diff --git a/scala/pom.xml b/scala/pom.xml index c53b99d0..9a5c003f 100644 --- a/scala/pom.xml +++ b/scala/pom.xml @@ -2,7 +2,7 @@ 4.0.0 org.msgpack scala-msgpack - 0.0.1-devel + 0.0.1-SNAPSHOT ${project.artifactId} My wonderfull scala app 2010 diff --git a/scala/src/main/scala/org/msgpack/JavassistTypeScalaTemplateBuilder.scala b/scala/src/main/scala/org/msgpack/JavassistTypeScalaTemplateBuilder.scala index eb565eac..d9efff4f 100644 --- a/scala/src/main/scala/org/msgpack/JavassistTypeScalaTemplateBuilder.scala +++ b/scala/src/main/scala/org/msgpack/JavassistTypeScalaTemplateBuilder.scala @@ -3,12 +3,12 @@ package org.msgpack import _root_.javassist.{CtClass, CtNewConstructor} import annotation._ import template._ +import builder.JavassistTemplateBuilder.JavassistTemplate +import builder.{BuildContextBase, JavassistTemplateBuilder} import java.lang.Class import collection.immutable.{ListMap, TreeMap} import java.lang.reflect.{Type, Modifier, Method, Field} import java.lang.annotation.{Annotation => JavaAnnotation} -import builder.{JavassistTemplateBuilder, BuildContextBase, BuildContext} -import builder.JavassistTemplateBuilder.JavassistTemplate import scala.collection.JavaConverters._ ; /* @@ -378,7 +378,7 @@ class ScalaFieldEntryReader extends IFieldEntryReader{ def sameType_?( getter : Method,setter : Method) = { getter.getReturnType == setter.getParameterTypes()(0) } - + /* for(g <- getters){ setters.get(g._1).map( s => { if(sameType_?(g._2,s)){ @@ -393,6 +393,22 @@ class ScalaFieldEntryReader extends IFieldEntryReader{ props +=( name -> (g._2,s,f)) } }) + }*/ + // In some situation, reflection returns wrong ordered getter methods compare with declaration order. + // So to avoid such situation, list up props with setter methods + for(s <- setters){ + getters.get(s._1).map( g => { + if(sameType_?(g,s._2)){ + val name = s._1 + val f = try{ + targetClass.getDeclaredField(name) + }catch{ + case e : NoSuchFieldException => null + } + + props +=(name -> (g,s._2,f)) + } + }) } props } diff --git a/scala/src/test/scala/org/msgpack/SampleClass.scala b/scala/src/test/scala/org/msgpack/SampleClass.scala index 4979ec61..acaf7b3f 100644 --- a/scala/src/test/scala/org/msgpack/SampleClass.scala +++ b/scala/src/test/scala/org/msgpack/SampleClass.scala @@ -74,4 +74,28 @@ class BasicalTypes{ +} + +object FieldOrder{ + val None = 0 + val Offering = 11 + val BeOffered = 12 + val Friend = 13 + val Block = 21 +} + +@MessagePackMessage +class FieldOrder{ + + var one : Int = 0 + var two : String = "aaa" + var three : String = "bbb" + var four : String = "" + var five : Boolean = false + + def six : Int = 1 + def six_=(v : Int) = one = v + + override def toString = "hogehoge" + } \ No newline at end of file diff --git a/scala/src/test/scala/org/msgpack/ScalaFieldEntryReaderSpec.scala b/scala/src/test/scala/org/msgpack/ScalaFieldEntryReaderSpec.scala index 3eeffaad..66ff819b 100644 --- a/scala/src/test/scala/org/msgpack/ScalaFieldEntryReaderSpec.scala +++ b/scala/src/test/scala/org/msgpack/ScalaFieldEntryReaderSpec.scala @@ -19,6 +19,8 @@ import org.specs.runner.{ JUnitSuiteRunner, JUnit } class ScalaFieldEntryReaderSpec extends Specification with JUnit { "ScalaFieldEntryReader" should { + + "check setter " in { val reader = new ScalaFieldEntryReader() @@ -67,6 +69,27 @@ class ScalaFieldEntryReaderSpec extends Specification with JUnit { } + "field order" in { + var reader = new ScalaFieldEntryReader + val c = classOf[FieldOrder] + + println("Methods of FieldOrder class") + c.getMethods.foreach(println(_)) + println("-- end --") + + val props = reader.findPropertyMethods(c) + + var index : Int = 0 + val names = List("one","two","three","four","five","six") + for( p <- props.values){ + p._1.getName must_== names(index) + index += 1 + } + + + } + + "indexing " in { val reader = new ScalaFieldEntryReader()