Print

Print


I can't help you with Scala, sorry.

Sean

On Jan 29, 2014, at 5:53 AM, Roman Seidl <[log in to unmask]> wrote:

> Hi!
> 
> I have been trying to implement a simple own Properties Class to be able 
> to declare my Properties in a way I like better than declaring lots of 
> methods.
> 
> Maybe one could think about adding the possibility of Java Annotations 
> to declare the domain, description etc.? Or would this break with Masons 
> JDK compatbility target?
> 
> The disadvantage of reflection would still be that there is not ordering 
> of the properties - at least I don't think that reflecting on a class 
> would guarantee any ordering of the properties that reflects the 
> ordering in the code.
> 
> Anyway, I have produce a class derive from sim.util.Properties that 
> delivers the information and made my inspected class implement 
> Propertied. For the source code see below. It' in Scala but that should 
> not be the reason for any of my problems.
> 
> When using this combination with SimpleInspector and a Domain-Slider I 
> get into an endless loop in SimpleInspector of
> - PropertyField.newValue calling
> - SimpleInspector.this.state.controller.refresh() calling
> - SimpleInspector.updateInspector() calling
> - SimpleInspector.generateProperties(start) calling
> - PropertyField.newValue calling
> ...
> 
> 
> The responsible lines of code in SimpleInspector.generateProperties are:
> 
> if (SimpleInspector.this.state.controller != null)
> 	SimpleInspector.this.state.controller.refresh();
> 
> If I just comment them out everything seems to be just fine. There is 
> not problems with the display not refreshing whatsoever.
> 
> Strange enough this kind of endless loop does not happen with the 
> standard SimpleProperties generated by Reflection. There is some looping 
> going on but it stops after some rounds. There has to be some race 
> condition or something alike that by chance works out fine. Or is there 
> some other reason? I couldn't figure it out.
> 
> Any ideas? Maybe this is just a bug. Then it would be fine and 
> commenting out the two lines of code above would fix it.
> 
> regards
> roman
> 
> -------------------------
> Custom Properties code:
> -------------------------
> 
> package at.granul.mason
> 
> import scala.collection.mutable
> import java.lang.reflect.Method
> import sim.util.{Properties, Propertied}
> import scala.Boolean
> import java.lang.Class
> 
> import at.granul.mason.Property
> import java.text.NumberFormat
> 
> /**
>  * Created by Roman Seidl on 28.01.14.
>  */
> 
> trait DeclaredPropertied extends Propertied {
>   var ___properties = DeclaredProperties(this)
> 
>   override def properties(): Properties = ___properties
> 
>   def setProperties(p: PropertyElement*) : DeclaredProperties = 
> ___properties.setProperties(p :_*)
> 
> }
> 
> abstract class PropertyElement(nam: String){
>   val name = nam
> }
> 
> case class Property(override val name : String, var title : String = 
> null, var domain : AnyRef = null, var isReadOnly : Boolean = false) 
> extends PropertyElement(name) {
>   if (title == null)
>     title = name
> 
>   def dom(lower: Long, upper: Long) : Property = {
>     domain = new sim.util.Interval(lower, upper)
>     this
>   }
> 
>   def dom(lower: Double, upper: Double) : Property = {
>     domain = new sim.util.Interval(lower, upper)
>     this
>   }
> 
>   def dom(dom: Array[String]) : Property = {
>     domain = dom
>     this
>   }
> 
> 
>   def caption(tf : String) : Property = title(tf)
>   def text(tf : String) : Property = title(tf)
>   def title(tf : String) : Property = {
>     title = tf
>     this
>   }
> 
>   def readOnly = ro
>   def ro : Property = {
>     isReadOnly = true
>     this
>   }
> 
>   //override def toString: String = super.toString + " Domain: " + " 
> Domain: " + domain + " Field: " + targetField
> }
> 
> 
> case class DeclaredProperties(obj: Object, p : PropertyElement*) extends 
> sim.util.Properties {
> 
>   val propertyElements = mutable.Buffer[PropertyElement]()
>   val elements = mutable.Buffer[Property]()
>   this.setProperties(p :_*)
> 
>   var getMethods = mutable.Buffer[Method]()
>   var setMethods = mutable.Buffer[Method]()
> 
>   def setProperties(p : PropertyElement*) : DeclaredProperties = {
>     for (pe <- p.iterator)
>       this.+(pe)
>     this
>   }
> 
>   def +(prop : PropertyElement) : DeclaredProperties = {
>     propertyElements += prop
>     if( prop.isInstanceOf[Property]){
>       elements += prop.asInstanceOf[Property]
> 
>       val getMethodStub = obj.getClass.getMethods.find(m => {m.getName 
> == prop.name || m.getName == ("get" + prop.name.capitalize) || m.getName 
> == ("is" + prop.name.capitalize)})
>       val getMethod = if(getMethodStub != null) getMethodStub.get else null
>       getMethods += getMethod
> 
>       val setMethodStub = obj.getClass.getMethods.find(m => {(m.getName 
> == prop.name + "_$eq") || m.getName == ("set" + prop.name.capitalize)})
>       val setMethod = if(setMethodStub != null) setMethodStub.get else null
>       setMethods += setMethod
>     }
>     this
>   }
> 
> 
>   def numProperties(): Int = elements.size
> 
>   def isVolatile: Boolean = true
> 
> 
>   def getValue(index: Int): Object = {
>     val method = getMethods(index)
>     if(method != null) method.invoke(obj) else null
>   }
> 
>   def _setValue(index: Int, value: Object): Object = {
> /*    if(isReadWrite(index: Int))
>     {*/
>       var method = setMethods(index)
>       if(method != null) {
>         method.invoke(obj, value.asInstanceOf[AnyRef])
>         getValue(index)
>       } else null
> /*    }
>     getValue(index)*/
>   }
> 
>   override def getDomain(index: Int): AnyRef = elements(index).domain
> 
>   def isReadWrite(index: Int): Boolean = !elements(index).isReadOnly
> 
>   def getName(index: Int): String = elements(index).title
> 
>   def getType(index: Int): Class[_] = {
>     val method = getMethods(index)
>     if(method != null) method.getReturnType else null
>   }
> 
>   override def toString: String = super.toString + " obj: " + obj + " 
> elements:"+ propertyElements
> }