User: vharcq
Date: 02/02/21 15:09:30
Modified: core/resources/xdoclet/ejb valueobject.j
Log:
Correct some bugs
Add equals() hashCode() and isIdentical(). More work needed here
And of course a Unit Test :-)
Revision Changes Path
1.5 +175 -2 xdoclet/core/resources/xdoclet/ejb/valueobject.j
Index: valueobject.j
===================================================================
RCS file: /cvsroot/xdoclet/xdoclet/core/resources/xdoclet/ejb/valueobject.j,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -w -r1.4 -r1.5
--- valueobject.j 17 Feb 2002 08:51:02 -0000 1.4
+++ valueobject.j 21 Feb 2002 23:09:30 -0000 1.5
@@ -21,16 +21,19 @@
<XDtEjbPersistent:forAllPersistentFields superclasses="false"
valueobject="<XDtEjbValueObj:valueObjectMatch/>">
private <XDtMethod:methodType/> <XDtMethod:propertyName/>;
+ private boolean <XDtMethod:propertyName/>HasBeenSet = false;
</XDtEjbPersistent:forAllPersistentFields>
<XDtEjbValueObj:forAllRelations superclasses="false"
valueobject="<XDtEjbValueObj:valueObjectMatch/>">
<XDtMethod:ifDoesntHaveMethodTag tagName="ejb:value-object" paramName="type">
private <XDtEjbValueObj:currentAggregateType/>
<XDtEjbValueObj:currentAggregateName/>;
+ private boolean <XDtEjbValueObj:currentAggregateName/>HasBeenSet = false;
</XDtMethod:ifDoesntHaveMethodTag>
<XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="type">
- private <XDtMethod:methodTagValue tagName="ejb:value-object" paramName="type"/>
<XDtEjbValueObj:currentAggregateName/>s;
+ private <XDtMethod:methodTagValue tagName="ejb:value-object" paramName="type"/>
<XDtEjbValueObj:currentAggregateName/>s = new java.util.ArrayList();
</XDtMethod:ifHasMethodTag>
</XDtEjbValueObj:forAllRelations>
+ private <XDtEjbPk:pkClass/> pk;
<XDtEjbBmp:ifUseSoftLocking>
private long _version = 0;
@@ -38,13 +41,16 @@
public <XDtClass:classOf><XDtEjbValueObj:valueObjectClass/></XDtClass:classOf>()
{
+ pk = new <XDtEjbPk:pkClass/>();
}
public <XDtClass:classOf><XDtEjbValueObj:valueObjectClass/></XDtClass:classOf>(
<XDtEjbPersistent:persistentfieldList
valueobject="<XDtEjbValueObj:valueObjectMatch/>"/> )
{
<XDtEjbPersistent:forAllPersistentFields superclasses="true"
valueobject="<XDtEjbValueObj:valueObjectMatch/>">
this.<XDtMethod:propertyName/> = <XDtMethod:propertyName/>;
+ <XDtMethod:propertyName/>HasBeenSet = true;
</XDtEjbPersistent:forAllPersistentFields>
+ pk = new <XDtEjbPk:pkClass/>(<XDtEjbPk:pkfieldListFrom name="this"/>);
}
//TODO Cloneable is better than this !
@@ -52,16 +58,24 @@
{
<XDtEjbPersistent:forAllPersistentFields superclasses="true"
valueobject="<XDtEjbValueObj:valueObjectMatch/>">
this.<XDtMethod:propertyName/> = otherValue.<XDtMethod:propertyName/>;
+ <XDtMethod:propertyName/>HasBeenSet = true;
</XDtEjbPersistent:forAllPersistentFields>
<XDtEjbValueObj:forAllRelations superclasses="false"
valueobject="<XDtEjbValueObj:valueObjectMatch/>">
// TODO Clone is better no ?
<XDtMethod:ifDoesntHaveMethodTag tagName="ejb:value-object" paramName="type">
this.<XDtEjbValueObj:currentAggregateName/> =
otherValue.<XDtEjbValueObj:currentAggregateName/>;
+ <XDtEjbValueObj:currentAggregateName/>HasBeenSet = true;
</XDtMethod:ifDoesntHaveMethodTag>
<XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="type">
this.<XDtEjbValueObj:currentAggregateName/>s =
otherValue.<XDtEjbValueObj:currentAggregateName/>s;
</XDtMethod:ifHasMethodTag>
</XDtEjbValueObj:forAllRelations>
+ pk = new <XDtEjbPk:pkClass/>(<XDtEjbPk:pkfieldListFrom name="this"/>);
+ }
+
+ public <XDtEjbPk:pkClass/> getPrimaryKey()
+ {
+ return pk;
}
<XDtEjbPersistent:forAllPersistentFields superclasses="true"
valueobject="<XDtEjbValueObj:valueObjectMatch/>">
@@ -69,10 +83,19 @@
{
return this.<XDtMethod:propertyName/>;
}
+
<XDtMethod:ifHasMethod name="<XDtMethod:setterMethod/>"
parameters="<XDtMethod:methodType/>">
public void <XDtMethod:setterMethod/>( <XDtMethod:methodType/>
<XDtMethod:propertyName/> )
{
this.<XDtMethod:propertyName/> = <XDtMethod:propertyName/>;
+ <XDtMethod:propertyName/>HasBeenSet = true;
+ <XDtEjbPk:ifIsPkField>
+ pk.<XDtMethod:setterMethod/>(<XDtMethod:propertyName/>);
+ </XDtEjbPk:ifIsPkField>
+ }
+
+ public boolean <XDtMethod:propertyName/>HasBeenSet(){
+ return <XDtMethod:propertyName/>HasBeenSet;
}
</XDtMethod:ifHasMethod>
</XDtEjbPersistent:forAllPersistentFields>
@@ -86,6 +109,7 @@
public void set<XDtEjbValueObj:currentAggregateName/>(
<XDtEjbValueObj:currentAggregateType/> <XDtEjbValueObj:currentAggregateName/> )
{
this.<XDtEjbValueObj:currentAggregateName/> =
<XDtEjbValueObj:currentAggregateName/>;
+ <XDtEjbValueObj:currentAggregateName/>HasBeenSet = true;
}
</XDtMethod:ifDoesntHaveMethodTag>
<XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="type">
@@ -97,7 +121,7 @@
public java.util.Collection getRemoved<XDtEjbValueObj:currentAggregateName/>s()
{ return removed<XDtEjbValueObj:currentAggregateName/>s; }
public java.util.Collection getUpdated<XDtEjbValueObj:currentAggregateName/>s()
{ return updated<XDtEjbValueObj:currentAggregateName/>s; }
- public <XDtEjbValueObj:currentAggregateType/>[]
getImmutable<XDtEjbValueObj:currentAggregateName/>s()
+ public <XDtEjbValueObj:currentAggregateType/>[]
get<XDtEjbValueObj:currentAggregateName/>s()
{
return
(<XDtEjbValueObj:currentAggregateType/>[])this.<XDtEjbValueObj:currentAggregateName/>s.toArray(new
<XDtEjbValueObj:currentAggregateType/>[<XDtEjbValueObj:currentAggregateName/>s.size()]);
}
@@ -162,6 +186,155 @@
str.append('}');
return(str.toString());
+ }
+
+ /**
+ * A Value object have an identity if its attributes making its Primary Key
+ * has all been set. One object without identity is never equal to any other
+ * object.
+ *
+ * @return true if this instance have an identity.
+ */
+ protected boolean hasIdentity()
+ {
+ boolean ret = true;
+ <XDtEjbPersistent:forAllPersistentFields superclasses="true"
valueobject="<XDtEjbValueObj:valueObjectMatch/>" only-pk="true">
+ ret = ret && <XDtMethod:propertyName/>HasBeenSet;
+ </XDtEjbPersistent:forAllPersistentFields>
+ return ret;
+ }
+
+ public boolean equals(Object other)
+ {
+ if ( ! hasIdentity() ) return false;
+ if (other instanceof
<XDtClass:classOf><XDtEjbValueObj:valueObjectClass/></XDtClass:classOf>)
+ {
+ <XDtClass:classOf><XDtEjbValueObj:valueObjectClass/></XDtClass:classOf>
that = (<XDtClass:classOf><XDtEjbValueObj:valueObjectClass/></XDtClass:classOf>) other;
+ if ( ! that.hasIdentity() ) return false;
+ boolean lEquals = true;
+ <XDtEjbPersistent:forAllPersistentFields superclasses="true"
valueobject="<XDtEjbValueObj:valueObjectMatch/>" only-pk="true">
+ <XDtType:ifIsPrimitive value="<XDtMethod:methodType/>">
+ lEquals = lEquals && this.<XDtMethod:propertyName/> ==
that.<XDtMethod:propertyName/>;
+ </XDtType:ifIsPrimitive>
+ <XDtType:ifIsNotPrimitive value="<XDtMethod:methodType/>">
+ if( this.<XDtMethod:propertyName/> == null )
+ {
+ lEquals = lEquals && ( that.<XDtMethod:propertyName/> == null );
+ }
+ else
+ {
+ lEquals = lEquals && this.<XDtMethod:propertyName/>.equals(
that.<XDtMethod:propertyName/> );
+ }
+ </XDtType:ifIsNotPrimitive>
+ </XDtEjbPersistent:forAllPersistentFields>
+
+ lEquals = lEquals && isIdentical(that);
+
+ return lEquals;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ public boolean isIdentical(Object other)
+ {
+ if (other instanceof
<XDtClass:classOf><XDtEjbValueObj:valueObjectClass/></XDtClass:classOf>)
+ {
+ <XDtClass:classOf><XDtEjbValueObj:valueObjectClass/></XDtClass:classOf>
that = (<XDtClass:classOf><XDtEjbValueObj:valueObjectClass/></XDtClass:classOf>) other;
+ boolean lEquals = true;
+ <XDtEjbPersistent:forAllPersistentFields superclasses="true"
valueobject="<XDtEjbValueObj:valueObjectMatch/>" not-pk="true">
+ <XDtType:ifIsPrimitive value="<XDtMethod:methodType/>">
+ lEquals = lEquals && this.<XDtMethod:propertyName/> ==
that.<XDtMethod:propertyName/>;
+ </XDtType:ifIsPrimitive>
+ <XDtType:ifIsNotPrimitive value="<XDtMethod:methodType/>">
+ if( this.<XDtMethod:propertyName/> == null )
+ {
+ lEquals = lEquals && ( that.<XDtMethod:propertyName/> == null );
+ }
+ else
+ {
+ lEquals = lEquals && this.<XDtMethod:propertyName/>.equals(
that.<XDtMethod:propertyName/> );
+ }
+ </XDtType:ifIsNotPrimitive>
+ </XDtEjbPersistent:forAllPersistentFields>
+ <XDtEjbValueObj:forAllRelations superclasses="false"
valueobject="<XDtEjbValueObj:valueObjectMatch/>">
+ <XDtMethod:ifDoesntHaveMethodTag tagName="ejb:value-object"
paramName="type">
+ if( this.<XDtEjbValueObj:currentAggregateName/> == null )
+ {
+ lEquals = lEquals && ( that.<XDtEjbValueObj:currentAggregateName/> ==
null );
+ }
+ else
+ {
+ lEquals = lEquals &&
this.<XDtEjbValueObj:currentAggregateName/>.equals(
that.<XDtEjbValueObj:currentAggregateName/> );
+ }
+ </XDtMethod:ifDoesntHaveMethodTag>
+ <XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="type">
+ if( this.get<XDtEjbValueObj:currentAggregateName/>s() == null )
+ {
+ lEquals = lEquals && (
that.get<XDtEjbValueObj:currentAggregateName/>s() == null );
+ }
+ else
+ {
+ lEquals = lEquals &&
java.util.Arrays.equals(this.get<XDtEjbValueObj:currentAggregateName/>s() ,
that.get<XDtEjbValueObj:currentAggregateName/>s()) ;
+ }
+ </XDtMethod:ifHasMethodTag>
+ </XDtEjbValueObj:forAllRelations>
+
+ return lEquals;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ public int hashCode(){
+ int result = 17;
+ <XDtEjbPersistent:forAllPersistentFields superclasses="true"
valueobject="<XDtEjbValueObj:valueObjectMatch/>">
+ <XDtType:ifIsOfType type="boolean" value="return-type">
+ result = 37*result + (<XDtMethod:propertyName/> ? 0 : 1);
+ </XDtType:ifIsOfType>
+ <XDtType:ifIsOfType type="long" value="return-type">
+ result = 37*result +
(int)(<XDtMethod:propertyName/>^(<XDtMethod:propertyName/>>>>32));
+ </XDtType:ifIsOfType>
+ <XDtType:ifIsOfType type="float" value="return-type">
+ result = 37*result + Float.floatToIntBits(<XDtMethod:propertyName/>);
+ </XDtType:ifIsOfType>
+ <XDtType:ifIsOfType type="double" value="return-type">
+ {
+ long l = Double.doubleToLongBits(<XDtMethod:propertyName/>);
+ result = 37*result + (int)(l^(l>>>32));
+ }
+ </XDtType:ifIsOfType>
+ <XDtType:ifIsPrimitive value="<XDtMethod:methodType/>">
+ <XDtType:ifIsNotOfType type="boolean" value="return-type">
+ <XDtType:ifIsNotOfType type="long" value="return-type">
+ <XDtType:ifIsNotOfType type="float" value="return-type">
+ <XDtType:ifIsNotOfType type="double" value="return-type">
+ result = 37*result + (int) <XDtMethod:propertyName/>;
+ </XDtType:ifIsNotOfType>
+ </XDtType:ifIsNotOfType>
+ </XDtType:ifIsNotOfType>
+ </XDtType:ifIsNotOfType>
+ </XDtType:ifIsPrimitive>
+ <XDtType:ifIsNotPrimitive value="<XDtMethod:methodType/>">
+ result = 37*result + ((this.<XDtMethod:propertyName/> != null) ?
this.<XDtMethod:propertyName/>.hashCode() : 0);
+ </XDtType:ifIsNotPrimitive>
+ </XDtEjbPersistent:forAllPersistentFields>
+ <XDtEjbValueObj:forAllRelations superclasses="false"
valueobject="<XDtEjbValueObj:valueObjectMatch/>">
+ <XDtMethod:ifDoesntHaveMethodTag tagName="ejb:value-object"
paramName="type">
+ result = 37*result + ((this.<XDtEjbValueObj:currentAggregateName/> != null) ?
this.<XDtEjbValueObj:currentAggregateName/>.hashCode() : 0);
+ </XDtMethod:ifDoesntHaveMethodTag>
+ <XDtMethod:ifHasMethodTag tagName="ejb:value-object" paramName="type">
+ <XDtComment:comment>
+ hashCode() is implemented in java.util.List so we don't have to worry
+ </XDtComment:comment>
+ result = 37*result + ((this.get<XDtEjbValueObj:currentAggregateName/>s() !=
null) ? this.get<XDtEjbValueObj:currentAggregateName/>s().hashCode() : 0);
+ </XDtMethod:ifHasMethodTag>
+ </XDtEjbValueObj:forAllRelations>
+ return result;
}
<XDtMerge:merge file="valueobject-custom.j">
_______________________________________________
Xdoclet-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/xdoclet-devel