Hi Michele,

thank you very much for your contribution so far. May it be possible for
you to create a new issue for this in castor bug tracking under:

http://jira.codehaus.org/browse/CASTOR

and attach you additions as a unified patch to the new issue. The patch
would make my work just a bit easier then without. Having said that I'll
try to get your additions into next release.

Regards
Ralf


Michele Mazzucco schrieb:
> I added this code to the org.exolab.castor.builder.SourceFactory class:
> 
> /**
>        * Create an "hashCode" method on the given JClass.
>        *
>        * @param jclass the JClass in wich we create the hashCode method.
>        */
>       public static void createHashCodeMethod(JClass jclass) {
>               if (jclass == null) {
>                       throw new IllegalArgumentException("JClass must not be 
> null");
>               }
>               
>               // The argument is not null
>               JField[] fields = jclass.getFields();
>               
>               // Creates the method signature
>         JMethod jMethod = new JMethod(JType.Int, "hashCode");
>               jMethod.setComment("Override the java.lang.Object.hashCode 
> method");
>               
>               // The hashCode method has no arguments
>               jclass.addMethod(jMethod);
>               
>               JSourceCode jsc = jMethod.getSourceCode();
>               
>               // The following steps came from Effective Java Programming 
> Language
> Guide by Joshua Bloch, chapter 3
>               jsc.add("int result = 17;");
>               
>               for (int i = 0; i <fields.length; i++) {
>             JField temp = fields[i];
>                       // If the field is an object the hashCode method is 
> called recursively
>                       
>                       JType type = temp.getType();
>                       String name = temp.getName();
>                       if (type.isPrimitive()) {
>                               if (type == JType.Boolean) {
>                                       jsc.add("result = 37 * result + (" + 
> name + "?0:1);");
>                               } else
>                               if ((type == JType.Byte) ||
>                                       (type == JType.Short) ||
>                                       (type == JType.Int)) {
>                                               
>                                       jsc.add("result = 37 * result + (int)" 
> + name + ";");
>                               } else if (type == JType.Long) {
>                                       jsc.add("result = 37 * result + (int)(" 
> + name + "^(" + name +
> ">>>32));");
>                               } else if (type == JType.Float) {
>                                       jsc.add("result = 37 * result + 
> Float.floatToIntBits(" + name + ");");
>                               } else if (type == JType.Double) {
>                                       jsc.add("long tmp = 
> Double.doubleToLongBits(" + name + ");");
>                                       jsc.add("result = 37 * result + 
> (int)(tmp^(tmp>>>32));");
>                               }
>                       }       else {
>                               // Calculates hashCode in a recursive manner.
>                               jsc.add("result = 37 * result + " + name + 
> ".hashCode();");
>                       }
>               }
>               jsc.add("");
>               jsc.add("return result;");              
>       }       //createHashCodeMethod
> 
> 
> 
> 
> and into the createSourceCode() method I've added the following control
> 
> //create equals() method?
> if (component.hasEquals()) {
>       createEqualsMethod(jClass);
>       createHashCodeMethod(jClass);
> }
> 
> since the hashCode method *must* be added when the equals method is
> created (see Effective Java Programming Language Guide by Joshua Bloch,
> chapter 3).
> 
> 
> Best regards,
> Michele
> 
> 
> 
> Ralf Joachim wrote:
> 
>>Hi Michele,
>>
>>SourceGenerator seams not to be able to generate hashcode() / equals()
>>methods at the moment. In general I don't see a reason why it should not
>>be possible to improve SourceGenerator to also generate them. As with
>>other open source projects we are open for contributions. So you are
>>open to volunteer on this addition.
>>
>>Regards
>>Ralf
>>Castor JDO, committer
>>
>>
>>Michele Mazzucco schrieb:
>>
>>>Hi all,
>>>
>>>is it possible to "autogenerate" the hashCode() method on java objects
>>>created from the xml schema?, otherwise checks on the server side could
>>>return wrong values (i.e. checking if an object sent by by client is
>>>stored in a collection hosted by the server side).
>>>
>>>
>>>Thanks in advance,
>>>Michele
>>>
>>>-------------------------------------------------
>>>If you wish to unsubscribe from this list, please send an empty
>>>message to the following address:
>>>
>>>[EMAIL PROTECTED]
>>>-------------------------------------------------
>>
>>-------------------------------------------------
>>If you wish to unsubscribe from this list, please send an empty message
>>to the following address:
>>
>>[EMAIL PROTECTED]
>>-------------------------------------------------
>>
> 
> 
> -------------------------------------------------
> If you wish to unsubscribe from this list, please 
> send an empty message to the following address:
> 
> [EMAIL PROTECTED]
> -------------------------------------------------

-- 

Syscon Ingenieurbüro für
Meß- und Datentechnik GmbH
Ralf Joachim
Raiffeisenstraße 11
D-72127 Kusterdingen
Germany

Tel.   +49 7071 3690 52
Mobil: +49 173 9630135
Fax    +49 7071 3690 98

Email: [EMAIL PROTECTED]
Web:   www.syscon-world.de

-------------------------------------------------
If you wish to unsubscribe from this list, please 
send an empty message to the following address:

[EMAIL PROTECTED]
-------------------------------------------------

Reply via email to