Java tutorial
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.BufferedWriter; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.StringReader; 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. * * @version $Revision: 289996 $ */ public class TestDataReaderAndWriter extends TestCase { /** * A test data sink. There is no need to call start/end as the don't do anything anyways in this class. */ private static class TestDataSink implements DataSink { /** Stores the read objects. */ private final ArrayList readObjects; /** * Creates a new test data sink using the given list as the backing store. * * @param readObjects The list to store the read object */ private TestDataSink(ArrayList readObjects) { this.readObjects = readObjects; } /** * {@inheritDoc} */ public void start() throws DataSinkException { } /** * {@inheritDoc} */ public void addBean(DynaBean bean) throws DataSinkException { readObjects.add(bean); } /** * {@inheritDoc} */ public void end() throws DataSinkException { } } /** * 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 { Database model = readModel("<?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>\n" + " </table>\n" + "</database>"); List beans = readBeans(model, "<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" + " <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" + " <isbn>0198321465</isbn>\n" + " <title>Macbeth</title>\n" + " <issue_date>1606</issue_date>\n" + " </book>\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" + " </book>\n" + "</data>"); assertEquals(5, beans.size()); 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()); assertEquals("1", obj1.get("author_id").toString()); assertEquals("Ernest Hemingway", obj1.get("name").toString()); assertEquals("author", obj2.getDynaClass().getName()); assertEquals("2", obj2.get("author_id").toString()); assertEquals("William Shakespeare", obj2.get("name").toString()); assertEquals("book", obj3.getDynaClass().getName()); assertEquals("1", obj3.get("book_id").toString()); assertEquals("1", obj3.get("author_id").toString()); assertEquals("0684830493", obj3.get("isbn").toString()); assertEquals("Old Man And The Sea", obj3.get("title").toString()); assertEquals("1952-01-01", obj3.get("issue_date").toString()); // parsed as a java.sql.Date assertEquals("book", obj4.getDynaClass().getName()); assertEquals("2", obj4.get("book_id").toString()); assertEquals("2", obj4.get("author_id").toString()); assertEquals("0198321465", obj4.get("isbn").toString()); assertEquals("Macbeth", obj4.get("title").toString()); assertEquals("1606-01-01", obj4.get("issue_date").toString()); // parsed as a java.sql.Date assertEquals("book", obj5.getDynaClass().getName()); assertEquals("3", obj5.get("book_id").toString()); assertEquals("2", obj5.get("author_id").toString()); assertEquals("0140707026", obj5.get("isbn").toString()); assertEquals("A Midsummer Night's Dream", obj5.get("title").toString()); assertEquals("1595-01-01", obj5.get("issue_date").toString()); // parsed as a java.sql.Date } /** * Tests reading the data from a file via the {#link {@link DataReader#read(String)} method. */ public void testReadFromFile1() throws Exception { 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>"); 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(); ArrayList beans = new ArrayList(); DataReader dataReader = new DataReader(); dataReader.setModel(model); dataReader.setSink(new TestDataSink(beans)); dataReader.read(tmpFile.getAbsolutePath()); assertEquals(1, beans.size()); DynaBean obj = (DynaBean) beans.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 { 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>"); 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(); ArrayList beans = new ArrayList(); DataReader dataReader = new DataReader(); dataReader.setModel(model); dataReader.setSink(new TestDataSink(beans)); dataReader.read(tmpFile); assertEquals(1, beans.size()); DynaBean obj = (DynaBean) beans.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 { 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>"); 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(); ArrayList beans = new ArrayList(); DataReader dataReader = new DataReader(); dataReader.setModel(model); dataReader.setSink(new TestDataSink(beans)); dataReader.read(new FileInputStream(tmpFile)); assertEquals(1, beans.size()); DynaBean obj = (DynaBean) beans.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 { 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>"); List beans = readBeans(model, "<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>"); assertEquals(3, beans.size()); DynaBean obj = (DynaBean) beans.get(0); assertEquals("test", obj.getDynaClass().getName()); assertEquals("1", obj.get("id").toString()); assertEquals("foo", obj.get("value").toString()); obj = (DynaBean) beans.get(1); assertEquals("test", obj.getDynaClass().getName()); assertEquals("2", obj.get("id").toString()); assertEquals("bar", obj.get("value").toString()); obj = (DynaBean) beans.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 { 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>"); List beans = readBeans(model, "<someRandomName>\n" + " <test id='1' value='foo'/>\n" + "</someRandomName>"); assertEquals(1, beans.size()); DynaBean obj = (DynaBean) beans.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 { 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>"); 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>"); assertEquals(2, beans.size()); DynaBean obj = (DynaBean) beans.get(0); assertEquals("test", obj.getDynaClass().getName()); assertEquals("1", obj.get("id").toString()); assertEquals("foo", obj.get("value").toString()); obj = (DynaBean) beans.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 { 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>"); List beans = readBeans(model, "<data>\n" + " <test id='1' value1='foo'/>\n" + "</data>"); assertEquals(1, beans.size()); DynaBean obj = (DynaBean) beans.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 { 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>"); List beans = readBeans(model, "<data>\n" + " <test id='1'>\n" + " <value2>foo</value2>\n" + " </test>\n" + "</data>"); assertEquals(1, beans.size()); DynaBean obj = (DynaBean) beans.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 { 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>"); String testDataXml = "<data>\n" + " <test Id='1' Value='foo'/>\n" + " <Test Id='2' value='baz'/>\n" + "</data>"; ArrayList beans = new ArrayList(); DataReader dataReader = new DataReader(); dataReader.setCaseSensitive(true); dataReader.setModel(model); dataReader.setSink(new TestDataSink(beans)); dataReader.read(new StringReader(testDataXml)); assertEquals(1, beans.size()); DynaBean obj = (DynaBean) beans.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 { 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>"); String testDataXml = "<data>\n" + " <test Id='1' Value='foo'/>\n" + " <Test Id='2' value='bar'/>\n" + " <Test id='3' Value='baz'/>\n" + "</data>"; ArrayList beans = new ArrayList(); DataReader dataReader = new DataReader(); dataReader.setCaseSensitive(false); dataReader.setModel(model); dataReader.setSink(new TestDataSink(beans)); dataReader.read(new StringReader(testDataXml)); assertEquals(3, beans.size()); DynaBean obj = (DynaBean) beans.get(0); assertEquals("Test", obj.getDynaClass().getName()); assertEquals("1", obj.get("Id").toString()); assertEquals("foo", obj.get("Value").toString()); obj = (DynaBean) beans.get(1); assertEquals("Test", obj.getDynaClass().getName()); assertEquals("2", obj.get("Id").toString()); assertEquals("bar", obj.get("Value").toString()); obj = (DynaBean) beans.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 { 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>"); String testedValue = "Some Special Characters: \u0001\u0009\u0010"; SqlDynaBean bean = (SqlDynaBean) model.createDynaBeanFor(model.getTable(0)); bean.set("id", new Integer(1)); bean.set("value", testedValue); 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"); } /** * Tests special characters in the data XML (for DDLUTILS-233). */ public void testSpecialCharactersUTF8() 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 Special Characters: \u0001\u0009\u0010"; SqlDynaBean bean = (SqlDynaBean) model.createDynaBeanFor(model.getTable(0)); bean.set("id", new Integer(1)); bean.set("value", testedValue); 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"); } /** * Tests a cdata section (see DDLUTILS-174). */ public void testCData() throws Exception { 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='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>"); 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) + "]]>"; SqlDynaBean bean = (SqlDynaBean) model.createDynaBeanFor(model.getTable(0)); bean.set("id", new Integer(1)); bean.set("value1", testedValue1); bean.set("value2", testedValue2); bean.set("value3", testedValue3); bean.set("value4", testedValue4); bean.set("value5", testedValue5); byte[] xmlData = writeBean(model, bean, "UTF-8"); List beans = readBeans(model, xmlData); assertEquals(1, beans.size()); assertEquals(bean, beans.get(0)); } /** * 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"; 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 is not a valid XML identifier. */ public void testTableNameNotAValidXmlIdentifier() 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"; 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>"); 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); 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=\"table\" id=\"1\" value=\"" + testedValue + "\" />\n" + "</data>\n"); } /** * 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"; 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\" value=\"" + testedValue + "\" />\n" + "</data>\n"); } /** * 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"); } /** * 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\" column=\"" + testedValue + "\" />\n" + "</data>\n"); } /** * Tests the reader & writer behavior when a column name is 'column-name'. */ 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 'table-name'. */ 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='table-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("table-name", testedValue); roundtripTest(model, bean, "UTF-8", "<?xml version='1.0' encoding='UTF-8'?>\n" + "<data>\n" + " <test id=\"1\">\n" + " <column column-name=\"table-name\">" + 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"); } }