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