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

Reply via email to