View Javadoc

1   /*
2    * Copyright 2012-2013 smartics, Kronseder & Reiner GmbH
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package de.smartics.properties.spi.core.classpath;
17  
18  import java.net.URL;
19  import java.net.URLClassLoader;
20  import java.util.Collection;
21  import java.util.Collections;
22  import java.util.Set;
23  
24  import org.reflections.Reflections;
25  import org.reflections.scanners.TypeAnnotationsScanner;
26  import org.reflections.util.ConfigurationBuilder;
27  
28  import de.smartics.properties.api.core.annotations.PropertySet;
29  
30  /**
31   * Loads classes that have a {@link PropertySet} annotation.
32   */
33  public final class PropertySetClassesLoader
34  {
35    // ********************************* Fields *********************************
36  
37    // --- constants ------------------------------------------------------------
38  
39    /**
40     * Default scanner to use.
41     */
42    private static final TypeAnnotationsScanner SCANNER =
43        new TypeAnnotationsScanner();
44  
45    // --- members --------------------------------------------------------------
46  
47    // ****************************** Initializer *******************************
48  
49    // ****************************** Constructors ******************************
50  
51    // ****************************** Inner Classes *****************************
52  
53    // ********************************* Methods ********************************
54  
55    // --- init -----------------------------------------------------------------
56  
57    private static Reflections buildReflections(final Collection<URL> urls)
58    {
59      final ClassLoader classLoader =
60          new URLClassLoader(urls.toArray(new URL[urls.size()]), Thread
61              .currentThread().getContextClassLoader());
62  
63      final ConfigurationBuilder builder = new ConfigurationBuilder();
64      builder.setScanners(SCANNER).addClassLoader(classLoader).addUrls(urls);
65      final Reflections reflections = new Reflections(builder);
66      return reflections;
67    }
68  
69    // --- get&set --------------------------------------------------------------
70  
71    // --- business -------------------------------------------------------------
72  
73    /**
74     * Returns all types that are annotated as property set.
75     *
76     * @param urls the class roots to search for types that have the required
77     *          annotation.
78     * @return the set of types that are annotated with {@link PropertySet}.
79     */
80    public Set<Class<?>> getPropertySetTypes(final Collection<URL> urls)
81    {
82      if (urls == null || urls.isEmpty())
83      {
84        return Collections.emptySet();
85      }
86  
87      final Reflections reflections = buildReflections(urls);
88      final Set<Class<?>> propertySetTypes =
89          reflections.getTypesAnnotatedWith(PropertySet.class);
90  
91      return propertySetTypes;
92    }
93  
94    // --- object basics --------------------------------------------------------
95  
96  }