arminw      2005/06/04 07:28:23

  Modified:    src/java/org/apache/ojb/broker/core Tag: OJB_1_0_RELEASE
                        DelegatingPersistenceBroker.java
                        PersistenceBrokerImpl.java
               src/java/org/apache/ojb/broker Tag: OJB_1_0_RELEASE
                        PersistenceBrokerInternal.java
  Log:
  add new enhanced store/delete methods in PBI which allow only to perform the 
specified object without take care of referenced objects. Think in OJB 1.x we 
should introduce a better separation of methods supporting store/delete 
operations based on the auto-xxx settings and methods only handle a single 
object, this allows to use the auto-xxx settings in top-level api independent 
from the PB-api.
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.11.2.4  +11 -2     
db-ojb/src/java/org/apache/ojb/broker/core/DelegatingPersistenceBroker.java
  
  Index: DelegatingPersistenceBroker.java
  ===================================================================
  RCS file: 
/home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/DelegatingPersistenceBroker.java,v
  retrieving revision 1.11.2.3
  retrieving revision 1.11.2.4
  diff -u -r1.11.2.3 -r1.11.2.4
  --- DelegatingPersistenceBroker.java  7 May 2005 16:51:09 -0000       1.11.2.3
  +++ DelegatingPersistenceBroker.java  4 Jun 2005 14:28:23 -0000       1.11.2.4
  @@ -57,7 +57,6 @@
    */
   public class DelegatingPersistenceBroker implements 
PersistenceBrokerInternal, PBState
   {
  -
        protected PersistenceBrokerInternal m_broker;
   
        public DelegatingPersistenceBroker(PersistenceBrokerInternal broker)
  @@ -137,6 +136,16 @@
           m_broker.setManaged(managed);
       }
   
  +    public void store(Object obj, Identity oid, ClassDescriptor cld, boolean 
insert, boolean ignoreReferences)
  +    {
  +        m_broker.store(obj, oid, cld, insert, ignoreReferences);
  +    }
  +
  +    public void delete(Object obj, boolean ignoreReferences) throws 
PersistenceBrokerException
  +    {
  +        m_broker.delete(obj, ignoreReferences);
  +    }
  +
       public boolean isInTransaction() throws PersistenceBrokerException
       {
           return m_broker != null ? getBroker().isInTransaction() : false;
  
  
  
  1.83.2.22 +94 -26    
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.21
  retrieving revision 1.83.2.22
  diff -u -r1.83.2.21 -r1.83.2.22
  --- PersistenceBrokerImpl.java        7 May 2005 16:43:06 -0000       
1.83.2.21
  +++ PersistenceBrokerImpl.java        4 Jun 2005 14:28:23 -0000       
1.83.2.22
  @@ -468,9 +468,19 @@
       }
   
       /**
  -     * @see org.apache.ojb.broker.PersistenceBroker#delete
  +     * Deletes the concrete representation of the specified object in the 
underlying
  +     * persistence system. This method is intended for use in top-level api 
or
  +     * by internal calls.
  +     *
  +     * @param obj The object to delete.
  +     * @param ignoreReferences With this flag the automatic 
deletion/unlinking
  +     * of references can be suppressed (independent of the used auto-delete 
setting in metadata),
  +     * except [EMAIL PROTECTED] 
org.apache.ojb.broker.metadata.SuperReferenceDescriptor}
  +     * these kind of reference (descriptor) will always be performed. If 
<em>true</em>
  +     * all "normal" referenced objects will be ignored, only the specified 
object is handled.
  +     * @throws PersistenceBrokerException
        */
  -    public void delete(Object obj) throws PersistenceBrokerException
  +    public void delete(Object obj, boolean ignoreReferences) throws 
