blob: e440a3b2d012d5a0ab87b9c03cf1cfe7f98ee622 [file] [log] [blame]
/*
* 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.
*/
package org.apache.openjpa.persistence.dynamicschema;
import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.jdbc.meta.ClassMapping;
import org.apache.openjpa.jdbc.schema.Column;
import org.apache.openjpa.jdbc.schema.Table;
import org.apache.openjpa.jdbc.sql.DBDictionary;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
/**
* <b>TestDynamicSchemas</b> is used to create dynamic schemas for the various
* database dictionaries and validate them to ensure they are created
* correctly as specified in their dictionary. The following variables of each
* dictionary are used for validation:<p>
*
* <ol>
* <li>maxTableNameLength
* <li>maxColumnNameLength
* <li>reservedWordsSet
* </ol>
*
* <b>Note(s):</b>
* <ul>
* <li>To minimize the running time of these testcases there are no
* connections made to any of the databases
* <li>This is accomplished by passing the "export" SchemaAction to the
* MappingTool, and using the RETAIN_DATA option to prevent SQL commands
* from getting executed
* </ul>
*
* @author Tim McConnell
* @since 2.0.0
*/
public class TestDynamicSchemas extends SingleEMFTestCase {
@Override
public void setUp() {
}
public void testDerbyDynamicSchema() {
OpenJPAEntityManagerFactorySPI derbyEMF =
createEMF(EntityVeryLongNames.class, EntityReservedWords.class,
"openjpa.ConnectionURL",
"jdbc:derby:net://host:1527/databaseName",
"openjpa.jdbc.SynchronizeMappings", "export",
"openjpa.jdbc.SchemaFactory", "dynamic", RETAIN_DATA);
validateTableName( derbyEMF );
closeEMF(derbyEMF);
}
public void testDB2DynamicSchema() {
OpenJPAEntityManagerFactorySPI db2EMF =
createEMF(EntityVeryLongNames.class, EntityReservedWords.class,
"openjpa.ConnectionURL",
"jdbc:db2://localhost:5000/db2",
"openjpa.jdbc.SynchronizeMappings", "export",
"openjpa.jdbc.SchemaFactory", "dynamic", RETAIN_DATA);
validateTableName( db2EMF );
closeEMF(db2EMF);
}
public void testOracleDynamicSchema() {
OpenJPAEntityManagerFactorySPI oracleEMF =
createEMF(EntityVeryLongNames.class, EntityReservedWords.class,
"openjpa.ConnectionURL",
"jdbc:oracle:thin:@host:1234:database_sid",
"openjpa.jdbc.SynchronizeMappings", "export",
"openjpa.jdbc.SchemaFactory", "dynamic", RETAIN_DATA);
validateTableName( oracleEMF );
closeEMF(oracleEMF);
}
public void testAccessDynamicSchema() {
OpenJPAEntityManagerFactorySPI accessEMF =
createEMF(EntityVeryLongNames.class, EntityReservedWords.class,
"openjpa.ConnectionURL",
"jdbc:odbc:Driver=Microsoft Access Driver (*.mdb);DBQ=c:",
"openjpa.jdbc.SynchronizeMappings", "export",
"openjpa.jdbc.SchemaFactory", "dynamic", RETAIN_DATA);
validateTableName( accessEMF );
closeEMF(accessEMF);
}
public void testSQLServerDynamicSchema() {
OpenJPAEntityManagerFactorySPI sqlserverEMF =
createEMF(EntityVeryLongNames.class, EntityReservedWords.class,
"openjpa.ConnectionURL",
"jdbc:microsoft:sqlserver:",
"openjpa.jdbc.SynchronizeMappings", "export",
"openjpa.jdbc.SchemaFactory", "dynamic", RETAIN_DATA);
validateTableName( sqlserverEMF );
closeEMF(sqlserverEMF);
}
public void testMariaDBDynamicSchema() {
OpenJPAEntityManagerFactorySPI mysqlEMF =
createEMF(EntityVeryLongNames.class, EntityReservedWords.class,
"openjpa.ConnectionURL",
"jdbc:mariadb://host1:1,host2:2/database?p1=v1&p2=v2",
"openjpa.jdbc.SynchronizeMappings", "export",
"openjpa.jdbc.SchemaFactory", "dynamic", RETAIN_DATA);
validateTableName( mysqlEMF );
closeEMF(mysqlEMF);
}
public void testMySQLDynamicSchema() {
OpenJPAEntityManagerFactorySPI mysqlEMF =
createEMF(EntityVeryLongNames.class, EntityReservedWords.class,
"openjpa.ConnectionURL",
"jdbc:mysql://host1:1,host2:2/database?p1=v1&p2=v2",
"openjpa.jdbc.SynchronizeMappings", "export",
"openjpa.jdbc.SchemaFactory", "dynamic", RETAIN_DATA);
validateTableName( mysqlEMF );
closeEMF(mysqlEMF);
}
public void testPostgresDynamicSchema() {
OpenJPAEntityManagerFactorySPI postgresEMF =
createEMF(EntityVeryLongNames.class, EntityReservedWords.class,
"openjpa.ConnectionURL",
"jdbc:postgresql:database",
"openjpa.jdbc.SynchronizeMappings", "export",
"openjpa.jdbc.SchemaFactory", "dynamic", RETAIN_DATA);
validateTableName( postgresEMF );
closeEMF(postgresEMF);
}
public void testInformixDynamicSchema() {
OpenJPAEntityManagerFactorySPI informixEMF =
createEMF(EntityVeryLongNames.class, EntityReservedWords.class,
"openjpa.ConnectionURL",
"jdbc:informix-sqli:",
"openjpa.jdbc.SynchronizeMappings", "export",
"openjpa.jdbc.SchemaFactory", "dynamic", RETAIN_DATA);
validateTableName( informixEMF );
closeEMF(informixEMF);
}
public void testSybaseDynamicSchema() {
OpenJPAEntityManagerFactorySPI sybaseEMF =
createEMF(EntityVeryLongNames.class, EntityReservedWords.class,
"openjpa.ConnectionURL",
"jdbc:sybase:Tds:host:1234?ServiceName=db",
"openjpa.jdbc.SynchronizeMappings", "export",
"openjpa.jdbc.SchemaFactory", "dynamic", RETAIN_DATA);
validateTableName( sybaseEMF );
closeEMF(sybaseEMF);
}
public void testFirebirdDynamicSchema() {
OpenJPAEntityManagerFactorySPI firebirdEMF =
createEMF(EntityVeryLongNames.class, EntityReservedWords.class,
"openjpa.ConnectionURL",
"jdbc:firebirdsql:host/1234:database",
"openjpa.jdbc.SynchronizeMappings", "export",
"openjpa.jdbc.SchemaFactory", "dynamic", RETAIN_DATA);
validateTableName( firebirdEMF );
closeEMF(firebirdEMF);
}
/**
* Derby tests run with a DerbyDictionary-specific property, so clear it out here.
* Otherwise, all tests except testDerbyDynamicSchema will fail.
*/
@Override
protected OpenJPAEntityManagerFactorySPI createEMF(Object... props) {
int propsLength = props.length;
Object[] newProps = new Object[propsLength + 2];
System.arraycopy(props, 0, newProps, 0, propsLength);
newProps[propsLength] = "openjpa.jdbc.DBDictionary";
newProps[propsLength + 1] = "";
return super.createEMF(newProps);
}
private void validateTableName(OpenJPAEntityManagerFactorySPI emf) {
JDBCConfiguration conf = (JDBCConfiguration) emf.getConfiguration();
DBDictionary dict = conf.getDBDictionaryInstance();
ClassMapping mapping = (ClassMapping)conf.
getMetaDataRepositoryInstance().
getMetaData(EntityVeryLongNames.class,getClass().
getClassLoader(), true);
Table table = mapping.getTable();
assertTrue(table.getName().length() > 0);
assertTrue(table.getName().length() <= dict.maxTableNameLength);
validateColumnNames(table, dict);
mapping = (ClassMapping)conf.
getMetaDataRepositoryInstance().
getMetaData(EntityReservedWords.class,getClass().
getClassLoader(), true);
table = mapping.getTable();
assertTrue(table.getName().length() > 0);
assertTrue(table.getName().length() <= dict.maxTableNameLength);
validateColumnNames(table, dict);
}
private void validateColumnNames(Table table, DBDictionary dict) {
Column[] columns = table.getColumns();
for (Column column : columns) {
assertTrue(column.getName().length() > 0);
assertTrue(column.getName().length() <= dict.maxColumnNameLength);
assertFalse("Column" + column.getName(), dict.getInvalidColumnWordSet().
contains(column.getName().toUpperCase()));
}
}
}