/******************************************************************************* | |
* 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.readonly; | |
import java.util.*; | |
import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl; | |
import org.eclipse.persistence.sessions.*; | |
import org.eclipse.persistence.testing.models.readonly.Country; | |
import org.eclipse.persistence.testing.models.readonly.Address; | |
import org.eclipse.persistence.testing.models.readonly.Promoter; | |
import org.eclipse.persistence.testing.framework.*; | |
/** | |
* <p> | |
* <b>Purpose</b>: Test the public API with regards to manipulation of the sets of the | |
* read-only classes in a UnitOfWork and the default set in Project. | |
* <p> | |
* <b>Responsibilities</b>: | |
* <ul> | |
* <li> Test the accessors for the manipulation of the read-only class set in instances | |
* <li> of UnitOfWork. | |
* <li> Test the accessors for the manipulation of the default read-only class in an | |
* <li> instance of Project. | |
* </ul> | |
*/ | |
public class ReadOnlyClassAccessingTestCase extends TestCase { | |
public ReadOnlyClassAccessingTestCase() { | |
super(); | |
} | |
/** | |
* Compares a Hashtable and a vector for equality. | |
*/ | |
protected boolean areEqual(Set ht, Vector v1) { | |
if (v1.size() != ht.size()) { | |
return false; | |
} | |
for (Enumeration enumtr = v1.elements(); enumtr.hasMoreElements();) { | |
if (!ht.contains(enumtr.nextElement())) { | |
return false; | |
} | |
} | |
return true; | |
} | |
/** | |
* Compares two vectors for equality. | |
*/ | |
protected boolean areEqual(Vector v1, Vector v2) { | |
if (v1.size() != v2.size()) { | |
return false; | |
} | |
for (Enumeration enumtr = v1.elements(); enumtr.hasMoreElements();) { | |
if (!v2.contains(enumtr.nextElement())) { | |
return false; | |
} | |
} | |
for (Enumeration enumtr = v2.elements(); enumtr.hasMoreElements();) { | |
if (!v1.contains(enumtr.nextElement())) { | |
return false; | |
} | |
} | |
return true; | |
} | |
public void reset() { | |
getSession().getProject().setDefaultReadOnlyClasses(new Vector()); | |
} | |
protected void setup() { | |
getSession().getProject().setDefaultReadOnlyClasses(new Vector()); | |
} | |
protected void test() { | |
// Test acquiring a unit of work. | |
UnitOfWork uow1 = getSession().acquireUnitOfWork(); | |
if (!((UnitOfWorkImpl)uow1).getReadOnlyClasses().isEmpty()) { | |
throw new TestErrorException(" When acquiring a UnitOfWork from a Session, the read-only classes where not empty as expected."); | |
} | |
uow1.release(); | |
// Test acquiring a unit of work with a vector of read-only classes. | |
Vector classes = new Vector(); | |
classes.addElement(Promoter.class); | |
classes.addElement(Country.class); | |
UnitOfWork uow2 = getSession().acquireUnitOfWork(); | |
uow2.removeAllReadOnlyClasses(); | |
uow2.addReadOnlyClasses(classes); | |
if (!areEqual(((UnitOfWorkImpl)uow2).getReadOnlyClasses(), classes)) { | |
throw new TestErrorException("When acquiring a UnitOfWork from a Session, the read-only classes specified did not get set in the UnitOfWork;"); | |
} | |
// Test the testing of read-only classes | |
for (Enumeration enumtr = classes.elements(); enumtr.hasMoreElements();) { | |
if (!uow2.isClassReadOnly((Class)enumtr.nextElement())) { | |
throw new TestErrorException("Testing whether a class is read-only or not has failed."); | |
} | |
} | |
if (uow2.isClassReadOnly(Vector.class)) { | |
throw new TestErrorException("Testing whether a class is read-only or not has failed."); | |
} | |
// Test the add and remove of read-only classes. | |
uow2.removeReadOnlyClass(Promoter.class); | |
if (uow2.isClassReadOnly(Promoter.class)) { | |
throw new TestErrorException("The method removeReadOnlyClass(Class) failed."); | |
} | |
uow2.addReadOnlyClass(Promoter.class); | |
if (!uow2.isClassReadOnly(Promoter.class)) { | |
throw new TestErrorException("The method addReadOnlyClass(Class) failed."); | |
} | |
// Test the removeAll. | |
uow2.removeAllReadOnlyClasses(); | |
if ((uow2.isClassReadOnly(Country.class)) || (!((UnitOfWorkImpl)uow2).getReadOnlyClasses().isEmpty())) { | |
throw new TestErrorException("Did not remove all the read-only classes from a UnitOfWork properly"); | |
} | |
// Check that we cannot make changes to the read-only set after registering an object. | |
try { | |
uow2.registerObject(new Address()); | |
uow2.removeAllReadOnlyClasses(); | |
uow2.addReadOnlyClasses(classes); | |
if (areEqual(((UnitOfWorkImpl)uow2).getReadOnlyClasses(), classes)) { | |
throw new TestErrorException("Shouldn't be able to change the readOnlyClasses of a UnitOfWork after an object was registered."); | |
} | |
} catch (org.eclipse.persistence.exceptions.ValidationException ex) { | |
getSession().logMessage("Caught validation exeception...OK"); | |
} finally { | |
uow2.release(); | |
} | |
// Check that the default read-only classes work. | |
Vector someClasses = new Vector(); | |
someClasses.addElement(Country.class); | |
someClasses.addElement(Address.class); | |
getSession().getProject().setDefaultReadOnlyClasses(someClasses); | |
UnitOfWork uow3 = getSession().acquireUnitOfWork(); | |
if (!areEqual(((UnitOfWorkImpl)uow3).getReadOnlyClasses(), someClasses)) { | |
throw new TestErrorException("The default read-only classes were not set properly when a UnitOfWork was aquired"); | |
} | |
// Nested units of work should not be able to reduce the set of read-only classes. | |
UnitOfWork uow4 = uow3.acquireUnitOfWork(); | |
try { | |
uow4.removeAllReadOnlyClasses(); | |
} catch (org.eclipse.persistence.exceptions.ValidationException ex) { | |
getSession().logMessage("Check the nested units of work read-only classes. OK"); | |
} finally { | |
uow3.release(); | |
uow4.release(); | |
} | |
// You should be able to get the default set of read-only classes from nested UnitOfWork objects. | |
UnitOfWork uow5 = getSession().acquireUnitOfWork(); | |
UnitOfWork uow6 = uow5.acquireUnitOfWork(); | |
if (!areEqual(((UnitOfWorkImpl)uow5).getDefaultReadOnlyClasses(), ((UnitOfWorkImpl)uow6).getDefaultReadOnlyClasses())) | |
throw new TestErrorException("Nested UnitOfWorks did not return consistent default read-only classes."); | |
uow5.release(); | |
uow6.release(); | |
} | |
/** | |
* Compares two vectors for equality. | |
*/ | |
protected boolean vectorsEqual(Vector v1, Vector v2) { | |
if (v1.size() != v2.size()) { | |
return false; | |
} | |
for (Enumeration enumtr = v1.elements(); enumtr.hasMoreElements();) { | |
if (!v2.contains(enumtr.nextElement())) { | |
return false; | |
} | |
} | |
for (Enumeration enumtr = v2.elements(); enumtr.hasMoreElements();) { | |
if (!v1.contains(enumtr.nextElement())) { | |
return false; | |
} | |
} | |
return true; | |
} | |
} |