PersistenceBrokerException
       {
           if(!isInTransaction())
           {
  @@ -498,7 +508,7 @@
           }
           try
           {
  -            doDelete(obj);
  +            doDelete(obj, ignoreReferences);
           }
           finally
           {
  @@ -507,10 +517,18 @@
       }
   
       /**
  +     * @see org.apache.ojb.broker.PersistenceBroker#delete
  +     */
  +    public void delete(Object obj) throws PersistenceBrokerException
  +    {
  +        delete(obj, false);
  +    }
  +
  +    /**
        * do delete given object. Should be used by all intern classes to delete
        * objects.
        */
  -    private void doDelete(Object obj) throws PersistenceBrokerException
  +    private void doDelete(Object obj, boolean ignoreReferences) throws 
PersistenceBrokerException
       {
           //logger.info("DELETING " + obj);
           // only delete if object is not null
  @@ -545,7 +563,7 @@
                * 2. register object in markedForDelete map.
                */
               markedForDelete.add(obj);
  -            Identity oid = new Identity(obj, this, cld);
  +            Identity oid = serviceIdentity().buildIdentity(cld, obj);
   
               // Invoke events on PersistenceBrokerAware instances and 
listeners
               BEFORE_DELETE_EVENT.setTarget(obj);
  @@ -553,7 +571,7 @@
               BEFORE_DELETE_EVENT.setTarget(null);
   
               // 1. delete dependend collections
  -            if (cld.getCollectionDescriptors().size() > 0)
  +            if (!ignoreReferences  && cld.getCollectionDescriptors().size() 
> 0)
               {
                   deleteCollections(obj, cld.getCollectionDescriptors());
               }
  @@ -575,7 +593,7 @@
               // 4. delete dependend upon objects last to avoid FK violations
               if (cld.getObjectReferenceDescriptors().size() > 0)
               {
  -                deleteReferences(obj, cld.getObjectReferenceDescriptors());
  +                deleteReferences(obj, cld.getObjectReferenceDescriptors(), 
ignoreReferences);
               }
               // remove obj from the object cache:
               objectCache.remove(oid);
  @@ -618,7 +636,7 @@
                   // make sure it's an Identity
                   if (!(oid instanceof Identity))
                   {
  -                    oid = new Identity(oid, this);
  +                    oid = serviceIdentity().buildIdentity(oid);
                   }
                   query = referencesBroker.getPKQuery((Identity) oid);
               }
  @@ -661,26 +679,32 @@
   
       /**
        * Deletes references that <b>obj</b> points to.
  -     * All objects which we have a FK poiting to (Via ReferenceDescriptors) 
will be deleted if auto-delete is true <b>AND</b>
  -     * the member field containing the object reference if NOT null.
  +     * All objects which we have a FK poiting to (Via ReferenceDescriptors)
  +     * will be deleted if auto-delete is true <b>AND</b>
  +     * the member field containing the object reference is NOT null.
        *
        * @param obj Object which we will delete references for
        * @param listRds list of ObjectRederenceDescriptors
  +     * @param ignoreReferences With this flag the automatic 
deletion/unlinking
  +     * of references can be suppressed (independent of the used auto-delete 
setting in metadata),
  +     * except [EMAIL PROTECTED] 
org.apache.ojb.broker.metadata.SuperReferenceDescriptor}
  +     * these kind of reference (descriptor) will always be performed.
        * @throws PersistenceBrokerException if some goes wrong - please see 
the error message for details
        */
  -    private void deleteReferences(Object obj, List listRds) throws 
PersistenceBrokerException
  +    private void deleteReferences(Object obj, List listRds, boolean 
ignoreReferences) throws PersistenceBrokerException
       {
           // get all members of obj that are references and delete them
           Iterator i = listRds.iterator();
           while (i.hasNext())
           {
               ObjectReferenceDescriptor rds = (ObjectReferenceDescriptor) 
i.next();
  -            if (rds.getCascadingDelete() == 
ObjectReferenceDescriptor.CASCADE_OBJECT)
  +            if ((!ignoreReferences && rds.getCascadingDelete() == 
ObjectReferenceDescriptor.CASCADE_OBJECT)
  +                    || rds.isSuperReferenceDescriptor())
               {
                   Object referencedObject = rds.getPersistentField().get(obj);
                   if (referencedObject != null)
                   {
  -                    doDelete(referencedObject);
  +                    doDelete(referencedObject, ignoreReferences);
                   }
               }
           }
  @@ -724,7 +748,7 @@
                           Iterator colIterator = 
BrokerHelper.getCollectionIterator(col);
                           while (colIterator.hasNext())
                           {
  -                            doDelete(colIterator.next());
  +                            doDelete(colIterator.next(), false);
                           }
                       }
                   }
  @@ -748,7 +772,7 @@
           was new and needs insert
           */
           boolean insert = serviceBrokerHelper().hasNullPKField(cld, obj);
  -        Identity oid = new Identity(obj, this, cld);
  +        Identity oid = serviceIdentity().buildIdentity(cld, obj);
           /*
           if PK values are set, lookup cache or db to see whether object
           needs insert or update
  @@ -787,9 +811,20 @@
       }
   
       /**
  -     * Internal used method which start the real store work.
  +     * Method which start the real store work (insert or update)
  +     * and is intended for use by top-level api or internal calls.
  +     *
  +     * @param obj The object to store.
  +     * @param oid The [EMAIL PROTECTED] Identity} of the object to store.
  +     * @param cld The [EMAIL PROTECTED] 
org.apache.ojb.broker.metadata.ClassDescriptor} of the object.
  +     * @param insert If <em>true</em> an insert operation will be performed, 
else update operation.
  +     * @param ignoreReferences With this flag the automatic storing/linking
  +     * of references can be suppressed (independent of the used auto-update 
setting in metadata),
  +     * except [EMAIL PROTECTED] 
org.apache.ojb.broker.metadata.SuperReferenceDescriptor}
  +     * these kind of reference (descriptor) will always be performed. If 
<em>true</em>
  +     * all "normal" referenced objects will be ignored, only the specified 
object is handled.
        */
  -    protected void store(Object obj, Identity oid, ClassDescriptor cld,  
boolean insert)
  +    public void store(Object obj, Identity oid, ClassDescriptor cld,  
boolean insert, boolean ignoreReferences)
       {
           if(obj == null || nowStoring.contains(obj))
           {
  @@ -845,7 +880,7 @@
           try
           {
               nowStoring.add(obj);
  -            storeToDb(obj, cld, oid, insert);
  +            storeToDb(obj, cld, oid, insert, ignoreReferences);
           }
           finally
           {
  @@ -878,14 +913,26 @@
       }
   
       /**
  +     * Internal used method which start the real store work.
  +     */
  +    protected void store(Object obj, Identity oid, ClassDescriptor cld,  
boolean insert)
  +    {
  +        store(obj, oid, cld, insert, false);
  +    }
  +
  +    /**
        * Store all object references that <b>obj</b> points to.
        * All objects which we have a FK pointing to (Via ReferenceDescriptors) 
will be
        * stored if auto-update is true <b>AND</b> the member field containing 
the object
        * reference is NOT null.
  +     * With flag <em>ignoreReferences</em> the storing/linking
  +     * of references can be suppressed (independent of the used auto-update 
setting),
  +     * except [EMAIL PROTECTED] 
org.apache.ojb.broker.metadata.SuperReferenceDescriptor}
  +     * these kind of reference (descriptor) will always be performed.
        *
        * @param obj Object which we will store references for
        */
  -    private void storeReferences(Object obj, ClassDescriptor cld, boolean 
insert)
  +    private void storeReferences(Object obj, ClassDescriptor cld, boolean 
insert, boolean ignoreReferences)
       {
           // get all members of obj that are references and store them
           Collection listRds = cld.getObjectReferenceDescriptors();
  @@ -898,7 +945,13 @@
           while (i.hasNext())
           {
               ObjectReferenceDescriptor rds = (ObjectReferenceDescriptor) 
i.next();
  -            if(rds.getCascadingStore() != 
ObjectReferenceDescriptor.CASCADE_NONE)
  +            /*
  +            arminw: the super-references (used for table per subclass 
inheritance) must
  +            be performed in any case. The "normal" 1:1 references can be 
ignored when
  +            flag "ignoreReferences" is set
  +            */
  +            if((!ignoreReferences && rds.getCascadingStore() != 
ObjectReferenceDescriptor.CASCADE_NONE)
  +                    || rds.isSuperReferenceDescriptor())
               {
                   storeAndLinkOneToOne(false, obj, cld, rds, insert);
               }
  @@ -1721,7 +1774,7 @@
       }
   
       /**
  -     * makes object obj persistent in the underlying persistence system.
  +     * Makes object obj persistent in the underlying persistence system.
        * E.G. by INSERT INTO ... or UPDATE ...  in an RDBMS.
        * The ObjectModification parameter can be used to determine whether 
INSERT or update is to be used.
        * This functionality is typically called from transaction managers, that
  @@ -1768,11 +1821,12 @@
        * @param cld
        * @param oid   BRJ: what is it good for ???
        * @param insert
  +     * @param ignoreReferences
        */
  -    private void storeToDb(Object obj, ClassDescriptor cld, Identity oid, 
boolean insert)
  +    private void storeToDb(Object obj, ClassDescriptor cld, Identity oid, 
boolean insert, boolean ignoreReferences)
       {
           // 1. link and store 1:1 references
  -        storeReferences(obj, cld, insert);
  +        storeReferences(obj, cld, insert, ignoreReferences);
   
           Object[] pkValues = oid.getPrimaryKeyValues();
           if (!serviceBrokerHelper().assertValidPksForStore(cld.getPkFields(), 
pkValues))
  @@ -1833,7 +1887,21 @@
           // Add the object to the cache.
           objectCache.doInternalCache(newOid, obj, 
ObjectCacheInternal.TYPE_WRITE);
           // 3. store 1:n and m:n associations
  -        storeCollections(obj, cld, insert);
  +        if(!ignoreReferences) storeCollections(obj, cld, insert);
  +    }
  +
  +    /**
  +     * I pulled this out of internal store so that when doing multiple table
  +     * inheritance, i can recurse this function.
  +     *
  +     * @param obj
  +     * @param cld
  +     * @param oid   BRJ: what is it good for ???
  +     * @param insert
  +     */
  +    private void storeToDb(Object obj, ClassDescriptor cld, Identity oid, 
boolean insert)
  +    {
  +        storeToDb(obj, cld, oid, insert, false);
       }
   
       /**
  @@ -1863,7 +1931,7 @@
           }
           else
           {
  -            identity = new Identity(objectOrIdentity, this);
  +            identity = serviceIdentity().buildIdentity(objectOrIdentity);
           }
           objectCache.remove(identity);
       }
  
  
  
  No                   revision
  No                   revision
  1.1.2.2   +34 -1     
db-ojb/src/java/org/apache/ojb/broker/PersistenceBrokerInternal.java
  
  Index: PersistenceBrokerInternal.java
  ===================================================================
  RCS file: 
/home/cvs/db-ojb/src/java/org/apache/ojb/broker/PersistenceBrokerInternal.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- PersistenceBrokerInternal.java    7 May 2005 16:51:09 -0000       1.1.2.1
  +++ PersistenceBrokerInternal.java    4 Jun 2005 14:28:23 -0000       1.1.2.2
  @@ -1,5 +1,7 @@
   package org.apache.ojb.broker;
   
  +import org.apache.ojb.broker.metadata.ClassDescriptor;
  +
   /* Copyright 2002-2004 The Apache Software Foundation
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
  @@ -35,4 +37,35 @@
        * to <em>false</em> automatic.
        */
       public void setManaged(boolean managed);
  +
  +    /**
  +     * Method which start the real store work (insert or update)
  +     * and is intended for use by top-level api or internal calls.
  +     *
  +     * @param obj The object to store.
  +     * @param oid The [EMAIL PROTECTED] Identity} of the object to store.
  +     * @param cld The [EMAIL PROTECTED] 
org.apache.ojb.broker.metadata.ClassDescriptor} of the object.
  +     * @param insert If <em>true</em> an insert operation will be performed, 
else update operation.
  +     * @param ignoreReferences With this flag the automatic storing/linking
  +     * of references can be suppressed (independent of the used auto-update 
setting in metadata),
  +     * except [EMAIL PROTECTED] 
org.apache.ojb.broker.metadata.SuperReferenceDescriptor}
  +     * these kind of reference (descriptor) will always be performed. If 
<em>true</em>
  +     * all "normal" referenced objects will be ignored, only the specified 
object is handled.
  +     */
  +    public void store(Object obj, Identity oid, ClassDescriptor cld,  
boolean insert, boolean ignoreReferences);
  +
  +    /**
  +     * Deletes the concrete representation of the specified object in the 
underlying
  +     * persistence system. This method is intended for use in top-level api 
or
  +     * by internal calls.
  +     *
  +     * @param obj The object to delete.
  +     * @param ignoreReferences With this flag the automatic 
deletion/unlinking
  +     * of references can be suppressed (independent of the used auto-delete 
setting in metadata),
  +     * except [EMAIL PROTECTED] 
org.apache.ojb.broker.metadata.SuperReferenceDescriptor}
  +     * these kind of reference (descriptor) will always be performed. If 
<em>true</em>
  +     * all "normal" referenced objects will be ignored, only the specified 
object is handled.
  +     * @throws PersistenceBrokerException
  +     */
  +    public void delete(Object obj, boolean ignoreReferences) throws 
PersistenceBrokerException;
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to