1 /*
2  * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
3  */
4 /*
5  * Licensed to the Apache Software Foundation (ASF) under one or more
6  * contributor license agreements.  See the NOTICE file distributed with
7  * this work for additional information regarding copyright ownership.
8  * The ASF licenses this file to You under the Apache License, Version 2.0
9  * (the "License"); you may not use this file except in compliance with
10  * the License.  You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20 
21 package com.sun.org.apache.xerces.internal.util;
22 
23 import java.io.InputStream;
24 import java.io.IOException;
25 import java.io.Reader;
26 
27 import com.sun.org.apache.xerces.internal.xni.XNIException;
28 import com.sun.org.apache.xerces.internal.xni.XMLResourceIdentifier;
29 import com.sun.org.apache.xerces.internal.xni.parser.XMLEntityResolver;
30 import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource;
31 import javax.xml.catalog.CatalogException;
32 
33 import org.xml.sax.EntityResolver;
34 import org.xml.sax.InputSource;
35 import org.xml.sax.SAXException;
36 
37 /**
38  * This class wraps a SAX entity resolver in an XNI entity resolver.
39  *
40  * @see EntityResolver
41  *
42  * @author Andy Clark, IBM
43  *
44  */
45 public class EntityResolverWrapper
46     implements XMLEntityResolver {
47 
48     //
49     // Data
50     //
51 
52     /** The SAX entity resolver. */
53     protected EntityResolver fEntityResolver;
54 
55     //
56     // Constructors
57     //
58 
59     /** Default constructor. */
EntityResolverWrapper()60     public EntityResolverWrapper() {}
61 
62     /** Wraps the specified SAX entity resolver. */
EntityResolverWrapper(EntityResolver entityResolver)63     public EntityResolverWrapper(EntityResolver entityResolver) {
64         setEntityResolver(entityResolver);
65     } // <init>(EntityResolver)
66 
67     //
68     // Public methods
69     //
70 
71     /** Sets the SAX entity resolver. */
setEntityResolver(EntityResolver entityResolver)72     public void setEntityResolver(EntityResolver entityResolver) {
73         fEntityResolver = entityResolver;
74     } // setEntityResolver(EntityResolver)
75 
76     /** Returns the SAX entity resolver. */
getEntityResolver()77     public EntityResolver getEntityResolver() {
78         return fEntityResolver;
79     } // getEntityResolver():EntityResolver
80 
81     //
82     // XMLEntityResolver methods
83     //
84 
85     /**
86      * Resolves an external parsed entity. If the entity cannot be
87      * resolved, this method should return null.
88      *
89      * @param resourceIdentifier        contains the physical co-ordinates of the resource to be resolved
90      *
91      * @throws XNIException Thrown on general error.
92      * @throws IOException  Thrown if resolved entity stream cannot be
93      *                      opened or some other i/o error occurs.
94      */
resolveEntity(XMLResourceIdentifier resourceIdentifier)95     public XMLInputSource resolveEntity(XMLResourceIdentifier resourceIdentifier)
96         throws XNIException, IOException {
97 
98         // When both pubId and sysId are null, the user's entity resolver
99         // can do nothing about it. We'd better not bother calling it.
100         // This happens when the resourceIdentifier is a GrammarDescription,
101         // which describes a schema grammar of some namespace, but without
102         // any schema location hint. -Sg
103         String pubId = resourceIdentifier.getPublicId();
104         String sysId = resourceIdentifier.getExpandedSystemId();
105         if (pubId == null && sysId == null)
106             return null;
107 
108         // resolve entity using SAX entity resolver
109         if (fEntityResolver != null && resourceIdentifier != null) {
110             try {
111                 InputSource inputSource = fEntityResolver.resolveEntity(pubId, sysId);
112                 if (inputSource != null) {
113                     String publicId = inputSource.getPublicId();
114                     String systemId = inputSource.getSystemId();
115                     String baseSystemId = resourceIdentifier.getBaseSystemId();
116                     InputStream byteStream = inputSource.getByteStream();
117                     Reader charStream = inputSource.getCharacterStream();
118                     String encoding = inputSource.getEncoding();
119                     XMLInputSource xmlInputSource =
120                         new XMLInputSource(publicId, systemId, baseSystemId, true);
121                     xmlInputSource.setByteStream(byteStream);
122                     xmlInputSource.setCharacterStream(charStream);
123                     xmlInputSource.setEncoding(encoding);
124                     return xmlInputSource;
125                 }
126             }
127 
128             // error resolving entity
129             catch (SAXException e) {
130                 Exception ex = e.getException();
131                 if (ex == null) {
132                     ex = e;
133                 }
134                 throw new XNIException(ex);
135             }
136 
137             catch (CatalogException e) {
138                 throw new XNIException(e);
139             }
140         }
141 
142         // unable to resolve entity
143         return null;
144 
145     } // resolveEntity(String,String,String):XMLInputSource
146 }
147