1 /*
   2  * Copyright (c) 2017, 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 
  22 package com.sun.org.apache.xalan.internal.xsltc.trax;
  23 
  24 import java.io.IOException;
  25 
  26 import javax.xml.transform.ErrorListener;
  27 import javax.xml.transform.Templates;
  28 import javax.xml.transform.Transformer;
  29 import javax.xml.transform.TransformerConfigurationException;
  30 import javax.xml.transform.sax.SAXResult;
  31 
  32 import com.sun.org.apache.xml.internal.utils.XMLReaderManager;
  33 import jdk.xml.internal.JdkXmlUtils;
  34 
  35 import org.xml.sax.ContentHandler;
  36 import org.xml.sax.InputSource;
  37 import org.xml.sax.SAXException;
  38 import org.xml.sax.XMLReader;
  39 import org.xml.sax.helpers.XMLFilterImpl;
  40 
  41 /**
  42  * skeleton extension of XMLFilterImpl for now.
  43  * @author Santiago Pericas-Geertsen
  44  * @author G. Todd Miller
  45  */
  46 public class TrAXFilter extends XMLFilterImpl {
  47     private Templates              _templates;
  48     private TransformerImpl        _transformer;
  49     private TransformerHandlerImpl _transformerHandler;
  50     private boolean _overrideDefaultParser;
  51 
  52     public TrAXFilter(Templates templates)  throws
  53         TransformerConfigurationException
  54     {
  55         _templates = templates;
  56         _transformer = (TransformerImpl) templates.newTransformer();
  57         _transformerHandler = new TransformerHandlerImpl(_transformer);
  58         _overrideDefaultParser = _transformer.overrideDefaultParser();
  59     }
  60 
  61     public Transformer getTransformer() {
  62         return _transformer;
  63     }
  64 
  65     private void createParent() throws SAXException {
  66         XMLReader parent = JdkXmlUtils.getXMLReader(_overrideDefaultParser,
  67                 _transformer.isSecureProcessing());
  68 
  69         // make this XMLReader the parent of this filter
  70         setParent(parent);
  71     }
  72 
  73     @Override
  74     public void parse (InputSource input) throws SAXException, IOException
  75     {
  76         XMLReader managedReader = null;
  77 
  78         try {
  79             if (getParent() == null) {
  80                 try {
  81                     managedReader = XMLReaderManager.getInstance(_overrideDefaultParser)
  82                                                     .getXMLReader();
  83                     setParent(managedReader);
  84                 } catch (SAXException  e) {
  85                     throw new SAXException(e.toString());
  86                 }
  87             }
  88 
  89             // call parse on the parent
  90             getParent().parse(input);
  91         } finally {
  92             if (managedReader != null) {
  93                 XMLReaderManager.getInstance(_overrideDefaultParser).releaseXMLReader(managedReader);
  94             }
  95         }
  96     }
  97 
  98     public void parse (String systemId) throws SAXException, IOException
  99     {
 100         parse(new InputSource(systemId));
 101     }
 102 
 103     public void setContentHandler (ContentHandler handler)
 104     {
 105         _transformerHandler.setResult(new SAXResult(handler));
 106         if (getParent() == null) {
 107                 try {
 108                     createParent();
 109                 }
 110                 catch (SAXException  e) {
 111                    return;
 112                 }
 113         }
 114         getParent().setContentHandler(_transformerHandler);
 115     }
 116 
 117     public void setErrorListener (ErrorListener handler) { }
 118 }