blob: 7ea461974635250c183d96f512d4861affe0076e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 Dies Koper (Fujitsu) All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Created Feb 19, 2010 - Dies Koper (Fujitsu)
* bug 288715: Drop Table Restrictions: "table locked" errors when dropping
* tables in several Core and many JPA LRG tests on Symfoware.
******************************************************************************/
package org.eclipse.persistence.testing.framework;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Vector;
import org.eclipse.persistence.exceptions.DatabaseException;
import org.eclipse.persistence.internal.sessions.AbstractSession;
import org.eclipse.persistence.logging.AbstractSessionLog;
import org.eclipse.persistence.logging.SessionLog;
import org.eclipse.persistence.sessions.DatabaseSession;
import org.eclipse.persistence.tools.schemaframework.SchemaManager;
import org.eclipse.persistence.tools.schemaframework.TableCreator;
import org.eclipse.persistence.tools.schemaframework.TableDefinition;
/**
* Many JPA and a few Core tests use the same tables names, so at the start of
* the tests tables are dropped and recreated. If the tables were created in a
* previous test and the connection used to create it is still open, Symfoware
* complains that the tables are locked when it tries to drop them.
* <p/>
*
* This class sets a flag before the subsequent recreation of the tables to
* delete the rows instead. The first time it is called it does not set the
* flag, to allow the tables to be initially created.
* <p/>
*
* To enable this functionality, the system property
* "eclipselink.test.toggle-fast-table-creator" needs to be set to "true".
* <p/>
*
* This class should be positioned between the test's table creator class and
* TableCreator by making the's test table creator extend this class.<br/>
*
* @author Dies Koper
*
*/
public class TogglingFastTableCreator extends TableCreator {
protected static Set fastTableCreators = new HashSet();
protected static boolean useFastTableCreatorAfterInitialCreate = Boolean
.getBoolean("eclipselink.test.toggle-fast-table-creator");
/**
* Delegates to super's constructor.
*/
public TogglingFastTableCreator() {
super();
}
/**
* Delegates to super's constructor.
*/
public TogglingFastTableCreator(Vector tableDefinitions) {
super(tableDefinitions);
}
@Override
public void replaceTables(DatabaseSession session) {
// on Symfoware, to avoid table locking issues only the first invocation
// of an instance of this class (drops & re-)creates the tables
// if the system property is set.
session.getSessionLog().log(SessionLog.FINEST, "TogglingFastTableCreator: useFastTableCreatorAfterInitialCreate: "
+ useFastTableCreatorAfterInitialCreate);
boolean isFirstCreate = !isFastTableCreator();
session.getSessionLog().log(SessionLog.FINEST, "TogglingFastTableCreator: " + getTableCreatorName()
+ " - isFirstCreate: " + isFirstCreate);
session.getSessionLog().log(SessionLog.FINEST, "TogglingFastTableCreator: Current fastTableCreators: "
+ fastTableCreators);
if (useFastTableCreatorAfterInitialCreate && !isFirstCreate) {
session.getSessionLog().log(SessionLog.FINEST, "TogglingFastTableCreator: " + getTableCreatorName()
+ " - toggling true");
String sequenceTableName = getSequenceTableName(session);
List<TableDefinition> tables = getTableDefinitions();
for (TableDefinition table : tables) {
if (!table.getName().equals(sequenceTableName)) {
SchemaManager schemaManager = new SchemaManager(session);
AbstractSession abstarctSession = schemaManager.getSession();
try {
abstarctSession.priviledgedExecuteNonSelectingCall(new org.eclipse.persistence.queries.SQLCall("DELETE FROM " + table.getFullName()));
} catch (DatabaseException ex) {
//Ignore database exception. eg. If there is no table to delete, it gives database exception.
}
}
}
} else {
super.replaceTables(session);
}
// next time just delete the rows instead.
if (useFastTableCreatorAfterInitialCreate) {
setFastTableCreator();
session.getSessionLog().log(SessionLog.FINEST, "TogglingFastTableCreator: " + getTableCreatorName()
+ " added to fastTableCreators");
}
}
public boolean resetFastTableCreator() {
AbstractSessionLog.getLog().log(SessionLog.FINEST, "TogglingFastTableCreator: removing table creator: "
+ getTableCreatorName());
return fastTableCreators.remove(getTableCreatorName());
}
public boolean setFastTableCreator() {
AbstractSessionLog.getLog().log(SessionLog.FINEST, "TogglingFastTableCreator: adding table creator: "
+ getTableCreatorName());
return fastTableCreators.add(getTableCreatorName());
}
public boolean isFastTableCreator() {
return fastTableCreators.contains(getTableCreatorName());
}
public String getTableCreatorName() {
return this.getClass().getName();
}
}