mirror of https://github.com/apache/openjpa.git
OPENJPA-396. Going ahead with the commit of the patch. Per the discussion in the Issue and the dev mailing list, I have added a few more comments to the clone() generation. Thanks.
git-svn-id: https://svn.apache.org/repos/asf/openjpa/branches/1.0.x@582974 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
3412d7df07
commit
bc8dfab419
|
@ -719,6 +719,32 @@ public class ProxyManagerImpl
|
||||||
code.calculateMaxStack();
|
code.calculateMaxStack();
|
||||||
code.calculateMaxLocals();
|
code.calculateMaxLocals();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* clone (return detached proxy object)
|
||||||
|
* Note: This method is only being provided to satisfy a quirk with
|
||||||
|
* the IBM JDK -- while comparing Calendar objects, the clone() method
|
||||||
|
* was invoked. So, we are now overriding the clone() method so as to
|
||||||
|
* provide a detached proxy object (null out the StateManager).
|
||||||
|
*/
|
||||||
|
m = bc.declareMethod("clone", Object.class, null);
|
||||||
|
m.makePublic();
|
||||||
|
code = m.getCode(true);
|
||||||
|
code.aload().setThis();
|
||||||
|
code.invokespecial().setMethod(bc.getSuperclassType(), "clone",
|
||||||
|
Object.class, null);
|
||||||
|
code.checkcast().setType(Proxy.class);
|
||||||
|
int other = code.getNextLocalsIndex();
|
||||||
|
code.astore().setLocal(other);
|
||||||
|
code.aload().setLocal(other);
|
||||||
|
code.constant().setNull();
|
||||||
|
code.constant().setValue(0);
|
||||||
|
code.invokeinterface().setMethod(Proxy.class, "setOwner", void.class,
|
||||||
|
new Class[] { OpenJPAStateManager.class, int.class });
|
||||||
|
code.aload().setLocal(other);
|
||||||
|
code.areturn();
|
||||||
|
code.calculateMaxStack();
|
||||||
|
code.calculateMaxLocals();
|
||||||
|
|
||||||
if (changeTracker) {
|
if (changeTracker) {
|
||||||
m = bc.declareMethod("getChangeTracker", ChangeTracker.class, null);
|
m = bc.declareMethod("getChangeTracker", ChangeTracker.class, null);
|
||||||
m.makePublic();
|
m.makePublic();
|
||||||
|
|
|
@ -46,6 +46,7 @@ import java.util.TreeSet;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
import java.util.Vector;
|
import java.util.Vector;
|
||||||
|
|
||||||
|
import org.apache.openjpa.util.Proxy;
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
import junit.textui.TestRunner;
|
import junit.textui.TestRunner;
|
||||||
|
|
||||||
|
@ -151,12 +152,20 @@ public class TestProxyManager
|
||||||
*/
|
*/
|
||||||
private static void assertSortedSetsEqual(SortedSet s1, SortedSet s2) {
|
private static void assertSortedSetsEqual(SortedSet s1, SortedSet s2) {
|
||||||
assertTrue(s1.getClass() == s2.getClass());
|
assertTrue(s1.getClass() == s2.getClass());
|
||||||
|
assertSortedSetsEquals(s1, s2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the given sets are exactly the same (minus the class).
|
||||||
|
*/
|
||||||
|
private static void assertSortedSetsEquals(SortedSet s1, SortedSet s2) {
|
||||||
assertEquals(s1.comparator(), s2.comparator());
|
assertEquals(s1.comparator(), s2.comparator());
|
||||||
assertEquals(s1.size(), s2.size());
|
assertEquals(s1.size(), s2.size());
|
||||||
Iterator itr1 = s1.iterator();
|
Iterator itr1 = s1.iterator();
|
||||||
Iterator itr2 = s2.iterator();
|
Iterator itr2 = s2.iterator();
|
||||||
while (itr1.hasNext())
|
while (itr1.hasNext())
|
||||||
assertTrue(itr1.next() == itr2.next());
|
assertTrue(itr1.next() == itr2.next());
|
||||||
|
assertTrue(s1.equals(s2));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testCopyNullCollection() {
|
public void testCopyNullCollection() {
|
||||||
|
@ -176,6 +185,16 @@ public class TestProxyManager
|
||||||
_mgr.copyCollection(torig));
|
_mgr.copyCollection(torig));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testCloneProxyCollection() {
|
||||||
|
// List doesn't support clone()
|
||||||
|
|
||||||
|
TreeSet torig = (TreeSet) _mgr.newCollectionProxy(TreeSet.class, null,
|
||||||
|
new CustomComparator());
|
||||||
|
assertTrue(torig.comparator() instanceof CustomComparator);
|
||||||
|
populate(torig);
|
||||||
|
assertSortedSetsEquals(new TreeSet(torig), (SortedSet) torig.clone());
|
||||||
|
}
|
||||||
|
|
||||||
public void testListMethodsProxied()
|
public void testListMethodsProxied()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
Class proxy = _mgr.newCollectionProxy(ArrayList.class, null, null).
|
Class proxy = _mgr.newCollectionProxy(ArrayList.class, null, null).
|
||||||
|
@ -433,6 +452,13 @@ public class TestProxyManager
|
||||||
*/
|
*/
|
||||||
private static void assertSortedMapsEqual(SortedMap m1, SortedMap m2) {
|
private static void assertSortedMapsEqual(SortedMap m1, SortedMap m2) {
|
||||||
assertTrue(m1.getClass() == m2.getClass());
|
assertTrue(m1.getClass() == m2.getClass());
|
||||||
|
assertSortedMapsEquals(m1, m2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the given maps are exactly the same (minus the class).
|
||||||
|
*/
|
||||||
|
private static void assertSortedMapsEquals(SortedMap m1, SortedMap m2) {
|
||||||
assertEquals(m1.comparator(), m2.comparator());
|
assertEquals(m1.comparator(), m2.comparator());
|
||||||
assertEquals(m1.size(), m2.size());
|
assertEquals(m1.size(), m2.size());
|
||||||
Map.Entry entry1;
|
Map.Entry entry1;
|
||||||
|
@ -445,6 +471,7 @@ public class TestProxyManager
|
||||||
assertTrue(entry1.getKey() == entry2.getKey());
|
assertTrue(entry1.getKey() == entry2.getKey());
|
||||||
assertTrue(entry1.getValue() == entry2.getValue());
|
assertTrue(entry1.getValue() == entry2.getValue());
|
||||||
}
|
}
|
||||||
|
assertTrue(m1.equals(m2));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testCopyNullMap() {
|
public void testCopyNullMap() {
|
||||||
|
@ -464,6 +491,16 @@ public class TestProxyManager
|
||||||
_mgr.copyMap(torig));
|
_mgr.copyMap(torig));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testCloneProxyMap() {
|
||||||
|
// Map does not support clone()
|
||||||
|
|
||||||
|
TreeMap torig = (TreeMap) _mgr.newMapProxy(TreeMap.class, null, null,
|
||||||
|
new CustomComparator());
|
||||||
|
assertTrue(torig.comparator() instanceof CustomComparator);
|
||||||
|
populate(torig);
|
||||||
|
assertSortedMapsEquals(new TreeMap(torig), (SortedMap) torig.clone());
|
||||||
|
}
|
||||||
|
|
||||||
public void testMapMethodsProxied()
|
public void testMapMethodsProxied()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
Class proxy = _mgr.newMapProxy(HashMap.class, null, null, null).
|
Class proxy = _mgr.newMapProxy(HashMap.class, null, null, null).
|
||||||
|
@ -551,8 +588,15 @@ public class TestProxyManager
|
||||||
* Assert that the given dates are exactly the same.
|
* Assert that the given dates are exactly the same.
|
||||||
*/
|
*/
|
||||||
private static void assertDatesEqual(Date d1, Date d2) {
|
private static void assertDatesEqual(Date d1, Date d2) {
|
||||||
assertTrue(d1.getClass() == d1.getClass());
|
assertTrue(d1.getClass() == d2.getClass());
|
||||||
assertEquals(d1, d2);
|
assertDatesEquals(d1, d2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the given dates are exactly the same (minus the class).
|
||||||
|
*/
|
||||||
|
private static void assertDatesEquals(Date d1, Date d2) {
|
||||||
|
assertTrue(d1.equals(d2));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testCopyNullDate() {
|
public void testCopyNullDate() {
|
||||||
|
@ -562,7 +606,13 @@ public class TestProxyManager
|
||||||
public void testCopyProxyDate() {
|
public void testCopyProxyDate() {
|
||||||
Date orig = (Date) _mgr.newDateProxy(Time.class);
|
Date orig = (Date) _mgr.newDateProxy(Time.class);
|
||||||
orig.setTime(1999);
|
orig.setTime(1999);
|
||||||
assertDatesEqual(new Date(orig.getTime()), (Date) _mgr.copyDate(orig));
|
assertDatesEqual(new Time(orig.getTime()), (Date) _mgr.copyDate(orig));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCloneProxyDate() {
|
||||||
|
Date orig = (Date) _mgr.newDateProxy(Time.class);
|
||||||
|
orig.setTime(1999);
|
||||||
|
assertDatesEquals(new Time(orig.getTime()), (Date) orig.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testDateMethodsProxied()
|
public void testDateMethodsProxied()
|
||||||
|
@ -647,8 +697,15 @@ public class TestProxyManager
|
||||||
* Assert that the given dates are exactly the same.
|
* Assert that the given dates are exactly the same.
|
||||||
*/
|
*/
|
||||||
private static void assertCalendarsEqual(Calendar c1, Calendar c2) {
|
private static void assertCalendarsEqual(Calendar c1, Calendar c2) {
|
||||||
assertTrue(c1.getClass() == c1.getClass());
|
assertTrue(c1.getClass() == c2.getClass());
|
||||||
assertEquals(c1, c2);
|
assertCalendarsEquals(c1, c2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the given dates are exactly the same (minus the class).
|
||||||
|
*/
|
||||||
|
private static void assertCalendarsEquals(Calendar c1, Calendar c2) {
|
||||||
|
assertTrue(c1.equals(c2));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testCopyNullCalendar() {
|
public void testCopyNullCalendar() {
|
||||||
|
@ -664,6 +721,15 @@ public class TestProxyManager
|
||||||
assertCalendarsEqual(cal, _mgr.copyCalendar(orig));
|
assertCalendarsEqual(cal, _mgr.copyCalendar(orig));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testCloneProxyCalendar() {
|
||||||
|
Calendar orig = (Calendar) _mgr.newCalendarProxy
|
||||||
|
(GregorianCalendar.class, TimeZone.getTimeZone("CST"));
|
||||||
|
populate(orig);
|
||||||
|
Calendar cal = new GregorianCalendar();
|
||||||
|
populate(cal);
|
||||||
|
assertCalendarsEquals(cal, (Calendar)orig.clone());
|
||||||
|
}
|
||||||
|
|
||||||
public void testCalendarAbstractClassProxy() {
|
public void testCalendarAbstractClassProxy() {
|
||||||
Proxy cal = _mgr.newCalendarProxy(Calendar.class, null);
|
Proxy cal = _mgr.newCalendarProxy(Calendar.class, null);
|
||||||
assertNotNull(cal);
|
assertNotNull(cal);
|
||||||
|
|
Loading…
Reference in New Issue