db-ddlutils-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From to...@apache.org
Subject svn commit: r684636 - in /db/ddlutils/trunk: ./ src/main/java/org/apache/ddlutils/io/ src/test/java/org/apache/ddlutils/ src/test/java/org/apache/ddlutils/io/ src/test/java/org/apache/ddlutils/task/
Date Mon, 11 Aug 2008 05:39:56 GMT
Author: tomdz
Date: Sun Aug 10 22:39:55 2008
New Revision: 684636

URL: http://svn.apache.org/viewvc?rev=684636&view=rev
Log:
Implementation of DDLUTILS-224: Get rid of Digester dependency

Added:
    db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/XMLUtils.java
Removed:
    db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/DigesterRules.java
    db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/DynaSqlCreateRule.java
    db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/SetColumnPropertyFromSubElementRule.java
    db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/SetColumnPropertyRule.java
Modified:
    db/ddlutils/trunk/.project
    db/ddlutils/trunk/build.properties
    db/ddlutils/trunk/pom.xml
    db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/DataReader.java
    db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/DatabaseDataIO.java
    db/ddlutils/trunk/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java
    db/ddlutils/trunk/src/test/java/org/apache/ddlutils/io/TestDataReaderAndWriter.java
    db/ddlutils/trunk/src/test/java/org/apache/ddlutils/task/TestTaskBase.java

Modified: db/ddlutils/trunk/.project
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/.project?rev=684636&r1=684635&r2=684636&view=diff
==============================================================================
--- db/ddlutils/trunk/.project (original)
+++ db/ddlutils/trunk/.project Sun Aug 10 22:39:55 2008
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>DdlUtils</name>
+	<name>ddlutils</name>
 	<comment>
   </comment>
 	<projects>
@@ -16,9 +16,15 @@
 			<arguments>
 			</arguments>
 		</buildCommand>
+		<buildCommand>
+			<name>org.maven.ide.eclipse.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
 	</buildSpec>
 	<natures>
 		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.maven.ide.eclipse.maven2Nature</nature>
 		<nature>org.devzuz.q.maven.jdt.core.mavenNature</nature>
 	</natures>
 </projectDescription>

Modified: db/ddlutils/trunk/build.properties
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/build.properties?rev=684636&r1=684635&r2=684636&view=diff
==============================================================================
--- db/ddlutils/trunk/build.properties (original)
+++ db/ddlutils/trunk/build.properties Sun Aug 10 22:39:55 2008
@@ -52,7 +52,7 @@
 
 checkstyle.version.pattern=\\$Revision.*\\$
 checkstyle.author.pattern=\\S
-checkstyle.license.file=${src.check.dir}/license-check.txt
+checkstyle.header.file=${src.check.dir}/license-check.txt
 
 test.profile.dir=${src.dir}/test-profiles
 test.summary.dir=${src.dir}/test-summary

Modified: db/ddlutils/trunk/pom.xml
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/pom.xml?rev=684636&r1=684635&r2=684636&view=diff
==============================================================================
--- db/ddlutils/trunk/pom.xml (original)
+++ db/ddlutils/trunk/pom.xml Sun Aug 10 22:39:55 2008
@@ -133,11 +133,6 @@
       <version>1.2.1</version>
     </dependency>
     <dependency>
-      <groupId>commons-digester</groupId>
-      <artifactId>commons-digester</artifactId>
-      <version>1.7</version>
-    </dependency>
-    <dependency>
       <groupId>commons-lang</groupId>
       <artifactId>commons-lang</artifactId>
       <version>2.1</version>
@@ -161,11 +156,13 @@
       <groupId>dom4j</groupId>
       <artifactId>dom4j</artifactId>
       <version>1.4</version>
+      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>3.8.1</version>
+      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>log4j</groupId>
@@ -182,7 +179,7 @@
     <dependency>
       <groupId>woodstox</groupId>
       <artifactId>wstx-asl</artifactId>
-      <version>3.0.2</version>
+      <version>3.2.6</version>
       <scope>runtime</scope>
       <optional>true</optional>
     </dependency>
@@ -229,6 +226,26 @@
 
   <profiles>
     <profile>
