1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.castor.mapping;
17
18 import java.io.IOException;
19 import java.util.Enumeration;
20 import java.util.Iterator;
21
22 import org.apache.commons.logging.Log;
23 import org.apache.commons.logging.LogFactory;
24 import org.castor.core.CoreProperties;
25 import org.castor.core.util.Messages;
26 import org.castor.xml.AbstractInternalContext;
27 import org.castor.xml.InternalContext;
28 import org.exolab.castor.mapping.Mapping;
29 import org.exolab.castor.mapping.MappingException;
30 import org.exolab.castor.mapping.MappingLoader;
31 import org.exolab.castor.mapping.loader.AbstractMappingLoader;
32 import org.exolab.castor.mapping.xml.ClassMapping;
33 import org.exolab.castor.mapping.xml.FieldHandlerDef;
34 import org.exolab.castor.mapping.xml.Include;
35 import org.exolab.castor.mapping.xml.KeyGeneratorDef;
36 import org.exolab.castor.mapping.xml.MappingRoot;
37 import org.exolab.castor.util.DTDResolver;
38 import org.exolab.castor.xml.ClassDescriptorResolverFactory;
39 import org.exolab.castor.xml.Introspector;
40 import org.exolab.castor.xml.Unmarshaller;
41 import org.exolab.castor.xml.XMLClassDescriptorResolver;
42 import org.exolab.castor.xml.util.ResolverStrategy;
43 import org.exolab.castor.xml.util.resolvers.CastorXMLStrategy;
44 import org.xml.sax.InputSource;
45 import org.xml.sax.SAXException;
46
47
48
49
50
51 public final class MappingUnmarshaller {
52
53
54
55
56 private static final Log LOG = LogFactory.getLog(MappingUnmarshaller.class);
57
58
59 private final MappingLoaderRegistry _registry;
60
61
62
63 private final MappingUnmarshallIDResolver _idResolver;
64
65
66
67 private boolean _allowRedefinitions = false;
68
69
70
71
72
73 private InternalContext _internalContext;
74
75
76
77
78
79
80 public MappingUnmarshaller() {
81 _registry = new MappingLoaderRegistry(new CoreProperties());
82 _idResolver = new MappingUnmarshallIDResolver();
83 AbstractInternalContext internalContext = new AbstractInternalContext() { };
84 internalContext.setClassLoader(getClass().getClassLoader());
85
86 XMLClassDescriptorResolver cdr = (XMLClassDescriptorResolver) ClassDescriptorResolverFactory
87 .createClassDescriptorResolver(BindingType.XML);
88 cdr.setInternalContext(internalContext);
89 internalContext.setXMLClassDescriptorResolver(cdr);
90
91 Introspector introspector = new Introspector();
92 introspector.setInternalContext(internalContext);
93 internalContext.setIntrospector(introspector);
94 cdr.setIntrospector(introspector);
95
96 ResolverStrategy resolverStrategy = new CastorXMLStrategy();
97 internalContext.setResolverStrategy(resolverStrategy);
98 cdr.setResolverStrategy(resolverStrategy);
99
100 _internalContext = internalContext;
101 }
102
103
104
105
106
107
108
109 public void setAllowRedefinitions(final boolean allow) {
110 _allowRedefinitions = allow;
111 }
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128 public MappingLoader getMappingLoader(final Mapping mapping,
129 final BindingType bindingType)
130 throws MappingException {
131 return getMappingLoader(mapping, bindingType, null);
132 }
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148 public MappingLoader getMappingLoader(final Mapping mapping,
149 final BindingType bindingType,
150 final Object param)
151 throws MappingException {
152 synchronized (this) {
153 Iterator iter = mapping.getMappingSources().iterator();
154 while (iter.hasNext()) {
155 MappingSource source = (MappingSource) iter.next();
156 loadMappingInternal(mapping, source.getResolver(), source.getSource());
157 }
158
159 AbstractMappingLoader loader;
160 loader = (AbstractMappingLoader) _registry.getMappingLoader(
161 "CastorXmlMapping", bindingType);
162 loader.setClassLoader(mapping.getClassLoader());
163 loader.setAllowRedefinitions(_allowRedefinitions);
164 loader.setInternalContext(_internalContext);
165 loader.loadMapping(mapping.getRoot(), param);
166 return loader;
167 }
168 }
169
170 public void loadMappingOnly(final Mapping mapping)
171 throws MappingException {
172 synchronized (this) {
173 Iterator iter = mapping.getMappingSources().iterator();
174 while (iter.hasNext()) {
175 MappingSource source = (MappingSource) iter.next();
176 loadMappingInternal(mapping, source.getResolver(), source.getSource());
177 }
178 }
179 }
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194 protected void loadMappingInternal(final Mapping mapping, final DTDResolver resolver,
195 final String url)
196 throws IOException, MappingException {
197 try {
198 InputSource source = resolver.resolveEntity(null, url);
199 if (source == null) { source = new InputSource(url); }
200 if (source.getSystemId() == null) { source.setSystemId(url); }
201 LOG.info(Messages.format("mapping.loadingFrom", url));
202 loadMappingInternal(mapping, resolver, source);
203 } catch (SAXException ex) {
204 throw new MappingException(ex);
205 }
206 }
207
208
209
210
211
212
213
214
215
216
217
218 private void loadMappingInternal(final Mapping mapping, final DTDResolver resolver,
219 final InputSource source)
220 throws MappingException {
221
222
223 _registry.clear();
224
225 Object id = source.getSystemId();
226 if (id == null) { id = source.getByteStream(); }
227 if (id != null) {
228
229 if (mapping.processed(id)) { return; }
230
231
232 mapping.markAsProcessed(id);
233 }
234
235 MappingRoot root = mapping.getRoot();
236 _idResolver.setMapping(root);
237
238 try {
239
240 Unmarshaller unm = new Unmarshaller(MappingRoot.class);
241 unm.setValidation(false);
242 unm.setEntityResolver(resolver);
243 unm.setClassLoader(Mapping.class.getClassLoader());
244 unm.setIDResolver(_idResolver);
245 unm.setUnmarshalListener(
246 new MappingUnmarshallListener(this, mapping, resolver));
247
248 MappingRoot loaded = (MappingRoot) unm.unmarshal(source);
249
250
251
252
253
254
255 Enumeration includes = loaded.enumerateInclude();
256 while (includes.hasMoreElements()) {
257 Include include = (Include) includes.nextElement();
258 if (!mapping.processed(include.getHref())) {
259 try {
260 loadMappingInternal(mapping, resolver, include.getHref());
261 } catch (Exception ex) {
262 throw new MappingException(ex);
263 }
264 }
265 }
266
267
268 Enumeration<? extends ClassMapping> classMappings = loaded.enumerateClassMapping();
269 while (classMappings.hasMoreElements()) {
270 root.addClassMapping(classMappings.nextElement());
271 }
272
273
274 Enumeration<? extends KeyGeneratorDef> keyGeneratorDefinitions = loaded.enumerateKeyGeneratorDef();
275 while (keyGeneratorDefinitions.hasMoreElements()) {
276 root.addKeyGeneratorDef(keyGeneratorDefinitions.nextElement());
277 }
278
279
280 Enumeration<? extends FieldHandlerDef> fieldHandlerDefinitions = loaded.enumerateFieldHandlerDef();
281 while (fieldHandlerDefinitions.hasMoreElements()) {
282 root.addFieldHandlerDef(fieldHandlerDefinitions.nextElement());
283 }
284 } catch (Exception ex) {
285 throw new MappingException(ex);
286 }
287 }
288
289
290
291
292
293
294
295
296
297
298 }