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