You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ddlutils-dev@db.apache.org by to...@apache.org on 2011/05/02 07:41:14 UTC
svn commit: r1098483 [2/2] - in /db/ddlutils/trunk/src:
main/java/org/apache/ddlutils/dynabean/ main/java/org/apache/ddlutils/io/
main/java/org/apache/ddlutils/util/ test/java/org/apache/ddlutils/io/
test/java/org/apache/ddlutils/util/
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=1098483&r1=1098482&r2=1098483&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 Mon May 2 05:41:14 2011
@@ -26,17 +26,18 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.StringReader;
-import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.ArrayList;
-
+import java.util.List;
import junit.framework.TestCase;
-
import org.apache.commons.beanutils.DynaBean;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
import org.apache.ddlutils.dynabean.SqlDynaBean;
+import org.apache.ddlutils.model.Column;
import org.apache.ddlutils.model.Database;
+import org.apache.ddlutils.model.Table;
/**
* Tests the {@link org.apache.ddlutils.io.DataReader} and {@link org.apache.ddlutils.io.DataWriter} classes.
@@ -85,11 +86,102 @@ public class TestDataReaderAndWriter ext
}
/**
+ * Reads the given schema xml into a {@link Database} object.
+ *
+ * @param schemaXml The schema xml
+ * @return The database model object
+ */
+ private Database readModel(String schemaXml)
+ {
+ DatabaseIO modelIO = new DatabaseIO();
+
+ modelIO.setValidateXml(true);
+
+ return modelIO.read(new StringReader(schemaXml));
+ }
+
+ /**
+ * Writes the given dyna bean via a {@link DataWriter} and returns the raw xml output.
+ *
+ * @param model The database model to use
+ * @param bean The bean to write
+ * @param encoding The encoding in which to write the xml
+ * @return The xml output as raw bytes
+ */
+ private byte[] writeBean(Database model, SqlDynaBean bean, String encoding)
+ {
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ DataWriter dataWriter = new DataWriter(output, encoding);
+
+ dataWriter.writeDocumentStart();
+ dataWriter.write(bean);
+ dataWriter.writeDocumentEnd();
+
+ return output.toByteArray();
+ }
+
+ /**
+ * Uses a {@link DataReader} with default settings to read dyna beans from the given xml data.
+ *
+ * @param model The database model to use
+ * @param dataXml The raw xml data
+ * @return The read dyna beans
+ */
+ private List readBeans(Database model, byte[] dataXml)
+ {
+ ArrayList beans = new ArrayList();
+ DataReader dataReader = new DataReader();
+
+ dataReader.setModel(model);
+ dataReader.setSink(new TestDataSink(beans));
+ dataReader.read(new ByteArrayInputStream(dataXml));
+ return beans;
+ }
+
+ /**
+ * Uses a {@link DataReader} with default settings to read dyna beans from the given xml data.
+ *
+ * @param model The database model to use
+ * @param dataXml The xml data
+ * @return The read dyna beans
+ */
+ private List readBeans(Database model, String dataXml)
+ {
+ ArrayList beans = new ArrayList();
+ DataReader dataReader = new DataReader();
+
+ dataReader.setModel(model);
+ dataReader.setSink(new TestDataSink(beans));
+ dataReader.read(new StringReader(dataXml));
+ return beans;
+ }
+
+ /**
+ * Helper method to perform a test that writes a bean and then reads it back.
+ *
+ * @param model The database model to use
+ * @param bean The bean to write and read back
+ * @param encoding The encoding to use for the data xml
+ * @param expectedDataXml The expected xml generated for the bean
+ */
+ private void roundtripTest(Database model, SqlDynaBean bean, String encoding, String expectedDataXml) throws UnsupportedEncodingException
+ {
+ byte[] xmlData = writeBean(model, bean, encoding);
+
+ assertEquals(expectedDataXml, new String(xmlData, encoding));
+
+ List beans = readBeans(model, xmlData);
+
+ assertEquals(1, beans.size());
+ assertEquals(bean, beans.get(0));
+ }
+
+ /**
* Tests reading the data from XML.
*/
public void testRead() throws Exception
{
- final String testSchemaXml =
+ Database model = readModel(
"<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='bookstore'>\n"+
" <table name='author'>\n"+
@@ -110,8 +202,9 @@ public class TestDataReaderAndWriter ext
" <index-column name='isbn'/>\n"+
" </index>\n"+
" </table>\n"+
- "</database>";
- final String testDataXml =
+ "</database>");
+ List beans = readBeans(
+ model,
"<data>\n"+
" <author author_id='1' name='Ernest Hemingway'/>\n"+
" <author author_id='2' name='William Shakespeare'/>\n"+
@@ -130,27 +223,15 @@ public class TestDataReaderAndWriter ext
" <title>A Midsummer Night's Dream</title>\n"+
" <issue_date>1595</issue_date>\n"+
" </book>\n"+
- "</data>";
+ "</data>");
- DatabaseIO modelReader = new DatabaseIO();
+ assertEquals(5, beans.size());
- 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(5, readObjects.size());
-
- DynaBean obj1 = (DynaBean)readObjects.get(0);
- DynaBean obj2 = (DynaBean)readObjects.get(1);
- DynaBean obj3 = (DynaBean)readObjects.get(2);
- DynaBean obj4 = (DynaBean)readObjects.get(3);
- DynaBean obj5 = (DynaBean)readObjects.get(4);
+ DynaBean obj1 = (DynaBean)beans.get(0);
+ DynaBean obj2 = (DynaBean)beans.get(1);
+ DynaBean obj3 = (DynaBean)beans.get(2);
+ DynaBean obj4 = (DynaBean)beans.get(3);
+ DynaBean obj5 = (DynaBean)beans.get(4);
assertEquals("author",
obj1.getDynaClass().getName());
@@ -207,15 +288,15 @@ public class TestDataReaderAndWriter ext
*/
public void testReadFromFile1() throws Exception
{
- final String testSchemaXml =
+ Database model = readModel(
"<?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 =
+ "</database>");
+ String testDataXml =
"<data>\n"+
" <test id='1' value='foo'/>\n"+
"</data>";
@@ -229,21 +310,16 @@ public class TestDataReaderAndWriter ext
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();
+ ArrayList beans = new ArrayList();
+ DataReader dataReader = new DataReader();
dataReader.setModel(model);
- dataReader.setSink(new TestDataSink(readObjects));
+ dataReader.setSink(new TestDataSink(beans));
dataReader.read(tmpFile.getAbsolutePath());
- assertEquals(1, readObjects.size());
+ assertEquals(1, beans.size());
- DynaBean obj = (DynaBean)readObjects.get(0);
+ DynaBean obj = (DynaBean)beans.get(0);
assertEquals("test",
obj.getDynaClass().getName());
@@ -263,15 +339,15 @@ public class TestDataReaderAndWriter ext
*/
public void testReadFromFile2() throws Exception
{
- final String testSchemaXml =
+ Database model = readModel(
"<?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 =
+ "</database>");
+ String testDataXml =
"<data>\n"+
" <test id='1' value='foo'/>\n"+
"</data>";
@@ -285,21 +361,16 @@ public class TestDataReaderAndWriter ext
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();
+ ArrayList beans = new ArrayList();
+ DataReader dataReader = new DataReader();
dataReader.setModel(model);
- dataReader.setSink(new TestDataSink(readObjects));
+ dataReader.setSink(new TestDataSink(beans));
dataReader.read(tmpFile);
- assertEquals(1, readObjects.size());
+ assertEquals(1, beans.size());
- DynaBean obj = (DynaBean)readObjects.get(0);
+ DynaBean obj = (DynaBean)beans.get(0);
assertEquals("test",
obj.getDynaClass().getName());
@@ -319,15 +390,15 @@ public class TestDataReaderAndWriter ext
*/
public void testReadFromFile3() throws Exception
{
- final String testSchemaXml =
+ Database model = readModel(
"<?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 =
+ "</database>");
+ String testDataXml =
"<data>\n"+
" <test id='1' value='foo'/>\n"+
"</data>";
@@ -341,21 +412,16 @@ public class TestDataReaderAndWriter ext
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();
+ ArrayList beans = new ArrayList();
+ DataReader dataReader = new DataReader();
dataReader.setModel(model);
- dataReader.setSink(new TestDataSink(readObjects));
+ dataReader.setSink(new TestDataSink(beans));
dataReader.read(new FileInputStream(tmpFile));
- assertEquals(1, readObjects.size());
+ assertEquals(1, beans.size());
- DynaBean obj = (DynaBean)readObjects.get(0);
+ DynaBean obj = (DynaBean)beans.get(0);
assertEquals("test",
obj.getDynaClass().getName());
@@ -375,15 +441,16 @@ public class TestDataReaderAndWriter ext
*/
public void testSubElements() throws Exception
{
- final String testSchemaXml =
+ Database model = readModel(
"<?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 =
+ "</database>");
+ List beans = readBeans(
+ model,
"<data>\n"+
" <test id='1'>\n"+
" <value>foo</value>\n"+
@@ -393,23 +460,11 @@ public class TestDataReaderAndWriter ext
" </test>\n"+
" <test id='3' value='baz'>\n"+
" </test>\n"+
- "</data>";
+ "</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, beans.size());
- assertEquals(3, readObjects.size());
-
- DynaBean obj = (DynaBean)readObjects.get(0);
+ DynaBean obj = (DynaBean)beans.get(0);
assertEquals("test",
obj.getDynaClass().getName());
@@ -418,7 +473,7 @@ public class TestDataReaderAndWriter ext
assertEquals("foo",
obj.get("value").toString());
- obj = (DynaBean)readObjects.get(1);
+ obj = (DynaBean)beans.get(1);
assertEquals("test",
obj.getDynaClass().getName());
@@ -427,7 +482,7 @@ public class TestDataReaderAndWriter ext
assertEquals("bar",
obj.get("value").toString());
- obj = (DynaBean)readObjects.get(2);
+ obj = (DynaBean)beans.get(2);
assertEquals("test",
obj.getDynaClass().getName());
@@ -442,34 +497,23 @@ public class TestDataReaderAndWriter ext
*/
public void testRootElementNameDoesntMatter() throws Exception
{
- final String testSchemaXml =
+ Database model = readModel(
"<?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 =
+ "</database>");
+ List beans = readBeans(
+ model,
"<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();
+ "</someRandomName>");
- dataReader.setModel(model);
- dataReader.setSink(new TestDataSink(readObjects));
- dataReader.read(new StringReader(testDataXml));
+ assertEquals(1, beans.size());
- assertEquals(1, readObjects.size());
-
- DynaBean obj = (DynaBean)readObjects.get(0);
+ DynaBean obj = (DynaBean)beans.get(0);
assertEquals("test",
obj.getDynaClass().getName());
@@ -484,36 +528,25 @@ public class TestDataReaderAndWriter ext
*/
public void testElementForUndefinedTable() throws Exception
{
- final String testSchemaXml =
+ Database model = readModel(
"<?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 =
+ "</database>");
+ List beans = readBeans(
+ model,
"<data>\n"+
" <test id='1' value='foo'/>\n"+
" <other id='2' value='bar'/>\n"+
" <test id='3' value='baz'/>\n"+
- "</data>";
+ "</data>");
- DatabaseIO modelReader = new DatabaseIO();
+ assertEquals(2, beans.size());
- 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);
+ DynaBean obj = (DynaBean)beans.get(0);
assertEquals("test",
obj.getDynaClass().getName());
@@ -522,7 +555,7 @@ public class TestDataReaderAndWriter ext
assertEquals("foo",
obj.get("value").toString());
- obj = (DynaBean)readObjects.get(1);
+ obj = (DynaBean)beans.get(1);
assertEquals("test",
obj.getDynaClass().getName());
@@ -537,34 +570,23 @@ public class TestDataReaderAndWriter ext
*/
public void testAttributeForUndefinedColumn() throws Exception
{
- final String testSchemaXml =
+ Database model = readModel(
"<?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 =
+ "</database>");
+ List beans = readBeans(
+ model,
"<data>\n"+
" <test id='1' value1='foo'/>\n"+
- "</data>";
+ "</data>");
- DatabaseIO modelReader = new DatabaseIO();
+ assertEquals(1, beans.size());
- 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);
+ DynaBean obj = (DynaBean)beans.get(0);
assertEquals("test",
obj.getDynaClass().getName());
@@ -578,36 +600,25 @@ public class TestDataReaderAndWriter ext
*/
public void testSubElementForUndefinedColumn() throws Exception
{
- final String testSchemaXml =
+ Database model = readModel(
"<?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 =
+ "</database>");
+ List beans = readBeans(
+ model,
"<data>\n"+
" <test id='1'>\n"+
" <value2>foo</value2>\n"+
" </test>\n"+
- "</data>";
+ "</data>");
- DatabaseIO modelReader = new DatabaseIO();
+ assertEquals(1, beans.size());
- 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);
+ DynaBean obj = (DynaBean)beans.get(0);
assertEquals("test",
obj.getDynaClass().getName());
@@ -621,36 +632,31 @@ public class TestDataReaderAndWriter ext
*/
public void testCaseSensitivityTurnedOn() throws Exception
{
- final String testSchemaXml =
+ Database model = readModel(
"<?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 =
+ "</database>");
+ 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();
+ ArrayList beans = new ArrayList();
+ DataReader dataReader = new DataReader();
dataReader.setCaseSensitive(true);
dataReader.setModel(model);
- dataReader.setSink(new TestDataSink(readObjects));
+ dataReader.setSink(new TestDataSink(beans));
dataReader.read(new StringReader(testDataXml));
- assertEquals(1, readObjects.size());
+ assertEquals(1, beans.size());
- DynaBean obj = (DynaBean)readObjects.get(0);
+ DynaBean obj = (DynaBean)beans.get(0);
assertEquals("Test",
obj.getDynaClass().getName());
@@ -664,37 +670,32 @@ public class TestDataReaderAndWriter ext
*/
public void testCaseSensitivityTurnedOff() throws Exception
{
- final String testSchemaXml =
+ Database model = readModel(
"<?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 =
+ "</database>");
+ 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();
+ ArrayList beans = new ArrayList();
+ DataReader dataReader = new DataReader();
dataReader.setCaseSensitive(false);
dataReader.setModel(model);
- dataReader.setSink(new TestDataSink(readObjects));
+ dataReader.setSink(new TestDataSink(beans));
dataReader.read(new StringReader(testDataXml));
- assertEquals(3, readObjects.size());
+ assertEquals(3, beans.size());
- DynaBean obj = (DynaBean)readObjects.get(0);
+ DynaBean obj = (DynaBean)beans.get(0);
assertEquals("Test",
obj.getDynaClass().getName());
@@ -703,7 +704,7 @@ public class TestDataReaderAndWriter ext
assertEquals("foo",
obj.get("Value").toString());
- obj = (DynaBean)readObjects.get(1);
+ obj = (DynaBean)beans.get(1);
assertEquals("Test",
obj.getDynaClass().getName());
@@ -712,7 +713,7 @@ public class TestDataReaderAndWriter ext
assertEquals("bar",
obj.get("Value").toString());
- obj = (DynaBean)readObjects.get(2);
+ obj = (DynaBean)beans.get(2);
assertEquals("Test",
obj.getDynaClass().getName());
@@ -727,58 +728,28 @@ public class TestDataReaderAndWriter ext
*/
public void testSpecialCharacters() throws Exception
{
- final String testSchemaXml =
+ Database model = readModel(
"<?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();
+ "</database>");
+ String testedValue = "Some Special Characters: \u0001\u0009\u0010";
- modelIO.setValidateXml(true);
-
- Database model = modelIO.read(new StringReader(testSchemaXml));
- ByteArrayOutputStream output = new ByteArrayOutputStream();
- DataWriter dataWriter = new DataWriter(output, "ISO-8859-1");
- SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+ 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();
-
- final ArrayList readObjects = new ArrayList();
- DataReader dataReader = new DataReader();
-
- String dataXml = new String(output.toByteArray(), "ISO-8859-1");
-
- assertEquals("<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
- "<data>\n" +
- " <test id=\"1\">\n" +
- " <value " + DatabaseIO.BASE64_ATTR_NAME + "=\"true\"><![CDATA[" + new String(Base64.encodeBase64(testedValue.getBytes()), "ISO-8859-1") + "]]></value>\n" +
- " </test>\n" +
- "</data>\n",
- dataXml);
-
- dataReader.setModel(model);
- dataReader.setSink(new TestDataSink(readObjects));
- dataReader.read(new ByteArrayInputStream(output.toByteArray()));
- 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());
+ roundtripTest(model, bean, "ISO-8859-1",
+ "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\">\n" +
+ " <value " + DatabaseIO.BASE64_ATTR_NAME + "=\"true\">" + new String(Base64.encodeBase64(testedValue.getBytes("UTF-8")), "ISO-8859-1") + "</value>\n" +
+ " </test>\n" +
+ "</data>\n");
}
/**
@@ -786,58 +757,28 @@ public class TestDataReaderAndWriter ext
*/
public void testSpecialCharactersUTF8() throws Exception
{
- final String testSchemaXml =
+ Database model = readModel(
"<?xml version='1.0' encoding='UTF-8'?>\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";
+ "</database>");
+ String testedValue = "Some Special Characters: \u0001\u0009\u0010";
- DatabaseIO modelIO = new DatabaseIO();
-
- modelIO.setValidateXml(true);
-
- Database model = modelIO.read(new StringReader(testSchemaXml));
- ByteArrayOutputStream output = new ByteArrayOutputStream();
- DataWriter dataWriter = new DataWriter(output, "UTF-8");
- SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+ 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 = new String(output.toByteArray(), "UTF-8");
-
- assertEquals("<?xml version='1.0' encoding='UTF-8'?>\n" +
- "<data>\n" +
- " <test id=\"1\">\n" +
- " <value " + DatabaseIO.BASE64_ATTR_NAME + "=\"true\"><![CDATA[" + new String(Base64.encodeBase64(testedValue.getBytes()), "UTF-8") + "]]></value>\n" +
- " </test>\n" +
- "</data>\n",
- dataXml);
-
- final ArrayList readObjects = new ArrayList();
- DataReader dataReader = new DataReader();
-
- dataReader.setModel(model);
- dataReader.setSink(new TestDataSink(readObjects));
- dataReader.read(new ByteArrayInputStream(output.toByteArray()));
-
- 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());
+ roundtripTest(model, bean, "ISO-8859-1",
+ "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\">\n" +
+ " <value " + DatabaseIO.BASE64_ATTR_NAME + "=\"true\">" + new String(Base64.encodeBase64(testedValue.getBytes("UTF-8")), "UTF-8") + "</value>\n" +
+ " </test>\n" +
+ "</data>\n");
}
/**
@@ -845,7 +786,7 @@ public class TestDataReaderAndWriter ext
*/
public void testCData() throws Exception
{
- final String testSchemaXml =
+ Database model = readModel(
"<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
"<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='test'>\n" +
" <table name='test'>\n"+
@@ -856,21 +797,14 @@ public class TestDataReaderAndWriter ext
" <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 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) + "]]>";
- final String testedValue5 = "<<![CDATA[" + StringUtils.repeat("b \n", 500) + "]]>><![CDATA[" + StringUtils.repeat("c \n", 500) + "]]>";
-
- DatabaseIO modelIO = new DatabaseIO();
-
- modelIO.setValidateXml(true);
+ "</database>");
+ String testedValue1 = "<?xml version='1.0' encoding='ISO-8859-1'?><test><![CDATA[some text]]></test>";
+ String testedValue2 = StringUtils.repeat("a ", 1000) + testedValue1;
+ String testedValue3 = "<div>\n<h1><![CDATA[WfMOpen]]></h1>\n" + StringUtils.repeat("Make it longer\n", 99) + "</div>";
+ String testedValue4 = "<![CDATA[" + StringUtils.repeat("b \n", 1000) + "]]>";
+ String testedValue5 = "<<![CDATA[" + StringUtils.repeat("b \n", 500) + "]]>><![CDATA[" + StringUtils.repeat("c \n", 500) + "]]>";
- 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));
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
bean.set("id", new Integer(1));
bean.set("value1", testedValue1);
@@ -878,37 +812,42 @@ public class TestDataReaderAndWriter ext
bean.set("value3", testedValue3);
bean.set("value4", testedValue4);
bean.set("value5", testedValue5);
- dataWriter.writeDocumentStart();
- dataWriter.write(bean);
- dataWriter.writeDocumentEnd();
- String dataXml = output.toString();
+ byte[] xmlData = writeBean(model, bean, "UTF-8");
+ List beans = readBeans(model, xmlData);
- final ArrayList readObjects = new ArrayList();
- DataReader dataReader = new DataReader();
+ assertEquals(1, beans.size());
+ assertEquals(bean, beans.get(0));
+ }
- dataReader.setModel(model);
- dataReader.setSink(new TestDataSink(readObjects));
- dataReader.read(new StringReader(dataXml));
+ /**
+ * Tests the reader & writer behavior when the table name is not a valid XML identifier.
+ */
+ public void testTableNameLong() throws Exception
+ {
+ String tableName = StringUtils.repeat("test", 100);
+ Database model = readModel(
+ "<?xml version='1.0' encoding='UTF-8'?>\n"+
+ "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='test'>\n" +
+ " <table name='" + tableName + "'>\n"+
+ " <column name='id' type='INTEGER' primaryKey='true' required='true'/>\n"+
+ " <column name='value' type='VARCHAR' size='50' required='true'/>\n"+
+ " </table>\n"+
+ "</database>");
+ String testedValue = "Some Text";
- assertEquals(1, readObjects.size());
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
- DynaBean obj = (DynaBean)readObjects.get(0);
+ bean.set("id", new Integer(1));
+ bean.set("value", testedValue);
- assertEquals("test",
- obj.getDynaClass().getName());
- assertEquals("1",
- obj.get("id").toString());
- assertEquals(testedValue1,
- obj.get("value1").toString());
- assertEquals(testedValue2,
- obj.get("value2").toString());
- assertEquals(testedValue3,
- obj.get("value3").toString());
- assertEquals(testedValue4,
- obj.get("value4").toString());
- assertEquals(testedValue5,
- obj.get("value5").toString());
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <table id=\"1\" value=\"" + testedValue + "\">\n" +
+ " <table-name>" + tableName + "</table-name>\n" +
+ " </table>\n" +
+ "</data>\n");
}
/**
@@ -916,53 +855,864 @@ public class TestDataReaderAndWriter ext
*/
public void testTableNameNotAValidXmlIdentifier() throws Exception
{
- final String testSchemaXml =
- "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
+ Database model = readModel(
+ "<?xml version='1.0' encoding='UTF-8'?>\n"+
"<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='test'>\n" +
- " <table 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>");
+ String testedValue = "Some Text";
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+
+ bean.set("id", new Integer(1));
+ bean.set("value", testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <table table-name=\"test$\" id=\"1\" value=\"" + testedValue + "\" />\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when the table name is not a valid XML identifier and too long.
+ */
+ public void testTableNameInvalidAndLong() throws Exception
+ {
+ String tableName = StringUtils.repeat("table name", 50);
+ Database model = readModel(
+ "<?xml version='1.0' encoding='UTF-8'?>\n"+
+ "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='test'>\n" +
+ " <table name='" + tableName + "'>\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";
+ "</database>");
+ String testedValue = "Some Text";
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+
+ bean.set("id", new Integer(1));
+ bean.set("value", testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <table id=\"1\" value=\"" + testedValue + "\">\n" +
+ " <table-name>" + tableName + "</table-name>\n" +
+ " </table>\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when the table name contains a '&' character.
+ */
+ public void testTableNameContainsAmpersand() throws Exception
+ {
+ String tableName = "test&table";
+ Database model = new Database("test");
+ Table table = new Table();
+ Column idColumn = new Column();
+ Column valueColumn = new Column();
+
+ idColumn.setName("id");
+ idColumn.setType("INTEGER");
+ idColumn.setPrimaryKey(true);
+ idColumn.setRequired(true);
+ valueColumn.setName("value");
+ valueColumn.setType("VARCHAR");
+ valueColumn.setSize("50");
+ valueColumn.setRequired(true);
+ table.setName(tableName);
+ table.addColumn(idColumn);
+ table.addColumn(valueColumn);
+ model.addTable(table);
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+ String testedValue = "Some Text";
+
+ bean.set("id", new Integer(1));
+ bean.set("value", testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <table table-name=\"test&table\" id=\"1\" value=\"" + testedValue + "\" />\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when the table name contains a '<' character.
+ */
+ public void testTableNameContainsLessCharacter() throws Exception
+ {
+ String tableName = "test<table";
+ Database model = new Database("test");
+ Table table = new Table();
+ Column idColumn = new Column();
+ Column valueColumn = new Column();
+
+ idColumn.setName("id");
+ idColumn.setType("INTEGER");
+ idColumn.setPrimaryKey(true);
+ idColumn.setRequired(true);
+ valueColumn.setName("value");
+ valueColumn.setType("VARCHAR");
+ valueColumn.setSize("50");
+ valueColumn.setRequired(true);
+ table.setName(tableName);
+ table.addColumn(idColumn);
+ table.addColumn(valueColumn);
+ model.addTable(table);
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+ String testedValue = "Some Text";
+
+ bean.set("id", new Integer(1));
+ bean.set("value", testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <table table-name=\"test<table\" id=\"1\" value=\"" + testedValue + "\" />\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when the table name contains a '>' character.
+ */
+ public void testTableNameContainsMoreCharacter() throws Exception
+ {
+ String tableName = "test>table";
+ Database model = new Database("test");
+ Table table = new Table();
+ Column idColumn = new Column();
+ Column valueColumn = new Column();
+
+ idColumn.setName("id");
+ idColumn.setType("INTEGER");
+ idColumn.setPrimaryKey(true);
+ idColumn.setRequired(true);
+ valueColumn.setName("value");
+ valueColumn.setType("VARCHAR");
+ valueColumn.setSize("50");
+ valueColumn.setRequired(true);
+ table.setName(tableName);
+ table.addColumn(idColumn);
+ table.addColumn(valueColumn);
+ model.addTable(table);
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+ String testedValue = "Some Text";
+
+ bean.set("id", new Integer(1));
+ bean.set("value", testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <table table-name=\"test>table\" id=\"1\" value=\"" + testedValue + "\" />\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when the table name contains characters not allowed in XML.
+ */
+ public void testTableNameContainsInvalidCharacters() throws Exception
+ {
+ String tableName = "test\u0000table";
+ Database model = new Database("test");
+ Table table = new Table();
+ Column idColumn = new Column();
+ Column valueColumn = new Column();
+
+ idColumn.setName("id");
+ idColumn.setType("INTEGER");
+ idColumn.setPrimaryKey(true);
+ idColumn.setRequired(true);
+ valueColumn.setName("value");
+ valueColumn.setType("VARCHAR");
+ valueColumn.setSize("50");
+ valueColumn.setRequired(true);
+ table.setName(tableName);
+ table.addColumn(idColumn);
+ table.addColumn(valueColumn);
+ model.addTable(table);
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+ String testedValue = "Some Text";
+
+ bean.set("id", new Integer(1));
+ bean.set("value", testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <table id=\"1\" value=\"" + testedValue + "\">\n" +
+ " <table-name " + DatabaseIO.BASE64_ATTR_NAME + "=\"true\">" + new String(Base64.encodeBase64(tableName.getBytes("UTF-8")), "UTF-8") + "</table-name>\n" +
+ " </table>\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when the table name is 'table'.
+ */
+ public void testTableNameIsTable() throws Exception
+ {
+ Database model = readModel(
+ "<?xml version='1.0' encoding='UTF-8'?>\n"+
+ "<database xmlns='" + DatabaseIO.DDLUTILS_NAMESPACE + "' name='test'>\n" +
+ " <table name='table'>\n"+
+ " <column name='id' type='INTEGER' primaryKey='true' required='true'/>\n"+
+ " <column name='value' type='VARCHAR' size='50' required='true'/>\n"+
+ " </table>\n"+
+ "</database>");
+ String testedValue = "Some Text";
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));
+
+ 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();
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <table table-name=\"table\" id=\"1\" value=\"" + testedValue + "\" />\n" +
+ "</data>\n");
+ }
- final ArrayList readObjects = new ArrayList();
- DataReader dataReader = new DataReader();
+ /**
+ * Tests the reader & writer behavior when a column name is a normal valid tag,
+ * and both column name and value are shorter than 255 characters.
+ */
+ public void testColumnNameAndValueShort() throws Exception
+ {
+ Database model = readModel(
+ "<?xml version='1.0' encoding='UTF-8'?>\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>");
+ String testedValue = "Some Text";
- dataReader.setModel(model);
- dataReader.setSink(new TestDataSink(readObjects));
- dataReader.read(new StringReader(dataXml));
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
- assertEquals(1, readObjects.size());
+ bean.set("id", new Integer(1));
+ bean.set("value", testedValue);
- DynaBean obj = (DynaBean)readObjects.get(0);
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\" value=\"" + testedValue + "\" />\n" +
+ "</data>\n");
+ }
- assertEquals("test",
- obj.getDynaClass().getName());
- assertEquals("1",
- obj.get("id").toString());
- assertEquals(testedValue,
- obj.get("value").toString());
+ /**
+ * Tests the reader & writer behavior when a column name is a normal valid tag,
+ * and the column name is shorter than 255 characters but the value is longer.
+ */
+ public void testColumnNameShortAndValueLong() throws Exception
+ {
+ Database model = readModel(
+ "<?xml version='1.0' encoding='UTF-8'?>\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='400' required='true'/>\n"+
+ " </table>\n"+
+ "</database>");
+ String testedValue = StringUtils.repeat("Some Text", 40);
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+
+ bean.set("id", new Integer(1));
+ bean.set("value", testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\">\n" +
+ " <value>" + testedValue + "</value>\n" +
+ " </test>\n" +
+ "</data>\n");
}
- // 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)
+ /**
+ * Tests the reader & writer behavior when a column name is not a valid XML identifier.
+ */
+ public void testColumnNameShortAndInvalidAndValueShort() throws Exception
+ {
+ Database model = readModel(
+ "<?xml version='1.0' encoding='UTF-8'?>\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='the value' type='VARCHAR' size='50' required='true'/>\n"+
+ " </table>\n"+
+ "</database>");
+ String testedValue = "Some Text";
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+
+ bean.set("id", new Integer(1));
+ bean.set("the value", testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\">\n" +
+ " <column column-name=\"the value\">" + testedValue + "</column>\n" +
+ " </test>\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when a column name is not a valid tag,
+ * and the column name is shorter than 255 characters and the value is longer.
+ */
+ public void testColumnNameShortAndInvalidAndValueLong() throws Exception
+ {
+ Database model = readModel(
+ "<?xml version='1.0' encoding='UTF-8'?>\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='the value' type='VARCHAR' size='50' required='true'/>\n"+
+ " </table>\n"+
+ "</database>");
+ String testedValue = StringUtils.repeat("Some Text", 40);
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+
+ bean.set("id", new Integer(1));
+ bean.set("the value", testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\">\n" +
+ " <column column-name=\"the value\">" + testedValue + "</column>\n" +
+ " </test>\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when a column name is a valid tag,
+ * and the column name is longer than 255 characters and the value is shorter.
+ */
+ public void testColumnNameLongAndValueShort() throws Exception
+ {
+ String columnName = StringUtils.repeat("value", 100);
+ Database model = readModel(
+ "<?xml version='1.0' encoding='UTF-8'?>\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='" + columnName + "' type='VARCHAR' size='50' required='true'/>\n"+
+ " </table>\n"+
+ "</database>");
+ String testedValue = "Some Text";
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+
+ bean.set("id", new Integer(1));
+ bean.set(columnName, testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\">\n" +
+ " <column>\n" +
+ " <column-name>" + columnName + "</column-name>\n" +
+ " <column-value>" + testedValue + "</column-value>\n" +
+ " </column>\n" +
+ " </test>\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when a column name is a valid tag,
+ * and both the column name and value are longer than 255 characters.
+ */
+ public void testColumnNameLongAndValueLong() throws Exception
+ {
+ String columnName = StringUtils.repeat("value", 100);
+ Database model = readModel(
+ "<?xml version='1.0' encoding='UTF-8'?>\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='" + columnName + "' type='VARCHAR' size='500' required='true'/>\n"+
+ " </table>\n"+
+ "</database>");
+ String testedValue = StringUtils.repeat("Some Text", 40);
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+
+ bean.set("id", new Integer(1));
+ bean.set(columnName, testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\">\n" +
+ " <column>\n" +
+ " <column-name>" + columnName + "</column-name>\n" +
+ " <column-value>" + testedValue + "</column-value>\n" +
+ " </column>\n" +
+ " </test>\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when a column name is a valid tag,
+ * and the column name is longer than 255 characters and the value is shorter.
+ */
+ public void testColumnNameAndValueLong() throws Exception
+ {
+ String columnName = StringUtils.repeat("value", 100);
+ Database model = readModel(
+ "<?xml version='1.0' encoding='UTF-8'?>\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='" + columnName + "' type='VARCHAR' size='50' required='true'/>\n"+
+ " </table>\n"+
+ "</database>");
+ String testedValue = "Some Text";
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+
+ bean.set("id", new Integer(1));
+ bean.set(columnName, testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\">\n" +
+ " <column>\n" +
+ " <column-name>" + columnName + "</column-name>\n" +
+ " <column-value>" + testedValue + "</column-value>\n" +
+ " </column>\n" +
+ " </test>\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when a column name is not a valid tag,
+ * and the value is invalid, and both are short.
+ */
+ public void testColumnNameAndValueShortAndInvalid() throws Exception
+ {
+ Database model = readModel(
+ "<?xml version='1.0' encoding='UTF-8'?>\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='the value' type='VARCHAR' size='50' required='true'/>\n"+
+ " </table>\n"+
+ "</database>");
+ String testedValue = "the\u0000value";
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+
+ bean.set("id", new Integer(1));
+ bean.set("the value", testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\">\n" +
+ " <column column-name=\"the value\" " + DatabaseIO.BASE64_ATTR_NAME + "=\"true\">" + new String(Base64.encodeBase64(testedValue.getBytes("UTF-8")), "UTF-8") + "</column>\n" +
+ " </test>\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when a column name is a valid tag and longer,
+ * than 255 characters, and the value is invalid and shorter than 255 characters.
+ */
+ public void testColumnNameLongAndValueInvalidAndShort() throws Exception
+ {
+ String columnName = StringUtils.repeat("value", 100);
+ Database model = readModel(
+ "<?xml version='1.0' encoding='UTF-8'?>\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='" + columnName + "' type='VARCHAR' size='50' required='true'/>\n"+
+ " </table>\n"+
+ "</database>");
+ String testedValue = "the\u0000value";
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+
+ bean.set("id", new Integer(1));
+ bean.set(columnName, testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\">\n" +
+ " <column>\n" +
+ " <column-name>" + columnName + "</column-name>\n" +
+ " <column-value " + DatabaseIO.BASE64_ATTR_NAME + "=\"true\">" + new String(Base64.encodeBase64(testedValue.getBytes("UTF-8")), "UTF-8") + "</column-value>\n" +
+ " </column>\n" +
+ " </test>\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when a column name is not a valid tag,
+ * and the value is invalid, and both are short.
+ */
+ public void testColumnNameAndValueLongAndInvalid() throws Exception
+ {
+ Database model = new Database("test");
+ Table table = new Table();
+ Column idColumn = new Column();
+ Column valueColumn = new Column();
+ String columnName = StringUtils.repeat("the\u0000name", 100);
+
+ idColumn.setName("id");
+ idColumn.setType("INTEGER");
+ idColumn.setPrimaryKey(true);
+ idColumn.setRequired(true);
+ valueColumn.setName(columnName);
+ valueColumn.setType("VARCHAR");
+ valueColumn.setSize("50");
+ valueColumn.setRequired(true);
+ table.setName("test");
+ table.addColumn(idColumn);
+ table.addColumn(valueColumn);
+ model.addTable(table);
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+ String testedValue = StringUtils.repeat("the\u0000value", 40);
+
+ bean.set("id", new Integer(1));
+ bean.set(columnName, testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\">\n" +
+ " <column>\n" +
+ " <column-name " + DatabaseIO.BASE64_ATTR_NAME + "=\"true\">" + new String(Base64.encodeBase64(columnName.getBytes("UTF-8")), "UTF-8") + "</column-name>\n" +
+ " <column-value " + DatabaseIO.BASE64_ATTR_NAME + "=\"true\">" + new String(Base64.encodeBase64(testedValue.getBytes("UTF-8")), "UTF-8") + "</column-value>\n" +
+ " </column>\n" +
+ " </test>\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when a column name contains an invalid character.
+ */
+ public void testColumnNameContainsInvalidCharacters() throws Exception
+ {
+ Database model = readModel(
+ "<?xml version='1.0' encoding='UTF-8'?>\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>");
+ String testedValue = "the\u0000value";
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+
+ bean.set("id", new Integer(1));
+ bean.set("value", testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\">\n" +
+ " <value " + DatabaseIO.BASE64_ATTR_NAME + "=\"true\">" + new String(Base64.encodeBase64(testedValue.getBytes("UTF-8")), "UTF-8") + "</value>\n" +
+ " </test>\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when a column value contains an invalid character.
+ */
+ public void testColumnValueContainsInvalidCharacters() throws Exception
+ {
+ Database model = new Database("test");
+ Table table = new Table();
+ Column idColumn = new Column();
+ Column valueColumn = new Column();
+ String columnName = "the\u0000value";
+
+ idColumn.setName("id");
+ idColumn.setType("INTEGER");
+ idColumn.setPrimaryKey(true);
+ idColumn.setRequired(true);
+ valueColumn.setName(columnName);
+ valueColumn.setType("VARCHAR");
+ valueColumn.setSize("50");
+ valueColumn.setRequired(true);
+ table.setName("test");
+ table.addColumn(idColumn);
+ table.addColumn(valueColumn);
+ model.addTable(table);
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+ String testedValue = "Some Text";
+
+ bean.set("id", new Integer(1));
+ bean.set(columnName, testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\">\n" +
+ " <column>\n" +
+ " <column-name " + DatabaseIO.BASE64_ATTR_NAME + "=\"true\">" + new String(Base64.encodeBase64(columnName.getBytes("UTF-8")), "UTF-8") + "</column-name>\n" +
+ " <column-value>" + testedValue + "</column-value>\n" +
+ " </column>\n" +
+ " </test>\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when a column value contains the '&' character.
+ */
+ public void testColumnValueContainsAmpersand() throws Exception
+ {
+ Database model = new Database("test");
+ Table table = new Table();
+ Column idColumn = new Column();
+ Column valueColumn = new Column();
+ String columnName = "foo&bar";
+
+ idColumn.setName("id");
+ idColumn.setType("INTEGER");
+ idColumn.setPrimaryKey(true);
+ idColumn.setRequired(true);
+ valueColumn.setName(columnName);
+ valueColumn.setType("VARCHAR");
+ valueColumn.setSize("50");
+ valueColumn.setRequired(true);
+ table.setName("test");
+ table.addColumn(idColumn);
+ table.addColumn(valueColumn);
+ model.addTable(table);
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+ String testedValue = "Some Text";
+
+ bean.set("id", new Integer(1));
+ bean.set(columnName, testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\">\n" +
+ " <column column-name=\"foo&bar\">" + testedValue + "</column>\n" +
+ " </test>\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when a column value contains the '<' character.
+ */
+ public void testColumnValueContainsLessCharacter() throws Exception
+ {
+ Database model = new Database("test");
+ Table table = new Table();
+ Column idColumn = new Column();
+ Column valueColumn = new Column();
+ String columnName = "foo<bar";
+
+ idColumn.setName("id");
+ idColumn.setType("INTEGER");
+ idColumn.setPrimaryKey(true);
+ idColumn.setRequired(true);
+ valueColumn.setName(columnName);
+ valueColumn.setType("VARCHAR");
+ valueColumn.setSize("50");
+ valueColumn.setRequired(true);
+ table.setName("test");
+ table.addColumn(idColumn);
+ table.addColumn(valueColumn);
+ model.addTable(table);
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+ String testedValue = "Some Text";
+
+ bean.set("id", new Integer(1));
+ bean.set(columnName, testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\">\n" +
+ " <column column-name=\"foo<bar\">" + testedValue + "</column>\n" +
+ " </test>\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when a column value contains the '>' character.
+ */
+ public void testColumnValueContainsMoreCharacter() throws Exception
+ {
+ Database model = new Database("test");
+ Table table = new Table();
+ Column idColumn = new Column();
+ Column valueColumn = new Column();
+ String columnName = "foo>bar";
+
+ idColumn.setName("id");
+ idColumn.setType("INTEGER");
+ idColumn.setPrimaryKey(true);
+ idColumn.setRequired(true);
+ valueColumn.setName(columnName);
+ valueColumn.setType("VARCHAR");
+ valueColumn.setSize("50");
+ valueColumn.setRequired(true);
+ table.setName("test");
+ table.addColumn(idColumn);
+ table.addColumn(valueColumn);
+ model.addTable(table);
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+ String testedValue = "Some Text";
+
+ bean.set("id", new Integer(1));
+ bean.set(columnName, testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\">\n" +
+ " <column column-name=\"foo>bar\">" + testedValue + "</column>\n" +
+ " </test>\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when a column name is 'column'.
+ */
+ public void testColumnNameIsColumn() throws Exception
+ {
+ Database model = readModel(
+ "<?xml version='1.0' encoding='UTF-8'?>\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='column' type='VARCHAR' size='50' required='true'/>\n"+
+ " </table>\n"+
+ "</database>");
+ String testedValue = "Some Text";
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+
+ bean.set("id", new Integer(1));
+ bean.set("column", testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\">\n" +
+ " <column column-name=\"column\">" + testedValue + "</column>\n" +
+ " </test>\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when a column name is 'column'.
+ */
+ public void testColumnNameIsColumnName() throws Exception
+ {
+ Database model = readModel(
+ "<?xml version='1.0' encoding='UTF-8'?>\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='column-name' type='VARCHAR' size='50' required='true'/>\n"+
+ " </table>\n"+
+ "</database>");
+ String testedValue = "Some Text";
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+
+ bean.set("id", new Integer(1));
+ bean.set("column-name", testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\" column-name=\"" + testedValue + "\" />\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when a column name is 'column'.
+ */
+ public void testColumnNameIsTableName() throws Exception
+ {
+ Database model = readModel(
+ "<?xml version='1.0' encoding='UTF-8'?>\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='the value' type='VARCHAR' size='50' required='true'/>\n"+
+ " </table>\n"+
+ "</database>");
+ String testedValue = "Some Text";
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+
+ bean.set("id", new Integer(1));
+ bean.set("the value", testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\">\n" +
+ " <column column-name=\"the value\">" + testedValue + "</column>\n" +
+ " </test>\n" +
+ "</data>\n");
+ }
+
+ /**
+ * Tests the reader & writer behavior when a column name is 'base64'.
+ */
+ public void testColumnNameIsBase64() throws Exception
+ {
+ Database model = readModel(
+ "<?xml version='1.0' encoding='UTF-8'?>\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='" + DatabaseIO.BASE64_ATTR_NAME + "' type='VARCHAR' size='50' required='true'/>\n"+
+ " </table>\n"+
+ "</database>");
+ String testedValue = "Some Text";
+
+ SqlDynaBean bean = (SqlDynaBean)model.createDynaBeanFor(model.getTable(0));
+
+ bean.set("id", new Integer(1));
+ bean.set(DatabaseIO.BASE64_ATTR_NAME, testedValue);
+
+ roundtripTest(model, bean, "UTF-8",
+ "<?xml version='1.0' encoding='UTF-8'?>\n" +
+ "<data>\n" +
+ " <test id=\"1\">\n" +
+ " <column column-name=\"" + DatabaseIO.BASE64_ATTR_NAME + "\">" + testedValue + "</column>\n" +
+ " </test>\n" +
+ "</data>\n");
+ }
}