EntityResolverWrapper.java revision 988:1c6c21d87aa4
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 21package com.sun.org.apache.xerces.internal.util; 22 23import java.io.InputStream; 24import java.io.IOException; 25import java.io.Reader; 26 27import com.sun.org.apache.xerces.internal.xni.XNIException; 28import com.sun.org.apache.xerces.internal.xni.XMLResourceIdentifier; 29import com.sun.org.apache.xerces.internal.xni.parser.XMLEntityResolver; 30import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource; 31import javax.xml.catalog.CatalogException; 32 33import org.xml.sax.EntityResolver; 34import org.xml.sax.InputSource; 35import 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 */ 45public 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. */ 60 public EntityResolverWrapper() {} 61 62 /** Wraps the specified SAX entity resolver. */ 63 public EntityResolverWrapper(EntityResolver entityResolver) { 64 setEntityResolver(entityResolver); 65 } // <init>(EntityResolver) 66 67 // 68 // Public methods 69 // 70 71 /** Sets the SAX entity resolver. */ 72 public void setEntityResolver(EntityResolver entityResolver) { 73 fEntityResolver = entityResolver; 74 } // setEntityResolver(EntityResolver) 75 76 /** Returns the SAX entity resolver. */ 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 */ 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