1 /*
2 * Redistribution and use of this software and associated documentation
3 * ("Software"), with or without modification, are permitted provided
4 * that the following conditions are met:
5 *
6 * 1. Redistributions of source code must retain copyright
7 * statements and notices. Redistributions must also contain a
8 * copy of this document.
9 *
10 * 2. Redistributions in binary form must reproduce the
11 * above copyright notice, this list of conditions and the
12 * following disclaimer in the documentation and/or other
13 * materials provided with the distribution.
14 *
15 * 3. The name "Exolab" must not be used to endorse or promote
16 * products derived from this Software without prior written
17 * permission of Intalio, Inc. For written permission,
18 * please contact info@exolab.org.
19 *
20 * 4. Products derived from this Software may not be called "Exolab"
21 * nor may "Exolab" appear in their names without prior written
22 * permission of Intalio, Inc. Exolab is a registered
23 * trademark of Intalio, Inc.
24 *
25 * 5. Due credit should be given to the Exolab Project
26 * (http://www.exolab.org/).
27 *
28 * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS
29 * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
32 * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39 * OF THE POSSIBILITY OF SUCH DAMAGE.
40 *
41 * Copyright 2002-2004 (C) Intalio, Inc. All Rights Reserved.
42 *
43 * $Id$
44 */
45 package org.exolab.castor.xml.descriptors;
46
47 import org.exolab.castor.mapping.AccessMode;
48 import org.exolab.castor.mapping.ClassDescriptor;
49 import org.exolab.castor.mapping.FieldDescriptor;
50 import org.exolab.castor.mapping.FieldHandler;
51 import org.exolab.castor.xml.NodeType;
52 import org.exolab.castor.xml.TypeValidator;
53 import org.exolab.castor.xml.XMLFieldDescriptor;
54 import org.exolab.castor.xml.XMLFieldHandler;
55 import org.exolab.castor.xml.util.XMLFieldDescriptorImpl;
56
57 /**
58 * The default class descriptor for Arrays that are passed in as the root-level
59 * class.
60 *
61 * @author <a href="mailto:kvisco-at-intalio.com">Keith Visco</a>
62 * @version $Revision$ $Date: 2004-12-16 22:49:25 -0700 (Thu, 16 Dec 2004) $
63 */
64 public class RootArrayDescriptor extends BaseDescriptor {
65
66 /** Our field descriptor for our "content". */
67 private static final XMLFieldDescriptor NO_CONTENT = null;
68 /** The set of attribute descriptors. */
69 private static final XMLFieldDescriptor[] NO_ATTRIBUTES = new XMLFieldDescriptor[0];
70
71 // --------------------/
72 // - Member Variables -/
73 // --------------------/
74
75 /** Our field descriptor array. Lists the fields we describe. */
76 private final FieldDescriptor[] _fields = new FieldDescriptor[1];
77 /** The set of element descriptors. */
78 private final XMLFieldDescriptor[] _elements = new XMLFieldDescriptor[1];
79 /** Class object for the type contained in the array. */
80 private final Class _javaClass;
81
82 /** The XML name for the described object.. */
83 private String _xmlName = "array";
84 /** The desired namespace for the described object. */
85 private String _nsURI = null;
86 /** Type validator to use to validate an instance of this type. */
87 private TypeValidator _validator = null;
88
89 //----------------/
90 //- Constructors -/
91 //----------------/
92
93 /**
94 * Creates a new RootArrayDescriptor for an array of the provided type.
95 * @param array An array to create a RootArrayDescriptor for.
96 */
97 public RootArrayDescriptor(final Class array) {
98 super();
99
100 if (array == null) {
101 String err = "Argument array must not be null.";
102 throw new IllegalArgumentException(err);
103 }
104
105 if (!array.isArray()) {
106 String err = "Argument array must be an array.";
107 throw new IllegalArgumentException(err);
108 }
109
110 _javaClass = array.getComponentType();
111
112 //-- create element descriptor
113 XMLFieldDescriptorImpl desc = new XMLFieldDescriptorImpl(_javaClass,
114 "_elements", null, NodeType.Element);
115 FieldHandler handler = (new XMLFieldHandler() {
116
117 /**
118 * {@inheritDoc}
119 */
120 public Object getValue(final Object object) throws IllegalStateException {
121 return object;
122 }
123
124 /**
125 * {@inheritDoc}
126 */
127 public void setValue(final Object object, final Object value)
128 throws IllegalStateException, IllegalArgumentException {
129 //-- do nothing
130 }
131
132 /**
133 * {@inheritDoc}
134 */
135 public Object newInstance(final Object parent) {
136 //-- not used
137 return null;
138 }
139 });
140 desc.setHandler(handler);
141 desc.setMultivalued(true);
142
143 _elements[0] = desc;
144 _fields[0] = desc;
145 } //-- RootArrayDescriptor()
146
147 //-----------/
148 //- Methods -/
149 //-----------/
150
151 /**
152 * Returns the set of attribute XMLFieldDescriptors.
153 *
154 * @return an array of XMLFieldDescriptors for all members that should be
155 * marshaled as attributes
156 */
157 public XMLFieldDescriptor[] getAttributeDescriptors() {
158 return NO_ATTRIBUTES;
159 } //-- getAttributeDescriptors()
160
161 /**
162 * Returns the Class that this ClassDescriptor describes.
163 * @return the Class that this ClassDescriptor describes.
164 */
165 public Class getJavaClass() {
166 return _javaClass;
167 } //-- getClassType()
168
169 /**
170 * Returns the set of element MarshalDescriptors.
171 *
172 * @return an array of MarshalDescriptors for all members that should be
173 * marshaled as Elements
174 */
175 public XMLFieldDescriptor[] getElementDescriptors() {
176 return _elements;
177 } //-- getElementDescriptors()
178
179 /**
180 * Returns the class descriptor of the class extended by this class.
181 *
182 * @return The extended class descriptor
183 */
184 public ClassDescriptor getExtends() {
185 return null;
186 } //-- getExtends
187
188 /**
189 * Returns a list of fields represented by this descriptor.
190 *
191 * @return A list of fields
192 */
193 public FieldDescriptor[] getFields() {
194 return _fields;
195 } //-- getFields
196
197 /**
198 * Returns the descriptor for dealing with Text content.
199 *
200 * @return the XMLFieldDescriptor for dealing with Text content
201 */
202 public XMLFieldDescriptor getContentDescriptor() {
203 return NO_CONTENT;
204 } //-- getContentDescriptor()
205
206 /**
207 * Returns the XML field descriptor matching the given xml name and
208 * nodeType. If NodeType is null, then either an AttributeDescriptor, or
209 * ElementDescriptor may be returned. Null is returned if no matching
210 * descriptor is available.
211 *
212 * @param name the xml name to match against
213 * @param namespace the namespace uri
214 * @param nodeType the NodeType to match against, or null if the node type
215 * is not known.
216 * @return the matching descriptor, or null if no matching descriptor is
217 * available.
218 */
219 public XMLFieldDescriptor getFieldDescriptor(final String name,
220 final String namespace, final NodeType nodeType) {
221 return _elements[0];
222 } //-- getFieldDescriptor
223
224 /**
225 * Returns the namespace prefix to use when marshalling as XML.
226 * @return the namespace prefix to use when marshalling as XML.
227 */
228 public String getNameSpacePrefix() {
229 return null;
230 } //-- getNameSpacePrefix
231
232 /**
233 * Returns the namespace URI used when marshaling and unmarshaling as XML.
234 * @return the namespace URI used when marshaling and unmarshaling as XML.
235 */
236 public String getNameSpaceURI() {
237 return _nsURI;
238 } //-- getNameSpaceURI
239
240 /**
241 * Returns the identity field, or null if this class has no identity.
242 *
243 * @return The identity field
244 */
245 public FieldDescriptor getIdentity() {
246 return null;
247 } //-- getIdentity
248
249 /**
250 * Returns the access mode specified for this class.
251 *
252 * @return The access mode
253 */
254 public AccessMode getAccessMode() {
255 return null;
256 } //-- getAccessMode
257
258 /**
259 * Returns a specific validator for the class described by this
260 * ClassDescriptor. A null value may be returned if no specific validator
261 * exists.
262 *
263 * @return the type validator for the class described by this
264 * ClassDescriptor.
265 */
266 public TypeValidator getValidator() {
267 return _validator;
268 } //-- getValidator
269
270 /**
271 * Returns the XML Name for the Class being described.
272 *
273 * @return the XML name.
274 */
275 public String getXMLName() {
276 return _xmlName;
277 } //-- getXMLName
278
279 /**
280 * Sets the XML Name for the described object.
281 *
282 * @param xmlName the XML name to use for the described object.
283 */
284 public void setXMLName(final String xmlName) {
285 this._xmlName = xmlName;
286 } //-- setXMLName
287
288 /**
289 * Sets the desired namespace URI for the described object.
290 *
291 * @param nsURI is the desired namespace URI
292 */
293 public void setNameSpaceURI(final String nsURI) {
294 this._nsURI = nsURI;
295 } //-- setNameSpaceURI
296
297 } //-- RootArrayDescriptor