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 2000-2004 (C) Intalio, Inc. All Rights Reserved.
42 *
43 * $Id$
44 */
45 package org.exolab.castor.xml.descriptors;
46
47 import java.util.Locale;
48
49 import org.exolab.castor.mapping.AccessMode;
50 import org.exolab.castor.mapping.ClassDescriptor;
51 import org.exolab.castor.mapping.FieldDescriptor;
52 import org.exolab.castor.xml.NodeType;
53 import org.exolab.castor.xml.TypeValidator;
54 import org.exolab.castor.xml.UnmarshalState;
55 import org.exolab.castor.xml.ValidationException;
56 import org.exolab.castor.xml.XMLClassDescriptor;
57 import org.exolab.castor.xml.XMLFieldDescriptor;
58 import org.exolab.castor.xml.XMLFieldHandler;
59 import org.exolab.castor.xml.util.XMLFieldDescriptorImpl;
60
61 /**
62 * A ClassDescriptor for java.util.Locale.
63 *
64 * @author <a href="kvisco-at-intalio.com">Keith Visco</a>
65 * @version $Revision$ $Date: 2004-12-16 22:45:54 -0700 (Thu, 16 Dec 2004) $
66 */
67 public class LocaleDescriptor extends BaseDescriptor {
68
69 /** Used for returning no attribute and no element fields. */
70 private static final XMLFieldDescriptor[] NO_FIELDS = new XMLFieldDescriptor[0];
71 /** Our field descriptor for our "content". */
72 private static final XMLFieldDescriptorImpl NO_CONTENT = null;
73 /** The name of the XML element. */
74 private static final String XML_NAME = "locale";
75 /** Our field descriptor array. Lists the fields we describe. */
76 private static final XMLFieldDescriptor[] FIELDS;
77 /** The TypeValidator to use for validation of the described class. */
78 private static final TypeValidator VALIDATOR = null;
79
80 static {
81 // -- Create FieldDescriptor for language
82 XMLFieldDescriptorImpl fdLanguage = new XMLFieldDescriptorImpl(
83 String.class, "language", "language", NodeType.Attribute);
84
85 fdLanguage.setConstructorArgumentIndex(0);
86 fdLanguage.setHandler(new XMLFieldHandler() {
87
88 /**
89 * {@inheritDoc}
90 */
91 public Object getValue(final Object object) throws IllegalStateException {
92 return ((java.util.Locale) object).getLanguage();
93 }
94
95 /**
96 * {@inheritDoc}
97 */
98 public void setValue(final Object object, final Object value)
99 throws IllegalStateException, IllegalArgumentException {
100 //-- do nothing, can only be set via constructor
101 }
102
103 /**
104 * {@inheritDoc}
105 */
106 public Object newInstance(final Object parent) {
107 //-- not applicable
108 return null;
109 }
110 });
111
112 // -- Create FieldDescriptor for country
113 XMLFieldDescriptorImpl fdCountry = new XMLFieldDescriptorImpl(
114 String.class, "country", "country", NodeType.Attribute);
115
116 fdCountry.setConstructorArgumentIndex(1);
117 fdCountry.setHandler(new XMLFieldHandler() {
118
119 /**
120 * {@inheritDoc}
121 */
122 public Object getValue(final Object object) throws IllegalStateException {
123 return ((java.util.Locale) object).getCountry();
124 }
125
126 /**
127 * {@inheritDoc}
128 */
129 public void setValue(final Object object, final Object value)
130 throws IllegalStateException, IllegalArgumentException {
131 // -- do nothing, can only be set via constructor
132 }
133
134 /**
135 * {@inheritDoc}
136 */
137 public Object newInstance(final Object parent) {
138 // -- not applicable
139 return null;
140 }
141 });
142
143 // // -- Create FieldDescriptor for language variant
144 // XMLFieldDescriptorImpl fdVariant = new XMLFieldDescriptorImpl(
145 // String.class, "variant", "variant", NodeType.Attribute);
146 //
147 // fdVariant.setConstructorArgumentIndex(2);
148 // fdVariant.setRequired(false);
149 // fdVariant.setHandler(new XMLFieldHandler() {
150 //
151 // /**
152 // * {@inheritDoc}
153 // */
154 // public Object getValue(final Object object) throws IllegalStateException {
155 // String variant = ((Locale) object).getVariant();
156 // if (variant == null || variant.length() == 0) {
157 // return null;
158 // }
159 //
160 // return variant;
161 // }
162 //
163 // /**
164 // * {@inheritDoc}
165 // */
166 // public void setValue(final Object object, final Object value)
167 // throws IllegalStateException, IllegalArgumentException {
168 // // -- do nothing, can only be set via constructor
169 // }
170 //
171 // /**
172 // * {@inheritDoc}
173 // */
174 // public Object newInstance(final Object parent) {
175 // // -- not applicable
176 // return null;
177 // }
178 // });
179
180 FIELDS = new XMLFieldDescriptor[2];
181 FIELDS[0] = fdCountry;
182 FIELDS[1] = fdLanguage;
183 // _fields[2] = fdVariant;
184 }
185
186 //----------------/
187 //- Constructors -/
188 //----------------/
189
190 /**
191 * No-arg constructor.
192 */
193 public LocaleDescriptor() {
194 super();
195 } //-- LocaleDescriptor
196
197 //------------------/
198 //- Public Methods -/
199 //------------------/
200
201 /**
202 * Returns the set of XMLFieldDescriptors for all members that should be
203 * marshaled as XML attributes.
204 *
205 * @return an array of XMLFieldDescriptors for all members that should be
206 * marshaled as XML attributes.
207 */
208 public XMLFieldDescriptor[] getAttributeDescriptors() {
209 return FIELDS;
210 } // getAttributeDescriptors
211
212 /**
213 * Returns the XMLFieldDescriptor for the member that should be marshaled
214 * as text content.
215 *
216 * @return the XMLFieldDescriptor for the member that should be marshaled
217 * as text content.
218 */
219 public XMLFieldDescriptor getContentDescriptor() {
220 return NO_CONTENT;
221 } // getContentDescriptor
222
223 /**
224 * Returns the set of XMLFieldDescriptors for all members that should be
225 * marshaled as XML elements.
226 *
227 * @return an array of XMLFieldDescriptors for all members that should be
228 * marshaled as XML elements.
229 */
230 public XMLFieldDescriptor[] getElementDescriptors() {
231 return NO_FIELDS;
232 } // getElementDescriptors
233
234 /**
235 * Returns the XML field descriptor matching the given xml name and
236 * nodeType. If NodeType is null, then either an AttributeDescriptor, or
237 * ElementDescriptor may be returned. Null is returned if no matching
238 * descriptor is available.
239 *
240 * @param name the xml name to match against
241 * @param namespace the namespace uri
242 * @param nodeType the NodeType to match against, or null if the node type
243 * is not known.
244 * @return the matching descriptor, or null if no matching descriptor is
245 * available.
246 */
247 public XMLFieldDescriptor getFieldDescriptor(final String name, final String namespace,
248 final NodeType nodeType) {
249 return null;
250 } //-- getFieldDescriptor
251
252 /**
253 * @return the namespace prefix to use when marshaling as XML.
254 */
255 public String getNameSpacePrefix() {
256 return null;
257 } //-- getNameSpacePrefix
258
259 /**
260 * @return the namespace URI used when marshaling and unmarshaling as XML.
261 */
262 public String getNameSpaceURI() {
263 return null;
264 } //-- getNameSpaceURI
265
266 /**
267 * Returns a specific validator for the class described by this
268 * ClassDescriptor. A null value may be returned if no specific validator
269 * exists.
270 *
271 * @return the type validator for the class described by this
272 * ClassDescriptor.
273 */
274 public TypeValidator getValidator() {
275 return VALIDATOR;
276 } //-- getValidator
277
278 /**
279 * Returns the XML Name for the Class being described.
280 *
281 * @return the XML name.
282 */
283 public String getXMLName() {
284 return XML_NAME;
285 } //-- getXMLName
286
287 /**
288 * Returns the String representation of this XMLClassDescriptor.
289 * @return the String representation of this XMLClassDescriptor.
290 */
291 public String toString() {
292 return super.toString() + "; descriptor for class: "
293 + Locale.class.getName() + "; xml name: " + XML_NAME;
294 } //-- toString
295
296 //-------------------------------------/
297 //- Implementation of ClassDescriptor -/
298 //-------------------------------------/
299
300 /**
301 * Returns the Java class represented by this descriptor.
302 *
303 * @return The Java class
304 */
305 public Class getJavaClass() {
306 return Locale.class;
307 } //-- getJavaClass
308
309 /**
310 * Returns a list of fields represented by this descriptor.
311 *
312 * @return A list of fields
313 */
314 public FieldDescriptor[] getFields() {
315 return FIELDS;
316 } //-- getFields
317
318 /**
319 * Returns the class descriptor of the class extended by this class.
320 *
321 * @return The extended class descriptor
322 */
323 public ClassDescriptor getExtends() {
324 return null;
325 } //-- getExtends
326
327 /**
328 * Returns the identity field, null if this class has no identity.
329 *
330 * @return The identity field
331 */
332 public FieldDescriptor getIdentity() {
333 return null;
334 } //-- getIdentity
335
336 /**
337 * Returns the access mode specified for this class.
338 *
339 * @return The access mode
340 */
341 public AccessMode getAccessMode() {
342 return null;
343 } //-- getAccessMode
344
345 } //-- class: LocaleDescriptor