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 1999-2002 (C) Intalio Inc. All Rights Reserved.
42 *
43 * $Id$
44 */
45
46 package org.exolab.castor.xml.schema.reader;
47
48 //-- imported classes and packages
49 import org.exolab.castor.xml.AttributeSet;
50 import org.exolab.castor.xml.Namespaces;
51 import org.exolab.castor.xml.XMLException;
52 import org.exolab.castor.xml.schema.Annotation;
53 import org.exolab.castor.xml.schema.ComplexType;
54 import org.exolab.castor.xml.schema.SchemaContext;
55 import org.exolab.castor.xml.schema.SchemaNames;
56
57 /**
58 * A class for Unmarshalling simpleContent
59 * @author <a href="mailto:kvisco@intalio.com">Keith Visco</a>
60 * @version $Revision$ $Date: 2006-04-14 04:14:43 -0600 (Fri, 14 Apr 2006) $
61 **/
62 public class SimpleContentUnmarshaller extends ComponentReader {
63
64 //--------------------/
65 //- Member Variables -/
66 //--------------------/
67
68 /**
69 * The current ComponentReader
70 **/
71 private ComponentReader unmarshaller;
72
73 /**
74 * The current branch depth
75 **/
76 private int depth = 0;
77
78 /**
79 * The Attribute reference for the Attribute we are constructing
80 **/
81 private ComplexType _complexType = null;
82
83 private boolean foundAnnotation = false;
84 private boolean foundExtension = false;
85 private boolean foundRestriction = false;
86
87 //----------------/
88 //- Constructors -/
89 //----------------/
90
91 /**
92 * Creates a new SimpleContentUnmarshaller.
93 * @param schemaContext the {@link SchemaContext} to get some configuration settings from
94 * @param complexType the complexType we are unmarshalling
95 * @param atts the AttributeList
96 **/
97 public SimpleContentUnmarshaller(
98 final SchemaContext schemaContext,
99 final ComplexType complexType,
100 final AttributeSet atts)
101 throws XMLException {
102
103 super(schemaContext);
104
105 _complexType = complexType;
106 } //-- SimpleContentUnmarshaller
107
108 //-----------/
109 //- Methods -/
110 //-----------/
111
112 /**
113 * Returns the name of the element that this ComponentReader
114 * handles
115 * @return the name of the element that this ComponentReader
116 * handles
117 **/
118 public String elementName() {
119 return SchemaNames.SIMPLE_CONTENT;
120 } //-- elementName
121
122 /**
123 * Returns the Object created by this ComponentReader
124 * @return the Object created by this ComponentReader
125 **/
126 public Object getObject() {
127 return null;
128 } //-- getObject
129
130 /**
131 * Signals the start of an element with the given name.
132 *
133 * @param name the NCName of the element. It is an error
134 * if the name is a QName (ie. contains a prefix).
135 * @param namespace the namespace of the element. This may be null.
136 * Note: A null namespace is not the same as the default namespace unless
137 * the default namespace is also null.
138 * @param atts the AttributeSet containing the attributes associated
139 * with the element.
140 * @param nsDecls the namespace declarations being declared for this
141 * element. This may be null.
142 **/
143 public void startElement(String name, String namespace, AttributeSet atts,
144 Namespaces nsDecls)
145 throws XMLException
146 {
147 //-- Do delagation if necessary
148 if (unmarshaller != null) {
149 unmarshaller.startElement(name, namespace, atts, nsDecls);
150 ++depth;
151 return;
152 }
153
154 //-- extension
155 if (SchemaNames.EXTENSION.equals(name)) {
156
157 if (foundExtension)
158 error("Only (1) 'extension' element may appear as a child "+
159 "of 'simpleContent' elements.");
160
161 if (foundRestriction)
162 error("Both 'extension' and 'restriction' elements may not "+
163 "appear as children of the same simpleContent "+
164 "definition.");
165
166 foundExtension = true;
167 unmarshaller
168 = new ExtensionUnmarshaller(getSchemaContext(), _complexType, atts);
169 }
170 //-- restriction
171 else if (SchemaNames.RESTRICTION.equals(name)) {
172
173 if (foundRestriction)
174 error("Only (1) 'restriction' element may appear as a child "+
175 "of 'simpleContent' elements.");
176
177 if (foundExtension)
178 error("Both 'extension' and 'restriction' elements may not "+
179 "appear as children of the same simpleContent "+
180 "definition.");
181
182 foundRestriction = true;
183
184 unmarshaller =
185 new SimpleContentRestrictionUnmarshaller(getSchemaContext(), _complexType, atts);
186 }
187 //-- annotation
188 else if (name.equals(SchemaNames.ANNOTATION)) {
189 if (foundAnnotation)
190 error("Only (1) 'annotation' element may appear as a child "+
191 "of 'simpleContent' elements.");
192
193 if (foundRestriction || foundExtension)
194 error("An 'annotation' may only appear as the first child "+
195 "of a 'simpleContent' element.");
196
197 foundAnnotation = true;
198 unmarshaller = new AnnotationUnmarshaller(getSchemaContext(), atts);
199 }
200 else illegalElement(name);
201
202 unmarshaller.setDocumentLocator(getDocumentLocator());
203 } //-- startElement
204
205 /**
206 * Signals to end of the element with the given name.
207 *
208 * @param name the NCName of the element. It is an error
209 * if the name is a QName (ie. contains a prefix).
210 * @param namespace the namespace of the element.
211 **/
212 public void endElement(String name, String namespace)
213 throws XMLException
214 {
215
216 //-- Do delagation if necessary
217 if ((unmarshaller != null) && (depth > 0)) {
218 unmarshaller.endElement(name, namespace);
219 --depth;
220 return;
221 }
222
223 //-- have unmarshaller perform any necessary clean up
224 unmarshaller.finish();
225
226 //-- annotation
227 if (SchemaNames.ANNOTATION.equals(name)) {
228 Annotation ann = ((AnnotationUnmarshaller)unmarshaller).getAnnotation();
229 _complexType.addAnnotation(ann);
230 }
231
232 unmarshaller = null;
233 } //-- endElement
234
235 public void characters(char[] ch, int start, int length)
236 throws XMLException
237 {
238 //-- Do delagation if necessary
239 if (unmarshaller != null) {
240 unmarshaller.characters(ch, start, length);
241 }
242 } //-- characters
243
244 } //-- SimpleContentUnmarshaller