1 /*
2 * Copyright 2008 Lukas Lang
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 */
17 package org.exolab.castor.builder.info.nature;
18
19 import java.util.List;
20
21 import org.castor.core.nature.BaseNature;
22 import org.castor.core.nature.PropertyHolder;
23 import org.exolab.castor.builder.info.GroupInfo;
24 import org.exolab.castor.builder.info.NodeType;
25 import org.exolab.castor.builder.types.XSType;
26
27 /**
28 * A XML specific view of a {@link PropertyHolder}, which can be a {@link ClassInfo} or a
29 * {@link FieldInfo}. Property based implementation.
30 *
31 * @author Lukas Lang
32 * @since 1.2.1
33 */
34 public final class XMLInfoNature extends BaseNature {
35
36 /**
37 * Property namespace prefix.
38 */
39 private static final String NAMESPACE_PREFIX = "namespaceprefix";
40
41 /**
42 * Property namespace URI.
43 */
44 private static final String NAMESPACE_URI = "namespaceuri";
45
46 /**
47 * Property node name.
48 */
49 private static final String NODE_NAME = "nodename";
50
51 /**
52 * Property node type.
53 */
54 private static final String NODE_TYPE = "nodetype";
55
56 /**
57 * Property schema type.
58 */
59 private static final String SCHEMA_TYPE = "schematype";
60
61 /**
62 * Indicates XML schema definition is global element or element with
63 * anonymous type.
64 */
65 private static final String ELEMENT_DEFINITION = "elementdefinition";
66
67 /**
68 * A flag indicating if the object described by this XML info can appear
69 * more than once.
70 */
71 private static final String MULTIVALUED = "multivalued";
72
73 /**
74 * Indicates the XML object must appear at least once.
75 */
76 private static final String REQUIRED = "required";
77
78 /**
79 * Property substitution groups.
80 */
81 private static final String SUBSTITUTION_GROUP = "substitutionGroup";
82
83 /**
84 * Property container.
85 */
86 private static final String IS_CONTAINER = "isContainer";
87
88 /**
89 * Property group info.
90 */
91 private static final String GROUP_INFO = "groupInfo";
92
93 /**
94 * Constructor taking a PropertyHolder.
95 *
96 * @param holder
97 * in focus.
98 */
99 public XMLInfoNature(final PropertyHolder holder) {
100 super(holder);
101 }
102
103 /**
104 * Implementation returns the fully qualified class name.
105 *
106 * @return the Nature id.
107 * @see org.exolab.castor.builder.info.nature.Nature#getId()
108 */
109 public String getId() {
110 return this.getClass().getName();
111 }
112
113 /**
114 * Returns the namespace prefix of the object described by this XMLInfo.
115 *
116 * @return the namespace prefix of the object described by this XMLInfo
117 */
118 public String getNamespacePrefix() {
119 return (String) this.getProperty(NAMESPACE_PREFIX);
120 }
121
122 /**
123 * Returns the namespace URI of the object described by this XMLInfo.
124 *
125 * @return the namespace URI of the object described by this XMLInfo
126 */
127 public String getNamespaceURI() {
128 return (String) this.getProperty(NAMESPACE_URI);
129 }
130
131 /**
132 * Returns the XML name for the object described by this XMLInfo.
133 *
134 * @return the XML name for the object described by this XMLInfo, or null if
135 * no name has been set
136 */
137 public String getNodeName() {
138 return (String) this.getProperty(NODE_NAME);
139 }
140
141 /**
142 * Returns the node type for the object described by this XMLInfo.
143 * <code>XMLInfo.ELEMENT_TYPE</code> if property is not set.
144 *
145 * @return the node type for the object described by this XMLInfo
146 */
147 public NodeType getNodeType() {
148 NodeType nodeType = (NodeType) this.getProperty(NODE_TYPE);
149 if (nodeType == null) {
150 return NodeType.ELEMENT;
151 }
152 return nodeType;
153 }
154
155 /**
156 * Returns the string name of the nodeType, either "attribute", "element" or
157 * "text".
158 *
159 * @return the name of the node-type of the object described by this
160 * XMLInfo.
161 */
162 public String getNodeTypeName() {
163 NodeType nodeType = getNodeType();
164 switch (nodeType) {
165 case ATTRIBUTE:
166 return "attribute";
167 case ELEMENT:
168 return "element";
169 case TEXT:
170 return "text";
171 default:
172 return "unknown";
173 }
174 }
175
176 /**
177 * Returns the XML Schema type for the described object.
178 *
179 * @return the XML Schema type.
180 */
181 public XSType getSchemaType() {
182 return (XSType) this.getProperty(SCHEMA_TYPE);
183 }
184
185 /**
186 * Returns true if XSD is global element or element with anonymous type or
187 * false if property is not set.
188 *
189 * @return true if xsd is element, false if not or null.
190 */
191 public boolean isElementDefinition() {
192 return getBooleanPropertyDefaultFalse(ELEMENT_DEFINITION);
193 }
194
195 /**
196 * Returns whether or not the object described by this XMLInfo is
197 * multi-valued (appears more than once in the XML document). Returns false
198 * if the property was not set.
199 *
200 * @return true if this object can appear more than once, false if not or
201 * not set.
202 */
203 public boolean isMultivalued() {
204 return getBooleanPropertyDefaultFalse(MULTIVALUED);
205 }
206
207 /**
208 * Return true if the XML object described by this XMLInfo must appear at
209 * least once in the XML document (or object model). Returns false if the
210 * property was not set.
211 *
212 * @return true if the XML object must appear at least once, false if not or
213 * not set.
214 */
215 public boolean isRequired() {
216 return getBooleanPropertyDefaultFalse(REQUIRED);
217 }
218
219 /**
220 * Sets whether or not XSD is element or not.
221 *
222 * @param elementDef
223 * The flag indicating whether or not XSD is global element,
224 * element with anonymous type or not.
225 */
226 public void setElementDefinition(final boolean elementDef) {
227 this.setProperty(ELEMENT_DEFINITION, new Boolean(elementDef));
228 }
229
230 /**
231 * Sets whether the XML object can appear more than once in the XML
232 * document.
233 *
234 * @param multivalued
235 * The boolean indicating whether or not the object can appear
236 * more than once.
237 */
238 public void setMultivalued(final boolean multivalued) {
239 this.setProperty(MULTIVALUED, new Boolean(multivalued));
240 }
241
242 /**
243 * Sets the desired namespace prefix for this XMLInfo There is no guarantee
244 * that this prefix will be used.
245 *
246 * @param nsPrefix
247 * the desired namespace prefix
248 */
249 public void setNamespacePrefix(final String nsPrefix) {
250 this.setProperty(NAMESPACE_PREFIX, nsPrefix);
251 }
252
253 /**
254 * Sets the Namespace URI for this XMLInfo.
255 *
256 * @param nsURI
257 * the Namespace URI for this XMLInfo
258 */
259 public void setNamespaceURI(final String nsURI) {
260 this.setProperty(NAMESPACE_URI, nsURI);
261 }
262
263 /**
264 * Sets the XML name of the object described by this XMLInfo.
265 *
266 * @param name
267 * the XML node name of the described object.
268 */
269 public void setNodeName(final String name) {
270 this.setProperty(NODE_NAME, name);
271 }
272
273 /**
274 * Sets the nodeType for this XMLInfo.
275 *
276 * @param nodeType
277 * the node type of the described object
278 */
279 public void setNodeType(final NodeType nodeType) {
280 this.setProperty(NODE_TYPE, nodeType);
281 }
282
283 /**
284 * Sets whether or not the XML object must appear at least once.
285 *
286 * @param required
287 * the flag indicating whether or not this XML object is required
288 */
289 public void setRequired(final boolean required) {
290 Boolean b = new Boolean(required);
291 this.setProperty(REQUIRED, b);
292 }
293
294 /**
295 * Sets the XML Schema type for this XMLInfo.
296 *
297 * @param xsType
298 * the XML Schema type
299 */
300 public void setSchemaType(final XSType xsType) {
301 this.setProperty(SCHEMA_TYPE, xsType);
302 }
303
304 /**
305 * Returns the possible substitution groups.
306 *
307 * @return the possible substitution groups.
308 */
309 @SuppressWarnings("unchecked")
310 public List<String> getSubstitutionGroups() {
311 return getPropertyAsList(SUBSTITUTION_GROUP);
312 }
313
314 /**
315 * Sets the possible substitution groups.
316 *
317 * @param substitutionGroups
318 * Possible substitution groups.
319 */
320 public void setSubstitutionGroups(final List<String> substitutionGroups) {
321 this.setProperty(SUBSTITUTION_GROUP, substitutionGroups);
322 }
323
324 /**
325 * Returns true if this ClassInfo describes a container class. A container
326 * class is a class which should not be marshalled as XML, but whose members
327 * should be.
328 *
329 * @return true if this ClassInfo describes a container class.
330 */
331 public boolean isContainer() {
332 return this.getBooleanPropertyDefaultFalse(IS_CONTAINER);
333 }
334
335 /**
336 * Sets whether or not this ClassInfo describes a container class. A
337 * container class is a class which should not be marshalled as XML, but
338 * whose members should be. By default this is false.
339 *
340 * @param isContainer the boolean value when true indicates this class
341 * should be a container class.
342 */
343 public void setContainer(final boolean isContainer) {
344 this.setProperty(IS_CONTAINER, new Boolean(isContainer));
345 }
346
347 /**
348 * Returns the {@link GroupInfo} for this XML nature.
349 *
350 * @return the {@link GroupInfo} instance.
351 */
352 public GroupInfo getGroupInfo() {
353 return (GroupInfo) this.getProperty(GROUP_INFO);
354 }
355
356 /**
357 * Sets the {@link GroupInfo} for this XML nature.
358 *
359 * @param groupInfo the {@link GroupInfo} instance.
360 */
361 public void setGroupInfo(final GroupInfo groupInfo) {
362 this.setProperty(GROUP_INFO, groupInfo);
363 }
364
365 /**
366 * Returns true if the compositor of this GroupInfo is a choice.
367 *
368 * @return true if the compositor of this GroupInfo is a choice
369 */
370 public boolean isChoice() {
371 return getGroupInfo().isChoice();
372 }
373
374 /**
375 * Returns true if the compositor of this GroupInfo is a sequence.
376 *
377 * @return true if the compositor of this GroupInfo is a sequence
378 */
379 public boolean isSequence() {
380 return getGroupInfo().isSequence();
381 }
382
383
384 }