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