I add a propertyHasBeenSet to getValueObject method.
I thing make a check when update an entity bean use a
temporary valueobject(populate by self not the one which
return from getValueObject)can prevents null values copy
to bean's property.


file: entity-value.xdt
/* Value Objects BEGIN */
<XDtComment:comment>
This part adds methods to handle 1-n relationships to add/remove/update one
entry of a specific relationship. Difference is made between aggregation and
composition
</XDtComment:comment>

<XDtEjbValueObj:forAllRelations superclasses="true" valueobject="*">
<XDtEjbValueObj:ifIsCollection>
public void add<XDtMethod:methodTagValue tagName="ejb:value-object"
paramName="members-name"/>(<XDtEjbValueObj:currentAggregateType/> added)
<XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="compose">
throws javax.ejb.CreateException
</XDtMethod:ifHasMethodTag>
<XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="aggregate">
throws javax.ejb.FinderException
</XDtMethod:ifHasMethodTag>
{
try
{
<XDtClass:pushClass value="<XDtEjbValueObj:currentRelationBeanClass/>">
<XDtEjbPk:ifHasPrimkeyField>
<XDtEjbPk:pkClass/> pk = added.<XDtEjbPk:primkeyGetter/>();
</XDtEjbPk:ifHasPrimkeyField>
<XDtEjbPk:ifDoesntHavePrimkeyField>
<XDtEjbPk:pkClass/> pk = new
<XDtEjbPk:pkClass/>(<XDtEjbPk:pkfieldListFrom name="added"/>);
</XDtEjbPk:ifDoesntHavePrimkeyField>
</XDtClass:pushClass>

<XDtMerge:merge
file="xdoclet/modules/ejb/entity/resources/entity-value-home.xdt">
</XDtMerge:merge>

<XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="compose">
<XDtMethod:methodTagValue tagName="ejb:value-object"
paramName="members"/> relation = home.create(added);
</XDtMethod:ifHasMethodTag>
<XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="aggregate">
<XDtMethod:methodTagValue tagName="ejb:value-object"
paramName="members"/> relation = home.findByPrimaryKey(pk);
</XDtMethod:ifHasMethodTag>
<XDtMethod:methodName/>().add(relation);
<XDtEjbCmp:ifNotUsingCmp2>
makeDirty();
</XDtEjbCmp:ifNotUsingCmp2>
}
catch (Exception e){
<XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="compose">
if (e instanceof javax.ejb.CreateException)
throw (javax.ejb.CreateException)e;
</XDtMethod:ifHasMethodTag>
<XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="aggregate">
if (e instanceof javax.ejb.FinderException)
throw (javax.ejb.FinderException)e;
</XDtMethod:ifHasMethodTag>
else
throw new javax.ejb.EJBException(e);
}
}

public void remove<XDtMethod:methodTagValue tagName="ejb:value-object"
paramName="members-name"/>(<XDtEjbValueObj:currentAggregateType/> removed)
throws javax.ejb.RemoveException
{
try
{
<XDtClass:pushClass value="<XDtEjbValueObj:currentRelationBeanClass/>">
<XDtEjbPk:ifHasPrimkeyField>
<XDtEjbPk:pkClass/> pk = removed.<XDtEjbPk:primkeyGetter/>();
</XDtEjbPk:ifHasPrimkeyField>
<XDtEjbPk:ifDoesntHavePrimkeyField>
<XDtEjbPk:pkClass/> pk = new
<XDtEjbPk:pkClass/>(<XDtEjbPk:pkfieldListFrom name="removed"/>);
</XDtEjbPk:ifDoesntHavePrimkeyField>
</XDtClass:pushClass>

<XDtMerge:merge
file="xdoclet/modules/ejb/entity/resources/entity-value-home.xdt">
</XDtMerge:merge>

<XDtMethod:methodTagValue tagName="ejb:value-object"
paramName="members"/> relation = home.findByPrimaryKey(pk);
<XDtMethod:methodName/>().remove(relation);
<XDtEjbCmp:ifNotUsingCmp2>
makeDirty();
</XDtEjbCmp:ifNotUsingCmp2>
<XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="compose">
relation.remove();
</XDtMethod:ifHasMethodTag>
}
catch (Exception e){
if (e instanceof javax.ejb.RemoveException)
throw (javax.ejb.RemoveException)e;
else
throw new javax.ejb.EJBException(e);
}
}

<XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="compose">
public void update<XDtMethod:methodTagValue tagName="ejb:value-object"
paramName="members-name"/>(<XDtEjbValueObj:currentAggregateType/> updated)
throws javax.ejb.FinderException
{
try
{
<XDtClass:pushClass value="<XDtEjbValueObj:currentRelationBeanClass/>">
<XDtEjbPk:ifHasPrimkeyField>
<XDtEjbPk:pkClass/> pk = updated.<XDtEjbPk:primkeyGetter/>();
</XDtEjbPk:ifHasPrimkeyField>
<XDtEjbPk:ifDoesntHavePrimkeyField>
<XDtEjbPk:pkClass/> pk = new
<XDtEjbPk:pkClass/>(<XDtEjbPk:pkfieldListFrom name="updated"/>);
</XDtEjbPk:ifDoesntHavePrimkeyField>
</XDtClass:pushClass>

<XDtMerge:merge
file="xdoclet/modules/ejb/entity/resources/entity-value-home.xdt">
</XDtMerge:merge>

<XDtMethod:methodTagValue tagName="ejb:value-object"
paramName="members"/> relation = home.findByPrimaryKey(pk);
relation.set<XDtEjbValueObj:currentAggregateType short="true"/>(updated);
}
catch (Exception e){
if (e instanceof javax.ejb.FinderException)
throw (javax.ejb.FinderException)e;
else
throw new javax.ejb.EJBException(e);
}
}

</XDtMethod:ifHasMethodTag>
</XDtEjbValueObj:ifIsCollection>
</XDtEjbValueObj:forAllRelations>

<XDtEjbValueObj:forAllValueObjects>
private <XDtEjbValueObj:currentValueObjectClass/>
<XDtEjbValueObj:currentValueObjectAttribute/> = null;

public <XDtEjbValueObj:valueMostSuperObjectClass/>
get<XDtEjbValueObj:currentValueObjectAttribute/>()
{
<XDtEjbValueObj:currentValueObjectAttribute/> = new
<XDtEjbValueObj:currentValueObjectClass/>();
<XDtMerge:merge
file="xdoclet/modules/ejb/entity/resources/entity-value-instantiation.xdt">
</XDtMerge:merge>

<XDtEjbPersistent:forAllPersistentFields
valueobject="<XDtEjbValueObj:currentValueObjectMatch/>">
<XDtMethod:ifHasMethod name="<XDtMethod:setterMethod/>"
parameters="<XDtMethod:methodType/>">
<XDtMethod:ifMethodTagValueEquals tagName="ejb:value-object"
paramName="relation" value="external">
<XDtEjbValueObj:currentValueObjectAttribute/>.<XDtMethod:setterMethod/>(
<XDtMethod:getterMethod/>() );
</XDtMethod:ifMethodTagValueEquals>
</XDtMethod:ifHasMethod>
</XDtEjbPersistent:forAllPersistentFields>

return <XDtEjbValueObj:currentValueObjectAttribute/>;
}
</XDtEjbValueObj:forAllValueObjects>

