1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.discovery.tools;
18
19 import org.apache.commons.discovery.ResourceClass;
20 import org.apache.commons.discovery.ResourceClassIterator;
21 import org.apache.commons.discovery.resource.classes.DiscoverClasses;
22 import org.apache.commons.discovery.resource.ClassLoaders;
23
24
25 /***
26 * Holder for a default class.
27 *
28 * Class may be specified by name (String) or class (Class).
29 * Using the holder complicates the users job, but minimized # of API's.
30 *
31 * @author Richard A. Sitze
32 */
33 public class DefaultClassHolder {
34 private Class defaultClass;
35 private final String defaultName;
36
37 public DefaultClassHolder(Class defaultClass) {
38 this.defaultClass = defaultClass;
39 this.defaultName = defaultClass.getName();
40 }
41
42 public DefaultClassHolder(String defaultName) {
43 this.defaultClass = null;
44 this.defaultName = defaultName;
45 }
46
47 /***
48 * @param spi non-null SPI
49 * @param loaders Used only if class needs to be loaded.
50 *
51 * @return Default Class. Load the class if necessary,
52 * and verify that it implements the SPI.
53 * (this forces the check, no way out..).
54 */
55 public Class getDefaultClass(SPInterface spi, ClassLoaders loaders) {
56 if (defaultClass == null) {
57 DiscoverClasses classDiscovery = new DiscoverClasses(loaders);
58 ResourceClassIterator classes = classDiscovery.findResourceClasses(getDefaultName());
59 if (classes.hasNext()) {
60 ResourceClass info = classes.nextResourceClass();
61 try {
62 defaultClass = info.loadClass();
63 } catch (Exception e) {
64
65 }
66 }
67 }
68
69 if (defaultClass != null) {
70 spi.verifyAncestory(defaultClass);
71 }
72
73 return defaultClass;
74 }
75
76 public String getDefaultName() {
77 return defaultName;
78 }
79 }