1 /* 2 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. 3 * @LastModified: Oct 2017 4 */ 5 /* 6 * Licensed to the Apache Software Foundation (ASF) under one or more 7 * contributor license agreements. See the NOTICE file distributed with 8 * this work for additional information regarding copyright ownership. 9 * The ASF licenses this file to You under the Apache License, Version 2.0 10 * (the "License"); you may not use this file except in compliance with 11 * the License. You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 */ 21 22 23 package com.sun.org.apache.xalan.internal.xsltc.trax; 24 25 import com.sun.org.apache.xalan.internal.xsltc.DOM; 26 import com.sun.org.apache.xalan.internal.xsltc.StripFilter; 27 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg; 28 import com.sun.org.apache.xalan.internal.xsltc.dom.DOMWSFilter; 29 import com.sun.org.apache.xalan.internal.xsltc.dom.SAXImpl; 30 import com.sun.org.apache.xalan.internal.xsltc.dom.XSLTCDTMManager; 31 import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; 32 import javax.xml.transform.Source; 33 import javax.xml.transform.stream.StreamSource; 34 import org.xml.sax.SAXException; 35 36 /** 37 * @author Morten Jorgensen 38 */ 39 public final class XSLTCSource implements Source { 40 41 private String _systemId = null; 42 private Source _source = null; 43 private ThreadLocal<SAXImpl> _dom = new ThreadLocal<>(); 44 45 /** 46 * Create a new XSLTC-specific source from a system ID 47 */ 48 public XSLTCSource(String systemId) 49 { 50 _systemId = systemId; 51 } 52 53 /** 54 * Create a new XSLTC-specific source from a JAXP Source 55 */ 56 public XSLTCSource(Source source) 57 { 58 _source = source; 59 } 60 61 /** 62 * Implements javax.xml.transform.Source.setSystemId() 63 * Set the system identifier for this Source. 64 * This Source can get its input either directly from a file (in this case 65 * it will instanciate and use a JAXP parser) or it can receive it through 66 * ContentHandler/LexicalHandler interfaces. 67 * @param systemId The system Id for this Source 68 */ 69 public void setSystemId(String systemId) { 70 _systemId = systemId; 71 if (_source != null) { 72 _source.setSystemId(systemId); 73 } 74 } 75 76 /** 77 * Implements javax.xml.transform.Source.getSystemId() 78 * Get the system identifier that was set with setSystemId. 79 * @return The system identifier that was set with setSystemId, 80 * or null if setSystemId was not called. 81 */ 82 public String getSystemId() { 83 if (_source != null) { 84 return _source.getSystemId(); 85 } 86 else { 87 return(_systemId); 88 } 89 } 90 91 /** 92 * Internal interface which returns a DOM for a given DTMManager and translet. 93 */ 94 protected DOM getDOM(XSLTCDTMManager dtmManager, AbstractTranslet translet) 95 throws SAXException 96 { 97 SAXImpl idom = (SAXImpl)_dom.get(); 98 99 if (idom != null) { 100 if (dtmManager != null) { 101 idom.migrateTo(dtmManager); 102 } 103 } 104 else { 105 Source source = _source; 106 if (source == null) { 107 if (_systemId != null && _systemId.length() > 0) { 108 source = new StreamSource(_systemId); 109 } 110 else { 111 ErrorMsg err = new ErrorMsg(ErrorMsg.XSLTC_SOURCE_ERR); 112 throw new SAXException(err.toString()); 113 } 114 } 115 116 DOMWSFilter wsfilter = null; 117 if (translet != null && translet instanceof StripFilter) { 118 wsfilter = new DOMWSFilter(translet); 119 } 120 121 boolean hasIdCall = (translet != null) ? translet.hasIdCall() : false; 122 123 if (dtmManager == null) { 124 dtmManager = XSLTCDTMManager.newInstance(); 125 } 126 127 idom = (SAXImpl)dtmManager.getDTM(source, true, wsfilter, false, false, hasIdCall); 128 129 String systemId = getSystemId(); 130 if (systemId != null) { 131 idom.setDocumentURI(systemId); 132 } 133 _dom.set(idom); 134 } 135 return idom; 136 } 137 138 }