Module org.hsqldb

Class JDBCSQLXML

  • All Implemented Interfaces:
    java.sql.SQLXML

    public class JDBCSQLXML
    extends java.lang.Object
    implements java.sql.SQLXML
    The mapping in the JavaTM programming language for the SQL XML type. XML is a built-in type that stores an XML value as a column value in a row of a database table. By default drivers implement an SQLXML object as a logical pointer to the XML data rather than the data itself. An SQLXML object is valid for the duration of the transaction in which it was created.

    The SQLXML interface provides methods for accessing the XML value as a String, a Reader or Writer, or as a Stream. The XML value may also be accessed through a Source or set as a Result, which are used with XML Parser APIs such as DOM, SAX, and StAX, as well as with XSLT transforms and XPath evaluations.

    Methods in the interfaces ResultSet, CallableStatement, and PreparedStatement, such as getSQLXML allow a programmer to access an XML value. In addition, this interface has methods for updating an XML value.

    The XML value of the SQLXML instance may be obtained as a BinaryStream using

       SQLXML sqlxml = resultSet.getSQLXML(column);
       InputStream binaryStream = sqlxml.getBinaryStream();
     
    For example, to parse an XML value with a DOM parser:
       DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
       Document result = parser.parse(binaryStream);
     
    or to parse an XML value with a SAX parser to your handler:
       SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
       parser.parse(binaryStream, myHandler);
     
    or to parse an XML value with a StAX parser:
       XMLInputFactory factory = XMLInputFactory.newInstance();
       XMLStreamReader streamReader = factory.createXMLStreamReader(binaryStream);
     

    Because databases may use an optimized representation for the XML, accessing the value through getSource() and setResult() can lead to improved processing performance without serializing to a stream representation and parsing the XML.

    For example, to obtain a DOM Document Node:

       DOMSource domSource = sqlxml.getSource(DOMSource.class);
       Document document = (Document) domSource.getNode();
     
    or to set the value to a DOM Document Node to myNode:
       DOMResult domResult = sqlxml.setResult(DOMResult.class);
       domResult.setNode(myNode);
     
    or, to send SAX events to your handler:
       SAXSource saxSource = sqlxml.getSource(SAXSource.class);
       XMLReader xmlReader = saxSource.getXMLReader();
       xmlReader.setContentHandler(myHandler);
       xmlReader.parse(saxSource.getInputSource());
     
    or, to set the result value from SAX events:
       SAXResult saxResult = sqlxml.setResult(SAXResult.class);
       ContentHandler contentHandler = saxResult.getXMLReader().getContentHandler();
       contentHandler.startDocument();
       // set the XML elements and attributes into the result
       contentHandler.endDocument();
     
    or, to obtain StAX events:
       StAXSource staxSource = sqlxml.getSource(StAXSource.class);
       XMLStreamReader streamReader = staxSource.getXMLStreamReader();
     
    or, to set the result value from StAX events:
       StAXResult staxResult = sqlxml.getResult(StAXResult.class);
       XMLStreamWriter streamWriter = staxResult.getXMLStreamWriter();
     
    or, to perform XSLT transformations on the XML value using the XSLT in xsltFile output to file resultFile:
       File xsltFile = new File("a.xslt");
       File myFile = new File("result.xml");
       Transformer xslt = TransformerFactory.newInstance().newTransformer(new StreamSource(xsltFile));
       Source source = sqlxml.getSource(null);
       Result result = new StreamResult(myFile);
       xslt.transform(source, result);
     
    or, to evaluate an XPath expression on the XML value:
       XPath xpath = XPathFactory.newInstance().newXPath();
       DOMSource domSource = sqlxml.getSource(DOMSource.class);
       Document document = (Document) domSource.getNode();
       String expression = "/foo/@bar";
       String barValue = xpath.evaluate(expression, document);
     
    To set the XML value to be the result of an XSLT transform:
       File sourceFile = new File("source.xml");
       Transformer xslt = TransformerFactory.newInstance().newTransformer(new StreamSource(xsltFile));
       Source streamSource = new StreamSource(sourceFile);
       Result result = sqlxml.setResult(null);
       xslt.transform(streamSource, result);
     
    Any Source can be transformed to a Result using the identity transform specified by calling newTransformer():
       Transformer identity = TransformerFactory.newInstance().newTransformer();
       Source source = sqlxml.getSource(null);
       File myFile = new File("result.xml");
       Result result = new StreamResult(myFile);
       identity.transform(source, result);
     
    To write the contents of a Source to standard output:
       Transformer identity = TransformerFactory.newInstance().newTransformer();
       Source source = sqlxml.getSource(null);
       Result result = new StreamResult(System.out);
       identity.transform(source, result);
     
    To create a DOMSource from a DOMResult:
        DOMSource domSource = new DOMSource(domResult.getNode());
     

    Incomplete or invalid XML values may cause an SQLException when set or the exception may occur when execute() occurs. All streams must be closed before execute() occurs or an SQLException will be thrown.

    Reading and writing XML values to or from an SQLXML object can happen at most once. The conceptual states of readable and not readable determine if one of the reading APIs will return a value or throw an exception. The conceptual states of writable and not writable determine if one of the writing APIs will set a value or throw an exception.

    The state moves from readable to not readable once free() or any of the reading APIs are called: getBinaryStream(), getCharacterStream(), getSource(), and getString(). Implementations may also change the state to not writable when this occurs.

    The state moves from writable to not writeable once free() or any of the writing APIs are called: setBinaryStream(), setCharacterStream(), setResult(), and setString(). Implementations may also change the state to not readable when this occurs.

    All methods on the SQLXML interface must be fully implemented if the JDBC driver supports the data type.

    HSQLDB-Specific Information:

    Starting with HSQLDB 2.0, a rudimentary client-side SQLXML interface implementation (this class) is supported for local use when the product is built and run under JDK 1.6+ and the SQLXML instance is constructed as the result of calling JDBCConnection.createSQLXML().

    SQLXML instances retrieved in such a fashion are initially write-only, with the lifecycle of read and write availability constrained in accordance with the documentation of the interface methods.

    When build and run under JDK 1.6+, it is also possible to retrieve read-only SQLXML instances from JDBCResultSet.getSQLXML(...), given that the underlying data can be converted to an XML Document Object Model (DOM).

    However, at the time of this writing (2007-06-12) it is not yet possible to store SQLXML objects directly into an HSQLDB database or to use them directly for HSQLDB statement parameterization purposes. This is because the SQLXML data type is not yet natively supported by the HSQLDB engine. Instead, a JDBCSQLXML instance must first be read as a string, binary input stream, character input stream and so on, which can then be used for such purposes.

    Here is the current read/write availability lifecycle for JDBCSQLXML:

    Lifecycle
    Origin Initially After 1st Write After 1st Read After 1st Free
    org.hsqldb.jdbc.JDBCConnection.createSQLXML() Write-only Read-only Not readable or writable Not readable or writable
    org.hsqldb.jdbc.JDBCResultSet.getSQLXML(...) Read-only N/A Not readable or writable Not readable or writable
    Since:
    JDK 1.6, HSQLDB 2.0
    Author:
    Campbell Burnet (campbell-burnet@users dot sourceforge.net)
    See Also:
    javax.xml.parsers, javax.xml.stream, javax.xml.transform, javax.xml.xpath
    • Nested Class Summary

      Nested Classes 
      Modifier and Type Class Description
      static class  JDBCSQLXML.SAX2XMLStreamWriter
      Writes to a XMLStreamWriter from SAX events.
    • Constructor Summary

      Constructors 
      Constructor Description
      JDBCSQLXML​(javax.xml.transform.Source source)
      Constructs a new read-only JDBCSQLXML object from the given Source object.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void free()
      This method closes this object and releases the resources that it held.
      java.io.InputStream getBinaryStream()
      Retrieves the XML value designated by this SQLXML instance as a stream.
      java.io.Reader getCharacterStream()
      Retrieves the XML value designated by this SQLXML instance as a java.io.Reader object.
      <T extends javax.xml.transform.Source>
      T
      getSource​(java.lang.Class<T> sourceClass)
      Returns a Source for reading the XML value designated by this SQLXML instance.
      java.lang.String getString()
      Returns a string representation of the XML value designated by this SQLXML instance.
      boolean isReadable()
      Retrieves the object's readability status.
      boolean isWritable()
      Retrieves the object's readability status.
      java.io.OutputStream setBinaryStream()
      Retrieves a stream that can be used to write the XML value that this SQLXML instance represents.
      java.io.Writer setCharacterStream()
      Retrieves a stream to be used to write the XML value that this SQLXML instance represents.
      <T extends javax.xml.transform.Result>
      T
      setResult​(java.lang.Class<T> resultClass)
      Returns a Result for setting the XML value designated by this SQLXML instance.
      void setString​(java.lang.String value)
      Sets the XML value designated by this SQLXML instance to the given String representation.
      • Methods inherited from class java.lang.Object

        equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Constructor Detail

      • JDBCSQLXML

        public JDBCSQLXML​(javax.xml.transform.Source source)
                   throws java.sql.SQLException
        Constructs a new read-only JDBCSQLXML object from the given Source object.
        Parameters:
        source - a Source representing an SQLXML value
        Throws:
        java.sql.SQLException - if the argument does not represent a valid SQLXML value
    • Method Detail

      • free

        public void free()
                  throws java.sql.SQLException
        This method closes this object and releases the resources that it held. The SQL XML object becomes invalid and neither readable nor writable when this method is called.

        After free has been called, any attempt to invoke a method other than free will result in a SQLException being thrown. If free is called multiple times, the subsequent calls to free are treated as a no-op.

        Specified by:
        free in interface java.sql.SQLXML
        Throws:
        java.sql.SQLException - if there is an error freeing the XML value.
        java.sql.SQLFeatureNotSupportedException - if the JDBC driver does not support this method
        Since:
        JDK 1.6
      • getBinaryStream

        public java.io.InputStream getBinaryStream()
                                            throws java.sql.SQLException
        Retrieves the XML value designated by this SQLXML instance as a stream. The bytes of the input stream are interpreted according to appendix F of the XML 1.0 specification. The behavior of this method is the same as ResultSet.getBinaryStream() when the designated column of the ResultSet has a type java.sql.Types of SQLXML.

        The SQL XML object becomes not readable when this method is called and may also become not writable depending on implementation.

        Specified by:
        getBinaryStream in interface java.sql.SQLXML
        Returns:
        a stream containing the XML data.
        Throws:
        java.sql.SQLException - if there is an error processing the XML value. An exception is thrown if the state is not readable.
        java.sql.SQLFeatureNotSupportedException - if the JDBC driver does not support this method
        Since:
        JDK 1.6
      • setBinaryStream

        public java.io.OutputStream setBinaryStream()
                                             throws java.sql.SQLException
        Retrieves a stream that can be used to write the XML value that this SQLXML instance represents. The stream begins at position 0. The bytes of the stream are interpreted according to appendix F of the XML 1.0 specification The behavior of this method is the same as ResultSet.updateBinaryStream() when the designated column of the ResultSet has a type java.sql.Types of SQLXML.

        The SQL XML object becomes not writeable when this method is called and may also become not readable depending on implementation.

        Specified by:
        setBinaryStream in interface java.sql.SQLXML
        Returns:
        a stream to which data can be written.
        Throws:
        java.sql.SQLException - if there is an error processing the XML value. An exception is thrown if the state is not writable.
        java.sql.SQLFeatureNotSupportedException - if the JDBC driver does not support this method
        Since:
        JDK 1.6
      • getCharacterStream

        public java.io.Reader getCharacterStream()
                                          throws java.sql.SQLException
        Retrieves the XML value designated by this SQLXML instance as a java.io.Reader object. The format of this stream is defined by org.xml.sax.InputSource, where the characters in the stream represent the unicode code points for XML according to section 2 and appendix B of the XML 1.0 specification. Although an encoding declaration other than unicode may be present, the encoding of the stream is unicode. The behavior of this method is the same as ResultSet.getCharacterStream() when the designated column of the ResultSet has a type java.sql.Types of SQLXML.

        The SQL XML object becomes not readable when this method is called and may also become not writable depending on implementation.

        Specified by:
        getCharacterStream in interface java.sql.SQLXML
        Returns:
        a stream containing the XML data.
        Throws:
        java.sql.SQLException - if there is an error processing the XML value. The getCause() method of the exception may provide a more detailed exception, for example, if the stream does not contain valid characters. An exception is thrown if the state is not readable.
        java.sql.SQLFeatureNotSupportedException - if the JDBC driver does not support this method
        Since:
        JDK 1.6
      • setCharacterStream

        public java.io.Writer setCharacterStream()
                                          throws java.sql.SQLException
        Retrieves a stream to be used to write the XML value that this SQLXML instance represents. The format of this stream is defined by org.xml.sax.InputSource, where the characters in the stream represent the unicode code points for XML according to section 2 and appendix B of the XML 1.0 specification. Although an encoding declaration other than unicode may be present, the encoding of the stream is unicode. The behavior of this method is the same as ResultSet.updateCharacterStream() when the designated column of the ResultSet has a type java.sql.Types of SQLXML.

        The SQL XML object becomes not writable when this method is called and may also become not readable depending on implementation.

        Specified by:
        setCharacterStream in interface java.sql.SQLXML
        Returns:
        a stream to which data can be written.
        Throws:
        java.sql.SQLException - if there is an error processing the XML value. The getCause() method of the exception may provide a more detailed exception, for example, if the stream does not contain valid characters. An exception is thrown if the state is not writable.
        java.sql.SQLFeatureNotSupportedException - if the JDBC driver does not support this method
        Since:
        JDK 1.6 Build 79
      • getString

        public java.lang.String getString()
                                   throws java.sql.SQLException
        Returns a string representation of the XML value designated by this SQLXML instance. The format of this String is defined by org.xml.sax.InputSource, where the characters in the stream represent the unicode code points for XML according to section 2 and appendix B of the XML 1.0 specification. Although an encoding declaration other than unicode may be present, the encoding of the String is unicode. The behavior of this method is the same as ResultSet.getString() when the designated column of the ResultSet has a type java.sql.Types of SQLXML.

        The SQL XML object becomes not readable when this method is called and may also become not writable depending on implementation.

        Specified by:
        getString in interface java.sql.SQLXML
        Returns:
        a string representation of the XML value designated by this SQLXML instance.
        Throws:
        java.sql.SQLException - if there is an error processing the XML value. The getCause() method of the exception may provide a more detailed exception, for example, if the stream does not contain valid characters. An exception is thrown if the state is not readable.
        java.sql.SQLFeatureNotSupportedException - if the JDBC driver does not support this method
        Since:
        JDK 1.6
      • setString

        public void setString​(java.lang.String value)
                       throws java.sql.SQLException
        Sets the XML value designated by this SQLXML instance to the given String representation. The format of this String is defined by org.xml.sax.InputSource, where the characters in the stream represent the unicode code points for XML according to section 2 and appendix B of the XML 1.0 specification. Although an encoding declaration other than unicode may be present, the encoding of the String is unicode. The behavior of this method is the same as ResultSet.updateString() when the designated column of the ResultSet has a type java.sql.Types of SQLXML.

        The SQL XML object becomes not writeable when this method is called and may also become not readable depending on implementation.

        Specified by:
        setString in interface java.sql.SQLXML
        Parameters:
        value - the XML value
        Throws:
        java.sql.SQLException - if there is an error processing the XML value. The getCause() method of the exception may provide a more detailed exception, for example, if the stream does not contain valid characters. An exception is thrown if the state is not writable.
        java.sql.SQLFeatureNotSupportedException - if the JDBC driver does not support this method
        Since:
        JDK 1.6
      • getSource

        public <T extends javax.xml.transform.Source> T getSource​(java.lang.Class<T> sourceClass)
                                                           throws java.sql.SQLException
        Returns a Source for reading the XML value designated by this SQLXML instance. Sources are used as inputs to XML parsers and XSLT transformers.

        Sources for XML parsers will have namespace processing on by default. The systemID of the Source is implementation dependent.

        The SQL XML object becomes not readable when this method is called and may also become not writable depending on implementation.

        Note that SAX is a callback architecture, so a returned SAXSource should then be set with a content handler that will receive the SAX events from parsing. The content handler will receive callbacks based on the contents of the XML.

           SAXSource saxSource = sqlxml.getSource(SAXSource.class);
           XMLReader xmlReader = saxSource.getXMLReader();
           xmlReader.setContentHandler(myHandler);
           xmlReader.parse(saxSource.getInputSource());
         
        Specified by:
        getSource in interface java.sql.SQLXML
        Parameters:
        sourceClass - The class of the source, or null. If the class is null, a vendor specific Source implementation will be returned. The following classes are supported at a minimum:
           javax.xml.transform.dom.DOMSource - returns a DOMSource
           javax.xml.transform.sax.SAXSource - returns a SAXSource
           javax.xml.transform.stax.StAXSource - returns a StAXSource
           javax.xml.transform.stream.StreamSource - returns a StreamSource
         
        Returns:
        a Source for reading the XML value.
        Throws:
        java.sql.SQLException - if there is an error processing the XML value or if this feature is not supported. The getCause() method of the exception may provide a more detailed exception, for example, if an XML parser exception occurs. An exception is thrown if the state is not readable.
        java.sql.SQLFeatureNotSupportedException - if the JDBC driver does not support this method
        Since:
        JDK 1.6 Build 79
      • setResult

        public <T extends javax.xml.transform.Result> T setResult​(java.lang.Class<T> resultClass)
                                                           throws java.sql.SQLException
        Returns a Result for setting the XML value designated by this SQLXML instance.

        The systemID of the Result is implementation dependent.

        The SQL XML object becomes not writable when this method is called and may also become not readable depending on implementation.

        Note that SAX is a callback architecture and the returned SAXResult has a content handler assigned that will receive the SAX events based on the contents of the XML. Call the content handler with the contents of the XML document to assign the values.

           SAXResult saxResult = sqlxml.getResult(SAXResult.class);
           ContentHandler contentHandler = saxResult.getXMLReader().getContentHandler();
           contentHandler.startDocument();
           // set the XML elements and attributes into the result
           contentHandler.endDocument();
         
        Specified by:
        setResult in interface java.sql.SQLXML
        Parameters:
        resultClass - The class of the result, or null. If resultClass is null, a vendor specific Result implementation will be returned. The following classes are supported at a minimum:
           javax.xml.transform.dom.DOMResult - returns a DOMResult
           javax.xml.transform.sax.SAXResult - returns a SAXResult
           javax.xml.transform.stax.StAXResult - returns a StAXResult
           javax.xml.transform.stream.StreamResult - returns a StreamResult
         
        Returns:
        Returns a Result for setting the XML value.
        Throws:
        java.sql.SQLException - if there is an error processing the XML value or if this feature is not supported. The getCause() method of the exception may provide a more detailed exception, for example, if an XML parser exception occurs. An exception is thrown if the state is not writable.
        java.sql.SQLFeatureNotSupportedException - if the JDBC driver does not support this method
        Since:
        JDK 1.6 Build 79
      • isReadable

        public boolean isReadable()
        Retrieves the object's readability status.
        Returns:
        if true, then readable; else not readable
      • isWritable

        public boolean isWritable()
        Retrieves the object's readability status.
        Returns:
        if true, then writable; else not writable