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-2004 (C) Intalio, Inc. All Rights Reserved.
042: *
043: * $Id: IncludeUnmarshaller.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.net.*;
048: import org.exolab.castor.xml.*;
049: import org.exolab.castor.xml.schema.*;
050: import org.xml.sax.*;
051:
052: /**
053: * A simple unmarshaller to read included schemas.
054: * Included schemas can be cached in the original parent Schema or
055: * can be inlined in that same XML Schema as recommended by the XML Schema
056: * specification.
057: *
058: * @author <a href="mailto:kvisco@intalio.com">Keith Visco</a>
059: * @author <a href="mailto:blandin@intalio.com">Arnaud Blandin</a>
060: * @version $Revision: 6230 $ $Date: 2006-04-25 15:08:23 -0600 (Tue, 25 Apr 2006) $
061: **/
062: public class IncludeUnmarshaller extends ComponentReader {
063:
064: public IncludeUnmarshaller(Schema schema, AttributeSet atts,
065: Resolver resolver, URIResolver uriResolver,
066: Locator locator, SchemaUnmarshallerState state)
067: throws XMLException {
068: super ();
069: setResolver(resolver);
070: setURIResolver(uriResolver);
071: URILocation uri = null;
072: //-- Get schemaLocation
073: String include = atts.getValue("schemaLocation");
074: if (include == null)
075: throw new SchemaException(
076: "'schemaLocation' attribute missing on 'include'");
077:
078: if (include.indexOf("\\") != -1) {
079: String err = include
080: + " is not a valid URI as defined by IETF RFC 2396.";
081: err += "The URI must not contain '\\'.";
082: throw new SchemaException(err);
083: }
084:
085: try {
086: String documentBase = locator.getSystemId();
087: if (documentBase != null) {
088: if (!documentBase.endsWith("/"))
089: documentBase = documentBase.substring(0,
090: documentBase.lastIndexOf("/") + 1);
091: }
092: uri = getURIResolver().resolve(include, documentBase);
093: } catch (URIException ure) {
094: throw new XMLException(ure);
095: }
096:
097: if (uri != null)
098: include = uri.getAbsoluteURI();
099:
100: //-- Has this schema location been included yet?
101: if (schema.includeProcessed(include)) {
102: return;
103: } else if (include.equals(schema.getSchemaLocation())) {
104: return;
105: }
106:
107: Schema includedSchema = null;
108: boolean alreadyLoaded = false;
109:
110: //-- caching is on
111: if (state.cacheIncludedSchemas) {
112: if (uri instanceof SchemaLocation) {
113: includedSchema = ((SchemaLocation) uri).getSchema();
114: schema.cacheIncludedSchema(includedSchema);
115: alreadyLoaded = true;
116: }
117: //-- Have we already imported this XML Schema file?
118: if (state.processed(include)) {
119: includedSchema = state.getSchema(include);
120: schema.cacheIncludedSchema(includedSchema);
121: alreadyLoaded = true;
122: }
123: }
124:
125: if (includedSchema == null)
126: includedSchema = new Schema();
127: else
128: state.markAsProcessed(include, includedSchema);
129:
130: //-- keep track of the schemaLocation
131: schema.addInclude(include);
132:
133: if (alreadyLoaded)
134: return;
135: Parser parser = null;
136: try {
137: parser = state.getConfiguration().getParser();
138: } catch (RuntimeException rte) {
139: }
140: if (parser == null) {
141: throw new SchemaException(
142: "Error failed to create parser for include");
143: }
144: SchemaUnmarshaller schemaUnmarshaller = new SchemaUnmarshaller(
145: true, state, getURIResolver());
146:
147: if (state.cacheIncludedSchemas)
148: schemaUnmarshaller.setSchema(includedSchema);
149: else
150: schemaUnmarshaller.setSchema(schema);
151:
152: Sax2ComponentReader handler = new Sax2ComponentReader(
153: schemaUnmarshaller);
154: parser.setDocumentHandler(handler);
155: parser.setErrorHandler(handler);
156:
157: try {
158: InputSource source = new InputSource(uri.getReader());
159: source.setSystemId(uri.getAbsoluteURI());
160: parser.parse(source);
161: } catch (java.io.IOException ioe) {
162: throw new SchemaException("Error reading include file '"
163: + include + "'");
164: } catch (org.xml.sax.SAXException sx) {
165: throw new SchemaException(sx);
166: }
167: if (state.cacheIncludedSchemas) {
168: String ns = includedSchema.getTargetNamespace();
169: if (ns == null || ns == "")
170: includedSchema.setTargetNamespace(schema
171: .getTargetNamespace());
172: else if (!ns.equals(schema.getTargetNamespace()))
173: throw new SchemaException(
174: "The target namespace of the included components must be the same as the target namespace of the including schema");
175: schema.cacheIncludedSchema(includedSchema);
176: }
177: }
178:
179: /**
180: * Sets the name of the element that this UnknownUnmarshaller handles
181: **/
182: public String elementName() {
183: return SchemaNames.INCLUDE;
184: } //-- elementName
185:
186: /**
187: * Returns the Object created by this ComponentReader
188: * @return the Object created by this ComponentReader
189: **/
190: public Object getObject() {
191: return null;
192: } //-- getObject
193:
194: }
|