1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 package org.exolab.castor.xml.util;
46
47 import org.castor.xml.BackwardCompatibilityContext;
48 import org.castor.xml.InternalContext;
49 import org.castor.xml.JavaNaming;
50 import org.castor.xml.XMLNaming;
51 import org.exolab.castor.mapping.ClassDescriptor;
52 import org.exolab.castor.mapping.FieldDescriptor;
53 import org.exolab.castor.mapping.MappingException;
54 import org.exolab.castor.mapping.loader.ClassDescriptorImpl;
55 import org.exolab.castor.xml.NodeType;
56 import org.exolab.castor.xml.XMLClassDescriptor;
57 import org.exolab.castor.xml.XMLFieldDescriptor;
58
59
60
61
62
63
64
65
66 public class XMLClassDescriptorAdapter extends XMLClassDescriptorImpl {
67 private InternalContext _internalContext;
68
69 public XMLClassDescriptorAdapter() {
70 super();
71 _internalContext = new BackwardCompatibilityContext();
72 }
73
74
75
76
77
78
79
80 public XMLClassDescriptorAdapter(final ClassDescriptor classDesc, final String xmlName)
81 throws org.exolab.castor.mapping.MappingException {
82 this(classDesc, xmlName, null);
83 }
84
85
86
87
88
89
90
91
92 public XMLClassDescriptorAdapter(final ClassDescriptor classDesc,
93 String xmlName, NodeType primitiveNodeType)
94 throws MappingException {
95 this();
96
97 if (classDesc == null) {
98 String err = "The ClassDescriptor argument to "
99 + "XMLClassDescriptorAdapter must not be null.";
100 throw new IllegalArgumentException(err);
101 }
102
103 if (primitiveNodeType == null) {
104 primitiveNodeType = new BackwardCompatibilityContext().getPrimitiveNodeType();
105 }
106
107 if (primitiveNodeType == null) {
108 primitiveNodeType = NodeType.Attribute;
109 }
110
111 process(classDesc, primitiveNodeType);
112 setJavaClass(classDesc.getJavaClass());
113
114 if (xmlName == null) {
115 if (classDesc instanceof XMLClassDescriptor) {
116 xmlName = ((XMLClassDescriptor) classDesc).getXMLName();
117 } else {
118 String clsName = _internalContext.getJavaNaming().getClassName(classDesc.getJavaClass());
119 xmlName = _internalContext.getXMLNaming().toXMLName(clsName);
120 }
121 }
122 setXMLName(xmlName);
123 }
124
125
126
127
128
129
130
131 private void process(ClassDescriptor classDesc, NodeType primitiveNodeType)
132 throws MappingException {
133 if (classDesc instanceof XMLClassDescriptor) {
134
135 process((XMLClassDescriptor)classDesc);
136 return;
137 }
138
139
140 XMLClassDescriptor xmlClassDesc = null;
141 ClassDescriptor extendsDesc = classDesc.getExtends();
142 if (extendsDesc != null) {
143 if (extendsDesc instanceof XMLClassDescriptor) {
144 xmlClassDesc = (XMLClassDescriptor) extendsDesc;
145 } else {
146 xmlClassDesc = new XMLClassDescriptorAdapter(extendsDesc, null, primitiveNodeType);
147 }
148 }
149 setExtends(xmlClassDesc);
150
151 FieldDescriptor identity = classDesc.getIdentity();
152 FieldDescriptor[] fields = classDesc.getFields();
153
154
155
156
157
158
159
160
161 if (classDesc instanceof ClassDescriptorImpl) {
162 ClassDescriptorImpl cdImpl = (ClassDescriptorImpl)classDesc;
163 FieldDescriptor[] identities = cdImpl.getIdentities();
164 if ((identities != null) && (identities.length > 1)) {
165 int size = fields.length + identities.length;
166 FieldDescriptor[] newFields = new FieldDescriptor[size];
167 System.arraycopy(fields, 0, newFields, 0, fields.length);
168 System.arraycopy(identities, 0, newFields, fields.length, identities.length);
169 fields = newFields;
170 }
171 }
172
173
174 for (int i = 0; i < fields.length; i++) {
175 FieldDescriptor fieldDesc = fields[i];
176 if (fieldDesc == null) {
177 continue;
178 }
179 if (fieldDesc instanceof XMLFieldDescriptorImpl) {
180 if (identity == fieldDesc) {
181 setIdentity((XMLFieldDescriptorImpl)fieldDesc);
182 identity = null;
183 } else {
184 addFieldDescriptor((XMLFieldDescriptorImpl)fieldDesc);
185 }
186 } else {
187 String name = fieldDesc.getFieldName();
188 String xmlFieldName = _internalContext.getXMLNaming().toXMLName(name);
189
190 if (identity == fieldDesc) {
191 setIdentity(new XMLFieldDescriptorImpl(fieldDesc,
192 xmlFieldName,
193 NodeType.Attribute,
194 primitiveNodeType));
195 identity = null;
196 } else {
197 NodeType nodeType = NodeType.Element;
198 if (isPrimitive(fieldDesc.getFieldType())) {
199 nodeType = primitiveNodeType;
200 }
201
202 addFieldDescriptor(new XMLFieldDescriptorImpl(fieldDesc,
203 xmlFieldName,
204 nodeType,
205 primitiveNodeType));
206 }
207 }
208 }
209
210
211
212
213
214 if ( identity != null ) {
215 String xmlFieldName;
216 if ( identity instanceof XMLFieldDescriptor ) {
217 setIdentity((XMLFieldDescriptor)identity);
218 } else {
219 xmlFieldName = _internalContext.getXMLNaming().toXMLName(identity.getFieldName());
220 setIdentity(new XMLFieldDescriptorImpl(identity,
221 xmlFieldName,
222 NodeType.Attribute,
223 primitiveNodeType));
224 }
225 }
226 }
227
228
229
230
231
232
233
234 private void process(XMLClassDescriptor classDesc) {
235 FieldDescriptor identity = classDesc.getIdentity();
236 FieldDescriptor[] fields = classDesc.getFields();
237 for (int i = 0; i < fields.length; i++) {
238 if (identity == fields[i]) {
239 setIdentity((XMLFieldDescriptor)fields[i]);
240 identity = null;
241 } else {
242 addFieldDescriptor((XMLFieldDescriptor)fields[i]);
243 }
244 }
245
246
247 if (identity != null) {
248 setIdentity((XMLFieldDescriptor)identity);
249 }
250 setXMLName(classDesc.getXMLName());
251 setExtendsWithoutFlatten((XMLClassDescriptor) classDesc.getExtends());
252 }
253 }