blob: 48c8edaf01b494088cc1541626c01a0f58851c69 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2013 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 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:
* Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.testing.tests.isolatedsession;
import java.util.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.sessions.server.*;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.exceptions.*;
import org.eclipse.persistence.config.ExclusiveConnectionMode;
public class ClientServerTest extends AutoVerifyTestCase {
protected DatabaseLogin login;
protected ArrayList clients;
protected ServerSession server;
protected String exclusiveConnectionMode;
protected boolean isIsolated = true;
protected Map isolatedDescriptors;
public ClientServerTest(boolean isExclusive) {
this((isExclusive ? ExclusiveConnectionMode.Isolated : ExclusiveConnectionMode.Transactional), true);
}
public ClientServerTest(String exclusiveConnectionMode, boolean isIsolated) {
clients = new ArrayList();
isolatedDescriptors = new HashMap();
this.exclusiveConnectionMode = exclusiveConnectionMode;
this.isIsolated = isIsolated;
if(exclusiveConnectionMode.equals(ExclusiveConnectionMode.Isolated) && !isIsolated) {
throw new TestProblemException("ExclusiveConnectionMode.Isolated requires isIsolated==true");
}
setDescription("This test acts as a template for tests using the client server framework");
}
public void copyDescriptors(Session session) {
Vector descriptors = new Vector();
for (Iterator iterator = session.getDescriptors().values().iterator(); iterator.hasNext(); ) {
ClassDescriptor desc = (ClassDescriptor)iterator.next();
descriptors.addElement(desc);
// it's an isolated descriptor, but the test requires no isolation.
// switch isolation off, cache the descriptor to restore isolation after the test is complete.
if(!isIsolated && desc.isIsolated()) {
// uowCacheIsolationLevel seems to be the only attribute affected by isolation,
// cache the original one in the map.
isolatedDescriptors.put(desc, desc.getUnitOfWorkCacheIsolationLevel());
// un-isolate descriptor
desc.setIsIsolated(false);
// the value assigned by default during initialization for non-isolated descriptor.
desc.setUnitOfWorkCacheIsolationLevel(ClassDescriptor.ISOLATE_NEW_DATA_AFTER_TRANSACTION);
}
}
this.server.addDescriptors(descriptors);
// Since the descriptors are already initialized, must also set the session to isolated.
this.server.getProject().setHasIsolatedClasses(true);
}
public void reset() {
try {
while (!this.clients.isEmpty()) {
((Session)this.clients.get(0)).release();
this.clients.remove(0);
}
this.server.logout();
// restore descriptors' isolation removed in setup
if(!isIsolated) {
Iterator it = isolatedDescriptors.entrySet().iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
ClassDescriptor desc = (ClassDescriptor)entry.getKey();
desc.setIsIsolated(true);
desc.setUnitOfWorkCacheIsolationLevel((Integer)entry.getValue());
}
isolatedDescriptors.clear();
}
getDatabaseSession().logout();
getDatabaseSession().login();
} catch (Exception ex) {
if (ex instanceof ValidationException) {
this.verify();
}
}
}
public void setup() {
try {
this.login = (DatabaseLogin)getSession().getLogin().clone();
this.server = new ServerSession(this.login, 2, 5);
this.server.setSessionLog(getSession().getSessionLog());
copyDescriptors(getSession());
this.server.login();
ConnectionPolicy connectionPolicy = this.server.getDefaultConnectionPolicy();
if (this.exclusiveConnectionMode.equals(ExclusiveConnectionMode.Isolated)) {
connectionPolicy.setExclusiveMode(ConnectionPolicy.ExclusiveMode.Isolated);
} else if (this.exclusiveConnectionMode.equals(ExclusiveConnectionMode.Always)) {
connectionPolicy.setExclusiveMode(ConnectionPolicy.ExclusiveMode.Always);
}
String propertyName = exclusiveConnectionMode;
if(isIsolated) {
propertyName += "_Isolated";
}
connectionPolicy.setProperty(propertyName, "true");
this.clients.add(this.server.acquireClientSession(connectionPolicy));
this.clients.add(this.server.acquireClientSession(connectionPolicy));
this.clients.add(this.server.acquireClientSession(connectionPolicy));
} catch (ValidationException ex) {
this.verify();
}
}
public void test() {
}
public void verify() {
}
}