Return-Path: Delivered-To: apmail-db-ojb-dev-archive@www.apache.org Received: (qmail 87499 invoked from network); 26 Sep 2006 12:15:52 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 26 Sep 2006 12:15:52 -0000 Received: (qmail 5621 invoked by uid 500); 26 Sep 2006 12:15:51 -0000 Delivered-To: apmail-db-ojb-dev-archive@db.apache.org Received: (qmail 5602 invoked by uid 500); 26 Sep 2006 12:15:51 -0000 Mailing-List: contact ojb-dev-help@db.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Help: List-Post: List-Id: "OJB Developers List" Reply-To: "OJB Developers List" Delivered-To: mailing list ojb-dev@db.apache.org Received: (qmail 5591 invoked by uid 500); 26 Sep 2006 12:15:51 -0000 Received: (qmail 5588 invoked by uid 99); 26 Sep 2006 12:15:51 -0000 Received: from idunn.apache.osuosl.org (HELO idunn.apache.osuosl.org) (140.211.166.84) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 26 Sep 2006 05:15:51 -0700 Authentication-Results: idunn.apache.osuosl.org smtp.mail=arminw@apache.org; spf=permerror X-ASF-Spam-Status: No, hits=-9.4 required=5.0 tests=ALL_TRUSTED,NO_REAL_NAME Received-SPF: error (idunn.apache.osuosl.org: domain apache.org from 140.211.166.113 cause and error) Received: from [140.211.166.113] ([140.211.166.113:54726] helo=eris.apache.org) by idunn.apache.osuosl.org (ecelerity 2.1.1.8 r(12930)) with ESMTP id 86/30-10462-6F919154 for ; Tue, 26 Sep 2006 05:15:50 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id 2CE881A981D; Tue, 26 Sep 2006 05:15:48 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r450014 - in /db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb: broker/accesslayer/CollectionPrefetcher.java broker/accesslayer/MtoNCollectionPrefetcher.java broker/core/QueryReferenceBroker.java odmg/ImplementationImpl.java Date: Tue, 26 Sep 2006 12:15:47 -0000 To: ojb-commits@db.apache.org From: arminw@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20060926121548.2CE881A981D@eris.apache.org> X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: arminw Date: Tue Sep 26 05:15:47 2006 New Revision: 450014 URL: http://svn.apache.org/viewvc?view=rev&rev=450014 Log: add support for configurable collection implementation classes used for 1:n, m:n references and query results Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/CollectionPrefetcher.java db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/MtoNCollectionPrefetcher.java db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/ImplementationImpl.java Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/CollectionPrefetcher.java URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/CollectionPrefetcher.java?view=diff&rev=450014&r1=450013&r2=450014 ============================================================================== --- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/CollectionPrefetcher.java (original) +++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/CollectionPrefetcher.java Tue Sep 26 05:15:47 2006 @@ -24,25 +24,18 @@ import java.util.List; import org.apache.ojb.broker.Identity; +import org.apache.ojb.broker.IdentityFactory; import org.apache.ojb.broker.ManageableCollection; -import org.apache.ojb.broker.OJBRuntimeException; import org.apache.ojb.broker.PersistenceBroker; -import org.apache.ojb.broker.IdentityFactory; import org.apache.ojb.broker.core.PersistenceBrokerImpl; import org.apache.ojb.broker.core.proxy.CollectionProxyDefaultImpl; -import org.apache.ojb.broker.core.proxy.ProxyHelper; import org.apache.ojb.broker.metadata.ClassDescriptor; import org.apache.ojb.broker.metadata.CollectionDescriptor; import org.apache.ojb.broker.metadata.FieldHelper; -import org.apache.ojb.broker.metadata.MetadataException; import org.apache.ojb.broker.metadata.ObjectReferenceDescriptor; import org.apache.ojb.broker.metadata.fieldaccess.PersistentField; import org.apache.ojb.broker.query.Query; import org.apache.ojb.broker.query.QueryByCriteria; -import org.apache.ojb.broker.util.BrokerHelper; -import org.apache.ojb.broker.util.collections.RemovalAwareCollection; -import org.apache.ojb.broker.util.collections.RemovalAwareList; -import org.apache.ojb.broker.util.collections.RemovalAwareSet; /** * Relationship Prefetcher for Collections. @@ -73,7 +66,6 @@ { ClassDescriptor cld = getOwnerClassDescriptor(); Class topLevelClass = getBroker().getTopLevelClass(cld.getClassOfObject()); - BrokerHelper helper = getBroker().serviceBrokerHelper(); Collection queries = new ArrayList(owners.size()); Collection idsSubset = new HashSet(owners.size()); Object[] fkValues; @@ -182,7 +174,7 @@ } else { - ManageableCollection col = createCollection(cds, collectionClass); + ManageableCollection col = createCollection(cds); for (Iterator it2 = list.iterator(); it2.hasNext();) { col.ojbAdd(it2.next()); @@ -208,56 +200,11 @@ * on the field type. * * @param desc The collection descriptor - * @param collectionClass The collection class specified in the collection-descriptor * @return The collection object */ - protected ManageableCollection createCollection(CollectionDescriptor desc, Class collectionClass) + protected ManageableCollection createCollection(CollectionDescriptor desc) { - Class fieldType = desc.getPersistentField().getType(); - ManageableCollection col; - - if (collectionClass == null) - { - if (ManageableCollection.class.isAssignableFrom(fieldType)) - { - try - { - col = (ManageableCollection)fieldType.newInstance(); - } - catch (Exception e) - { - throw new OJBRuntimeException("Cannot instantiate the default collection type "+fieldType.getName()+" of collection "+desc.getAttributeName()+" in type "+desc.getClassDescriptor().getClassNameOfObject()); - } - } - else if (fieldType.isAssignableFrom(RemovalAwareCollection.class)) - { - col = new RemovalAwareCollection(); - } - else if (fieldType.isAssignableFrom(RemovalAwareList.class)) - { - col = new RemovalAwareList(); - } - else if (fieldType.isAssignableFrom(RemovalAwareSet.class)) - { - col = new RemovalAwareSet(); - } - else - { - throw new MetadataException("Cannot determine a default collection type for collection "+desc.getAttributeName()+" in type "+desc.getClassDescriptor().getClassNameOfObject()); - } - } - else - { - try - { - col = (ManageableCollection)collectionClass.newInstance(); - } - catch (Exception e) - { - throw new OJBRuntimeException("Cannot instantiate the collection class "+collectionClass.getName()+" of collection "+desc.getAttributeName()+" in type "+desc.getClassDescriptor().getClassNameOfObject()); - } - } - return col; + return getBroker().getCollectionTypes().createCollectionClass(desc); } protected CollectionDescriptor getCollectionDescriptor() Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/MtoNCollectionPrefetcher.java URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/MtoNCollectionPrefetcher.java?view=diff&rev=450014&r1=450013&r2=450014 ============================================================================== --- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/MtoNCollectionPrefetcher.java (original) +++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/MtoNCollectionPrefetcher.java Tue Sep 26 05:15:47 2006 @@ -485,7 +485,7 @@ } else { - ManageableCollection col = createCollection(cds, collectionClass); + ManageableCollection col = createCollection(cds); for (Iterator it2 = list.iterator(); it2.hasNext();) { Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java?view=diff&rev=450014&r1=450013&r2=450014 ============================================================================== --- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java (original) +++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java Tue Sep 26 05:15:47 2006 @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; +import org.apache.commons.lang.SystemUtils; import org.apache.ojb.broker.Identity; import org.apache.ojb.broker.ManageableCollection; import org.apache.ojb.broker.PBLifeCycleEvent; @@ -42,7 +43,6 @@ import org.apache.ojb.broker.metadata.CollectionDescriptor; import org.apache.ojb.broker.metadata.FieldDescriptor; import org.apache.ojb.broker.metadata.FieldHelper; -import org.apache.ojb.broker.metadata.MetadataException; import org.apache.ojb.broker.metadata.ObjectReferenceDescriptor; import org.apache.ojb.broker.metadata.fieldaccess.PersistentField; import org.apache.ojb.broker.query.Criteria; @@ -50,14 +50,9 @@ import org.apache.ojb.broker.query.QueryByCriteria; import org.apache.ojb.broker.query.QueryFactory; import org.apache.ojb.broker.util.BrokerHelper; -import org.apache.ojb.broker.util.collections.ManageableArrayList; -import org.apache.ojb.broker.util.collections.ManageableHashSet; -import org.apache.ojb.broker.util.collections.RemovalAwareCollection; -import org.apache.ojb.broker.util.collections.RemovalAwareList; -import org.apache.ojb.broker.util.collections.RemovalAwareSet; +import org.apache.ojb.broker.util.ClassHelper; import org.apache.ojb.broker.util.logging.Logger; import org.apache.ojb.broker.util.logging.LoggerFactory; -import org.apache.commons.lang.SystemUtils; /** * Encapsulates 1:1 and 1:n references and collection references stuff. @@ -65,7 +60,6 @@ * TODO: Should we made this class independend from PB implementation class * and only use PB interface methods? * - * @author Armin Waibel * @version $Id$ */ public class QueryReferenceBroker @@ -114,7 +108,7 @@ pb.getInternalCache().enableMaterializationCache(); try { - result = (ManageableCollection) collectionClass.newInstance(); + result = (ManageableCollection) ClassHelper.newInstance(collectionClass); // now iterate over all elements and add them to the new collection // lifecycle events are disabled @@ -254,7 +248,7 @@ // BRJ: return empty Collection for null query if (query == null) { - result = (ManageableCollection)collectionClass.newInstance(); + result = (ManageableCollection) ClassHelper.newInstance(collectionClass); } else { @@ -283,49 +277,6 @@ } /** - * retrieve a collection of itemClass Objects matching the Query query - */ - public Collection getCollectionByQuery(Query query, boolean lazy) throws PersistenceBrokerException - { - // thma: the following cast is safe because: - // 1. ManageableVector implements Collection (will be returned if lazy == false) - // 2. CollectionProxy implements Collection (will be returned if lazy == true) - return (Collection) getCollectionByQuery(RemovalAwareCollection.class, query, lazy); - } - - - private Class getCollectionTypeClass(CollectionDescriptor cds) throws PersistenceBrokerException{ - // BRJ: do not use RemovalAwareCollection for m:n relationships - // see http://db.apache.org/ojb/docu/guides/basic-technique.html#Mapping+m%3An+associations - - Class fieldType = cds.getPersistentField().getType(); - Class collType; - - if (fieldType.isArray() || fieldType.isAssignableFrom(RemovalAwareCollection.class)) - { - collType = cds.isMtoNRelation() ? ManageableArrayList.class : RemovalAwareCollection.class; - } - else if (fieldType.isAssignableFrom(RemovalAwareList.class)) - { - collType = cds.isMtoNRelation() ? ManageableArrayList.class : RemovalAwareList.class; - } - else if (fieldType.isAssignableFrom(RemovalAwareSet.class)) - { - collType = cds.isMtoNRelation() ? ManageableHashSet.class : RemovalAwareSet.class; - } - else if (ManageableCollection.class.isAssignableFrom(fieldType)) - { - collType = fieldType; - } - else - { - throw new MetadataException("Cannot determine a default collection type for collection "+cds.getAttributeName()+" in type "+cds.getClassDescriptor().getClassNameOfObject()); - } - return collType; - } - - - /** * @return true if this is the first task for the given ObjectReferenceDescriptor */ private boolean addRetrievalTask(Object obj, Object key) @@ -723,7 +674,7 @@ */ public void retrieveCollection(Object obj, ClassDescriptor cld, CollectionDescriptor cds, boolean forced) { - doRetrieveCollection(obj, cld, cds, forced, cds.isLazy()); + doRetrieveCollection(obj, cds, forced, cds.isLazy()); } /** @@ -739,10 +690,10 @@ */ public void retrieveProxyCollection(Object obj, ClassDescriptor cld, CollectionDescriptor cds, boolean forced) { - doRetrieveCollection(obj, cld, cds, forced, true); + doRetrieveCollection(obj, cds, forced, true); } - private void doRetrieveCollection(Object obj, ClassDescriptor cld, CollectionDescriptor cds, boolean forced, boolean lazyLoad) + private void doRetrieveCollection(Object obj, CollectionDescriptor cds, boolean forced, boolean lazyLoad) { if (forced || cds.getCascadeRetrieve()) { @@ -755,45 +706,39 @@ else { // this collection type will be used: - Class collectionClass = cds.getCollectionClass(); PersistentField collectionField = cds.getPersistentField(); - Query fkQuery = getFKQuery(obj, cld, cds); + Query fkQuery = getFKQuery(obj, cds); Object value; pb.getInternalCache().enableMaterializationCache(); try { - if (collectionClass == null) + // this collection type will be used: + Class collectionClass = pb.getCollectionTypes().getCollectionClass(cds); + ManageableCollection result = getCollectionByQuery(collectionClass, fkQuery, lazyLoad); + // assign collection to objects attribute + // if attribute has an array type build an array, else assign collection directly + if (collectionField.getType().isArray() && (result instanceof Collection)) { - Collection result = (Collection)getCollectionByQuery(getCollectionTypeClass(cds), fkQuery, lazyLoad); + // if an array is used we expect a Collection result + Collection coll = (Collection) result; + int length = coll.size(); + Class itemtype = collectionField.getType().getComponentType(); + int j = 0; - // assign collection to objects attribute - // if attribute has an array type build an array, else assign collection directly - if (collectionField.getType().isArray()) + value = Array.newInstance(itemtype, length); + for (Iterator iter = coll.iterator(); iter.hasNext();j++) { - int length = result.size(); - Class itemtype = collectionField.getType().getComponentType(); - Object resultArray = Array.newInstance(itemtype, length); - int j = 0; - for (Iterator iter = result.iterator(); iter.hasNext();j++) - { - Array.set(resultArray, j, iter.next()); - } - collectionField.set(obj, resultArray); + Array.set(value, j, iter.next()); } - else - { - collectionField.set(obj, result); - } - value = result; } else { - ManageableCollection result = getCollectionByQuery(collectionClass, fkQuery, lazyLoad); - collectionField.set(obj, result); value = result; } + collectionField.set(obj, value); + if (prefetchProxies && (m_retrievalTasks != null) && (cds.getProxyPrefetchingLimit() > 0) && (cds.getQueryCustomizer() == null) @@ -821,18 +766,18 @@ * Answer the foreign key query to retrieve the collection * defined by CollectionDescriptor */ - private Query getFKQuery(Object obj, ClassDescriptor cld, CollectionDescriptor cds) + private Query getFKQuery(Object obj, CollectionDescriptor cds) { Query fkQuery; QueryByCriteria fkQueryCrit; if (cds.isMtoNRelation()) { - fkQueryCrit = getFKQueryMtoN(obj, cld, cds); + fkQueryCrit = getFKQueryMtoN(obj, cds); } else { - fkQueryCrit = getFKQuery1toN(obj, cld, cds); + fkQueryCrit = getFKQuery1toN(obj, cds); } // check if collection must be ordered @@ -863,10 +808,9 @@ * supports UNIDIRECTIONAL m:n using QueryByMtoNCriteria * @return org.apache.ojb.broker.query.QueryByCriteria * @param obj the owner of the relationship - * @param cld the ClassDescriptor for the owner * @param cod the CollectionDescriptor */ - private QueryByCriteria getFKQueryMtoN(Object obj, ClassDescriptor cld, CollectionDescriptor cod) + private QueryByCriteria getFKQueryMtoN(Object obj, CollectionDescriptor cod) { ValueContainer[] values = pb.serviceBrokerHelper().getFkTargetValuesForObject(cod, obj ,false); Object[] thisClassFks = cod.getFksToThisClass(); @@ -891,10 +835,9 @@ * Get Foreign key query for 1:n * @return org.apache.ojb.broker.query.QueryByCriteria * @param obj - * @param cld * @param cod */ - private QueryByCriteria getFKQuery1toN(Object obj, ClassDescriptor cld, CollectionDescriptor cod) + private QueryByCriteria getFKQuery1toN(Object obj, CollectionDescriptor cod) { ValueContainer[] container = pb.serviceBrokerHelper().getFkTargetValuesForObject(cod, obj ,false); ClassDescriptor refCld = pb.getClassDescriptor(cod.getItemClass()); Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/ImplementationImpl.java URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/ImplementationImpl.java?view=diff&rev=450014&r1=450013&r2=450014 ============================================================================== --- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/ImplementationImpl.java (original) +++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/odmg/ImplementationImpl.java Tue Sep 26 05:15:47 2006 @@ -79,7 +79,12 @@ lockManager = LockManagerFactory.getLockManager(); setConfigurator(PersistenceBrokerFactory.getConfigurator()); Configuration conf = getConfigurator().getConfigurationFor(null); - oqlCollectionClass = conf.getClass("OqlCollectionClass", ManageableArrayList.class); + oqlCollectionClass = conf.getClass("CollectionTypes.OQLQuery", ManageableArrayList.class); + // backward compatible fallback + if(conf.getClass("CollectionTypes.OQLQuery", null) == null) + { + oqlCollectionClass = conf.getClass("OqlCollectionClass", ManageableArrayList.class); + } impliciteWriteLocks = (conf.getString("LockAssociations", "WRITE").equalsIgnoreCase("WRITE")); implicitLocking = conf.getBoolean("ImplicitLocking", true); ordering = conf.getBoolean("Ordering", true); --------------------------------------------------------------------- To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org For additional commands, e-mail: ojb-dev-help@db.apache.org