blob: 4d6f7724e91f33a0f14c0334e52fc3ee611959d2 [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.framework;
import java.util.*;
import org.eclipse.persistence.config.PersistenceUnitProperties;
import org.eclipse.persistence.exceptions.*;
import org.eclipse.persistence.logging.AbstractSessionLog;
import org.eclipse.persistence.platform.database.TimesTenPlatform;
import org.eclipse.persistence.sessions.DatabaseLogin;
import org.eclipse.persistence.sessions.DatabaseSession;
import org.eclipse.persistence.platform.database.DatabasePlatform;
import org.eclipse.persistence.sessions.Project;
import org.eclipse.persistence.sessions.Session;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCaseHelper;
import org.eclipse.persistence.tools.schemaframework.*;
/**
* Used in a test model to configure the database and session.
* This class also store every database login that we use.
*/
public class TestSystem {
protected DatabaseLogin login;
public Project project;
public Map<String, String> properties;
/**
* Add all of the descriptors.
*/
public void addDescriptors(DatabaseSession session) {
session.addDescriptors(buildDescriptors());
}
/**
* Return all descriptor for the system.
* This can be used so that subclasses do not have to add descriptors themselves.
*/
public Vector buildDescriptors() {
return new Vector();
}
/**
* Return all tables for the system.
* This can be used so that subclasses do not have to create the tables themselves.
*/
public Vector buildTables() {
return new Vector();
}
/**
* Define the table creation pattern.
*/
public void createTables() throws Exception {
DatabaseSession session;
session = login();
try {
createTables(session);
} finally {
session.logout();
}
}
/**
* Default method to create/recreate the database.
* First drop constraints ignoring errors if tables did not exist.
* Second recreate the tables.
* Then add the constraints back.
*/
public void createTables(DatabaseSession session) throws Exception {
Vector tables = buildTables();
SchemaManager schemaManager = new SchemaManager(session);
for (Enumeration dropForeignKeyEnum = tables.elements();
dropForeignKeyEnum.hasMoreElements();) {
TableDefinition table = (TableDefinition)dropForeignKeyEnum.nextElement();
try {
schemaManager.dropConstraints(table);
} catch (DatabaseException exception) {
// Ignore
}
}
for (Enumeration replaceEnum = tables.elements(); replaceEnum.hasMoreElements();) {
TableDefinition table = (TableDefinition)replaceEnum.nextElement();
schemaManager.replaceObject(table);
}
for (Enumeration createForeignKeyEnum = tables.elements();
createForeignKeyEnum.hasMoreElements();) {
TableDefinition table = (TableDefinition)createForeignKeyEnum.nextElement();
schemaManager.createConstraints(table);
}
}
/**
* Return the default database login to be used.
*/
public DatabaseLogin getLogin() {
if (login == null) {
loadLoginFromProperties();
}
return login;
}
/**
* Load the default login from the test.properties file.
* This file must be on the classpath, or system property set.
*/
public void loadLoginFromProperties() {
this.properties = JUnitTestCaseHelper.getDatabaseProperties();
login = new DatabaseLogin();
login.setDriverClassName(this.properties.get(PersistenceUnitProperties.JDBC_DRIVER));
login.setConnectionString(this.properties.get(PersistenceUnitProperties.JDBC_URL));
login.setUserName(this.properties.get(PersistenceUnitProperties.JDBC_USER));
// This avoids encrypting the password, as some tests require it non-encrypted.
login.setEncryptedPassword(this.properties.get(PersistenceUnitProperties.JDBC_PASSWORD));
String platform = this.properties.get("eclipselink.target-database");
if (platform != null) {
login.setPlatformClassName(platform);
}
}
/**
* Return a connected session using the default login.
*/
public DatabaseSession login() {
DatabaseSession session;
session = new Project(getLogin()).createDatabaseSession();
addDescriptors(session);
session.setLogLevel(AbstractSessionLog.translateStringToLoggingLevel(properties.get(PersistenceUnitProperties.LOGGING_LEVEL)));
try {
session.login();
} catch (DatabaseException x) {
if (session.getPlatform().isMySQL()) {
AbstractSessionLog.getLog().warning("Cannot login to the database");
// Using System.err since session log may not print out the stack trace
x.printStackTrace(System.err);
} else {
throw x;
}
}
return session;
}
/**
* Define the database population pattern.
*/
public void populate() throws Exception {
DatabaseSession session;
session = login();
try {
populate(session);
} finally {
session.logout();
}
}
/**
* Abstract method for database population.
*/
public void populate(DatabaseSession session) throws Exception {
// Nothing by default.
}
/**
* Used for configuration during testing.
*/
public void run(Session session) throws Exception {
// Use old API to be able to run on 9.0.4 for perf testing.
session.getIdentityMapAccessor().initializeIdentityMaps();
this.addDescriptors((DatabaseSession)session);
if (session.getDatasourceLogin().getDatasourcePlatform().isTimesTen()) {
((TimesTenPlatform)session.getDatasourceLogin().getDatasourcePlatform()).setSupportsForeignKeyConstraints(false);
}
this.createTables((DatabaseSession)session);
this.populate((DatabaseSession)session);
// Use old API to be able to run on 9.0.4 for perf testing.
session.getIdentityMapAccessor().initializeIdentityMaps();
}
/**
* Set the default database login to be used.
*/
public void setLogin(DatabaseLogin login) {
this.login = login;
}
/**
* You must have MS Access installed an the MS ODBC setup to a local database.
*/
public void useAccessJDBCODBC() {
DatabaseLogin login = new DatabaseLogin();
login.useAccess();
login.setODBCDataSourceName("MSACCESS");
setLogin(login);
}
/**
* You must have the Attunity Connect driver loaded.
*/
public void useAttunityConnect() {
DatabaseLogin login = new DatabaseLogin(new org.eclipse.persistence.platform.database.AttunityPlatform());
login.setDatabaseURL("mercury2;deftdpname=oracle");
login.setDriverClassName("com.attunity.jdbc.NvDriver");
login.setDriverURLHeader("jdbc:attconnect://");
setLogin(login);
}
/**
* You must have the Derby driver loaded.
*/
public void useDerby() {
DatabaseLogin login = new DatabaseLogin(new org.eclipse.persistence.platform.database.DerbyPlatform());
login.setDriverClassName("org.apache.derby.jdbc.EmbeddedDriver");
login.setDriverURLHeader("jdbc:derby:");
login.setDatabaseURL("test;create=true");
setLogin(login);
}
/**
* You must have the H2 driver loaded.
*/
public void useH2() {
DatabaseLogin login = new DatabaseLogin(new org.eclipse.persistence.platform.database.H2Platform());
login.setDriverClassName("org.h2.Driver");
login.setDriverURLHeader("jdbc:h2:");
login.setDatabaseURL("test");
login.setUserName("sa");
login.setPassword("");
setLogin(login);
}
/**
* You must have the Postgres driver loaded.
*/
public void usePostgres() {
DatabaseLogin login = new DatabaseLogin(new org.eclipse.persistence.platform.database.PostgreSQLPlatform());
login.setDriverClassName("org.postgresql.Driver");
login.setDriverURLHeader("jdbc:postgresql:");
login.setDatabaseURL("//ottvm048.ca.oracle.com/toplink");
setLogin(login);
}
/**
* You must have the Universal drivers and license files loaded.
*/
public void useDB2UniversalDriver() {
DatabaseLogin login = new DatabaseLogin();
login.useDB2();
login.setDriverClassName("com.ibm.db2.jcc.DB2Driver");
login.setDriverURLHeader("jdbc:db2://");
login.setDatabaseURL("ottvm046.ca.oracle.com:50000/TOPLINK2");
login.setUserName("");
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("password");
setLogin(login);
}
/**
* You must have the DataDirect drivers and oc4j.jar loaded.
*/
public void useDB2DataDirect() {
DatabaseLogin login = new DatabaseLogin();
login.useDB2();
login.setDriverClassName("com.oracle.ias.jdbc.db2.DB2Driver");
login.setDriverURLHeader("jdbc:oracle:db2://");
login.setDatabaseURL("tlsvrdb7.ca.oracle.com:50001;DatabaseName=TOPLINK");
login.setUserName("");
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("password");
setLogin(login);
}
/**
* You must have DB2 client installed and the IBM JDBC driver loaded.
*/
public void useDB2App() {
DatabaseLogin login = new DatabaseLogin();
//login.useDB2JDBCDriver();
login.useDB2();
login.setDriverClassName("COM.ibm.db2.jdbc.app.DB2Driver");
login.setDriverURLHeader("jdbc:db2:");
login.useStreamsForBinding();
login.setUserName("");
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("password");
login.setDatabaseURL("TOPLINK");
login.useByteArrayBinding();
setLogin(login);
}
/**
* You must have the IBM JDBC driver loaded.
*/
public void useDB2Net() {
DatabaseLogin login = new DatabaseLogin();
login.useDB2();
login.setDriverClassName("COM.ibm.db2.jdbc.net.DB2Driver");
login.setDriverURLHeader("jdbc:db2:");
login.useStreamsForBinding();
login.setUserName("");
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("password");
login.setDatabaseURL("tlsvrdb7.ca.oracle.com:TOPLINK");
login.useByteArrayBinding();
setLogin(login);
}
/**
* You must have the MySQL Connector/J JDBC driver loaded.
* @param userName java.lang.String
* Creation date: (03/17/05 4:50:00 PM)
* Creator: Edwin Tang
*/
public void useMySQL(String userName) {
DatabaseLogin login = new DatabaseLogin();
login.useMySQL();
login.setDriverClassName("com.mysql.jdbc.Driver");
login.setDriverURLHeader("jdbc:mysql:");
login.useStreamsForBinding();
login.setUserName(userName);
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("password");
login.setDatabaseURL("//ottvm044.ca.oracle.com:3306/"+userName);
login.useByteArrayBinding();
setLogin(login);
}
/**
* You must have the HSQL driver loaded. You must have the HSQL server running.
*/
public void useHSQL() {
DatabaseLogin login = new DatabaseLogin(new org.eclipse.persistence.platform.database.HSQLPlatform());
login.useHSQLDriver();
login.setDatabaseURL("file:test");
login.setUserName("sa");
setLogin(login);
}
/**
* You must have the Informix thin driver loaded.
*/
public void useInformixJDBC20() {
DatabaseLogin login = new DatabaseLogin(new org.eclipse.persistence.platform.database.InformixPlatform());
login.useInformix();
login.useByteArrayBinding();
login.setDriverClassName("com.informix.jdbc.IfxDriver");
login.setDriverURLHeader("jdbc:informix-sqli://");
login.setDatabaseURL("mercury2:1526/toplinkj:INFORMIXSERVER=toplinkj");
login.setUserName("informix");
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("informix");
setLogin(login);
}
/**
* You must have the Informix drivers loaded.
*/
public void useInformix11() {
DatabaseLogin dbLogin = new DatabaseLogin(new org.eclipse.persistence.platform.database.InformixPlatform());
dbLogin.useInformix();
dbLogin.setDriverClassName("com.informix.jdbc.IfxDriver");
dbLogin.setDriverURLHeader("jdbc:informix-sqli://");
dbLogin.setDatabaseURL("tlsvrdb6.ca.oracle.com:9088/toplink:INFORMIXSERVER=informix");
dbLogin.setUserName("informix");
//set the encrypted password will enable toplink to use the plain text password as is
dbLogin.setEncryptedPassword("password");
setLogin(dbLogin);
}
/**
* This is a generic configuration, would should test this occationally to test generic drivers.
* A "JDBC" ODBC entry must be setup, however table creation will fail for most databases, I think
* if it is setup to DB2 table creation will pass.
*/
public void useJDBCODBC() {
DatabaseLogin login = new DatabaseLogin();
login.setODBCDataSourceName("JDBC");
setLogin(login);
}
/**
* You must have the Oracle client installed and the Oracle JDBC driver loaded.
*/
public void useOracleOCI() {
DatabaseLogin login = new DatabaseLogin(OracleDBPlatformHelper.getInstance().getOracle9Platform());
login.useOracleJDBCDriver();
login.setDatabaseURL("toplink");
login.setUserName("");
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("password");
setLogin(login);
}
/**
* You must have the MS JDBC driver for SQL Server loaded.
*/
public void useSQLServerMSJDBC() {
DatabaseLogin login = new DatabaseLogin();
login.useSQLServer();
login.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
login.setDriverURLHeader("jdbc:sqlserver://");
login.setDatabaseURL("ottvm041");
login.setUserName("dev1");
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("password");
login.useByteArrayBinding();
setLogin(login);
}
/**
* You must have the SQL Server and the Weblogic drivers installed.
*/
public void useSQLServerWeblogicDBLib() {
DatabaseLogin login = new DatabaseLogin();
login.useWebLogicSQLServerDBLibDriver();
login.setDatabaseURL("ottvm041");
login.setUserName("dev1");
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("password");
login.useByteArrayBinding();
setLogin(login);
}
/**
* You must have the DataDirect drivers and oc4j.jar loaded..
*/
public void useSQLServerDataDirect() {
DatabaseLogin login = new DatabaseLogin();
login.useSQLServer();
login.setDriverClassName("com.oracle.ias.jdbc.sqlserver.SQLServerDriver");
login.setDriverURLHeader("jdbc:oracle:sqlserver://");
login.setDatabaseURL("localhost\\\\ottvm041");
login.setUserName("dev1");
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("password");
login.useByteArrayBinding();
setLogin(login);
}
/**
* You must have the Sybase JConnect thin driver loaded.
*/
public void useSybaseJConnect() {
DatabaseLogin login = new DatabaseLogin();
login.useSybase();
login.setDriverClassName("com.sybase.jdbc3.jdbc.SybDriver");
login.setDriverURLHeader("jdbc:sybase:Tds:");
login.setDatabaseURL("ottvm031.ca.oracle.com:5000/qa2");
login.setUserName("qa2");
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("password");
setLogin(login);
}
/**
* You must have the DataDirect drivers and oc4j.jar loaded.
*/
public void useSybaseDataDirect() {
DatabaseLogin login = new DatabaseLogin();
login.useSybase();
login.setDriverClassName("com.oracle.ias.jdbc.sybase.SybaseDriver");
login.setDriverURLHeader("jdbc:oracle:sybase://");
login.setDatabaseURL("ottvm031.ca.oracle.com:5000/qa2");
login.setUserName("qa2");
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("password");
setLogin(login);
}
/**
* You must have the Oracle thin driver loaded.
* @param userName java.lang.String
* Creation date: (12/7/00 4:03:00 PM)
* Creator: Edwin Tang
*/
public void useOracleThin(String databaseURL, String userName, String password) {
DatabasePlatform platform = null;
try{
Class platformClass = Class.forName("org.eclipse.persistence.platform.database.oracle.Oracle9Platform");
platform = (DatabasePlatform)platformClass.getConstructor().newInstance();
} catch (Exception e){
platform = new org.eclipse.persistence.platform.database.OraclePlatform();
}
DatabaseLogin login = new DatabaseLogin(platform);
login.useOracleThinJDBCDriver();
login.setDatabaseURL(databaseURL);
login.setUserName(userName);
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword(password);
setLogin(login);
}
/**
* You must have the Oracle 8 thin driver loaded.
* @param userName java.lang.String
* Creation date: (12/7/00 4:03:00 PM)
* Creator: Praba Vijayaratnam
*/
public void useOracle8Thin(String databaseURL, String userName, String password) {
DatabasePlatform platform = null;
try{
Class platformClass = Class.forName("org.eclipse.persistence.platform.database.oracle.Oracle8Platform");
platform = (DatabasePlatform)platformClass.getConstructor().newInstance();
} catch (Exception e){
platform = new org.eclipse.persistence.platform.database.OraclePlatform();
}
DatabaseLogin login = new DatabaseLogin(platform);
login.useOracleThinJDBCDriver();
login.setDatabaseURL(databaseURL);
login.setUserName(userName);
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword(password);
setLogin(login);
}
/**
* You must have DB2 installed with the IBM DB2 ODBC driver setup as "DB2".
*/
public void useDB2JDBCODBC() {
DatabaseLogin login = new DatabaseLogin();
login.useDB2();
login.setODBCDataSourceName("DB2");
login.setUserName("");
login.setTableQualifier("");
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("password");
setLogin(login);
}
/**
* You must have DB2 installed with a TopLink database created and the IBM JDBC driver loaded.
*/
public void useDB2JDBC() {
DatabaseLogin login = new DatabaseLogin();
login.useDB2JDBCDriver();
login.useByteArrayBinding();
login.useStreamsForBinding();
login.setUserName("");
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("password");
login.setDatabaseURL("TOPLINK");
setLogin(login);
}
/**
* You must have the SQL Server and the Weblogic drivers installed.
*/
public void useSQLServerWeblogicThin() {
DatabaseLogin login = new DatabaseLogin();
login.useSQLServer();
login.useWebLogicSQLServerDriver();
login.setODBCDataSourceName("localhost");
login.setUserName("");
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("password");
login.useByteArrayBinding();
setLogin(login);
}
/**
* You must have the Sybase JConnect thin driver loaded.
*/
public void useSybaseJConnect50() {
DatabaseLogin login = new DatabaseLogin();
login.setDriverClassName("");
login.setDatabaseURL("tlsvrdb1.ca.oracle.com:5000/COREDEV1");
login.setUserName("");
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("password");
setLogin(login);
}
/**
* You must have the Sybase client installed and the Weblogic JDBC driver loaded.
*/
public void useSybaseWeblogicDBLib() {
DatabaseLogin login = new DatabaseLogin();
login.useWebLogicSybaseDBLibDriver();
login.setDatabaseURL("");
login.setUserName("");
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("password");
setLogin(login);
}
/**
* You must have the SQL Server and the i-net jdbc driver for java 2 installed. This will run on TM2.
*/
public void useSQLServerThin() {
DatabaseLogin login = new DatabaseLogin();
login.useSQLServer();
login.useINetSQLServerDriver();
login.setODBCDataSourceName("localhost");
login.setUserName("");
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("password");
login.useByteArrayBinding();
setLogin(login);
}
/**
* You must have the TimesTen JDBC driver loaded.
* @param userName java.lang.String
* Creation date: (11/10/05 4:55:00 PM)
* Creator: Edwin Tang
*/
public void useTimesTen(String userName) {
DatabaseLogin login = new DatabaseLogin();
try {
login.usePlatform((org.eclipse.persistence.internal.databaseaccess.DatabasePlatform)Class.forName("org.eclipse.persistence.platform.database.TimesTenPlatform").getConstructor().newInstance());
} catch (Exception e) {}
login.setDriverClassName("com.timesten.jdbc.TimesTenDriver");
login.setDriverURLHeader("jdbc:timesten:client:");
login.useStreamsForBinding();
login.setUserName(userName);
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("password");
login.setDatabaseURL(userName);
login.useByteArrayBinding();
setLogin(login);
}
/**
* You must have the Symfoware JDBC driver loaded.
*/
public void useSymfowareRDB2_TCP() {
DatabaseLogin login = new DatabaseLogin();
try {
login.usePlatform((org.eclipse.persistence.internal.databaseaccess.DatabasePlatform)Class.forName("org.eclipse.persistence.platform.database.SymfowarePlatform").getConstructor().newInstance());
} catch (Exception e) {
e.printStackTrace();
}
login.setDriverClassName("com.fujitsu.symfoware.jdbc.SYMDriver");
login.setDriverURLHeader("jdbc:symford:");
// codeselect setting reduces garbled characters when DB and client's
// character encoding settings do not match
login.setDatabaseURL("TESTDB");
//set the encrypted password will enable toplink to use the plain text password as is
login.setEncryptedPassword("password");
setLogin(login);
}
}