Author: jgbutler Date: Tue Nov 28 13:55:59 2006 New Revision: 480230 URL: http://svn.apache.org/viewvc?view=rev&rev=480230 Log: Changes for IBATIS-373 - Allow iBATIS to build SqlMapClient from InputStream
Modified: ibatis/trunk/java/mapper/mapper2/build/version.properties ibatis/trunk/java/mapper/mapper2/doc/release.txt ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/xml/NodeletParser.java ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/client/SqlMapClientBuilder.java ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapConfigParser.java ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlStatementParser.java ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/XmlConverter.java Modified: ibatis/trunk/java/mapper/mapper2/build/version.properties URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/build/version.properties?view=diff&rev=480230&r1=480229&r2=480230 ============================================================================== --- ibatis/trunk/java/mapper/mapper2/build/version.properties (original) +++ ibatis/trunk/java/mapper/mapper2/build/version.properties Tue Nov 28 13:55:59 2006 @@ -1,5 +1,5 @@ #Build version info -#Mon Nov 27 20:26:47 CST 2006 +#Tue Nov 28 15:50:32 CST 2006 version=2.3.0 -buildDate=2006/11/27 20\:26 -buildNum=672 +buildDate=2006/11/28 15\:50 +buildNum=673 Modified: ibatis/trunk/java/mapper/mapper2/doc/release.txt URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/doc/release.txt?view=diff&rev=480230&r1=480229&r2=480230 ============================================================================== --- ibatis/trunk/java/mapper/mapper2/doc/release.txt (original) +++ ibatis/trunk/java/mapper/mapper2/doc/release.txt Tue Nov 28 13:55:59 2006 @@ -14,6 +14,8 @@ o Fixed IBATIS-340 - Provide ability to override the default encoding in the Resources class o Fixed IBATIS-353 - Probe exception when using inheritance hierarchies o Fixed IBATIS-366 - Use ResultObjectFactory to create nested classes + o Fixed IBATIS-373 - Allow iBATIS to build SqlMapClient from InputStream + ------------------------------ 2.2.0 - Aug 15, 2006 Modified: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/xml/NodeletParser.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/xml/NodeletParser.java?view=diff&rev=480230&r1=480229&r2=480230 ============================================================================== --- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/xml/NodeletParser.java (original) +++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/xml/NodeletParser.java Tue Nov 28 13:55:59 2006 @@ -8,6 +8,7 @@ import javax.xml.parsers.FactoryConfigurationError; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; +import java.io.InputStream; import java.io.Reader; import java.util.*; @@ -53,6 +54,15 @@ } } + public void parse(InputStream inputStream) throws NodeletException { + try { + Document doc = createDocument(inputStream); + parse(doc.getLastChild()); + } catch (Exception e) { + throw new NodeletException("Error parsing XML. Cause: " + e, e); + } + } + /** * Begins parsing from the provided Node. */ @@ -147,6 +157,38 @@ return builder.parse(new InputSource(reader)); } + /** + * Creates a JAXP Document from an InoutStream. + */ + private Document createDocument(InputStream inputStream) throws ParserConfigurationException, FactoryConfigurationError, + SAXException, IOException { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setValidating(validation); + + factory.setNamespaceAware(false); + factory.setIgnoringComments(true); + factory.setIgnoringElementContentWhitespace(false); + factory.setCoalescing(false); + factory.setExpandEntityReferences(true); + + DocumentBuilder builder = factory.newDocumentBuilder(); + builder.setEntityResolver(entityResolver); + builder.setErrorHandler(new ErrorHandler() { + public void error(SAXParseException exception) throws SAXException { + throw exception; + } + + public void fatalError(SAXParseException exception) throws SAXException { + throw exception; + } + + public void warning(SAXParseException exception) throws SAXException { + } + }); + + return builder.parse(new InputSource(inputStream)); + } + public void setValidation(boolean validation) { this.validation = validation; } Modified: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/client/SqlMapClientBuilder.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/client/SqlMapClientBuilder.java?view=diff&rev=480230&r1=480229&r2=480230 ============================================================================== --- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/client/SqlMapClientBuilder.java (original) +++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/client/SqlMapClientBuilder.java Tue Nov 28 13:55:59 2006 @@ -17,6 +17,7 @@ import com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser; +import java.io.InputStream; import java.io.Reader; import java.util.Properties; @@ -78,4 +79,29 @@ return new SqlMapConfigParser().parse(reader, props); } + /** + * Builds an SqlMapClient using the specified input stream. + * + * @param inputStream An InputStream instance that reads an sql-map-config.xml file. + * The stream should read a well formed sql-map-config.xml file. + * @return An SqlMapClient instance. + */ + public static SqlMapClient buildSqlMapClient(InputStream inputStream) { + return new SqlMapConfigParser().parse(inputStream); + } + + /** + * Builds an SqlMapClient using the specified input stream and properties file. + * <p/> + * + * @param inputStream An InputStream instance that reads an sql-map-config.xml file. + * The stream should read an well formed sql-map-config.xml file. + * @param props Properties to be used to provide values to dynamic property tokens + * in the sql-map-config.xml configuration file. This provides an easy way to + * achieve some level of programmatic configuration. + * @return An SqlMapClient instance. + */ + public static SqlMapClient buildSqlMapClient(InputStream inputStream, Properties props) { + return new SqlMapConfigParser().parse(inputStream, props); + } } Modified: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapConfigParser.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapConfigParser.java?view=diff&rev=480230&r1=480229&r2=480230 ============================================================================== --- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapConfigParser.java (original) +++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapConfigParser.java Tue Nov 28 13:55:59 2006 @@ -28,8 +28,10 @@ import com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransactionConfig; import com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig; import com.ibatis.sqlmap.engine.type.*; + import org.w3c.dom.Node; +import java.io.InputStream; import java.io.Reader; import java.util.Iterator; import java.util.Properties; @@ -37,6 +39,7 @@ public class SqlMapConfigParser extends BaseParser { protected final NodeletParser parser = new NodeletParser(); + private boolean usingStreams; public SqlMapConfigParser() { this(null, null); @@ -78,6 +81,8 @@ reader = vars.sqlMapConfigConv.convertXml(reader); } + usingStreams = false; + parser.parse(reader); return vars.client; } catch (Exception e) { @@ -85,6 +90,26 @@ } } + public SqlMapClient parse(InputStream inputStream, Properties props) { + vars.properties = props; + return parse(inputStream); + } + + public SqlMapClient parse(InputStream inputStream) { + try { + if (vars.sqlMapConfigConv != null) { + inputStream = vars.sqlMapConfigConv.convertXml(inputStream); + } + + usingStreams = true; + + parser.parse(inputStream); + return vars.client; + } catch (Exception e) { + throw new RuntimeException("Error occurred. Cause: " + e, e); + } + } + private void addSqlMapConfigNodelets() { parser.addNodelet("/sqlMapConfig/end()", new Nodelet() { public void process(Node node) throws Exception { @@ -351,21 +376,39 @@ String resource = attributes.getProperty("resource"); String url = attributes.getProperty("url"); - Reader reader = null; - if (resource != null) { - vars.errorCtx.setResource(resource); - reader = Resources.getResourceAsReader(resource); - } else if (url != null) { - vars.errorCtx.setResource(url); - reader = Resources.getUrlAsReader(url); + if (usingStreams) { + InputStream inputStream = null; + if (resource != null) { + vars.errorCtx.setResource(resource); + inputStream = Resources.getResourceAsStream(resource); + } else if (url != null) { + vars.errorCtx.setResource(url); + inputStream = Resources.getUrlAsStream(url); + } else { + throw new SqlMapException("The <sqlMap> element requires either a resource or a url attribute."); + } + + if (vars.sqlMapConv != null) { + inputStream = vars.sqlMapConv.convertXml(inputStream); + } + new SqlMapParser(vars).parse(inputStream); } else { - throw new SqlMapException("The <sqlMap> element requires either a resource or a url attribute."); - } + Reader reader = null; + if (resource != null) { + vars.errorCtx.setResource(resource); + reader = Resources.getResourceAsReader(resource); + } else if (url != null) { + vars.errorCtx.setResource(url); + reader = Resources.getUrlAsReader(url); + } else { + throw new SqlMapException("The <sqlMap> element requires either a resource or a url attribute."); + } - if (vars.sqlMapConv != null) { - reader = vars.sqlMapConv.convertXml(reader); + if (vars.sqlMapConv != null) { + reader = vars.sqlMapConv.convertXml(reader); + } + new SqlMapParser(vars).parse(reader); } - new SqlMapParser(vars).parse(reader); } }); } Modified: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java?view=diff&rev=480230&r1=480229&r2=480230 ============================================================================== --- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java (original) +++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java Tue Nov 28 13:55:59 2006 @@ -18,6 +18,7 @@ import com.ibatis.sqlmap.engine.type.TypeHandler; import org.w3c.dom.Node; +import java.io.InputStream; import java.io.Reader; import java.util.ArrayList; import java.util.List; @@ -48,6 +49,10 @@ public void parse(Reader reader) throws NodeletException { parser.parse(reader); + } + + public void parse(InputStream inputStream) throws NodeletException { + parser.parse(inputStream); } private void addSqlMapNodelets() { Modified: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlStatementParser.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlStatementParser.java?view=diff&rev=480230&r1=480229&r2=480230 ============================================================================== --- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlStatementParser.java (original) +++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlStatementParser.java Tue Nov 28 13:55:59 2006 @@ -58,7 +58,6 @@ String timeout = attributes.getProperty("timeout"); String[] additionalResultMapNames; - List additionalResultMaps = new ArrayList(); vars.errorCtx.setObjectId(id + " statement"); Modified: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/XmlConverter.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/XmlConverter.java?view=diff&rev=480230&r1=480229&r2=480230 ============================================================================== --- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/XmlConverter.java (original) +++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/XmlConverter.java Tue Nov 28 13:55:59 2006 @@ -15,6 +15,7 @@ */ package com.ibatis.sqlmap.engine.builder.xml; +import java.io.InputStream; import java.io.Reader; import java.io.Writer; @@ -37,4 +38,10 @@ */ public void convertXml(Reader reader, Writer writer); + /** + * Get an InputStream based on another InputStream + * @param inputStream - an InputStream for the file to convert + * @return - the converted file + */ + public InputStream convertXml(InputStream inputStream); }