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 1999-2003 (C) Intalio, Inc. All Rights Reserved.
042: *
043: * $Id: AppInfoUnmarshaller.java 6231 2006-09-20 10:55:10Z 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.AppInfo;
051: import org.exolab.castor.xml.schema.SchemaNames;
052:
053: import org.exolab.castor.types.AnyNode;
054: import java.util.Enumeration;
055: import java.util.Stack;
056:
057: /**
058: * A class for unmarshalling XML Schema {@literal <appinfo>} elements
059: * @author <a href="mailto:kvisco@intalio.com">Keith Visco</a>
060: * @version $Revision: 6231 $ $Date: 2004-10-01 07:25:46 -0600 (Fri, 01 Oct 2004) $
061: **/
062: public class AppInfoUnmarshaller extends ComponentReader {
063:
064: //--------------------/
065: //- Member Variables -/
066: //--------------------/
067:
068: /**
069: * The Attribute reference for the Attribute we are constructing
070: */
071: private AppInfo _appInfo = null;
072:
073: /**
074: * Stack of AnyNodes being unmarshalled
075: */
076: private Stack _nodes = null;
077:
078: //----------------/
079: //- Constructors -/
080: //----------------/
081:
082: /**
083: * Creates a new AppInfoUnmarshaller
084: * @param atts the AttributeList
085: **/
086: public AppInfoUnmarshaller(AttributeSet atts) throws XMLException {
087: super ();
088:
089: _appInfo = new AppInfo();
090: _appInfo.setSource(atts.getValue(SchemaNames.SOURCE_ATTR));
091:
092: _nodes = new Stack();
093:
094: } //-- AppInfoUnmarshaller
095:
096: //-----------/
097: //- Methods -/
098: //-----------/
099:
100: /**
101: *
102: **/
103: public AppInfo getAppInfo() {
104: return _appInfo;
105: } //-- getArchetype
106:
107: /**
108: * Returns the name of the element that this ComponentReader
109: * handles
110: * @return the name of the element that this ComponentReader
111: * handles
112: **/
113: public String elementName() {
114: return SchemaNames.APPINFO;
115: } //-- elementName
116:
117: /**
118: * Called to signal an end of unmarshalling. This method should
119: * be overridden to perform any necessary clean up by an unmarshaller
120: **/
121: public void finish() {
122: //-- do nothing
123: } //-- finish
124:
125: /**
126: * Returns the Object created by this ComponentReader
127: * @return the Object created by this ComponentReader
128: **/
129: public Object getObject() {
130: return getAppInfo();
131: } //-- getObject
132:
133: /**
134: * Signals the start of an element with the given name.
135: *
136: * @param name the NCName of the element. It is an error
137: * if the name is a QName (ie. contains a prefix).
138: * @param namespace the namespace of the element. This may be null.
139: * Note: A null namespace is not the same as the default namespace unless
140: * the default namespace is also null.
141: * @param atts the AttributeSet containing the attributes associated
142: * with the element.
143: * @param nsDecls the namespace declarations being declared for this
144: * element. This may be null.
145: **/
146: public void startElement(String name, String namespace,
147: AttributeSet atts, Namespaces nsDecls) throws XMLException {
148:
149: String prefix = null;
150: if (nsDecls != null) {
151: //-- find prefix (elements use default namespace if null)
152: if (namespace == null)
153: namespace = "";
154: prefix = nsDecls.getNamespacePrefix(namespace);
155: }
156:
157: AnyNode node = new AnyNode(AnyNode.ELEMENT, name, prefix,
158: namespace, null);
159: _nodes.push(node);
160:
161: //-- process namespace nodes
162: if (nsDecls != null) {
163: Enumeration enumeration = nsDecls.getLocalNamespaces();
164: while (enumeration.hasMoreElements()) {
165: namespace = (String) enumeration.nextElement();
166: prefix = nsDecls.getNamespacePrefix(namespace);
167: node.addNamespace(new AnyNode(AnyNode.NAMESPACE, null, //-- no local name for a ns decl.
168: prefix, namespace, null)); //-- no value
169: }
170: }
171: //-- process attributes
172: if (atts != null) {
173: for (int i = 0; i < atts.getSize(); i++) {
174: namespace = atts.getNamespace(i);
175: if ((nsDecls != null) && (namespace != null)) {
176: prefix = nsDecls.getNamespacePrefix(namespace);
177: } else
178: prefix = null;
179: node.addAttribute(new AnyNode(AnyNode.ATTRIBUTE, atts
180: .getName(i), prefix, namespace, atts
181: .getValue(i)));
182: }
183: }
184:
185: } //-- startElement
186:
187: /**
188: * Signals to end of the element with the given name.
189: *
190: * @param name the NCName of the element. It is an error
191: * if the name is a QName (ie. contains a prefix).
192: * @param namespace the namespace of the element.
193: **/
194: public void endElement(String name, String namespace)
195: throws XMLException {
196: AnyNode node = (AnyNode) _nodes.pop();
197: if (_nodes.isEmpty()) {
198: //-- add to appInfo
199: _appInfo.add(node);
200: } else {
201: //-- add to parent AnyNode
202: ((AnyNode) _nodes.peek()).addChild(node);
203: }
204: } //-- endElement
205:
206: public void characters(char[] ch, int start, int length)
207: throws XMLException {
208: //-- Do delagation if necessary
209: AnyNode text = new AnyNode(AnyNode.TEXT, null, //-- no local name for text nodes
210: null, //-- no prefix
211: null, //-- no namespace
212: new String(ch, start, length));
213:
214: if (!_nodes.isEmpty()) {
215: AnyNode parent = (AnyNode) _nodes.peek();
216: parent.addChild(text);
217: } else {
218: _appInfo.add(text);
219: }
220:
221: } //-- characters
222:
223: } //-- AppInfoUnmarshaller
|