001 /** 002 * 003 * Licensed to the Apache Software Foundation (ASF) under one or more 004 * contributor license agreements. See the NOTICE file distributed with 005 * this work for additional information regarding copyright ownership. 006 * The ASF licenses this file to You under the Apache License, Version 2.0 007 * (the "License"); you may not use this file except in compliance with 008 * the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 package org.apache.camel.impl; 019 020 import org.apache.camel.CamelContext; 021 import org.apache.camel.Component; 022 import org.apache.camel.Exchange; 023 import org.apache.camel.spi.ComponentResolver; 024 import org.apache.camel.util.FactoryFinder; 025 import org.apache.camel.util.NoFactoryAvailableException; 026 027 /** 028 * The default implementation of {@link ComponentResolver} 029 * which tries to find components by using the URI scheme prefix and searching for a file of the URI 030 * scheme name in the <b>META-INF/services/org/apache/camel/component/</b> 031 * directory on the classpath. 032 * 033 * @version $Revision: 530555 $ 034 */ 035 public class DefaultComponentResolver<E extends Exchange> implements ComponentResolver<E> { 036 protected static final FactoryFinder componentFactory = new FactoryFinder("META-INF/services/org/apache/camel/component/"); 037 038 public Component<E> resolveComponent(String name, CamelContext context) { 039 Class type; 040 try { 041 type = componentFactory.findClass(name); 042 } 043 catch (NoFactoryAvailableException e) { 044 return null; 045 } 046 catch (Throwable e) { 047 throw new IllegalArgumentException("Invalid URI, no EndpointResolver registered for scheme : " + name, e); 048 } 049 if (type == null) { 050 return null; 051 } 052 if (Component.class.isAssignableFrom(type)) { 053 return (Component<E>)context.getInjector().newInstance(type); 054 } 055 else { 056 throw new IllegalArgumentException("Type is not a Component implementation. Found: " + type.getName()); 057 } 058 } 059 }