<XDtEjbValueObj:forAllSuperSetValue>
public void set<XDtEjbValueObj:currentValueObjectAttribute/>(
<XDtEjbValueObj:currentValueObjectClass/> valueHolder )
<XDtMethod:exceptionList
method="set<XDtEjbValueObj:currentValueObjectAttribute/>"/>{
<XDtMethod:ifHasMethod name="validate"
parameters="<XDtEjbValueObj:currentValueObjectClass/>">
validate(valueHolder);
</XDtMethod:ifHasMethod>
<XDtEjbBmp:ifUseSoftLocking>
if( getVersion() != valueHolder.getVersion() )
throw new IllegalStateException( "Wrong version. Had " + getVersion() +
", got " + valueHolder.getVersion() );
</XDtEjbBmp:ifUseSoftLocking>

try
{
<XDtEjbPersistent:forAllPersistentFields not-pk="true"
valueobject="<XDtEjbValueObj:currentValueObjectMatch/>">
<XDtEjbPk:ifIsNotPrimkeyField>
<XDtMethod:ifHasMethod name="<XDtMethod:setterMethod/>"
parameters="<XDtMethod:methodType/>">
<XDtComment:comment>
Check if propertyHasBeenSet, then set..
</XDtComment:comment>
if (valueHolder.<XDtMethod:propertyName/>HasBeenSet()) {
<XDtMethod:setterMethod/>( valueHolder.<XDtMethod:getterMethod/>() );
}
</XDtMethod:ifHasMethod>
</XDtEjbPk:ifIsNotPrimkeyField>
</XDtEjbPersistent:forAllPersistentFields>

<XDtEjbValueObj:forAllAggregates superclasses="true"
valueobject="<XDtEjbValueObj:currentValueObjectMatch/>">
{
<XDtEjbValueObj:ifIsNotCollection>
<XDtClass:pushClass value="<XDtEjbValueObj:currentRelationBeanClass/>">
// Checks for null aggregate
if (valueHolder.get<XDtEjbValueObj:currentAggregateName/>() != null)
{
<XDtEjbPk:ifHasPrimkeyField>
<XDtEjbPk:pkClass/> pk =
valueHolder.get<XDtEjbValueObj:currentAggregateName/>().<XDtEjbPk:primkeyGetter/>();
</XDtEjbPk:ifHasPrimkeyField>
<XDtEjbPk:ifDoesntHavePrimkeyField>
<XDtEjbPk:pkClass/> pk = new
<XDtEjbPk:pkClass/>(<XDtEjbPk:pkfieldListFrom
name="valueHolder.get<XDtEjbValueObj:currentAggregateName/>()"/>);
</XDtEjbPk:ifDoesntHavePrimkeyField>
</XDtClass:pushClass>

<XDtMerge:merge
file="xdoclet/modules/ejb/entity/resources/entity-value-home.xdt">
</XDtMerge:merge>

<XDtMethod:methodType/> relation = home.findByPrimaryKey(pk);
<XDtMethod:setterMethod/>(relation);
} else {
<XDtMethod:setterMethod/>(null);
}
</XDtEjbValueObj:ifIsNotCollection>
<XDtEjbValueObj:ifIsCollection>
<XDtComment:comment>
Here we take what has changed (update/add/remove) inside the VO
collection and
call methods according to. These methods are extracted so that you can
define
them abstract with a ejb:interface tag to give them access from the outside.
</XDtComment:comment>
java.util.Iterator i<XDtEjbValueObj:currentAggregateName/> =
valueHolder.getAdded<XDtEjbValueObj:currentAggregateName
plural="true"/>().iterator();
while (i<XDtEjbValueObj:currentAggregateName/>.hasNext())
{
<XDtEjbValueObj:currentAggregateType/> o =
(<XDtEjbValueObj:currentAggregateType/>)i<XDtEjbValueObj:currentAggregateName/>.next();
add<XDtMethod:methodTagValue tagName="ejb:value-object"
paramName="members-name"/>(o);
}
i<XDtEjbValueObj:currentAggregateName/> =
valueHolder.getRemoved<XDtEjbValueObj:currentAggregateName
plural="true"/>().iterator();
while (i<XDtEjbValueObj:currentAggregateName/>.hasNext())
{
<XDtEjbValueObj:currentAggregateType/> o =
(<XDtEjbValueObj:currentAggregateType/>)i<XDtEjbValueObj:currentAggregateName/>.next();
remove<XDtMethod:methodTagValue tagName="ejb:value-object"
paramName="members-name"/>(o);
}
</XDtEjbValueObj:ifIsCollection>
}
</XDtEjbValueObj:forAllAggregates>
<XDtEjbValueObj:forAllComposes superclasses="true"
valueobject="<XDtEjbValueObj:currentValueObjectMatch/>">
// Anonymous block to allow variable declations without conflicts
{
<XDtEjbValueObj:ifIsNotCollection>
<XDtClass:pushClass value="<XDtEjbValueObj:currentRelationBeanClass/>">
// Checks for null composition
if (valueHolder.get<XDtEjbValueObj:currentAggregateName/>() != null)
{
<XDtEjbPk:ifHasPrimkeyField>
<XDtEjbPk:pkClass/> pk =
valueHolder.get<XDtEjbValueObj:currentAggregateName/>().<XDtEjbPk:primkeyGetter/>();
</XDtEjbPk:ifHasPrimkeyField>
<XDtEjbPk:ifDoesntHavePrimkeyField>
<XDtEjbPk:pkClass/> pk = new
<XDtEjbPk:pkClass/>(<XDtEjbPk:pkfieldListFrom
name="valueHolder.get<XDtEjbValueObj:currentAggregateName/>()"/>);
</XDtEjbPk:ifDoesntHavePrimkeyField>
</XDtClass:pushClass>

<XDtMerge:merge
file="xdoclet/modules/ejb/entity/resources/entity-value-home.xdt">
</XDtMerge:merge>

<XDtMethod:methodType/> relation = home.findByPrimaryKey(pk);
relation.set<XDtEjbValueObj:currentAggregateName/>(valueHolder.get<XDtEjbValueObj:currentAggregateName/>());
}
</XDtEjbValueObj:ifIsNotCollection>
<XDtEjbValueObj:ifIsCollection>
<XDtComment:comment>
Here we take what has changed (update/add/remove) inside the VO
collection and
call methods according to. These methods are extracted so that you can
define
them abstract with a ejb:interface tag to give them access from the outside.
</XDtComment:comment>
java.util.Iterator i<XDtEjbValueObj:currentAggregateName/> =
valueHolder.getUpdated<XDtEjbValueObj:currentAggregateName
plural="true"/>().iterator();
while (i<XDtEjbValueObj:currentAggregateName/>.hasNext())
{
<XDtEjbValueObj:currentAggregateType/> o =
(<XDtEjbValueObj:currentAggregateType/>)i<XDtEjbValueObj:currentAggregateName/>.next();
update<XDtMethod:methodTagValue tagName="ejb:value-object"
paramName="members-name"/>(o);
}
i<XDtEjbValueObj:currentAggregateName/> =
valueHolder.getAdded<XDtEjbValueObj:currentAggregateName
plural="true"/>().iterator();
while (i<XDtEjbValueObj:currentAggregateName/>.hasNext())
{
<XDtEjbValueObj:currentAggregateType/> o =
(<XDtEjbValueObj:currentAggregateType/>)i<XDtEjbValueObj:currentAggregateName/>.next();
add<XDtMethod:methodTagValue tagName="ejb:value-object"
paramName="members-name"/>(o);
}
i<XDtEjbValueObj:currentAggregateName/> =
valueHolder.getRemoved<XDtEjbValueObj:currentAggregateName
plural="true"/>().iterator();
while (i<XDtEjbValueObj:currentAggregateName/>.hasNext())
{
<XDtEjbValueObj:currentAggregateType/> o =
(<XDtEjbValueObj:currentAggregateType/>)i<XDtEjbValueObj:currentAggregateName/>.next();
remove<XDtMethod:methodTagValue tagName="ejb:value-object"
paramName="members-name"/>(o);
}
</XDtEjbValueObj:ifIsCollection>
}
</XDtEjbValueObj:forAllComposes>
}
catch (Exception e)
{
throw new javax.ejb.EJBException(e);
}
}
</XDtEjbValueObj:forAllSuperSetValue>

/* Value Objects END */





-------------------------------------------------------
This SF.Net email is sponsored by the JBoss Inc.  Get Certified Today
Register for a JBoss Training Course.  Free Certification Exam
for All Training Attendees Through End of 2005. For more info visit:
http://ads.osdn.com/?ad_id=7628&alloc_id=16845&op=click
_______________________________________________
xdoclet-devel mailing list
xdoclet-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/xdoclet-devel

Reply via email to