>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]>