001: /**
002: * Redistribution and use of this software and associated documentation
003: * ("Software"), with or without modification, are permitted provided
004: * that the following conditions are met:
005: *
006: * 1. Redistributions of source code must retain copyright
007: * statements and notices. Redistributions must also contain a
008: * copy of this document.
009: *
010: * 2. Redistributions in binary form must reproduce the
011: * above copyright notice, this list of conditions and the
012: * following disclaimer in the documentation and/or other
013: * materials provided with the distribution.
014: *
015: * 3. The name "Exolab" must not be used to endorse or promote
016: * products derived from this Software without prior written
017: * permission of Intalio, Inc. For written permission,
018: * please contact info@exolab.org.
019: *
020: * 4. Products derived from this Software may not be called "Exolab"
021: * nor may "Exolab" appear in their names without prior written
022: * permission of Intalio, Inc. Exolab is a registered
023: * trademark of Intalio, Inc.
024: *
025: * 5. Due credit should be given to the Exolab Project
026: * (http://www.exolab.org/).
027: *
028: * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS
029: * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
030: * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
031: * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
032: * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
033: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
034: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
035: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
036: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
037: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
038: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
039: * OF THE POSSIBILITY OF SUCH DAMAGE.
040: *
041: * Copyright 2001-2002 (C) Intalio Inc. All Rights Reserved.
042: *
043: * $Id: SimpleTypeListUnmarshaller.java 6230 2006-09-19 07:56:07Z wguttmn $
044: */package org.exolab.castor.xml.schema.reader;
045:
046: //-- imported classes and packages
047: import org.exolab.castor.xml.AttributeSet;
048: import org.exolab.castor.xml.Namespaces;
049: import org.exolab.castor.xml.XMLException;
050: import org.exolab.castor.xml.schema.*;
051: import org.exolab.castor.xml.schema.simpletypes.ListType;
052:
053: /**
054: * A class for unmarshalling list elements of a simpleType.
055: * Thanks to <a href="mailto:cdchudasama@yahoo.com">Chetan Chudasama</a>
056: * for his help.
057: * @author <a href="mailto:blandin@intalio.com">Arnaud Blandin</a>
058: * @author <a href="mailto:kvsico@intalio.com">Keith Visco</a>
059: * @version $Revision: 6230 $
060: **/
061: public class SimpleTypeListUnmarshaller extends ComponentReader {
062:
063: //--------------------/
064: //- Member Variables -/
065: //--------------------/
066:
067: /**
068: * The current ComponentReader
069: **/
070: private ComponentReader unmarshaller;
071:
072: /**
073: * The current branch depth
074: **/
075: private int depth = 0;
076:
077: /**
078: * The simpleType we are unmarshalling
079: **/
080: private ListType _list = null;
081: private Schema _schema = null;
082: private boolean foundAnnotation = false;
083: private boolean foundSimpleType = false;
084: private boolean foundItemType = false;
085:
086: //----------------/
087: //- Constructors -/
088: //----------------/
089:
090: /**
091: * Creates a new ListUnmarshaller
092: * @param atts the AttributeList
093: **/
094: SimpleTypeListUnmarshaller(Schema schema, AttributeSet atts)
095: throws XMLException {
096: super ();
097:
098: _schema = schema;
099: _list = new ListType(schema);
100:
101: //-- itemType
102: String itemTypeName = atts.getValue(SchemaNames.ITEM_TYPE_ATTR);
103: if ((itemTypeName != null) && (itemTypeName.length() > 0)) {
104:
105: foundItemType = true;
106: XMLType itemType = _schema.getType(itemTypeName);
107: if (itemType == null) {
108: _list.setItemType(itemTypeName);
109: } else if (itemType.getStructureType() == Structure.COMPLEX_TYPE) {
110: String err = "The item type of a list cannot "
111: + "be a complexType.";
112: throw new IllegalStateException(err);
113: } else
114: _list.setItemType((SimpleType) itemType);
115: }
116:
117: //-- @id
118: _list.setId(atts.getValue(SchemaNames.ID_ATTR));
119:
120: } //-- SimpleTypeListUnmarshaller
121:
122: //-----------/
123: //- Methods -/
124: //-----------/
125:
126: /**
127: * Returns the name of the element that this ComponentReader
128: * handles
129: * @return the name of the element that this ComponentReader
130: * handles
131: **/
132: public String elementName() {
133: return SchemaNames.LIST;
134: } //-- elementName
135:
136: /**
137: * Called to signal an end of unmarshalling. This method should
138: * be overridden to perform any necessary clean up by an unmarshaller
139: **/
140: public void finish() throws XMLException {
141: if ((!foundItemType) && (!foundSimpleType)) {
142: String err = "Missing sub-component of <list>, either use "
143: + " the 'itemType' attribute, or an anonymous simpleType.";
144: error(err);
145: }
146: } //-- finish
147:
148: /**
149: * Returns the Object created by this ComponentReader
150: * @return the Object created by this ComponentReader
151: **/
152: public Object getObject() {
153: if ((!foundItemType) && (!foundSimpleType)) {
154: String err = "Missing sub-component of <list>, either use "
155: + " the 'itemType' attribute, or an anonymous simpleType.";
156: throw new IllegalStateException(err);
157: }
158: return _list;
159: } //-- getObject
160:
161: /**
162: * Signals the start of an element with the given name.
163: *
164: * @param name the NCName of the element. It is an error
165: * if the name is a QName (ie. contains a prefix).
166: * @param namespace the namespace of the element. This may be null.
167: * Note: A null namespace is not the same as the default namespace unless
168: * the default namespace is also null.
169: * @param atts the AttributeSet containing the attributes associated
170: * with the element.
171: * @param nsDecls the namespace declarations being declared for this
172: * element. This may be null.
173: **/
174: public void startElement(String name, String namespace,
175: AttributeSet atts, Namespaces nsDecls) throws XMLException {
176: //-- Do delagation if necessary
177: if (unmarshaller != null) {
178: unmarshaller.startElement(name, namespace, atts, nsDecls);
179: ++depth;
180: return;
181: }
182:
183: //-- annotation
184: if (name.equals(SchemaNames.ANNOTATION)) {
185:
186: if (foundSimpleType)
187: error("An annotation must appear as the first child "
188: + "of 'list' elements.");
189:
190: if (foundAnnotation)
191: error("Only one (1) annotation may appear as a child of "
192: + "'list' elements.");
193:
194: foundAnnotation = true;
195: unmarshaller = new AnnotationUnmarshaller(atts);
196: } else if (SchemaNames.SIMPLE_TYPE.equals(name)) {
197: if (foundItemType)
198: error("A 'list' element can have either an 'itemType' or "
199: + " 'simpleType'.");
200:
201: if (foundSimpleType)
202: error("Only one (1) 'simpleType' may appear as a child of "
203: + "'list' elements.");
204:
205: foundSimpleType = true;
206: unmarshaller = new SimpleTypeUnmarshaller(_schema, atts);
207:
208: } else
209: illegalElement(name);
210:
211: unmarshaller.setDocumentLocator(getDocumentLocator());
212: } //-- startElement
213:
214: /**
215: * Signals to end of the element with the given name.
216: *
217: * @param name the NCName of the element. It is an error
218: * if the name is a QName (ie. contains a prefix).
219: * @param namespace the namespace of the element.
220: **/
221: public void endElement(String name, String namespace)
222: throws XMLException {
223:
224: //-- Do delagation if necessary
225: if ((unmarshaller != null) && (depth > 0)) {
226: unmarshaller.endElement(name, namespace);
227: --depth;
228: return;
229: }
230:
231: //-- have unmarshaller perform any necessary clean up
232: unmarshaller.finish();
233:
234: //-- annotation
235: if (SchemaNames.ANNOTATION.equals(name)) {
236: Annotation ann = ((AnnotationUnmarshaller) unmarshaller)
237: .getAnnotation();
238: _list.setLocalAnnotation(ann);
239: } else if (SchemaNames.SIMPLE_TYPE.equals(name)) {
240: SimpleType type = (SimpleType) unmarshaller.getObject();
241: _list.setItemType(type);
242: }
243:
244: unmarshaller = null;
245: } //-- endElement
246:
247: public void characters(char[] ch, int start, int length)
248: throws XMLException {
249: //-- Do delagation if necessary
250: if (unmarshaller != null) {
251: unmarshaller.characters(ch, start, length);
252: }
253: } //-- characters
254:
255: } //-- SimpleTypeListUnmarshaller
|