+      <id>checkstyle</id>
+      <build>
+        <defaultGoal>checkstyle:checkstyle</defaultGoal>
+	    <plugins>
+	      <plugin>
+	        <groupId>org.apache.maven.plugins</groupId>
+	        <artifactId>maven-checkstyle-plugin</artifactId>
+            <configuration>
+              <consoleOutput>true</consoleOutput>
+              <failsOnError>true</failsOnError>
+              <includeTestSourceDirectory>true</includeTestSourceDirectory>
+              <configLocation>src/main/checkstyle/ddlutils-checks.xml</configLocation>
+              <headerLocation>src/main/checkstyle/license-check.txt</headerLocation>
+            </configuration>
+	      </plugin>
+	    </plugins>
+	  </build>
+    </profile>
+
+    <profile>
       <activation>
         <property>
           <name>testDb</name>

Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/DataReader.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/DataReader.java?rev=684636&r1=684635&r2=684636&view=diff
==============================================================================
--- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/DataReader.java (original)
+++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/DataReader.java Sun Aug 10 22:39:55 2008
@@ -1,161 +1,427 @@
-package org.apache.ddlutils.io;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import org.apache.commons.digester.Digester;
-import org.apache.ddlutils.io.converters.SqlTypeConverter;
-import org.apache.ddlutils.model.Column;
-import org.apache.ddlutils.model.Database;
-import org.apache.ddlutils.model.Table;
-
-/**
- * Reads data XML into dyna beans matching a specified database model. Note that
- * the data sink won't be started or ended by the data reader, this has to be done
- * in the code that uses the data reader. 
- * 
- * @version $Revision: 289996 $
- */
-public class DataReader extends Digester
-{
-    /** The database model. */
-    private Database _model;
-    /** The object to receive the read beans. */
-    private DataSink _sink;
-    /** Specifies whether the (lazy) configuration of the digester still needs to be performed. */
-    private boolean  _needsConfiguration = true;
-    /** The converters. */
-    private ConverterConfiguration _converterConf = new ConverterConfiguration();
-    /** Whether to be case sensitive or not. */
-    private boolean _caseSensitive = false;
-
-    /**
-     * Returns the converter configuration of this data reader.
-     * 
-     * @return The converter configuration
-     */
-    public ConverterConfiguration getConverterConfiguration()
-    {
-        return _converterConf;
-    }
-
-    /**
-     * Returns the database model.
-     *
-     * @return The model
-     */
-    public Database getModel()
-    {
-        return _model;
-    }
-
-    /**
-     * Sets the database model.
-     *
-     * @param model The model
-     */
-    public void setModel(Database model)
-    {
-        _model              = model;
-        _needsConfiguration = true;
-    }
-
-    /**
-     * Returns the data sink.
-     *
-     * @return The sink
-     */
-    public DataSink getSink()
-    {
-        return _sink;
-    }
-
-    /**
-     * Sets the data sink.
-     *
-     * @param sink The sink
-     */
-    public void setSink(DataSink sink)
-    {
-        _sink               = sink;
-        _needsConfiguration = true;
-    }
-
-    /**
-     * Determines whether this rules object matches case sensitively.
-     *
-     * @return <code>true</code> if the case of the pattern matters
-     */
-    public boolean isCaseSensitive()
-    {
-        return _caseSensitive;
-    }
-
-
-    /**
-     * Specifies whether this rules object shall match case sensitively.
-     *
-     * @param beCaseSensitive <code>true</code> if the case of the pattern shall matter
-     */
-    public void setCaseSensitive(boolean beCaseSensitive)
-    {
-        _caseSensitive = beCaseSensitive;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected void configure()
-    {
-        if (_needsConfiguration)
-        {
-            if (_model == null)
-            {
-                throw new NullPointerException("No database model specified");
-            }
-            if (_sink == null)
-            {
-                throw new NullPointerException("No data sink model specified");
-            }
-
-            DigesterRules rules = new DigesterRules();
-
-            rules.setCaseSensitive(isCaseSensitive());
-            setRules(rules);
-            for (int tableIdx = 0; tableIdx < _model.getTableCount(); tableIdx++)
-            {
-                // TODO: For now we hardcode the root as 'data' but ultimately we should wildcard it ('?')
-                Table  table = _model.getTable(tableIdx);
-                String path  = "data/"+table.getName();
-    
-                addRule(path, new DynaSqlCreateRule(_model, table, _sink));
-                for (int columnIdx = 0; columnIdx < table.getColumnCount(); columnIdx++)
-                {
-                    Column           column    = (Column)table.getColumn(columnIdx);
-                    SqlTypeConverter converter = _converterConf.getRegisteredConverter(table, column);
-    
-                    addRule(path, new SetColumnPropertyRule(column, converter, isCaseSensitive()));
-                    addRule(path + "/" + column.getName(), new SetColumnPropertyFromSubElementRule(column, converter));
-                }
-            }
-            _needsConfiguration = false;
-        }
-        super.configure();
-    }
-}
+package org.apache.ddlutils.io;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.lang.reflect.InvocationTargetException;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.commons.beanutils.DynaBean;
+import org.apache.commons.beanutils.PropertyUtils;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.ddlutils.io.converters.SqlTypeConverter;
+import org.apache.ddlutils.model.Column;
+import org.apache.ddlutils.model.Database;
+import org.apache.ddlutils.model.Table;
+import org.xml.sax.InputSource;
+
+/**
+ * Reads data XML into dyna beans matching a specified database model. Note that
+ * the data sink won't be started or ended by the data reader, this has to be done
+ * in the code that uses the data reader. 
+ * 
+ * @version $Revision: $
+ */
+public class DataReader
+{
+    /** Our log. */
+    private final Log _log = LogFactory.getLog(DataReader.class);
+
+    /** The database model. */
+    private Database _model;
+    /** The object to receive the read beans. */
+    private DataSink _sink;
+    /** The converters. */
+    private ConverterConfiguration _converterConf = new ConverterConfiguration();
+    /** Whether to be case sensitive or not. */
+    private boolean _caseSensitive = false;
+
+    /**
+     * Returns the converter configuration of this data reader.
+     * 
+     * @return The converter configuration
+     */
+    public ConverterConfiguration getConverterConfiguration()
+    {
+        return _converterConf;
+    }
+
+    /**
+     * Returns the database model.
+     *
+     * @return The model
+     */
+    public Database getModel()
+    {
+        return _model;
+    }
+
+    /**
+     * Sets the database model.
+     *
+     * @param model The model
+     */
+    public void setModel(Database model)
+    {
+        _model = model;
+    }
+
+    /**
+     * Returns the data sink.
+     *
+     * @return The sink
+     */
+    public DataSink getSink()
+    {
+        return _sink;
+    }
+
+    /**
+     * Sets the data sink.
+     *
+     * @param sink The sink
+     */
+    public void setSink(DataSink sink)
+    {
+        _sink = sink;
+    }
+
+    /**
+     * Determines whether this rules object matches case sensitively.
+     *
+     * @return <code>true</code> if the case of the pattern matters
+     */
+    public boolean isCaseSensitive()
+    {
+        return _caseSensitive;
+    }
+
+
+    /**
+     * Specifies whether this rules object shall match case sensitively.
+     *
+     * @param beCaseSensitive <code>true</code> if the case of the pattern shall matter
+     */
+    public void setCaseSensitive(boolean beCaseSensitive)
+    {
+        _caseSensitive = beCaseSensitive;
+    }
+
+    /**
+     * Creates a new, initialized XML input factory object.
+     * 
+     * @return The factory object
+     */
+    private XMLInputFactory getXMLInputFactory()
+    {
+        XMLInputFactory factory = XMLInputFactory.newInstance();
+
+        factory.setProperty("javax.xml.stream.isCoalescing",     Boolean.TRUE);
+        factory.setProperty("javax.xml.stream.isNamespaceAware", Boolean.FALSE);
+        return factory;
+    }
+
+    /**
+     * Reads the data contained in the specified file.
+     * 
+     * @param filename The data file name
+     */
+    public void read(String filename) throws DdlUtilsXMLException
+    {
+        try
+        {
+            read(new FileReader(filename));
+        }
+        catch (IOException ex)
+        {
+            throw new DdlUtilsXMLException(ex);
+        }
+    }
+
+    /**
+     * Reads the data contained in the specified file.
+     * 
+     * @param file The data file
+     */
+    public void read(File file) throws DdlUtilsXMLException
+    {
+        try
+        {
+            read(new FileReader(file));
+        }
+        catch (IOException ex)
+        {
+            throw new DdlUtilsXMLException(ex);
+        }
+    }
+
+    /**
+     * Reads the data given by the reader.
+     * 
+     * @param reader The reader that returns the data XML
+     */
+    public void read(Reader reader) throws DdlUtilsXMLException
+    {
+        try
+        {
+            read(getXMLInputFactory().createXMLStreamReader(reader));
+        }
+        catch (XMLStreamException ex)
+        {
+            throw new DdlUtilsXMLException(ex);
+        }
+    }
+
+    /**
+     * Reads the data given by the input stream.
+     * 
+     * @param input The input stream that returns the data XML
+     */
+    public void read(InputStream input) throws DdlUtilsXMLException
+    {
+        try
+        {
+            read(getXMLInputFactory().createXMLStreamReader(input));
+        }
+        catch (XMLStreamException ex)
+        {
+            throw new DdlUtilsXMLException(ex);
+        }
+    }
+
+    /**
+     * Reads the data from the given input source.
+     *
+     * @param source The input source
+     */
+    public void read(InputSource source) throws DdlUtilsXMLException
+    {
+        read(source.getCharacterStream());
+    }
+
+    /**
+     * Reads the data from the given XML stream reader.
+     * 
+     * @param xmlReader The reader
+     */
+    private void read(XMLStreamReader xmlReader) throws DdlUtilsXMLException
+    {
+        try
+        {
+            while (xmlReader.getEventType() != XMLStreamReader.START_ELEMENT)
+            {
+                if (xmlReader.next() == XMLStreamReader.END_DOCUMENT)
+                {
+                    return;
+                }
+            }
+            readDocument(xmlReader);
+        }
+        catch (XMLStreamException ex)
+        {
+            throw new DdlUtilsXMLException(ex);
+        }
+    }
+
+    // TODO: add debug level logging (or trace ?)
+
+    private void readDocument(XMLStreamReader xmlReader) throws XMLStreamException, DdlUtilsXMLException
+    {
+        // we ignore the top-level tag since we don't know about its name
+        int eventType = XMLStreamReader.START_ELEMENT;
+
+        while (eventType != XMLStreamReader.END_ELEMENT)
+        {
+            eventType = xmlReader.next();
+            if (eventType == XMLStreamReader.START_ELEMENT)
+            {
+                readBean(xmlReader);
+            }
+        }
+    }
+
+    private void readBean(XMLStreamReader xmlReader) throws XMLStreamException, DdlUtilsXMLException
+    {
+        QName elemQName = xmlReader.getName();
+        Table table     = _model.findTable(elemQName.getLocalPart(), isCaseSensitive());
+
+        if (table == null)
+        {
+            _log.warn("Data XML contains an element " + elemQName + " at location " + xmlReader.getLocation() +
+                      " but there is no table defined with this name. This element will be ignored.");
+            readOverElement(xmlReader);
+        }
+        else
+        {
+            DynaBean bean = _model.createDynaBeanFor(table);
+    
+            for (int idx = 0; idx < xmlReader.getAttributeCount(); idx++)
+            {
+                QName  attrQName = xmlReader.getAttributeName(idx);
+                Column column    = table.findColumn(attrQName.getLocalPart(), isCaseSensitive());
+
+                if (column == null)
+                {
+                    _log.warn("Data XML contains an attribute " + attrQName + " at location " + xmlReader.getLocation() +
+                              " but there is no column defined in table " + table.getName() + " with this name. This attribute will be ignored.");
+                }
+                else
+                {
+                    setColumnValue(bean, table, column, xmlReader.getAttributeValue(idx));
+                }
+            }
+            readColumnSubElements(xmlReader, bean, table);
+            getSink().addBean(bean);
+            consumeRestOfElement(xmlReader);
+        }
+    }
+
+    private void readColumnSubElements(XMLStreamReader xmlReader, DynaBean bean, Table table) throws XMLStreamException, DdlUtilsXMLException
+    {
+        int eventType = XMLStreamReader.START_ELEMENT;
+
+        while (eventType != XMLStreamReader.END_ELEMENT)
+        {
+            eventType = xmlReader.next();
+            if (eventType == XMLStreamReader.START_ELEMENT)
+            {
+                readColumnSubElement(xmlReader, bean, table);
+            }
+        }
+    }
+
+    private void readColumnSubElement(XMLStreamReader xmlReader, DynaBean bean, Table table) throws XMLStreamException, DdlUtilsXMLException
+    {
+        QName   elemQName  = xmlReader.getName();
+        boolean usesBase64 = false;
+
+        for (int idx = 0; idx < xmlReader.getAttributeCount(); idx++)
+        {
+            QName attrQName = xmlReader.getAttributeName(idx);
+
+            if (DatabaseIO.BASE64_ATTR_NAME.equals(attrQName.getLocalPart()) &&
+                "true".equalsIgnoreCase(xmlReader.getAttributeValue(idx)))
+            {
+                usesBase64 = true;
+                break;
+            }
+        }
+
+        Column column  = table.findColumn(elemQName.getLocalPart(), isCaseSensitive());
+
+        if (column == null)
+        {
+            _log.warn("Data XML contains an element " + elemQName + " at location " + xmlReader.getLocation() +
+                      " but there is no column defined in table " + table.getName() + " with this name. This element will be ignored.");
+        }
+        else
+        {
+            String value = xmlReader.getElementText();
+
+            if (value != null)
+            {
+                value = value.trim();
+
+                if (usesBase64)
+                {
+                    value = new String(Base64.decodeBase64(value.getBytes()));
+                }
+                setColumnValue(bean, table, column, value);
+            }
+        }
+        consumeRestOfElement(xmlReader);
+    }
+
+    private void setColumnValue(DynaBean bean, Table table, Column column, String value) throws DdlUtilsXMLException
+    {
+        SqlTypeConverter converter = _converterConf.getRegisteredConverter(table, column);
+        Object           propValue = (converter != null ? converter.convertFromString(value, column.getTypeCode()) : value);
+
+        try
+        {
+            PropertyUtils.setProperty(bean, column.getName(), propValue);
+        }
+        catch (NoSuchMethodException ex)
+        {
+            throw new DdlUtilsXMLException("Undefined column " + column.getName());
+        }
+        catch (IllegalAccessException ex)
+        {
+            throw new DdlUtilsXMLException("Could not set bean property for column " + column.getName(), ex);
+        }
+        catch (InvocationTargetException ex)
+        {
+            throw new DdlUtilsXMLException("Could not set bean property for column " + column.getName(), ex);
+        }
+    }
+
+    // TODO: move these two into a helper class:
+    
+    /**
+     * Reads over the current element. This assumes that the current XML stream event type is
+     * START_ELEMENT.
+     *  
+     * @param reader The xml reader
+     */
+    private void readOverElement(XMLStreamReader reader) throws XMLStreamException
+    {
+        int depth = 1;
+
+        while (depth > 0)
+        {
+            int eventType = reader.next();
+
+            if (eventType == XMLStreamReader.START_ELEMENT)
+            {
+                depth++;
+            }
+            else if (eventType == XMLStreamReader.END_ELEMENT)
+            {
+                depth--;
+            }
+        }
+    }
+    
+    /**
+     * Consumes the rest of the current element. This assumes that the current XML stream
+     * event type is not START_ELEMENT.
+     * 
+     * @param reader The xml reader
+     */
+    private void consumeRestOfElement(XMLStreamReader reader) throws XMLStreamException
+    {
+        int eventType = reader.getEventType();
+
+        while ((eventType != XMLStreamReader.END_ELEMENT) && (eventType != XMLStreamReader.END_DOCUMENT))
+        {
+            eventType = reader.next();
+        }
+    }
+}

Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/DatabaseDataIO.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/DatabaseDataIO.java?rev=684636&r1=684635&r2=684636&view=diff
==============================================================================
--- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/DatabaseDataIO.java (original)
+++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/DatabaseDataIO.java Sun Aug 10 22:39:55 2008
@@ -723,7 +723,7 @@
     {
         try
         {
-            dataReader.parse(path);
+            dataReader.read(path);
         }
         catch (Exception ex)
         {
@@ -744,7 +744,7 @@
     {
         try
         {
-            dataReader.parse(input);
+            dataReader.read(input);
         }
         catch (Exception ex)
         {
@@ -765,7 +765,7 @@
     {
         try
         {
-            dataReader.parse(input);
+            dataReader.read(input);
         }
         catch (Exception ex)
         {

Added: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/XMLUtils.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/XMLUtils.java?rev=684636&view=auto
==============================================================================
--- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/XMLUtils.java (added)
+++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/XMLUtils.java Sun Aug 10 22:39:55 2008
@@ -0,0 +1,295 @@
+package org.apache.ddlutils.io;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */ 
+
+/**
+  * Contains basic utility methods for XML.</p>
+  * This class is borrowed from <a href='http://commons.apache.org/betwixt/'>Apache Commons Betwixt</a>
+  * whose class in turn is based on code in <a href='http://xerces.apache.org/xerces2-j/index.html'>Apache Xerces</a>.
+  * <p>The code for {@link #isWellFormedXMLName} is based on code in 
+  * <code>org.apache.xerces.util.XMLChar</code> 
+  * in <a href='http://xerces.apache.org/xerces2-j/index.html'>Apache Xerces</a>.
+  * The authors of the Xerces and Betwixt classes are credited below.</p>
+  *
+  * @author Glenn Marcy, IBM
+  * @author Andy Clark, IBM
+  * @author Eric Ye, IBM
+  * @author Arnaud  Le Hors, IBM
+  * @author Rahul Srivastava, Sun Microsystems Inc.  
+  * @author Robert Burrell Donkin
+  */
+public class XMLUtils
+{
+    /** Name start character mask. */
+    private static final int MASK_NAME_START = 0x01;
+    /** Name character mask. */
+    private static final int MASK_NAME = 0x02;
+    
+    /** Character flags. */
+    private static final byte[] CHARS = new byte[1 << 16];
+
+    static
+    {
+        //
+        // [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' |
+        //                  CombiningChar | Extender
+        //
+        int nameChar[] =
+        { 
+            0x002D, 0x002E, // '-' and '.'
+        };
+
+        //
+        // [5] Name ::= (Letter | '_' | ':') (NameChar)*
+        //
+        int nameStartChar[] =
+        { 
+            0x003A, 0x005F, // ':' and '_'
+        };
+
+        //
+        // [84] Letter ::= BaseChar | Ideographic
+        //
+        int letterRange[] =
+        {
+            // BaseChar
+            0x0041, 0x005A, 0x0061, 0x007A, 0x00C0, 0x00D6, 0x00D8, 0x00F6,
+            0x00F8, 0x0131, 0x0134, 0x013E, 0x0141, 0x0148, 0x014A, 0x017E,
+            0x0180, 0x01C3, 0x01CD, 0x01F0, 0x01F4, 0x01F5, 0x01FA, 0x0217,
+            0x0250, 0x02A8, 0x02BB, 0x02C1, 0x0388, 0x038A, 0x038E, 0x03A1,
+            0x03A3, 0x03CE, 0x03D0, 0x03D6, 0x03E2, 0x03F3, 0x0401, 0x040C,
+            0x040E, 0x044F, 0x0451, 0x045C, 0x045E, 0x0481, 0x0490, 0x04C4,
+            0x04C7, 0x04C8, 0x04CB, 0x04CC, 0x04D0, 0x04EB, 0x04EE, 0x04F5,
+            0x04F8, 0x04F9, 0x0531, 0x0556, 0x0561, 0x0586, 0x05D0, 0x05EA,
+            0x05F0, 0x05F2, 0x0621, 0x063A, 0x0641, 0x064A, 0x0671, 0x06B7,
+            0x06BA, 0x06BE, 0x06C0, 0x06CE, 0x06D0, 0x06D3, 0x06E5, 0x06E6,
+            0x0905, 0x0939, 0x0958, 0x0961, 0x0985, 0x098C, 0x098F, 0x0990,
+            0x0993, 0x09A8, 0x09AA, 0x09B0, 0x09B6, 0x09B9, 0x09DC, 0x09DD,
+            0x09DF, 0x09E1, 0x09F0, 0x09F1, 0x0A05, 0x0A0A, 0x0A0F, 0x0A10,
+            0x0A13, 0x0A28, 0x0A2A, 0x0A30, 0x0A32, 0x0A33, 0x0A35, 0x0A36,
+            0x0A38, 0x0A39, 0x0A59, 0x0A5C, 0x0A72, 0x0A74, 0x0A85, 0x0A8B,
+            0x0A8F, 0x0A91, 0x0A93, 0x0AA8, 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3,
+            0x0AB5, 0x0AB9, 0x0B05, 0x0B0C, 0x0B0F, 0x0B10, 0x0B13, 0x0B28,
+            0x0B2A, 0x0B30, 0x0B32, 0x0B33, 0x0B36, 0x0B39, 0x0B5C, 0x0B5D,
+            0x0B5F, 0x0B61, 0x0B85, 0x0B8A, 0x0B8E, 0x0B90, 0x0B92, 0x0B95,
+            0x0B99, 0x0B9A, 0x0B9E, 0x0B9F, 0x0BA3, 0x0BA4, 0x0BA8, 0x0BAA,
+            0x0BAE, 0x0BB5, 0x0BB7, 0x0BB9, 0x0C05, 0x0C0C, 0x0C0E, 0x0C10,
+            0x0C12, 0x0C28, 0x0C2A, 0x0C33, 0x0C35, 0x0C39, 0x0C60, 0x0C61,
+            0x0C85, 0x0C8C, 0x0C8E, 0x0C90, 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3,
+            0x0CB5, 0x0CB9, 0x0CE0, 0x0CE1, 0x0D05, 0x0D0C, 0x0D0E, 0x0D10,
+            0x0D12, 0x0D28, 0x0D2A, 0x0D39, 0x0D60, 0x0D61, 0x0E01, 0x0E2E,
+            0x0E32, 0x0E33, 0x0E40, 0x0E45, 0x0E81, 0x0E82, 0x0E87, 0x0E88,
+            0x0E94, 0x0E97, 0x0E99, 0x0E9F, 0x0EA1, 0x0EA3, 0x0EAA, 0x0EAB,
+            0x0EAD, 0x0EAE, 0x0EB2, 0x0EB3, 0x0EC0, 0x0EC4, 0x0F40, 0x0F47,
+            0x0F49, 0x0F69, 0x10A0, 0x10C5, 0x10D0, 0x10F6, 0x1102, 0x1103,
+            0x1105, 0x1107, 0x110B, 0x110C, 0x110E, 0x1112, 0x1154, 0x1155,
+            0x115F, 0x1161, 0x116D, 0x116E, 0x1172, 0x1173, 0x11AE, 0x11AF,
+            0x11B7, 0x11B8, 0x11BC, 0x11C2, 0x1E00, 0x1E9B, 0x1EA0, 0x1EF9,
+            0x1F00, 0x1F15, 0x1F18, 0x1F1D, 0x1F20, 0x1F45, 0x1F48, 0x1F4D,
+            0x1F50, 0x1F57, 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FBC,
+            0x1FC2, 0x1FC4, 0x1FC6, 0x1FCC, 0x1FD0, 0x1FD3, 0x1FD6, 0x1FDB,
+            0x1FE0, 0x1FEC, 0x1FF2, 0x1FF4, 0x1FF6, 0x1FFC, 0x212A, 0x212B,
+            0x2180, 0x2182, 0x3041, 0x3094, 0x30A1, 0x30FA, 0x3105, 0x312C,
+            0xAC00, 0xD7A3,
+            // Ideographic
+            0x3021, 0x3029, 0x4E00, 0x9FA5,
+        };
+        int letterChar[] =
+        {
+            // BaseChar
+            0x0386, 0x038C, 0x03DA, 0x03DC, 0x03DE, 0x03E0, 0x0559, 0x06D5,
+            0x093D, 0x09B2, 0x0A5E, 0x0A8D, 0x0ABD, 0x0AE0, 0x0B3D, 0x0B9C,
+            0x0CDE, 0x0E30, 0x0E84, 0x0E8A, 0x0E8D, 0x0EA5, 0x0EA7, 0x0EB0,
+            0x0EBD, 0x1100, 0x1109, 0x113C, 0x113E, 0x1140, 0x114C, 0x114E,
+            0x1150, 0x1159, 0x1163, 0x1165, 0x1167, 0x1169, 0x1175, 0x119E,
+            0x11A8, 0x11AB, 0x11BA, 0x11EB, 0x11F0, 0x11F9, 0x1F59, 0x1F5B,
+            0x1F5D, 0x1FBE, 0x2126, 0x212E,
+            // Ideographic
+            0x3007,
+        };
+
+        //
+        // [87] CombiningChar ::= ...
+        //
+        int combiningCharRange[] =
+        {
+            0x0300, 0x0345, 0x0360, 0x0361, 0x0483, 0x0486, 0x0591, 0x05A1,
+            0x05A3, 0x05B9, 0x05BB, 0x05BD, 0x05C1, 0x05C2, 0x064B, 0x0652,
+            0x06D6, 0x06DC, 0x06DD, 0x06DF, 0x06E0, 0x06E4, 0x06E7, 0x06E8,
+            0x06EA, 0x06ED, 0x0901, 0x0903, 0x093E, 0x094C, 0x0951, 0x0954,
+            0x0962, 0x0963, 0x0981, 0x0983, 0x09C0, 0x09C4, 0x09C7, 0x09C8,
+            0x09CB, 0x09CD, 0x09E2, 0x09E3, 0x0A40, 0x0A42, 0x0A47, 0x0A48,
+            0x0A4B, 0x0A4D, 0x0A70, 0x0A71, 0x0A81, 0x0A83, 0x0ABE, 0x0AC5,
+            0x0AC7, 0x0AC9, 0x0ACB, 0x0ACD, 0x0B01, 0x0B03, 0x0B3E, 0x0B43,
+            0x0B47, 0x0B48, 0x0B4B, 0x0B4D, 0x0B56, 0x0B57, 0x0B82, 0x0B83,
+            0x0BBE, 0x0BC2, 0x0BC6, 0x0BC8, 0x0BCA, 0x0BCD, 0x0C01, 0x0C03,
+            0x0C3E, 0x0C44, 0x0C46, 0x0C48, 0x0C4A, 0x0C4D, 0x0C55, 0x0C56,
+            0x0C82, 0x0C83, 0x0CBE, 0x0CC4, 0x0CC6, 0x0CC8, 0x0CCA, 0x0CCD,
+            0x0CD5, 0x0CD6, 0x0D02, 0x0D03, 0x0D3E, 0x0D43, 0x0D46, 0x0D48,
+            0x0D4A, 0x0D4D, 0x0E34, 0x0E3A, 0x0E47, 0x0E4E, 0x0EB4, 0x0EB9,
+            0x0EBB, 0x0EBC, 0x0EC8, 0x0ECD, 0x0F18, 0x0F19, 0x0F71, 0x0F84,
+            0x0F86, 0x0F8B, 0x0F90, 0x0F95, 0x0F99, 0x0FAD, 0x0FB1, 0x0FB7,
+            0x20D0, 0x20DC, 0x302A, 0x302F,
+        };
+
+        int combiningCharChar[] =
+        {
+            0x05BF, 0x05C4, 0x0670, 0x093C, 0x094D, 0x09BC, 0x09BE, 0x09BF,
+            0x09D7, 0x0A02, 0x0A3C, 0x0A3E, 0x0A3F, 0x0ABC, 0x0B3C, 0x0BD7,
+            0x0D57, 0x0E31, 0x0EB1, 0x0F35, 0x0F37, 0x0F39, 0x0F3E, 0x0F3F,
+            0x0F97, 0x0FB9, 0x20E1, 0x3099, 0x309A,
+        };
+
+        //
+        // [88] Digit ::= ...
+        //
+        int digitRange[] =
+        {
+            0x0030, 0x0039, 0x0660, 0x0669, 0x06F0, 0x06F9, 0x0966, 0x096F,
+            0x09E6, 0x09EF, 0x0A66, 0x0A6F, 0x0AE6, 0x0AEF, 0x0B66, 0x0B6F,
+            0x0BE7, 0x0BEF, 0x0C66, 0x0C6F, 0x0CE6, 0x0CEF, 0x0D66, 0x0D6F,
+            0x0E50, 0x0E59, 0x0ED0, 0x0ED9, 0x0F20, 0x0F29,
+        };
+
+        //
+        // [89] Extender ::= ...
+        //
+        int extenderRange[] =
+        {
+            0x3031, 0x3035, 0x309D, 0x309E, 0x30FC, 0x30FE,
+        };
+
+        int extenderChar[] =
+        {
+            0x00B7, 0x02D0, 0x02D1, 0x0387, 0x0640, 0x0E46, 0x0EC6, 0x3005,
+        };
+
+        // set name start characters
+        for (int idx = 0; idx < nameStartChar.length; idx++)
+        {
+            CHARS[nameStartChar[idx]] |= MASK_NAME_START | MASK_NAME;
+        }
+        for (int idx1 = 0; idx1 < letterRange.length; idx1 += 2)
+        {
+            for (int idx2 = letterRange[idx1]; idx2 <= letterRange[idx1 + 1]; idx2++)
+            {
+                CHARS[idx2] |= MASK_NAME_START | MASK_NAME;
+            }
+        }
+        for (int idx = 0; idx < letterChar.length; idx++)
+        {
+            CHARS[letterChar[idx]] |= MASK_NAME_START | MASK_NAME;
+        }
+
+        // set name characters
+        for (int idx = 0; idx < nameChar.length; idx++)
+        {
+            CHARS[nameChar[idx]] |= MASK_NAME;
+        }
+        for (int idx1 = 0; idx1 < digitRange.length; idx1 += 2)
+        {
+            for (int idx2 = digitRange[idx1]; idx2 <= digitRange[idx1 + 1]; idx2++)
+            {
+                CHARS[idx2] |= MASK_NAME;
+            }
+        }
+        for (int idx1 = 0; idx1 < combiningCharRange.length; idx1 += 2)
+        {
+            for (int idx2 = combiningCharRange[idx1]; idx2 <= combiningCharRange[idx1 + 1]; idx2++)
+            {
+                CHARS[idx2] |= MASK_NAME;
+            }
+        }
+        for (int idx = 0; idx < combiningCharChar.length; idx++)
+        {
+            CHARS[combiningCharChar[idx]] |= MASK_NAME;
+        }
+        for (int idx1 = 0; idx1 < extenderRange.length; idx1 += 2)
+        {
+            for (int idx2 = extenderRange[idx1]; idx2 <= extenderRange[idx1 + 1]; idx2++)
+            {
+                CHARS[idx2] |= MASK_NAME;
+            }
+        }
+        for (int idx = 0; idx < extenderChar.length; idx++) {
+            CHARS[extenderChar[idx]] |= MASK_NAME;
+        }
+
+    }
+        
+    /**
+     * <p>Determines whether the given string is a well formed xml name.
+     * Only certain characters are allowed in well formed element and attribute
+     * names in xml. For example, white space is not allowed in a name.</p>
+     *
+     * <p>The code for this method is based on code in <code>org.apache.xerces.util.XMLChar</code> 
+     * in <a href='http://xerces.apache.org/xerces2-j/index.html'>Apache Xerces</a>.
+     * The authors of this class are credited at the top of this class.</p>
+     *
+     * @param name The string to be checked for use as an xml attribute or element name.
+     *             Returns <code>false</code> if <code>name</code> is null
+     * @return Whether this string would be a well-formed name
+     */
+    public static boolean isWellFormedXMLName(String name)
+    {
+        if ((name == null) || (name.length() == 0))
+        {
+            return false;
+        }
+        
+        char ch = name.charAt(0);
+ 
+        if (isNameStartChar(ch) == false)
+        {
+           return false;
+           
+        }
+
+        for (int idx = 1; idx < name.length(); idx++)
+        {
+            ch = name.charAt(idx);
+            if (isNameChar(ch) == false)
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Returns true if the specified character is a valid name character as defined by the XML 1.0 specification.
+     *
+     * @param c The character to check
+     * @return Whether this is an XML name character
+     */
+    public static boolean isNameChar(int c)
+    {
+        return (c < 0x10000) && ((CHARS[c] & MASK_NAME) != 0);
+    }
+    
+    /**
+     * Returns true if the specified character is a valid name start character as defined in the XML 1.0 specification.
+     *
+     * @param c The character to check
+     * @return Whether this is an XML name start character
+     */
+    public static boolean isNameStartChar(int c)
+    {
+        return (c < 0x10000) && ((CHARS[c] & MASK_NAME_START) != 0);
+    }
+}

Modified: db/ddlutils/trunk/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java?rev=684636&r1=684635&r2=684636&view=diff
==============================================================================
--- db/ddlutils/trunk/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java (original)
+++ db/ddlutils/trunk/src/test/java/org/apache/ddlutils/TestAgainstLiveDatabaseBase.java Sun Aug 10 22:39:55 2008
@@ -505,7 +505,7 @@
             dataReader.setModel(_model);
             dataReader.setSink(new DataToDatabaseSink(getPlatform(), _model));
             dataReader.getSink().start();
-            dataReader.parse(new StringReader(dataXml));
+            dataReader.read(new StringReader(dataXml));
             dataReader.getSink().end();
             return _model;
         }

Modified: db/ddlutils/trunk/src/test/java/org/apache/ddlutils/io/TestDataReaderAndWriter.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/java/org/apache/ddlutils/io/TestDataReaderAndWriter.java?rev=684636&r1=684635&r2=684636&view=diff
==============================================================================
--- db/ddlutils/trunk/src/test/java/org/apache/ddlutils/io/TestDataReaderAndWriter.java (original)
+++ db/ddlutils/trunk/src/test/java/org/apache/ddlutils/io/TestDataReaderAndWriter.java Sun Aug 10 22:39:55 2008
@@ -19,8 +19,13 @@
  * under the License.
  */
 
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
 import java.io.StringReader;
 import java.io.StringWriter;
+import java.io.Writer;
 import java.util.ArrayList;
 
 import junit.framework.TestCase;
@@ -37,48 +42,70 @@
  */
 public class TestDataReaderAndWriter extends TestCase
 {
+    // no need to call start/end as the don't do anything anyways
+    private static class TestDataSink implements DataSink
+    {
+        private final ArrayList readObjects;
+
+        private TestDataSink(ArrayList readObjects)
+        {
+            this.readObjects = readObjects;
+        }
+
+        public void start() throws DataSinkException
+        {}
+
+        public void addBean(DynaBean bean) throws DataSinkException
+        {
+            readObjects.add(bean);
+        }
+
+        public void end() throws DataSinkException
+        {}
+    }
+
     /**
      * Tests reading the data from XML.
      */
     public void testRead() throws Exception
     {
         final String testSchemaXml = 
-            "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"+
-            "<database name=\"bookstore\">\n"+
-            "  <table name=\"author\">\n"+
-            "    <column name=\"author_id\" type=\"INTEGER\" primaryKey=\"true\" required=\"true\"/>\n"+
-            "    <column name=\"name\" type=\"VARCHAR\" size=\"50\" required=\"true\"/>\n"+
-            "    <column name=\"organisation\" type=\"VARCHAR\" size=\"50\" required=\"false\"/>\n"+
-            "  </table>\n"+
-            "  <table name=\"book\">\n"+
-            "    <column name=\"book_id\" type=\"INTEGER\" required=\"true\" primaryKey=\"true\" autoIncrement=\"true\"/>\n"+
-            "    <column name=\"isbn\" type=\"VARCHAR\" size=\"15\" required=\"true\"/>\n"+
-            "    <column name=\"author_id\" type=\"INTEGER\" required=\"true\"/>\n"+
-            "    <column name=\"title\" type=\"VARCHAR\" size=\"255\" defaultValue=\"N/A\" required=\"true\"/>\n"+
-            "    <column name=\"issue_date\" type=\"DATE\" required=\"false\"/>\n"+
-            "    <foreign-key foreignTable=\"author\">\n"+
-            "      <reference local=\"author_id\" foreign=\"author_id\"/>\n"+
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='bookstore'>\n"+
+            "  <table name='author'>\n"+
+            "    <column name='author_id' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='name' type='VARCHAR' size='50' required='true'/>\n"+
+            "    <column name='organisation' type='VARCHAR' size='50' required='false'/>\n"+
+            "  </table>\n"+
+            "  <table name='book'>\n"+
+            "    <column name='book_id' type='INTEGER' required='true' primaryKey='true' autoIncrement='true'/>\n"+
+            "    <column name='isbn' type='VARCHAR' size='15' required='true'/>\n"+
+            "    <column name='author_id' type='INTEGER' required='true'/>\n"+
+            "    <column name='title' type='VARCHAR' size='255' default='N/A' required='true'/>\n"+
+            "    <column name='issue_date' type='DATE' required='false'/>\n"+
+            "    <foreign-key foreignTable='author'>\n"+
+            "      <reference local='author_id' foreign='author_id'/>\n"+
             "    </foreign-key>\n"+
-            "    <index name=\"book_isbn\">\n"+
-            "      <index-column name=\"isbn\"/>\n"+
+            "    <index name='book_isbn'>\n"+
+            "      <index-column name='isbn'/>\n"+
             "    </index>\n"+
             "  </table>\n"+
             "</database>";
         final String testDataXml =
             "<data>\n"+
-            "  <author author_id=\"1\" name=\"Ernest Hemingway\"/>\n"+
-            "  <author author_id=\"2\" name=\"William Shakespeare\"/>\n"+
-            "  <book book_id=\"1\" author_id=\"1\">\n"+
+            "  <author author_id='1' name='Ernest Hemingway'/>\n"+
+            "  <author author_id='2' name='William Shakespeare'/>\n"+
+            "  <book book_id='1' author_id='1'>\n"+
             "    <isbn>0684830493</isbn>\n"+
             "    <title>Old Man And The Sea</title>\n"+
             "    <issue_date>1952</issue_date>\n"+
             "  </book>\n"+
-            "  <book book_id=\"2\" author_id=\"2\">\n"+
+            "  <book book_id='2' author_id='2'>\n"+
             "    <isbn>0198321465</isbn>\n"+
             "    <title>Macbeth</title>\n"+
             "    <issue_date>1606</issue_date>\n"+
             "  </book>\n"+
-            "  <book book_id=\"3\" author_id=\"2\">\n"+
+            "  <book book_id='3' author_id='2'>\n"+
             "    <isbn>0140707026</isbn>\n"+
             "    <title>A Midsummer Night's Dream</title>\n"+
             "    <issue_date>1595</issue_date>\n"+
@@ -87,28 +114,15 @@
 
         DatabaseIO modelReader = new DatabaseIO();
 
-        modelReader.setUseInternalDtd(true);
-        modelReader.setValidateXml(false);
+        modelReader.setValidateXml(true);
         
         Database        model       = modelReader.read(new StringReader(testSchemaXml));
         final ArrayList readObjects = new ArrayList();
         DataReader      dataReader  = new DataReader();
 
         dataReader.setModel(model);
-        dataReader.setSink(new DataSink() {
-            public void start() throws DataSinkException
-            {}
-
-            public void addBean(DynaBean bean) throws DataSinkException
-            {
-                readObjects.add(bean);
-            }
-
-            public void end() throws DataSinkException
-            {}
-        });
-        // no need to call start/end as the don't do anything anyways
-        dataReader.parse(new StringReader(testDataXml));
+        dataReader.setSink(new TestDataSink(readObjects));
+        dataReader.read(new StringReader(testDataXml));
 
         assertEquals(5, readObjects.size());
 
@@ -169,24 +183,543 @@
     }
 
     /**
+     * Tests reading the data from a file via the {#link {@link DataReader#read(String)} method.
+     */
+    public void testReadFromFile1() throws Exception
+    {
+        final String testSchemaXml = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='test'>\n" +
+            "  <table name='test'>\n"+
+            "    <column name='id' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='value' type='VARCHAR' size='50' required='true'/>\n"+
+            "  </table>\n"+
+            "</database>";
+        final String testDataXml =
+            "<data>\n"+
+            "  <test id='1' value='foo'/>\n"+
+            "</data>";
+
+        File tmpFile = File.createTempFile("data", ".xml");
+
+        try
+        {
+            Writer writer = new BufferedWriter(new FileWriter(tmpFile));
+
+            writer.write(testDataXml);
+            writer.close();
+
+            DatabaseIO modelReader = new DatabaseIO();
+
+            modelReader.setValidateXml(true);
+            
+            Database        model       = modelReader.read(new StringReader(testSchemaXml));
+            final ArrayList readObjects = new ArrayList();
+            DataReader      dataReader  = new DataReader();
+    
+            dataReader.setModel(model);
+            dataReader.setSink(new TestDataSink(readObjects));
+            dataReader.read(tmpFile.getAbsolutePath());
+    
+            assertEquals(1, readObjects.size());
+    
+            DynaBean obj = (DynaBean)readObjects.get(0);
+    
+            assertEquals("test",
+                         obj.getDynaClass().getName());
+            assertEquals("1",
+                         obj.get("id").toString());
+            assertEquals("foo",
+                         obj.get("value").toString());
+        }
+        finally
+        {
+            tmpFile.delete();
+        }
+    }
+
+    /**
+     * Tests reading the data from a file via the {#link {@link DataReader#read(File)} method.
+     */
+    public void testReadFromFile2() throws Exception
+    {
+        final String testSchemaXml = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='test'>\n" +
+            "  <table name='test'>\n"+
+            "    <column name='id' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='value' type='VARCHAR' size='50' required='true'/>\n"+
+            "  </table>\n"+
+            "</database>";
+        final String testDataXml =
+            "<data>\n"+
+            "  <test id='1' value='foo'/>\n"+
+            "</data>";
+
+        File tmpFile = File.createTempFile("data", ".xml");
+
+        try
+        {
+            Writer writer = new BufferedWriter(new FileWriter(tmpFile));
+
+            writer.write(testDataXml);
+            writer.close();
+
+            DatabaseIO modelReader = new DatabaseIO();
+
+            modelReader.setValidateXml(true);
+            
+            Database        model       = modelReader.read(new StringReader(testSchemaXml));
+            final ArrayList readObjects = new ArrayList();
+            DataReader      dataReader  = new DataReader();
+    
+            dataReader.setModel(model);
+            dataReader.setSink(new TestDataSink(readObjects));
+            dataReader.read(tmpFile);
+    
+            assertEquals(1, readObjects.size());
+    
+            DynaBean obj = (DynaBean)readObjects.get(0);
+    
+            assertEquals("test",
+                         obj.getDynaClass().getName());
+            assertEquals("1",
+                         obj.get("id").toString());
+            assertEquals("foo",
+                         obj.get("value").toString());
+        }
+        finally
+        {
+            tmpFile.delete();
+        }
+    }
+
+    /**
+     * Tests reading the data from a file via the {#link {@link DataReader#read(java.io.InputStream)} method.
+     */
+    public void testReadFromFile3() throws Exception
+    {
+        final String testSchemaXml = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='test'>\n" +
+            "  <table name='test'>\n"+
+            "    <column name='id' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='value' type='VARCHAR' size='50' required='true'/>\n"+
+            "  </table>\n"+
+            "</database>";
+        final String testDataXml =
+            "<data>\n"+
+            "  <test id='1' value='foo'/>\n"+
+            "</data>";
+
+        File tmpFile = File.createTempFile("data", ".xml");
+
+        try
+        {
+            Writer writer = new BufferedWriter(new FileWriter(tmpFile));
+
+            writer.write(testDataXml);
+            writer.close();
+
+            DatabaseIO modelReader = new DatabaseIO();
+
+            modelReader.setValidateXml(true);
+            
+            Database        model       = modelReader.read(new StringReader(testSchemaXml));
+            final ArrayList readObjects = new ArrayList();
+            DataReader      dataReader  = new DataReader();
+    
+            dataReader.setModel(model);
+            dataReader.setSink(new TestDataSink(readObjects));
+            dataReader.read(new FileInputStream(tmpFile));
+    
+            assertEquals(1, readObjects.size());
+    
+            DynaBean obj = (DynaBean)readObjects.get(0);
+    
+            assertEquals("test",
+                         obj.getDynaClass().getName());
+            assertEquals("1",
+                         obj.get("id").toString());
+            assertEquals("foo",
+                         obj.get("value").toString());
+        }
+        finally
+        {
+            tmpFile.delete();
+        }
+    }
+
+    /**
+     * Tests sub elements for columns.
+     */
+    public void testSubElements() throws Exception
+    {
+        final String testSchemaXml = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='test'>\n" +
+            "  <table name='test'>\n"+
+            "    <column name='id' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='value' type='VARCHAR' size='50' required='true'/>\n"+
+            "  </table>\n"+
+            "</database>";
+        final String testDataXml =
+            "<data>\n"+
+            "  <test id='1'>\n"+
+            "    <value>foo</value>\n"+
+            "  </test>\n"+
+            "  <test id='2' value='foo'>\n"+
+            "    <value>bar</value>\n"+
+            "  </test>\n"+
+            "  <test id='3' value='baz'>\n"+
+            "  </test>\n"+
+            "</data>";
+
+        DatabaseIO modelReader = new DatabaseIO();
+
+        modelReader.setValidateXml(true);
+        
+        Database        model       = modelReader.read(new StringReader(testSchemaXml));
+        final ArrayList readObjects = new ArrayList();
+        DataReader      dataReader  = new DataReader();
+
+        dataReader.setModel(model);
+        dataReader.setSink(new TestDataSink(readObjects));
+        dataReader.read(new StringReader(testDataXml));
+
+        assertEquals(3, readObjects.size());
+
+        DynaBean obj = (DynaBean)readObjects.get(0);
+
+        assertEquals("test",
+                     obj.getDynaClass().getName());
+        assertEquals("1",
+                     obj.get("id").toString());
+        assertEquals("foo",
+                     obj.get("value").toString());
+
+        obj = (DynaBean)readObjects.get(1);
+
+        assertEquals("test",
+                     obj.getDynaClass().getName());
+        assertEquals("2",
+                     obj.get("id").toString());
+        assertEquals("bar",
+                     obj.get("value").toString());
+
+        obj = (DynaBean)readObjects.get(2);
+
+        assertEquals("test",
+                     obj.getDynaClass().getName());
+        assertEquals("3",
+                     obj.get("id").toString());
+        assertEquals("baz",
+                     obj.get("value").toString());
+    }
+
+    /**
+     * Tests that the name of the root element does not matter.
+     */
+    public void testRootElementNameDoesntMatter() throws Exception
+    {
+        final String testSchemaXml = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='test'>\n" +
+            "  <table name='test'>\n"+
+            "    <column name='id' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='value' type='VARCHAR' size='50' required='true'/>\n"+
+            "  </table>\n"+
+            "</database>";
+        final String testDataXml =
+            "<someRandomName>\n"+
+            "  <test id='1' value='foo'/>\n"+
+            "</someRandomName>";
+
+        DatabaseIO modelReader = new DatabaseIO();
+
+        modelReader.setValidateXml(true);
+        
+        Database        model       = modelReader.read(new StringReader(testSchemaXml));
+        final ArrayList readObjects = new ArrayList();
+        DataReader      dataReader  = new DataReader();
+
+        dataReader.setModel(model);
+        dataReader.setSink(new TestDataSink(readObjects));
+        dataReader.read(new StringReader(testDataXml));
+
+        assertEquals(1, readObjects.size());
+
+        DynaBean obj = (DynaBean)readObjects.get(0);
+
+        assertEquals("test",
+                     obj.getDynaClass().getName());
+        assertEquals("1",
+                     obj.get("id").toString());
+        assertEquals("foo",
+                     obj.get("value").toString());
+    }
+
+    /**
+     * Tests that elements for undefined tables are ignored.
+     */
+    public void testElementForUndefinedTable() throws Exception
+    {
+        final String testSchemaXml = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='test'>\n" +
+            "  <table name='test'>\n"+
+            "    <column name='id' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='value' type='VARCHAR' size='50' required='true'/>\n"+
+            "  </table>\n"+
+            "</database>";
+        final String testDataXml =
+            "<data>\n"+
+            "  <test id='1' value='foo'/>\n"+
+            "  <other id='2' value='bar'/>\n"+
+            "  <test id='3' value='baz'/>\n"+
+            "</data>";
+
+        DatabaseIO modelReader = new DatabaseIO();
+
+        modelReader.setValidateXml(true);
+        
+        Database        model       = modelReader.read(new StringReader(testSchemaXml));
+        final ArrayList readObjects = new ArrayList();
+        DataReader      dataReader  = new DataReader();
+
+        dataReader.setModel(model);
+        dataReader.setSink(new TestDataSink(readObjects));
+        dataReader.read(new StringReader(testDataXml));
+
+        assertEquals(2, readObjects.size());
+
+        DynaBean obj = (DynaBean)readObjects.get(0);
+
+        assertEquals("test",
+                     obj.getDynaClass().getName());
+        assertEquals("1",
+                     obj.get("id").toString());
+        assertEquals("foo",
+                     obj.get("value").toString());
+
+        obj = (DynaBean)readObjects.get(1);
+
+        assertEquals("test",
+                     obj.getDynaClass().getName());
+        assertEquals("3",
+                     obj.get("id").toString());
+        assertEquals("baz",
+                     obj.get("value").toString());
+    }
+
+    /**
+     * Tests that attributes for which no column is defined, are ignored.
+     */
+    public void testAttributeForUndefinedColumn() throws Exception
+    {
+        final String testSchemaXml = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='test'>\n" +
+            "  <table name='test'>\n"+
+            "    <column name='id' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='value' type='VARCHAR' size='50' required='true'/>\n"+
+            "  </table>\n"+
+            "</database>";
+        final String testDataXml =
+            "<data>\n"+
+            "  <test id='1' value1='foo'/>\n"+
+            "</data>";
+
+        DatabaseIO modelReader = new DatabaseIO();
+
+        modelReader.setValidateXml(true);
+        
+        Database        model       = modelReader.read(new StringReader(testSchemaXml));
+        final ArrayList readObjects = new ArrayList();
+        DataReader      dataReader  = new DataReader();
+
+        dataReader.setModel(model);
+        dataReader.setSink(new TestDataSink(readObjects));
+        dataReader.read(new StringReader(testDataXml));
+
+        assertEquals(1, readObjects.size());
+
+        DynaBean obj = (DynaBean)readObjects.get(0);
+
+        assertEquals("test",
+                     obj.getDynaClass().getName());
+        assertEquals("1",
+                     obj.get("id").toString());
+        assertNull(obj.get("value"));
+    }
+
+    /**
+     * Tests that sub elements for which no column is defined, are ignored.
+     */
+    public void testSubElementForUndefinedColumn() throws Exception
+    {
+        final String testSchemaXml = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='test'>\n" +
+            "  <table name='test'>\n"+
+            "    <column name='id' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='value' type='VARCHAR' size='50' required='true'/>\n"+
+            "  </table>\n"+
+            "</database>";
+        final String testDataXml =
+            "<data>\n"+
+            "  <test id='1'>\n"+
+            "    <value2>foo</value2>\n"+
+            "  </test>\n"+
+            "</data>";
+
+        DatabaseIO modelReader = new DatabaseIO();
+
+        modelReader.setValidateXml(true);
+        
+        Database        model       = modelReader.read(new StringReader(testSchemaXml));
+        final ArrayList readObjects = new ArrayList();
+        DataReader      dataReader  = new DataReader();
+
+        dataReader.setModel(model);
+        dataReader.setSink(new TestDataSink(readObjects));
+        dataReader.read(new StringReader(testDataXml));
+
+        assertEquals(1, readObjects.size());
+
+        DynaBean obj = (DynaBean)readObjects.get(0);
+
+        assertEquals("test",
+                     obj.getDynaClass().getName());
+        assertEquals("1",
+                     obj.get("id").toString());
+        assertNull(obj.get("value"));
+    }
+
+    /**
+     * Tests parsing when case sensitivity is turned on.
+     */
+    public void testCaseSensitivityTurnedOn() throws Exception
+    {
+        final String testSchemaXml = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='test'>\n" +
+            "  <table name='Test'>\n"+
+            "    <column name='Id' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='Value' type='VARCHAR' size='50' required='true'/>\n"+
+            "  </table>\n"+
+            "</database>";
+        final String testDataXml =
+            "<data>\n"+
+            "  <test Id='1' Value='foo'/>\n"+
+            "  <Test Id='2' value='baz'/>\n"+
+            "</data>";
+
+        DatabaseIO modelReader = new DatabaseIO();
+
+        modelReader.setValidateXml(true);
+        
+        Database        model       = modelReader.read(new StringReader(testSchemaXml));
+        final ArrayList readObjects = new ArrayList();
+        DataReader      dataReader  = new DataReader();
+
+        dataReader.setCaseSensitive(true);
+        dataReader.setModel(model);
+        dataReader.setSink(new TestDataSink(readObjects));
+        dataReader.read(new StringReader(testDataXml));
+
+        assertEquals(1, readObjects.size());
+
+        DynaBean obj = (DynaBean)readObjects.get(0);
+
+        assertEquals("Test",
+                     obj.getDynaClass().getName());
+        assertEquals("2",
+                     obj.get("Id").toString());
+        assertNull(obj.get("Value"));
+    }
+
+    /**
+     * Tests parsing when case sensitivity is turned off.
+     */
+    public void testCaseSensitivityTurnedOff() throws Exception
+    {
+        final String testSchemaXml = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='test'>\n" +
+            "  <table name='Test'>\n"+
+            "    <column name='Id' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='Value' type='VARCHAR' size='50' required='true'/>\n"+
+            "  </table>\n"+
+            "</database>";
+        final String testDataXml =
+            "<data>\n"+
+            "  <test Id='1' Value='foo'/>\n"+
+            "  <Test Id='2' value='bar'/>\n"+
+            "  <Test id='3' Value='baz'/>\n"+
+            "</data>";
+
+        DatabaseIO modelReader = new DatabaseIO();
+
+        modelReader.setValidateXml(true);
+        
+        Database        model       = modelReader.read(new StringReader(testSchemaXml));
+        final ArrayList readObjects = new ArrayList();
+        DataReader      dataReader  = new DataReader();
+
+        dataReader.setCaseSensitive(false);
+        dataReader.setModel(model);
+        dataReader.setSink(new TestDataSink(readObjects));
+        dataReader.read(new StringReader(testDataXml));
+
+        assertEquals(3, readObjects.size());
+
+        DynaBean obj = (DynaBean)readObjects.get(0);
+
+        assertEquals("Test",
+                     obj.getDynaClass().getName());
+        assertEquals("1",
+                     obj.get("Id").toString());
+        assertEquals("foo",
+                     obj.get("Value").toString());
+
+        obj = (DynaBean)readObjects.get(1);
+
+        assertEquals("Test",
+                     obj.getDynaClass().getName());
+        assertEquals("2",
+                     obj.get("Id").toString());
+        assertEquals("bar",
+                     obj.get("Value").toString());
+
+        obj = (DynaBean)readObjects.get(2);
+
+        assertEquals("Test",
+                     obj.getDynaClass().getName());
+        assertEquals("3",
+                     obj.get("Id").toString());
+        assertEquals("baz",
+                     obj.get("Value").toString());
+    }
+
+    /**
      * Tests special characters in the data XML (for DDLUTILS-63).
      */
     public void testSpecialCharacters() throws Exception
     {
         final String testSchemaXml = 
-            "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"+
-            "<database name=\"test\">\n"+
-            "  <table name=\"test\">\n"+
-            "    <column name=\"id\" type=\"INTEGER\" primaryKey=\"true\" required=\"true\"/>\n"+
-            "    <column name=\"value\" type=\"VARCHAR\" size=\"50\" required=\"true\"/>\n"+
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='test'>\n" +
+            "  <table name='test'>\n"+
+            "    <column name='id' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='value' type='VARCHAR' size='50' required='true'/>\n"+
             "  </table>\n"+
             "</database>";
         final String testedValue = "Some Special Characters: \u0001\u0009\u0010";
 
         DatabaseIO modelIO = new DatabaseIO();
 
-        modelIO.setUseInternalDtd(true);
-        modelIO.setValidateXml(false);
+        modelIO.setValidateXml(true);
         
         Database     model      = modelIO.read(new StringReader(testSchemaXml));
         StringWriter output     = new StringWriter();
@@ -205,20 +738,8 @@
         DataReader      dataReader  = new DataReader();
 
         dataReader.setModel(model);
-        dataReader.setSink(new DataSink() {
-            public void start() throws DataSinkException
-            {}
-
-            public void addBean(DynaBean bean) throws DataSinkException
-            {
-                readObjects.add(bean);
-            }
-
-            public void end() throws DataSinkException
-            {}
-        });
-        // no need to call start/end as they don't do anything anyways
-        dataReader.parse(new StringReader(dataXml));
+        dataReader.setSink(new TestDataSink(readObjects));
+        dataReader.read(new StringReader(dataXml));
 
         assertEquals(1, readObjects.size());
 
@@ -232,25 +753,24 @@
                      obj.get("value").toString());
     }
 
-
     /**
      * Tests a cdata section (see DDLUTILS-174).
      */
     public void testCData() throws Exception
     {
         final String testSchemaXml = 
-            "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"+
-            "<database name=\"test\">\n"+
-            "  <table name=\"test\">\n"+
-            "    <column name=\"id\" type=\"INTEGER\" primaryKey=\"true\" required=\"true\"/>\n"+
-            "    <column name=\"value1\" type=\"VARCHAR\" size=\"50\" required=\"true\"/>\n"+
-            "    <column name=\"value2\" type=\"VARCHAR\" size=\"4000\" required=\"true\"/>\n"+
-            "    <column name=\"value3\" type=\"LONGVARCHAR\" size=\"4000\" required=\"true\"/>\n"+
-            "    <column name=\"value4\" type=\"LONGVARCHAR\" size=\"4000\" required=\"true\"/>\n"+
-            "    <column name=\"value5\" type=\"LONGVARCHAR\" size=\"4000\" required=\"true\"/>\n"+
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='test'>\n" +
+            "  <table name='test'>\n"+
+            "    <column name='id' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='value1' type='VARCHAR' size='50' required='true'/>\n"+
+            "    <column name='value2' type='VARCHAR' size='4000' required='true'/>\n"+
+            "    <column name='value3' type='LONGVARCHAR' size='4000' required='true'/>\n"+
+            "    <column name='value4' type='LONGVARCHAR' size='4000' required='true'/>\n"+
+            "    <column name='value5' type='LONGVARCHAR' size='4000' required='true'/>\n"+
             "  </table>\n"+
             "</database>";
-        final String testedValue1 = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><test><![CDATA[some text]]></test>";
+        final String testedValue1 = "<?xml version='1.0' encoding='ISO-8859-1'?><test><![CDATA[some text]]></test>";
         final String testedValue2 = StringUtils.repeat("a ", 1000) + testedValue1;
         final String testedValue3 = "<div>\n<h1><![CDATA[WfMOpen]]></h1>\n" + StringUtils.repeat("Make it longer\n", 99) +  "</div>";
         final String testedValue4 = "<![CDATA[" + StringUtils.repeat("b \n", 1000) +  "]]>";
@@ -258,8 +778,7 @@
 
         DatabaseIO modelIO = new DatabaseIO();
 
-        modelIO.setUseInternalDtd(true);
-        modelIO.setValidateXml(false);
+        modelIO.setValidateXml(true);
 
         Database     model      = modelIO.read(new StringReader(testSchemaXml));
         StringWriter output     = new StringWriter();
@@ -282,20 +801,8 @@
         DataReader      dataReader  = new DataReader();
 
         dataReader.setModel(model);
-        dataReader.setSink(new DataSink() {
-            public void start() throws DataSinkException
-            {}
-
-            public void addBean(DynaBean bean) throws DataSinkException
-            {
-                readObjects.add(bean);
-            }
-
-            public void end() throws DataSinkException
-            {}
-        });
-        // no need to call start/end as they don't do anything anyways
-        dataReader.parse(new StringReader(dataXml));
+        dataReader.setSink(new TestDataSink(readObjects));
+        dataReader.read(new StringReader(dataXml));
 
         assertEquals(1, readObjects.size());
 
@@ -316,4 +823,59 @@
         assertEquals(testedValue5,
                      obj.get("value5").toString());
     }
+
+    /**
+     * Tests the reader & writer behavior when the table name is not a valid XML identifier.
+     */
+    public void testTableNameNotAValidXmlIdentifier() throws Exception
+    {
+        final String testSchemaXml = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+            "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='test'>\n" +
+            "  <table name='test'>\n"+
+            "    <column name='id' type='INTEGER' primaryKey='true' required='true'/>\n"+
+            "    <column name='value' type='VARCHAR' size='50' required='true'/>\n"+
+            "  </table>\n"+
+            "</database>";
+        final String testedValue = "Some Special Characters: \u0001\u0009\u0010";
+
+        DatabaseIO modelIO = new DatabaseIO();
+
+        modelIO.setValidateXml(true);
+        
+        Database     model      = modelIO.read(new StringReader(testSchemaXml));
+        StringWriter output     = new StringWriter();
+        DataWriter   dataWriter = new DataWriter(output, "UTF-8");
+        SqlDynaBean  bean       = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+
+        bean.set("id", new Integer(1));
+        bean.set("value", testedValue);
+        dataWriter.writeDocumentStart();
+        dataWriter.write(bean);
+        dataWriter.writeDocumentEnd();
+
+        String dataXml = output.toString();
+
+        final ArrayList readObjects = new ArrayList();
+        DataReader      dataReader  = new DataReader();
+
+        dataReader.setModel(model);
+        dataReader.setSink(new TestDataSink(readObjects));
+        dataReader.read(new StringReader(dataXml));
+
+        assertEquals(1, readObjects.size());
+
+        DynaBean obj = (DynaBean)readObjects.get(0);
+
+        assertEquals("test",
+                     obj.getDynaClass().getName());
+        assertEquals("1",
+                     obj.get("id").toString());
+        assertEquals(testedValue,
+                     obj.get("value").toString());
+    }
+
+    // TODO: additional tests
+    // - table name with illegal-for-XML characters, e.g space, &, ... (write)
+    // - column name with illegal-for-XML characters, e.g space, &, ... (write)
 }

Modified: db/ddlutils/trunk/src/test/java/org/apache/ddlutils/task/TestTaskBase.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/java/org/apache/ddlutils/task/TestTaskBase.java?rev=684636&r1=684635&r2=684636&view=diff
==============================================================================
--- db/ddlutils/trunk/src/test/java/org/apache/ddlutils/task/TestTaskBase.java (original)
+++ db/ddlutils/trunk/src/test/java/org/apache/ddlutils/task/TestTaskBase.java Sun Aug 10 22:39:55 2008
@@ -59,4 +59,30 @@
         task.setUseDelimitedSqlIdentifiers(getPlatform().isDelimitedIdentifierModeOn());
         return task;
     }
+
+    /**
+     * Returns an instance of the {@link DdlToDatabaseTask}, already configured with
+     * a project and the tested database.
+     * 
+     * @return The task object
+     */
+    protected DdlToDatabaseTask getDdlToDatabaseTaskInstance()
+    {
+        DdlToDatabaseTask task       = new DdlToDatabaseTask();
+        Properties        props      = getTestProperties();
+        String            catalog    = props.getProperty(DDLUTILS_CATALOG_PROPERTY);
+        String            schema     = props.getProperty(DDLUTILS_SCHEMA_PROPERTY);
+        DataSource        dataSource = getDataSource();
+
+        if (!(dataSource instanceof BasicDataSource))
+        {
+            fail("Datasource needs to be of type " + BasicDataSource.class.getName());
+        }
+        task.setProject(new Project());
+        task.addConfiguredDatabase((BasicDataSource)getDataSource());
+        task.setCatalogPattern(catalog);
+        task.setSchemaPattern(schema);
+        task.setUseDelimitedSqlIdentifiers(getPlatform().isDelimitedIdentifierModeOn());
+        return task;
+    }
 }



Mime
View raw message