public Object invoke(Invocation mi) throws Exception {
if(!(mi instanceof CMRInvocation))
return getNext().invoke(mi);
CMRMessage relationshipMessage = ((CMRInvocation)mi).getCmrMessage();
if(relationshipMessage == null)
{
// Not a relationship message. Invoke down the chain
return getNext().invoke(mi);
}
// We are going to work with the context a lot
EntityEnterpriseContext ctx = (EntityEnterpriseContext)mi.getEnterpriseContext();
JDBCCMRFieldBridge cmrField = (JDBCCMRFieldBridge)mi.getArguments()[0];
if(CMRMessage.GET_RELATED_ID == relationshipMessage)
{
// call getRelateId
if(log.isTraceEnabled())
{
log.trace("Getting related id: field=" + cmrField.getFieldName() + " id=" + ctx.getId());
}
return cmrField.getRelatedId(ctx);
}
else if(CMRMessage.ADD_RELATION == relationshipMessage)
{
// call addRelation
Object relatedId = mi.getArguments()[1];
if(log.isTraceEnabled())
{
log.trace("Add relation: field=" + cmrField.getFieldName() +
" id=" + ctx.getId() +
" relatedId=" + relatedId);
}
cmrField.addRelation(ctx, relatedId);
return null;
}
else if(CMRMessage.REMOVE_RELATION == relationshipMessage)
{
// call removeRelation
Object relatedId = mi.getArguments()[1];
if(log.isTraceEnabled())
{
log.trace("Remove relation: field=" + cmrField.getFieldName() +
" id=" + ctx.getId() +
" relatedId=" + relatedId);
}
cmrField.removeRelation(ctx, relatedId);
return null;
}
else if(CMRMessage.SCHEDULE_FOR_CASCADE_DELETE == relationshipMessage)
{
JDBCEntityBridge entity = (JDBCEntityBridge)cmrField.getEntity();
entity.scheduleForCascadeDelete(ctx);
return null;
}
else if(CMRMessage.SCHEDULE_FOR_BATCH_CASCADE_DELETE == relationshipMessage)
{
JDBCEntityBridge entity = (JDBCEntityBridge)cmrField.getEntity();
entity.scheduleForBatchCascadeDelete(ctx);
return null;
}
else
{
// this should not be possible we are using a type safe enum
throw new EJBException("Unknown cmp2.0-relationship-message=" +
relationshipMessage);
}
}
|