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 2000-2002 (C) Intalio Inc. All Rights Reserved.
042: *
043: * $Id: SimpleTypeRestrictionUnmarshaller.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.Annotation;
051: import org.exolab.castor.xml.schema.Facet;
052: import org.exolab.castor.xml.schema.Schema;
053: import org.exolab.castor.xml.schema.SchemaNames;
054: import org.exolab.castor.xml.schema.SimpleType;
055: import org.exolab.castor.xml.schema.Structure;
056: import org.exolab.castor.xml.schema.XMLType;
057:
058: /**
059: * A class for unmarshalling restriction elements of a simpleType
060: * @author <a href="mailto:kvisco@intalio.com">Keith Visco</a>
061: * @version $Revision: 6230 $ $Date: 2003-03-03 00:05:44 -0700 (Mon, 03 Mar 2003) $
062: **/
063: public class SimpleTypeRestrictionUnmarshaller extends ComponentReader {
064:
065: //--------------------/
066: //- Member Variables -/
067: //--------------------/
068:
069: /**
070: * The current ComponentReader
071: **/
072: private ComponentReader unmarshaller;
073:
074: /**
075: * The current branch depth
076: **/
077: private int depth = 0;
078:
079: /**
080: * The simpleType we are unmarshalling
081: **/
082: private SimpleTypeDefinition _typeDefinition = null;
083:
084: private Schema _schema = null;
085: private boolean foundAnnotation = false;
086: private boolean foundSimpleType = false;
087: private boolean foundFacets = false;
088:
089: /**
090: * The base simpleType (ie the one we are restricting)
091: **/
092: // private SimpleType _baseType = null;
093: //----------------/
094: //- Constructors -/
095: //----------------/
096: /**
097: * Creates a new RestrictionUnmarshaller
098: * @param typeDefinition the SimpleType being unmarshalled
099: * @param atts the AttributeList
100: **/
101: public SimpleTypeRestrictionUnmarshaller(
102: SimpleTypeDefinition typeDefinition, AttributeSet atts)
103: throws XMLException {
104: super ();
105:
106: _typeDefinition = typeDefinition;
107: _schema = typeDefinition.getSchema();
108:
109: //-- base
110: String base = atts.getValue(SchemaNames.BASE_ATTR);
111: if ((base != null) && (base.length() > 0)) {
112:
113: XMLType baseType = _schema.getType(base);
114: if (baseType == null)
115: _typeDefinition.setBaseTypeName(base);
116: else if (baseType.getStructureType() == Structure.COMPLEX_TYPE) {
117: String err = "The base type of a simpleType cannot "
118: + "be a complexType.";
119: throw new IllegalStateException(err);
120: } else
121: _typeDefinition.setBaseType((SimpleType) baseType);
122: }
123:
124: } //-- RestrictionUnmarshaller
125:
126: //-----------/
127: //- Methods -/
128: //-----------/
129:
130: /**
131: * Returns the name of the element that this ComponentReader
132: * handles
133: * @return the name of the element that this ComponentReader
134: * handles
135: **/
136: public String elementName() {
137: return SchemaNames.RESTRICTION;
138: } //-- elementName
139:
140: /**
141: * Returns the Object created by this ComponentReader
142: * @return the Object created by this ComponentReader
143: **/
144: public Object getObject() {
145: return null;
146: } //-- getObject
147:
148: /**
149: * Signals the start of an element with the given name.
150: *
151: * @param name the NCName of the element. It is an error
152: * if the name is a QName (ie. contains a prefix).
153: * @param namespace the namespace of the element. This may be null.
154: * Note: A null namespace is not the same as the default namespace unless
155: * the default namespace is also null.
156: * @param atts the AttributeSet containing the attributes associated
157: * with the element.
158: * @param nsDecls the namespace declarations being declared for this
159: * element. This may be null.
160: **/
161: public void startElement(String name, String namespace,
162: AttributeSet atts, Namespaces nsDecls) throws XMLException {
163: //-- Do delagation if necessary
164: if (unmarshaller != null) {
165: unmarshaller.startElement(name, namespace, atts, nsDecls);
166: ++depth;
167: return;
168: }
169:
170: //-- annotation
171: if (name.equals(SchemaNames.ANNOTATION)) {
172:
173: if (foundFacets || foundSimpleType)
174: error("An annotation must appear as the first child "
175: + "of 'restriction' elements.");
176:
177: if (foundAnnotation)
178: error("Only one (1) annotation may appear as a child of "
179: + "'restriction' elements.");
180:
181: foundAnnotation = true;
182: unmarshaller = new AnnotationUnmarshaller(atts);
183: } else if (SchemaNames.SIMPLE_TYPE.equals(name)) {
184: if (foundSimpleType)
185: error("Only one (1) 'simpleType' may appear as a child of "
186: + "'restriction' elements.");
187:
188: if (foundFacets)
189: error("A 'simpleType', as a child of 'restriction' "
190: + "elements, must appear before any facets.");
191:
192: foundSimpleType = true;
193: unmarshaller = new SimpleTypeUnmarshaller(_schema, atts);
194:
195: } else if (FacetUnmarshaller.isFacet(name)) {
196: foundFacets = true;
197: unmarshaller = new FacetUnmarshaller(name, atts);
198: } else
199: illegalElement(name);
200:
201: unmarshaller.setDocumentLocator(getDocumentLocator());
202: } //-- startElement
203:
204: /**
205: * Signals to end of the element with the given name.
206: *
207: * @param name the NCName of the element. It is an error
208: * if the name is a QName (ie. contains a prefix).
209: * @param namespace the namespace of the element.
210: **/
211: public void endElement(String name, String namespace)
212: throws XMLException {
213:
214: //-- Do delagation if necessary
215: if ((unmarshaller != null) && (depth > 0)) {
216: unmarshaller.endElement(name, namespace);
217: --depth;
218: return;
219: }
220:
221: //-- have unmarshaller perform any necessary clean up
222: unmarshaller.finish();
223:
224: //-- annotation
225: if (SchemaNames.ANNOTATION.equals(name)) {
226: Annotation ann = ((AnnotationUnmarshaller) unmarshaller)
227: .getAnnotation();
228: _typeDefinition.setAnnotation(ann);
229: } else if (SchemaNames.SIMPLE_TYPE.equals(name)) {
230: SimpleType type = (SimpleType) unmarshaller.getObject();
231: _typeDefinition.setBaseType(type);
232: } else {
233: _typeDefinition.addFacet((Facet) unmarshaller.getObject());
234: }
235:
236: unmarshaller = null;
237: } //-- endElement
238:
239: public void characters(char[] ch, int start, int length)
240: throws XMLException {
241: //-- Do delagation if necessary
242: if (unmarshaller != null) {
243: unmarshaller.characters(ch, start, length);
244: }
245: } //-- characters
246:
247: } //-- SimpleTypeRestrictionUnmarshaller
|