1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.exolab.castor.xml.util.resolvers;
17
18 import java.util.HashMap;
19 import java.util.Map;
20
21 import org.apache.commons.logging.Log;
22 import org.apache.commons.logging.LogFactory;
23 import org.exolab.castor.xml.ResolverException;
24 import org.exolab.castor.xml.XMLConstants;
25
26
27
28
29
30
31
32
33
34
35
36 public class ByDescriptorClass extends AbstractResolverClassCommand {
37 private static final Log LOG = LogFactory.getLog(ByDescriptorClass.class);
38
39
40
41
42 public ByDescriptorClass() {
43 super();
44 }
45
46
47
48
49
50
51
52
53
54
55
56 protected Map internalResolve(final String className, final ClassLoader classLoader,
57 final Map properties) throws ResolverException {
58
59 HashMap results = new HashMap();
60 if (classLoader == null) {
61 LOG.debug("No class loader available.");
62 return results;
63 }
64
65 StringBuffer descriptorClassName = new StringBuffer(className);
66 descriptorClassName.append(XMLConstants.DESCRIPTOR_SUFFIX);
67 Class descriptorClass = ResolveHelpers.loadClass(
68 classLoader, descriptorClassName.toString());
69
70
71 if (descriptorClass == null) {
72 int offset = descriptorClassName.lastIndexOf(".");
73 if (offset != -1) {
74 descriptorClassName.insert(offset , ".");
75 descriptorClassName.insert(offset + 1, XMLConstants.DESCRIPTOR_PACKAGE);
76 descriptorClass = ResolveHelpers.loadClass(
77 classLoader, descriptorClassName.toString());
78 }
79 }
80
81 if (descriptorClass != null) {
82 try {
83 LOG.debug("Found descriptor: " + descriptorClass);
84 results.put(className, descriptorClass.newInstance());
85 } catch (InstantiationException e) {
86 LOG.debug("Ignored exception: " + e + "at loading descriptor class for: "
87 + className);
88 } catch (IllegalAccessException e) {
89 LOG.debug("Ignored exception: " + e + "at loading descriptor class for: "
90 + className);
91 }
92 }
93 return results;
94 }
95 }