You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ar...@apache.org on 2004/11/19 01:04:42 UTC
cvs commit: db-ojb/src/test/org/apache/ojb/junit OJBTestCase.java
arminw 2004/11/18 16:04:41
Modified: src/test/org/apache/ojb/junit Tag: OJB_1_0_RELEASE
OJBTestCase.java
Log:
add service method to change reference settings at runtime
Revision Changes Path
No revision
No revision
1.5.2.2 +155 -1 db-ojb/src/test/org/apache/ojb/junit/OJBTestCase.java
Index: OJBTestCase.java
===================================================================
RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/junit/OJBTestCase.java,v
retrieving revision 1.5.2.1
retrieving revision 1.5.2.2
diff -u -r1.5.2.1 -r1.5.2.2
--- OJBTestCase.java 22 Oct 2004 12:40:56 -0000 1.5.2.1
+++ OJBTestCase.java 19 Nov 2004 00:04:41 -0000 1.5.2.2
@@ -1,6 +1,16 @@
package org.apache.ojb.junit;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
import junit.framework.TestCase;
+import org.apache.commons.lang.SerializationUtils;
+import org.apache.ojb.broker.OJBRuntimeException;
+import org.apache.ojb.broker.PersistenceBroker;
+import org.apache.ojb.broker.PersistenceBrokerFactory;
+import org.apache.ojb.broker.metadata.ClassDescriptor;
+import org.apache.ojb.broker.metadata.ObjectReferenceDescriptor;
/**
* Extension of the JUnit test class.
@@ -12,6 +22,7 @@
{
private static final String SKIP_STR = "OJB.skip.issues";
private static final String SKIP_DEFAULT_VALUE = "false";
+ private MetadataHelper referenceHelper;
public OJBTestCase()
{
@@ -33,6 +44,22 @@
protected void tearDown() throws Exception
{
super.tearDown();
+ if(referenceHelper != null)
+ {
+ PersistenceBroker temp = PersistenceBrokerFactory.defaultPersistenceBroker();
+ try
+ {
+ referenceHelper.restoreMetadataSettings(temp);
+ }
+ finally
+ {
+ if(temp != null)
+ {
+ temp.close();
+ }
+ }
+ }
+
// sleep thread to guarantee different timestamp values for
// each test
ojbSleep();
@@ -90,5 +117,132 @@
System.out.println("# [Skip test in " + className + "] " + message + " #");
}
return skip;
+ }
+
+ /**
+ * Allows to do a global change of object/collection reference settings. When the test
+ * is tear down the old settings will be restored. Be careful when override setUp/tearDown method, don't
+ * forget the "super call", else this method couldn't work properly.
+ *
+ * @param clazz
+ * @param referenceField
+ * @param autoRetrieve
+ * @param autoUpdate
+ * @param autoDelete
+ * @param useProxy
+ */
+ public void ojbChangeReferenceSetting(Class clazz, String referenceField, boolean autoRetrieve, int autoUpdate, int autoDelete, boolean useProxy)
+ {
+ if(referenceHelper == null)
+ {
+ referenceHelper = new MetadataHelper();
+ }
+ PersistenceBroker temp = PersistenceBrokerFactory.defaultPersistenceBroker();
+ try
+ {
+ referenceHelper.changeReferenceSetting(temp, clazz, referenceField, autoRetrieve, autoUpdate, autoDelete, useProxy);
+ }
+ finally
+ {
+ if(temp != null)
+ {
+ temp.close();
+ }
+ }
+ }
+
+
+
+ //================================================================
+ // inner class
+ //================================================================
+ /**
+ * Class that help us to do changes on metadata and restore old state on
+ * tear down of the test.
+ * NOTE: This strategy is not recommended in production application because
+ * the made changes will be global and all threads will recognize them immediately.
+ *
+ */
+ public class MetadataHelper
+ {
+ private Map oldSettings;
+
+ public MetadataHelper()
+ {
+ oldSettings = new HashMap();
+ }
+
+ protected void restoreMetadataSettings(PersistenceBroker broker)
+ {
+ if(oldSettings.size() == 0) return;
+ Iterator it = oldSettings.entrySet().iterator();
+ Map.Entry entry;
+ while(it.hasNext())
+ {
+ entry = (Map.Entry) it.next();
+ String clazz = (String) entry.getKey();
+ Map fieldMap = (Map) entry.getValue();
+ Iterator iter = fieldMap.entrySet().iterator();
+ Map.Entry entry2;
+ ClassDescriptor cld = broker.getDescriptorRepository().getDescriptorFor(clazz);
+ while(iter.hasNext())
+ {
+ entry2 = (Map.Entry) iter.next();
+ String oldRefName = (String) entry2.getKey();
+ ObjectReferenceDescriptor oldRef = (ObjectReferenceDescriptor) entry2.getValue();
+ // lookup single object or collection descriptor
+ ObjectReferenceDescriptor ref = cld.getCollectionDescriptorByName(oldRefName);
+ if(ref == null) ref = cld.getObjectReferenceDescriptorByName(oldRefName);
+
+// System.out.println("Restoring metadata for " + clazz
+// + " from " + ref.toXML()
+// + " === to ===> " + oldRef.toXML());
+ ref.setCascadeRetrieve(oldRef.getCascadeRetrieve());
+ ref.setCascadingStore(oldRef.getCascadingStore());
+ ref.setCascadingDelete(oldRef.getCascadingDelete());
+ ref.setLazy(oldRef.isLazy());
+// System.out.println("Restore metadata for " + clazz
+// + " to " + ref.toXML());
+ }
+ }
+ oldSettings.clear();
+ }
+
+ public void changeReferenceSetting(PersistenceBroker broker, Class clazz,
+ String referenceField, boolean autoRetrieve,
+ int autoUpdate, int autoDelete, boolean useProxy)
+ {
+ ClassDescriptor cld = broker.getClassDescriptor(clazz);
+ ObjectReferenceDescriptor ref = cld.getCollectionDescriptorByName(referenceField);
+ if(ref == null) ref = cld.getObjectReferenceDescriptorByName(referenceField);
+ if(ref == null)
+ {
+ throw new OJBRuntimeException("Given field " + referenceField + " does not match a reference in " + clazz);
+ }
+
+ HashMap fieldMap = (HashMap) oldSettings.get(cld.getClassNameOfObject());
+ if(fieldMap == null)
+ {
+ fieldMap = new HashMap();
+ oldSettings.put(cld.getClassNameOfObject(), fieldMap);
+ }
+
+ ObjectReferenceDescriptor oldRef = (ObjectReferenceDescriptor) fieldMap.get(ref.getPersistentField().getName());
+ // if we don't find old settings buffer it
+ if(oldRef == null)
+ {
+ // buffer deep copy of old settings
+ oldRef = (ObjectReferenceDescriptor) SerializationUtils.clone(ref);
+ fieldMap.put(ref.getPersistentField().getName(), oldRef);
+ }
+
+ ref.setLazy(useProxy);
+ ref.setCascadeRetrieve(autoRetrieve);
+ ref.setCascadingStore(autoUpdate);
+ ref.setCascadingDelete(autoDelete);
+
+// System.out.println("old settings: " + oldRef.toXML());
+// System.out.println("new settings: " + ref.toXML());
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org