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 (C) Intalio, Inc. All Rights Reserved.
042: *
043: * $Id: Consumer.java 5951 2006-05-30 22:18:48Z bsnyder $
044: */package org.exolab.castor.dsml;
045:
046: import java.util.Enumeration;
047: import org.xml.sax.DocumentHandler;
048: import org.xml.sax.SAXException;
049: import org.xml.sax.AttributeList;
050: import org.xml.sax.Locator;
051: import org.castor.util.Messages;
052:
053: /**
054: *
055: *
056: * @author <a href="mailto:arkin@intalio.com">Assaf Arkin</a>
057: * @version $Revision: 5951 $ $Date: 2006-04-26 13:58:52 -0600 (Wed, 26 Apr 2006) $
058: */
059: public abstract class Consumer implements DocumentHandler {
060:
061: private boolean _insideRoot;
062:
063: private DocumentHandler _redirect;
064:
065: public Consumer() {
066: }
067:
068: public abstract Enumeration getResults();
069:
070: protected abstract DocumentHandler getEntryConsumer();
071:
072: public void startElement(String tagName, AttributeList attr)
073: throws SAXException {
074: if (_redirect != null) {
075: // When redirecting all element creations pass directly to
076: // the other handler, we only look for closure.
077: _redirect.startElement(tagName, attr);
078: } else if (tagName.equals(XML.Namespace.Root)) {
079: // Flag when entering (and leaving) the root element.
080: if (_insideRoot)
081: throw new SAXException(Messages.format(
082: "dsml.elementNested", XML.Namespace.Root));
083: _insideRoot = true;
084: } else {
085: if (!_insideRoot)
086: throw new SAXException(Messages.format(
087: "dsml.expectingOpeningTag", XML.Namespace.Root,
088: tagName));
089: if (tagName.equals(XML.Schema.Element)
090: || tagName.equals(XML.Entries.Element)) {
091: DocumentHandler entry;
092:
093: entry = getEntryConsumer();
094: entry.startElement(tagName, attr);
095: _redirect = entry;
096: } else {
097: throw new SAXException(Messages.format(
098: "dsml.openingTagNotRecognized", tagName));
099: }
100: }
101: }
102:
103: public void endElement(String tagName) throws SAXException {
104: if (_redirect == null) {
105: // This is the only case where we expect the root element
106: // to be closed.
107: if (tagName.equals(XML.Namespace.Root)) {
108: if (_insideRoot == true)
109: _insideRoot = false;
110: else
111: throw new SAXException(Messages.format(
112: "dsml.closingOutsideRoot", tagName));
113: } else {
114: throw new SAXException(Messages.format(
115: "dsml.expectingClosingTag", XML.Namespace.Root,
116: tagName));
117: }
118: } else {
119: _redirect.endElement(tagName);
120:
121: if (tagName.equals(XML.Schema.Element)
122: || tagName.equals(XML.Entries.Element)) {
123: // If we've reached this point we must be inside the
124: // entries/schema redirect.
125: _redirect = null;
126: }
127: // If we've reached this point we must be inside the
128: // entries/schema redirect, we ignore all closing tags.
129: }
130: }
131:
132: public void characters(char[] ch, int offset, int length)
133: throws SAXException {
134: if (_redirect != null) {
135: _redirect.characters(ch, offset, length);
136: }
137: }
138:
139: public void ignorableWhitespace(char[] ch, int offset, int length)
140: throws SAXException {
141: if (_redirect != null) {
142: _redirect.ignorableWhitespace(ch, offset, length);
143: }
144: }
145:
146: public void processingInstruction(String target, String instruction)
147: throws SAXException {
148: if (_redirect != null) {
149: _redirect.processingInstruction(target, instruction);
150: }
151: }
152:
153: public void startDocument() throws SAXException {
154: }
155:
156: public void endDocument() throws SAXException {
157: if (_insideRoot)
158: throw new SAXException(Messages
159: .message("dsml.documentRootStillOpen"));
160: }
161:
162: public void setDocumentLocator(Locator locator) {
163: }
164:
165: }
|