It's done.
I just commited this nice little feature into CVS.
cheers,
Thomas
Thomas Mahler wrote:
> Hi Jakob,
>
> This helper is meant for situations where reference- and
> collection-descriptors are set to auto-retrieve="false".
> And the user wants to load the references by an explicit API call.
>
> We have all necessary stuff in PBImpl. Thus I'm planning to simply
> expose two new methods in the PB interface:
>
> retrieveAllReferences(Object instance)
> retrieveReference(Object instance, String referenceAttribute)
>
> cheers,
> Thomas
>
>
> Jakob Braeuchi wrote:
>
>> hi,
>>
>> i have to admit i haven't always followed this thread so please
>> forgive my
>> ignorance.
>> what's the purpose of the relationship helper ?
>> could it be integrated into ojb ?
>>
>> jakob
>>
>> ----- Original Message -----
>> From: "Charles Anthony" <[EMAIL PROTECTED]>
>> To: "'OJB Users List'" <[EMAIL PROTECTED]>
>> Sent: Monday, September 09, 2002 10:45 AM
>> Subject: RE: Anyone up for a "challange" ? :)
>>
>>
>>
>>>> Willingly to share the code - just to see it ? :)
>>>>
>>>> /max
>>>
>>>
>>> Voila!
>>>
>>> My RelationshipHelper delegates to a more complex object, the
>>> appropriate
>>> sections of which are detailed below.
>>>
>>> Cheers,
>>>
>>> Charles.
>>>
>>> /**
>>> * If the relationship specified is not null, load the the named
>>> * relationship
>>> * @param o instance of an object
>>> * @param relationshipName the name of the relationship to load
>>> */
>>> public void loadRelationship(Object o, String relationshipName) {
>>> PersistenceBroker broker =
>>> PersistenceBrokerFactory.defaultPersistenceBroker();
>>>
>>> ClassDescriptor cld = broker.getClassDescriptor(o.getClass());
>>> ObjectReferenceDescriptor rd =
>>> cld.getObjectReferenceDescriptorByName(relationshipName);
>>> if (rd == null) {
>>> rd = cld.getCollectionDescriptorByName(relationshipName);
>>> }
>>>
>>> if (rd == null) {
>>> Log.error(this, "loadRelationship - couldn't find
>>> relationship
>>> '" + relationshipName + "'");
>>> } else {
>>> PersistentField persistentField = rd.getPersistentField();
>>> Object currentValue = persistentField.get(o);
>>> if (currentValue == null) {
>>> if (rd instanceof CollectionDescriptor) {
>>> persistentField.set(o,
>>
>>
>> getCollectionRelationship(broker,
>>
>>> o, relationshipName));
>>> } else {
>>> persistentField.set(o, getReferencedObject(broker, o,
>>> relationshipName));
>>> }
>>> } else {
>>> Log.debug(this, "loadRelationship - relationship '" +
>>> relationshipName + "' already loaded on " + o);
>>> }
>>> }
>>> broker.close();
>>> }
>>>
>>>
>>> /**
>>> * Get Foreign key query for 1:n collection, by name
>>> *
>>> * Largely copied from
>>> org.apache.ojb.broker.singlevm.PersitenceBrokerImpl
>>> *
>>> * @return org.apache.ojb.broker.query.Query
>>> * @param obj
>>> * @param collectionName name of the collection to build the query
>>> for
>>> */
>>> private Query getForeignKeyQuery(PersistenceBroker broker, Object
>>> obj,
>>> String collectionName) {
>>> ClassDescriptor cld = broker.getClassDescriptor(obj.getClass());
>>> CollectionDescriptor cod =
>>> cld.getCollectionDescriptorByName(collectionName);
>>> ClassDescriptor refCld =
>>> broker.getClassDescriptor(cod.getItemClass());
>>>
>>> Object[] values = cld.getKeyValues(obj);
>>> FieldDescriptor[] fields =
>>> cod.getForeignKeyFieldDescriptors(refCld);
>>>
>>> Criteria criteria = new Criteria();
>>> for (int i = 0; i < fields.length; i++) {
>>> FieldDescriptor fld = (FieldDescriptor) fields[i];
>>> criteria.addEqualTo(fld.getAttributeName(), values[i]);
>>> }
>>>
>>> if (cod.getOrderBy() != null) {
>>> criteria.addOrderBy(cod.getOrderBy(), cod.isAscending());
>>> }
>>>
>>> Query query = QueryFactory.newQuery(refCld.getClassOfObject(),
>>> criteria, true);
>>>
>>> return query;
>>> }
>>>
>>> private Collection getCollectionRelationship(PersistenceBroker
>>> broker,
>>> Object o, String collectionName) {
>>> ClassDescriptor cld = broker.getClassDescriptor(o.getClass());
>>> CollectionDescriptor cod =
>>> cld.getCollectionDescriptorByName(collectionName);
>>> Class collectionClass = cod.getCollectionClass();
>>> Collection results = null;
>>>
>>> Query fkQuery =
>>> getForeignKeyQuery(PersistenceBrokerFactory.defaultPersistenceBroker(),
>>> o,
>>> collectionName);
>>> if (collectionClass == null) {
>>> results = broker.getCollectionByQuery(fkQuery);
>>> } else {
>>> results = (Collection)
>>> broker.getCollectionByQuery(collectionClass, fkQuery);
>>> }
>>> return results;
>>> }
>>>
>>> /**
>>> * Largely copied from
>>> org.apache.ojb.broker.singlevm.PersitenceBrokerImpl
>>> * @param obj
>>> * @param referenceName
>>> * @return
>>> */
>>> private Object getReferencedObject(PersistenceBroker broker, Object
>>
>>
>> obj,
>>
>>> String referenceName) {
>>> ClassDescriptor cd = broker.getClassDescriptor(obj.getClass());
>>> ObjectReferenceDescriptor rds =
>>> cd.getObjectReferenceDescriptorByName(referenceName);
>>> Class referencedClass = rds.getItemClass();
>>> // ensure that top-level extents are used for Identities
>>>
>>> referencedClass =
>>> broker.getDescriptorRepository().getExtentClass(referencedClass);
>>>
>>> Object[] pkVals = rds.getForeignKeyValues(obj, cd);
>>>
>>> boolean allPkNull = true;
>>>
>>> // BRJ : check if we have non null pk values
>>> for (int i = 0; i < pkVals.length; i++) {
>>> if (pkVals[i] != null) {
>>> allPkNull = false;
>>> break;
>>> }
>>> }
>>>
>>> // BRJ : if all pk values are null there's no referenced object
>>> if (allPkNull) {
>>> return null;
>>> } else {
>>> Identity id = new Identity(referencedClass, pkVals);
>>> return broker.getObjectByIdentity(id);
>>> }
>>> }
>>>
>>>
>>>
>>>
>>>
>>>
>>>> -----Original Message-----
>>>> From: Max Rydahl Andersen [mailto:[EMAIL PROTECTED]]
>>>> Sent: 09 September 2002 09:35
>>>> To: OJB Users List
>>>> Subject: Re: Anyone up for a "challange" ? :)
>>>>
>>>>
>>>> Willingly to share the code - just to see it ? :)
>>>>
>>>> /max
>>>>
>>>> ----- Original Message -----
>>>> From: "Charles Anthony" <[EMAIL PROTECTED]>
>>>> To: "'OJB Users List'" <[EMAIL PROTECTED]>
>>>> Sent: Monday, September 09, 2002 9:31 AM
>>>> Subject: RE: Anyone up for a "challange" ? :)
>>>>
>>>>
>>>>
>>>>> [snippety-snip]
>>>>>
>>>>>> crystal clear! This relationship helper is something I have thought
>>>>>> about in the last week. As all needed functionality is already
>>>>>> implemented in the PersistenceBroker it will be pretty easy
>>>>>
>>>>>
>>>> to expose
>>>>
>>>>>> such a feature in the public API.
>>>>>> I will put this feature on my personal todo list.
>>>>>
>>>>>
>>>>> Cool; spookily, I have a RelationshipHelper class, that has a
>>>>> lazilyLoadRelationship(Object o, String relationshipName),
>>>>
>>>>
>>>> which basically
>>>>
>>>>> delegates clones of the appropriate methods on the PB. It'd
>>>>
>>>>
>>>> be good to
>>>> kick
>>>>
>>>>> out the cut-n-paste code re-use !
>>>>>
>>>>> Chers,
>>>>>
>>>>> Charles.
>>>>>
>>>>>
>>>>> This email and any attachments are strictly confidential and
>>>>
>>>>
>>>> are intended
>>>>
>>>>> solely for the addressee. If you are not the intended
>>>>
>>>>
>>>> recipient you must
>>>>
>>>>> not disclose, forward, copy or take any action in reliance
>>>>
>>>>
>>>> on this message
>>>>
>>>>> or its attachments. If you have received this email in error
>>>>
>>>>
>>>> please notify
>>>>
>>>>> the sender as soon as possible and delete it from your
>>>>
>>>>
>>>> computer systems.
>>>>
>>>>> Any views or opinions presented are solely those of the
>>>>
>>>>
>>>> author and do not
>>>>
>>>>> necessarily reflect those of HPD Software Limited or its affiliates.
>>>>>
>>>>> At present the integrity of email across the internet cannot be
>>>>
>>>>
>>>> guaranteed
>>>>
>>>>> and messages sent via this medium are potentially at risk.
>>>>
>>>>
>>>> All liability
>>>>
>>>>> is excluded to the extent permitted by law for any claims
>>>>
>>>>
>>>> arising as a re-
>>>>
>>>>> sult of the use of this medium to transmit information by or to
>>>>> HPD Software Limited or its affiliates.
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> To unsubscribe, e-mail:
>>>>
>>>>
>>>> <mailto:[EMAIL PROTECTED]>
>>>>
>>>>> For
>>>>
>>>>
>>>> additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
>>>>
>>>>>
>>>>
>>>> --
>>>> To unsubscribe, e-mail:
>>>> <mailto:[EMAIL PROTECTED]>
>>>> For
>>>> additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
>>>>
>>>
>>> This email and any attachments are strictly confidential and are
>>> intended
>>> solely for the addressee. If you are not the intended recipient you must
>>> not disclose, forward, copy or take any action in reliance on this
>>> message
>>> or its attachments. If you have received this email in error please
>>> notify
>>> the sender as soon as possible and delete it from your computer systems.
>>> Any views or opinions presented are solely those of the author and do
>>> not
>>> necessarily reflect those of HPD Software Limited or its affiliates.
>>>
>>> At present the integrity of email across the internet cannot be
>>
>>
>> guaranteed
>>
>>> and messages sent via this medium are potentially at risk. All
>>> liability
>>> is excluded to the extent permitted by law for any claims arising as
>>> a re-
>>> sult of the use of this medium to transmit information by or to
>>> HPD Software Limited or its affiliates.
>>>
>>>
>>>
>>> --
>>> To unsubscribe, e-mail:
>>> <mailto:[EMAIL PROTECTED]>
>>> For additional commands, e-mail:
>>> <mailto:[EMAIL PROTECTED]>
>>>
>>
>>
>> --
>> To unsubscribe, e-mail:
>> <mailto:[EMAIL PROTECTED]>
>> For additional commands, e-mail:
>> <mailto:[EMAIL PROTECTED]>
>>
>>
>>
>>
>
>
>
> --
> To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
>
>
>
>
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>