001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: package org.apache.xerces.util;
019:
020: import java.io.InputStream;
021: import java.io.IOException;
022: import java.io.Reader;
023:
024: import org.apache.xerces.xni.XNIException;
025: import org.apache.xerces.xni.XMLResourceIdentifier;
026: import org.apache.xerces.xni.parser.XMLEntityResolver;
027: import org.apache.xerces.xni.parser.XMLInputSource;
028:
029: import org.xml.sax.EntityResolver;
030: import org.xml.sax.InputSource;
031: import org.xml.sax.SAXException;
032:
033: /**
034: * This class wraps a SAX entity resolver in an XNI entity resolver.
035: *
036: * @see EntityResolver
037: *
038: * @author Andy Clark, IBM
039: *
040: * @version $Id: EntityResolverWrapper.java 447241 2006-09-18 05:12:57Z mrglavas $
041: */
042: public class EntityResolverWrapper implements XMLEntityResolver {
043:
044: //
045: // Data
046: //
047:
048: /** The SAX entity resolver. */
049: protected EntityResolver fEntityResolver;
050:
051: //
052: // Constructors
053: //
054:
055: /** Default constructor. */
056: public EntityResolverWrapper() {
057: }
058:
059: /** Wraps the specified SAX entity resolver. */
060: public EntityResolverWrapper(EntityResolver entityResolver) {
061: setEntityResolver(entityResolver);
062: } // <init>(EntityResolver)
063:
064: //
065: // Public methods
066: //
067:
068: /** Sets the SAX entity resolver. */
069: public void setEntityResolver(EntityResolver entityResolver) {
070: fEntityResolver = entityResolver;
071: } // setEntityResolver(EntityResolver)
072:
073: /** Returns the SAX entity resolver. */
074: public EntityResolver getEntityResolver() {
075: return fEntityResolver;
076: } // getEntityResolver():EntityResolver
077:
078: //
079: // XMLEntityResolver methods
080: //
081:
082: /**
083: * Resolves an external parsed entity. If the entity cannot be
084: * resolved, this method should return null.
085: *
086: * @param resourceIdentifier contains the physical co-ordinates of the resource to be resolved
087: *
088: * @throws XNIException Thrown on general error.
089: * @throws IOException Thrown if resolved entity stream cannot be
090: * opened or some other i/o error occurs.
091: */
092: public XMLInputSource resolveEntity(
093: XMLResourceIdentifier resourceIdentifier)
094: throws XNIException, IOException {
095:
096: // When both pubId and sysId are null, the user's entity resolver
097: // can do nothing about it. We'd better not bother calling it.
098: // This happens when the resourceIdentifier is a GrammarDescription,
099: // which describes a schema grammar of some namespace, but without
100: // any schema location hint. -Sg
101: String pubId = resourceIdentifier.getPublicId();
102: String sysId = resourceIdentifier.getExpandedSystemId();
103: if (pubId == null && sysId == null)
104: return null;
105:
106: // resolve entity using SAX entity resolver
107: if (fEntityResolver != null && resourceIdentifier != null) {
108: try {
109: InputSource inputSource = fEntityResolver
110: .resolveEntity(pubId, sysId);
111: if (inputSource != null) {
112: String publicId = inputSource.getPublicId();
113: String systemId = inputSource.getSystemId();
114: String baseSystemId = resourceIdentifier
115: .getBaseSystemId();
116: InputStream byteStream = inputSource
117: .getByteStream();
118: Reader charStream = inputSource
119: .getCharacterStream();
120: String encoding = inputSource.getEncoding();
121: XMLInputSource xmlInputSource = new XMLInputSource(
122: publicId, systemId, baseSystemId);
123: xmlInputSource.setByteStream(byteStream);
124: xmlInputSource.setCharacterStream(charStream);
125: xmlInputSource.setEncoding(encoding);
126: return xmlInputSource;
127: }
128: }
129:
130: // error resolving entity
131: catch (SAXException e) {
132: Exception ex = e.getException();
133: if (ex == null) {
134: ex = e;
135: }
136: throw new XNIException(ex);
137: }
138: }
139:
140: // unable to resolve entity
141: return null;
142:
143: } // resolveEntity(String,String,String):XMLInputSource
144: }
|