001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.camel.impl.converter;
018    
019    import java.lang.annotation.Annotation;
020    import java.util.Collections;
021    import java.util.LinkedHashSet;
022    import java.util.Set;
023    
024    import org.apache.camel.component.bean.BeanConverter;
025    import org.apache.camel.component.file.GenericFileConverter;
026    import org.apache.camel.converter.CamelConverter;
027    import org.apache.camel.converter.CollectionConverter;
028    import org.apache.camel.converter.DateTimeConverter;
029    import org.apache.camel.converter.IOConverter;
030    import org.apache.camel.converter.NIOConverter;
031    import org.apache.camel.converter.ObjectConverter;
032    import org.apache.camel.converter.TimePatternConverter;
033    import org.apache.camel.converter.jaxp.DomConverter;
034    import org.apache.camel.converter.jaxp.StaxConverter;
035    import org.apache.camel.converter.jaxp.StreamSourceConverter;
036    import org.apache.camel.converter.jaxp.XmlConverter;
037    import org.apache.camel.converter.stream.StreamCacheConverter;
038    import org.apache.camel.spi.PackageScanClassResolver;
039    import org.apache.camel.spi.PackageScanFilter;
040    import org.slf4j.Logger;
041    import org.slf4j.LoggerFactory;
042    
043    /**
044     * A {@link org.apache.camel.spi.ClassResolver} which loads type converters
045     * from a hardcoded list of classes.
046     * <p/>
047     * <b>Important:</b> Whenever a new type converter class is added to camel-core
048     * then the class should be added to the list in this class.
049     *
050     * @see CoreTypeConverterLoader
051     */
052    public class CorePackageScanClassResolver implements PackageScanClassResolver {
053    
054        protected final Logger log = LoggerFactory.getLogger(getClass());
055        private final Set<ClassLoader> classLoaders = new LinkedHashSet<ClassLoader>();
056        private final Set<Class<?>> converters = new LinkedHashSet<Class<?>>();
057    
058        public CorePackageScanClassResolver() {
059            converters.add(ObjectConverter.class);
060            converters.add(CollectionConverter.class);
061            converters.add(DateTimeConverter.class);
062            converters.add(IOConverter.class);
063            converters.add(NIOConverter.class);
064            converters.add(StaxConverter.class);
065            converters.add(DomConverter.class);
066            converters.add(StreamSourceConverter.class);
067            converters.add(XmlConverter.class);
068            converters.add(CamelConverter.class);
069            converters.add(StreamCacheConverter.class);
070            converters.add(TimePatternConverter.class);
071            converters.add(FutureTypeConverter.class);
072            converters.add(BeanConverter.class);
073            converters.add(GenericFileConverter.class);
074        }
075    
076        @Override
077        public void setClassLoaders(Set<ClassLoader> classLoaders) {
078            // add all the class loaders
079            this.classLoaders.addAll(classLoaders);
080        }
081    
082        @Override
083        public Set<ClassLoader> getClassLoaders() {
084            // return a new set to avoid any concurrency issues in other runtimes such as OSGi
085            return Collections.unmodifiableSet(new LinkedHashSet<ClassLoader>(classLoaders));
086        }
087    
088        @Override
089        public void addClassLoader(ClassLoader classLoader) {
090            classLoaders.add(classLoader);
091        }
092    
093        @Override
094        public Set<Class<?>> findAnnotated(Class<? extends Annotation> annotation, String... packageNames) {
095            return converters;
096        }
097    
098        @Override
099        public Set<Class<?>> findAnnotated(Set<Class<? extends Annotation>> annotations, String... packageNames) {
100            return converters;
101        }
102    
103        @Override
104        public Set<Class<?>> findImplementations(Class<?> parent, String... packageNames) {
105            // noop
106            return null;
107        }
108    
109        @Override
110        public Set<Class<?>> findByFilter(PackageScanFilter filter, String... packageNames) {
111            // noop
112            return null;
113        }
114    
115        @Override
116        public void addFilter(PackageScanFilter filter) {
117            // noop
118        }
119    
120        @Override
121        public void removeFilter(PackageScanFilter filter) {
122            // noop
123        }
124    }