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 br...@apache.org on 2005/04/17 15:29:37 UTC

cvs commit: db-ojb/src/java/org/apache/ojb/broker/core PersistenceBrokerImpl.java

brj         2005/04/17 06:29:37

  Modified:    src/java/org/apache/ojb/broker/util Tag: OJB_1_0_RELEASE
                        BrokerHelper.java
               src/test/org/apache/ojb/broker Tag: OJB_1_0_RELEASE
                        CollectionTest.java
               src/java/org/apache/ojb/broker/util/collections Tag:
                        OJB_1_0_RELEASE RemovalAwareCollection.java
               src/java/org/apache/ojb/broker/core Tag: OJB_1_0_RELEASE
                        PersistenceBrokerImpl.java
  Log:
  - do not delete non persistent object in afterStore()
  - throw PBException when deleting non persistent objct
  see http://issues.apache.org/jira/browse/OJB-23
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.57.2.12 +27 -3     db-ojb/src/java/org/apache/ojb/broker/util/BrokerHelper.java
  
  Index: BrokerHelper.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/util/BrokerHelper.java,v
  retrieving revision 1.57.2.11
  retrieving revision 1.57.2.12
  diff -u -r1.57.2.11 -r1.57.2.12
  --- BrokerHelper.java	3 Apr 2005 02:14:45 -0000	1.57.2.11
  +++ BrokerHelper.java	17 Apr 2005 13:29:37 -0000	1.57.2.12
  @@ -343,6 +343,7 @@
   
       /**
        * Get the values of the fields for an obj
  +     * Autoincrement values are automatically set.
        * @param fields
        * @param obj
        * @throws PersistenceBrokerException
  @@ -420,7 +421,7 @@
       }
   
       /**
  -     * returns true if the primary key fields are valid, else false.
  +     * returns true if the primary key fields are valid for store, else false.
        * PK fields are valid if each of them is either an OJB managed
        * attribute (autoincrement or locking) or if it contains
        * a valid non-null value
  @@ -428,7 +429,7 @@
        * @param pkValues the array of PK values
        * @return boolean
        */
  -    public boolean assertValidPkFields(FieldDescriptor[] fieldDescriptors, Object[] pkValues)
  +    public boolean assertValidPksForStore(FieldDescriptor[] fieldDescriptors, Object[] pkValues)
       {
           int fieldDescriptorSize = fieldDescriptors.length;
           for(int i = 0; i < fieldDescriptorSize; i++)
  @@ -449,6 +450,29 @@
       }
   
       /**
  +     * returns true if the primary key fields are valid for delete, else false.
  +     * PK fields are valid if each of them contains a valid non-null value
  +     * @param cld the ClassDescriptor
  +     * @param obj the object 
  +     * @return boolean
  +     */
  +    public boolean assertValidPkForDelete(ClassDescriptor cld, Object obj)
  +    {
  +        FieldDescriptor fieldDescriptors[] = cld.getPkFields();
  +        int fieldDescriptorSize = fieldDescriptors.length;
  +        for(int i = 0; i < fieldDescriptorSize; i++)
  +        {
  +            FieldDescriptor fd = fieldDescriptors[i];
  +            Object pkValue = fd.getPersistentField().get(obj);
  +            if (!assertValidPkValue(pkValue))
  +            {
  +                return false;
  +            }
  +        }
  +        return true;
  +    }
  +
  +    /**
        * returns true if a value is non-null, STring instances are also checked,
        * if they are non-empty.
        * @param pkValue the value to check
  
  
  
  No                   revision
  No                   revision
  1.11.2.4  +39 -1     db-ojb/src/test/org/apache/ojb/broker/CollectionTest.java
  
  Index: CollectionTest.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/broker/CollectionTest.java,v
  retrieving revision 1.11.2.3
  retrieving revision 1.11.2.4
  diff -u -r1.11.2.3 -r1.11.2.4
  --- CollectionTest.java	9 Mar 2005 20:58:39 -0000	1.11.2.3
  +++ CollectionTest.java	17 Apr 2005 13:29:37 -0000	1.11.2.4
  @@ -833,6 +833,44 @@
       }
   
       /**
  +     * Test RemovalAwareCollection remove() of non persistent obj
  +     */
  +    public void testRemovalAwareCollection2()
  +    {
  +        String prefix = "testRemovalAwareCollection2_" + System.currentTimeMillis();
  +
  +        Identity gathererId;
  +        Gatherer loadedCopy;
  +        Gatherer gatherer = new Gatherer(null, "Gatherer_" + prefix);
  +        List coll = new ArrayList();
  +        coll.add(new CollectibleBase("Base_1_" + prefix));
  +        coll.add(new CollectibleBase("Base_2_" + prefix));
  +        gatherer.setCollectiblesBase(coll);
  +
  +        broker.beginTransaction();
  +        broker.store(gatherer);
  +        broker.commitTransaction();
  +        assertTrue(gatherer.getGatId() != null);
  +        gathererId = broker.serviceIdentity().buildIdentity(gatherer);
  +
  +        broker.clearCache();
  +        loadedCopy = (Gatherer) broker.getObjectByIdentity(gathererId);
  +        assertNotNull(loadedCopy);
  +        assertNotNull(loadedCopy.getCollectiblesBase());
  +        assertTrue(loadedCopy.getCollectiblesBase() instanceof RemovalAwareCollection);
  +        assertEquals(2, loadedCopy.getCollectiblesBase().size());
  +        
  +        // add and remove non persistent obj
  +        loadedCopy.getCollectiblesBase().add(new CollectibleBase("Base_3_" + prefix));
  +        assertEquals(3, loadedCopy.getCollectiblesBase().size());
  +        loadedCopy.getCollectiblesBase().remove(2);
  +
  +        broker.beginTransaction();
  +        broker.store(loadedCopy);
  +        broker.commitTransaction();
  +    }
  +
  +    /**
        * Test RemovalAwareCollection remove() and clear()
        */
       public void testRemovalAwareCollectionProxy()
  
  
  
  No                   revision
  No                   revision
  1.7.2.2   +8 -2      db-ojb/src/java/org/apache/ojb/broker/util/collections/RemovalAwareCollection.java
  
  Index: RemovalAwareCollection.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/util/collections/RemovalAwareCollection.java,v
  retrieving revision 1.7.2.1
  retrieving revision 1.7.2.2
  diff -u -r1.7.2.1 -r1.7.2.2
  --- RemovalAwareCollection.java	11 Mar 2005 11:31:05 -0000	1.7.2.1
  +++ RemovalAwareCollection.java	17 Apr 2005 13:29:37 -0000	1.7.2.2
  @@ -17,6 +17,7 @@
   
   import org.apache.ojb.broker.PersistenceBroker;
   import org.apache.ojb.broker.PersistenceBrokerException;
  +import org.apache.ojb.broker.metadata.ClassDescriptor;
   
   import java.util.Iterator;
   import java.util.Vector;
  @@ -47,7 +48,12 @@
           Iterator iter = allObjectsToBeRemoved.iterator();
           while (iter.hasNext())
           {
  -            broker.delete(iter.next());
  +            Object obj = iter.next();
  +            ClassDescriptor cld = broker.getClassDescriptor(obj.getClass());
  +            if (broker.serviceBrokerHelper().assertValidPkForDelete(cld, obj))
  +            {    
  +                broker.delete(obj);
  +            }    
           }
           allObjectsToBeRemoved.clear();
       }
  
  
  
  No                   revision
  No                   revision
  1.83.2.15 +13 -4     db-ojb/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java
  
  Index: PersistenceBrokerImpl.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java,v
  retrieving revision 1.83.2.14
  retrieving revision 1.83.2.15
  diff -u -r1.83.2.14 -r1.83.2.15
  --- PersistenceBrokerImpl.java	18 Mar 2005 19:25:05 -0000	1.83.2.14
  +++ PersistenceBrokerImpl.java	17 Apr 2005 13:29:37 -0000	1.83.2.15
  @@ -504,12 +504,21 @@
               {
                   return;
               }
  +            
  +            ClassDescriptor cld = getClassDescriptor(obj.getClass());
  +            //BRJ: check for valid pk
  +            if (!serviceBrokerHelper().assertValidPkForDelete(cld, obj))
  +            {
  +                String msg = "Cannot delete object without valid PKs. " + obj;
  +                logger.error(msg);
  +                throw new PersistenceBrokerException(msg);
  +            }
  +            
               /**
                * MBAIRD
                * 2. register object in markedForDelete map.
                */
               markedForDelete.add(obj);
  -            ClassDescriptor cld = getClassDescriptor(obj.getClass());
               Identity oid = new Identity(obj, this, cld);
   
               // Invoke events on PersistenceBrokerAware instances and listeners
  @@ -1716,12 +1725,12 @@
           storeReferences(obj, cld, insert);
   
           Object[] pkValues = oid.getPrimaryKeyValues();
  -        if (!serviceBrokerHelper().assertValidPkFields(cld.getPkFields(), pkValues))
  +        if (!serviceBrokerHelper().assertValidPksForStore(cld.getPkFields(), pkValues))
           {
               // BRJ: fk values may be part of pk, but the are not known during
               // creation of Identity. so we have to get them here
               pkValues = serviceBrokerHelper().getKeyValues(cld, obj);
  -            if (!serviceBrokerHelper().assertValidPkFields(cld.getPkFields(), pkValues))
  +            if (!serviceBrokerHelper().assertValidPksForStore(cld.getPkFields(), pkValues))
               {
                   String append = insert ? " on insert" : " on update" ;
                   throw new PersistenceBrokerException("assertValidPkFields failed for Object of type: " + cld.getClassNameOfObject() + append);
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org