1 /*
   2  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package com.sun.xml.internal.stream.buffer;
  27 
  28 import com.sun.xml.internal.stream.buffer.sax.SAXBufferCreator;
  29 import javax.xml.transform.sax.SAXResult;
  30 import org.xml.sax.ContentHandler;
  31 import org.xml.sax.ext.LexicalHandler;
  32 
  33 /**
  34  * A JAXP Result implementation that supports the serialization to an
  35  * {@link MutableXMLStreamBuffer} for use by applications that expect a Result.
  36  *
  37  * <p>
  38  * Reuse of a XMLStreamBufferResult more than once will require that the
  39  * MutableXMLStreamBuffer is reset by called
  40  * {@link #.getXMLStreamBuffer()}.reset(), or by calling
  41  * {@link #.setXMLStreamBuffer()} with a new instance of
  42  * {@link MutableXMLStreamBuffer}.
  43  *
  44  * <p>
  45  * The derivation of XMLStreamBufferResult from SAXResult is an implementation
  46  * detail.
  47  *
  48  * <p>General applications shall not call the following methods:
  49  * <ul>
  50  * <li>setHandler</li>
  51  * <li>setLexicalHandler</li>
  52  * <li>setSystemId</li>
  53  * </ul>
  54  */
  55 public class XMLStreamBufferResult extends SAXResult {
  56     protected MutableXMLStreamBuffer _buffer;
  57     protected SAXBufferCreator _bufferCreator;
  58 
  59     /**
  60      * The default XMLStreamBufferResult constructor.
  61      *
  62      * <p>
  63      * A {@link MutableXMLStreamBuffer} is instantiated and used.
  64      */
  65     public XMLStreamBufferResult() {
  66         setXMLStreamBuffer(new MutableXMLStreamBuffer());
  67     }
  68 
  69     /**
  70      * XMLStreamBufferResult constructor.
  71      *
  72      * @param buffer the {@link MutableXMLStreamBuffer} to use.
  73      */
  74     public XMLStreamBufferResult(MutableXMLStreamBuffer buffer) {
  75         setXMLStreamBuffer(buffer);
  76     }
  77 
  78     /**
  79      * Get the {@link MutableXMLStreamBuffer} that is used.
  80      *
  81      * @return the {@link MutableXMLStreamBuffer}.
  82      */
  83     public MutableXMLStreamBuffer getXMLStreamBuffer() {
  84         return _buffer;
  85     }
  86 
  87     /**
  88      * Set the {@link MutableXMLStreamBuffer} to use.
  89      *
  90      * @param buffer the {@link MutableXMLStreamBuffer}.
  91      */
  92     public void setXMLStreamBuffer(MutableXMLStreamBuffer buffer) {
  93         if (buffer == null) {
  94             throw new NullPointerException("buffer cannot be null");
  95         }
  96         _buffer = buffer;
  97         setSystemId(_buffer.getSystemId());
  98 
  99         if (_bufferCreator != null) {
 100             _bufferCreator.setXMLStreamBuffer(_buffer);
 101         }
 102     }
 103 
 104     public ContentHandler getHandler() {
 105         if (_bufferCreator == null) {
 106             _bufferCreator = new SAXBufferCreator(_buffer);
 107             setHandler(_bufferCreator);
 108         } else if (super.getHandler() == null) {
 109             setHandler(_bufferCreator);
 110         }
 111 
 112         return _bufferCreator;
 113     }
 114 
 115     public LexicalHandler getLexicalHandler() {
 116         return (LexicalHandler) getHandler();
 117     }
 118 }