org.simantics.databoard.accessor.java
Class JavaObject

java.lang.Object
  extended by org.simantics.databoard.accessor.java.JavaObject
All Implemented Interfaces:
Accessor
Direct Known Subclasses:
JavaArray, JavaBoolean, JavaByte, JavaDouble, JavaFloat, JavaInteger, JavaLong, JavaMap, JavaOptional, JavaRecord, JavaString, JavaUnion, JavaVariant

public abstract class JavaObject
extends java.lang.Object
implements Accessor

Accessor to a Java Object.

The monitoring contract forbids modifications to the object outside this accessor object. If you do modifications to the value using other mechanisms, do not use the listening mechanism.

Operations cannot be performed safely in multi-threaded environment. The caller must provide external synchronization protection, not just to one object but the whole accessor tree.

Author:
Toni Kalajainen

Nested Class Summary
 
Nested classes/interfaces inherited from interface org.simantics.databoard.accessor.Accessor
Accessor.Listener
 
Constructor Summary
JavaObject(JavaObject parent, Binding binding, java.lang.Object initialValue)
           
 
Method Summary
 void addListener(Accessor.Listener listener, InterestSet interestSet, AccessorReference path)
          Place a listener to an accessor node.
 void apply(java.util.List<Event> cs, java.util.LinkedList<Event> rollback)
          Apply a change set in a single transaction operation.
static JavaObject createAccessor(Binding b, java.lang.Object v)
           
 Binding getBinding()
           
 java.lang.Object getObject()
          Get the Java Object
 java.lang.Object getValue(Binding binding)
          Get a snapshot of the object model as a single data value.
 void removeListener(Accessor.Listener listener)
          Remove a listener.
 java.lang.String toString()
           
 DataType type()
          Get structural represtentation of the accessor presented in databoard's type system format.
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface org.simantics.databoard.accessor.Accessor
getAccessor, setValue
 

Constructor Detail

JavaObject

public JavaObject(JavaObject parent,
                  Binding binding,
                  java.lang.Object initialValue)
Method Detail

getObject

public java.lang.Object getObject()
Get the Java Object

Returns:
Object

getBinding

public Binding getBinding()

type

public DataType type()
Description copied from interface: Accessor
Get structural represtentation of the accessor presented in databoard's type system format.

Specified by:
type in interface Accessor
Returns:
type description

getValue

public java.lang.Object getValue(Binding binding)
                          throws AccessorException
Description copied from interface: Accessor
Get a snapshot of the object model as a single data value.

Specified by:
getValue in interface Accessor
Returns:
the value
Throws:
AccessorException

addListener

public void addListener(Accessor.Listener listener,
                        InterestSet interestSet,
                        AccessorReference path)
                 throws AccessorException
Description copied from interface: Accessor
Place a listener to an accessor node. The listener will be notified for changes in the node or posssibly its decendant nodes, depending on interest set.

The synchronization contract is implementation specific, so read the document. A common contract is that the listener object must not make modifications to the accessor within the handle event function. The correct strategy is to collect events and mutate the accessor afterwards.

Each event instance spawned by the listener, is annotated with a reference that describes the reference path of the node to which the event applies to. The path originates from the node where the listener was placed.

Listener is attached to the container that holds the value at the time at the of the adding. For example, If a listener is attached to an array of element at index 3, and a new value is inserted at position 2, the listener still monitors the same container, which is now at index 4. The references of incoming the events are modified to have the new index.

Also, if a new value is assigned to the parent of an object that is listened, the listener keeps on monitoring the new value at the same reference. This doesn't apply when a new value is set to a union of different tag, to a variant with a new type, or value is removed from Optional type. In these two cases the listener is invalidated.

See ChangeSet is an implementation that collects events.

Specified by:
addListener in interface Accessor
path - path to the accessor or null. This is used in the events the accessor produces
Throws:
AccessorException
See Also:
collects events

removeListener

public void removeListener(Accessor.Listener listener)
                    throws AccessorException
Description copied from interface: Accessor
Remove a listener. If the listener is added multiple times, the last one added is removed.

Specified by:
removeListener in interface Accessor
Throws:
AccessorException

createAccessor

public static JavaObject createAccessor(Binding b,
                                        java.lang.Object v)
                                 throws AccessorConstructionException
Throws:
AccessorConstructionException

apply

public void apply(java.util.List<Event> cs,
                  java.util.LinkedList<Event> rollback)
           throws AccessorException
Description copied from interface: Accessor
Apply a change set in a single transaction operation. If rollback log is supplied, it is filled with reverse events. If the operation fails, rollback log can be applied to cancel changes.

Specified by:
apply in interface Accessor
rollback - log to be filled with rollback events or null
Throws:
AccessorException - failed to apply change set

toString

public java.lang.String toString()
Overrides:
toString in class java.lang.Object