/******************************************************************************* | |
* 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() { | |
} | |
} |