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.net.URL;
19 import java.util.ArrayList;
20 import java.util.HashMap;
21 import java.util.List;
22 import java.util.Map;
23
24 import org.apache.commons.logging.Log;
25 import org.apache.commons.logging.LogFactory;
26 import org.castor.mapping.BindingType;
27 import org.castor.mapping.MappingUnmarshaller;
28 import org.exolab.castor.mapping.ClassDescriptor;
29 import org.exolab.castor.mapping.Mapping;
30 import org.exolab.castor.mapping.MappingException;
31 import org.exolab.castor.mapping.MappingLoader;
32 import org.exolab.castor.xml.ResolverException;
33 import org.exolab.castor.xml.XMLConstants;
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 public class ByPackageMapping extends AbstractResolverPackageCommand {
61 private static final Log LOG = LogFactory.getLog(ByPackageMapping.class);
62
63 private List<String> _loadedPackages = new ArrayList<String>();
64
65
66
67
68 public ByPackageMapping() {
69 super();
70 }
71
72
73
74
75
76
77
78
79
80
81 private Mapping loadMapping(final String packageName, final ClassLoader classLoader)
82 throws MappingException {
83 URL url = classLoader.getResource(ResolveHelpers.getQualifiedFileName(
84 XMLConstants.PKG_MAPPING_FILE, packageName));
85 if (url == null) { return null; }
86 try {
87 Mapping mapping = new Mapping(classLoader);
88 mapping.loadMapping(url);
89 return mapping;
90 } catch (java.io.IOException ioex) {
91 throw new MappingException(ioex);
92 }
93 }
94
95
96
97
98 protected Map<String, ClassDescriptor> internalResolve(final String packageName, final ClassLoader classLoader,
99 final Map properties) throws ResolverException {
100
101 Map<String, ClassDescriptor> results = new HashMap<String, ClassDescriptor>();
102 if (!isEmptyPackageName(packageName) && _loadedPackages.contains(packageName)) {
103 if (LOG.isDebugEnabled()) {
104 LOG.debug("Package: " + packageName + " has already been loaded.");
105 }
106 return results;
107 }
108
109 if (!isEmptyPackageName(packageName)) {
110 _loadedPackages.add(packageName);
111 }
112 try {
113 final Mapping mapping = this.loadMapping(packageName, classLoader);
114 if (mapping != null) {
115 MappingUnmarshaller unmarshaller = new MappingUnmarshaller();
116
117 MappingLoader mappingLoader = unmarshaller.getMappingLoader(mapping, BindingType.XML);
118 for (ClassDescriptor classDescriptor : mappingLoader.getDescriptors()) {
119 if (LOG.isDebugEnabled()) {
120 LOG.debug("Found descriptor: " + classDescriptor);
121 }
122 results.put(classDescriptor.getJavaClass().getName(), classDescriptor);
123 }
124 }
125 } catch (MappingException e) {
126 if (LOG.isDebugEnabled()) {
127 LOG.debug("Ignored exception: " + e + " while loading mapping for package: "
128 + packageName);
129 }
130 }
131 return results;
132 }
133 }