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);
 }


Reply via email to