-/*******************************************************************************\r
- * Copyright (c) 2010 Association for Decentralized Information Management in\r
- * Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
+/*******************************************************************************
+ * Copyright (c) 2010 Association for Decentralized Information Management in
+ * Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
package org.simantics.databoard.accessor.java;
-import java.io.IOException;\r
-import java.util.Collection;\r
-import java.util.LinkedList;\r
-import java.util.List;\r
-import java.util.concurrent.Executor;\r
-import java.util.concurrent.locks.Lock;\r
-\r
-import org.simantics.databoard.accessor.Accessor;\r
-import org.simantics.databoard.accessor.ParametrisedAccessor;\r
-import org.simantics.databoard.accessor.error.AccessorConstructionException;\r
-import org.simantics.databoard.accessor.error.AccessorException;\r
-import org.simantics.databoard.accessor.error.ReferenceException;\r
-import org.simantics.databoard.accessor.event.Event;\r
-import org.simantics.databoard.accessor.event.InvalidatedEvent;\r
-import org.simantics.databoard.accessor.event.ValueAssigned;\r
-import org.simantics.databoard.accessor.impl.AccessorParams;\r
-import org.simantics.databoard.accessor.impl.ListenerEntry;\r
-import org.simantics.databoard.accessor.interestset.ByteInterestSet;\r
-import org.simantics.databoard.accessor.interestset.InterestSet;\r
-import org.simantics.databoard.accessor.reference.ChildReference;\r
-import org.simantics.databoard.adapter.AdaptException;\r
-import org.simantics.databoard.adapter.AdapterConstructionException;\r
-import org.simantics.databoard.binding.ArrayBinding;\r
-import org.simantics.databoard.binding.Binding;\r
-import org.simantics.databoard.binding.BooleanBinding;\r
-import org.simantics.databoard.binding.ByteBinding;\r
-import org.simantics.databoard.binding.DoubleBinding;\r
-import org.simantics.databoard.binding.FloatBinding;\r
-import org.simantics.databoard.binding.IntegerBinding;\r
-import org.simantics.databoard.binding.LongBinding;\r
-import org.simantics.databoard.binding.MapBinding;\r
-import org.simantics.databoard.binding.OptionalBinding;\r
-import org.simantics.databoard.binding.RecordBinding;\r
-import org.simantics.databoard.binding.StringBinding;\r
-import org.simantics.databoard.binding.UnionBinding;\r
-import org.simantics.databoard.binding.VariantBinding;\r
-import org.simantics.databoard.binding.error.BindingException;\r
-import org.simantics.databoard.type.Datatype;\r
+import java.io.IOException;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.concurrent.locks.Lock;
+
+import org.simantics.databoard.accessor.Accessor;
+import org.simantics.databoard.accessor.ParametrisedAccessor;
+import org.simantics.databoard.accessor.error.AccessorConstructionException;
+import org.simantics.databoard.accessor.error.AccessorException;
+import org.simantics.databoard.accessor.error.ReferenceException;
+import org.simantics.databoard.accessor.event.Event;
+import org.simantics.databoard.accessor.event.InvalidatedEvent;
+import org.simantics.databoard.accessor.event.ValueAssigned;
+import org.simantics.databoard.accessor.impl.AccessorParams;
+import org.simantics.databoard.accessor.impl.ListenerEntry;
+import org.simantics.databoard.accessor.interestset.ByteInterestSet;
+import org.simantics.databoard.accessor.interestset.InterestSet;
+import org.simantics.databoard.accessor.reference.ChildReference;
+import org.simantics.databoard.adapter.AdaptException;
+import org.simantics.databoard.adapter.AdapterConstructionException;
+import org.simantics.databoard.binding.ArrayBinding;
+import org.simantics.databoard.binding.Binding;
+import org.simantics.databoard.binding.BooleanBinding;
+import org.simantics.databoard.binding.ByteBinding;
+import org.simantics.databoard.binding.DoubleBinding;
+import org.simantics.databoard.binding.FloatBinding;
+import org.simantics.databoard.binding.IntegerBinding;
+import org.simantics.databoard.binding.LongBinding;
+import org.simantics.databoard.binding.MapBinding;
+import org.simantics.databoard.binding.OptionalBinding;
+import org.simantics.databoard.binding.RecordBinding;
+import org.simantics.databoard.binding.StringBinding;
+import org.simantics.databoard.binding.UnionBinding;
+import org.simantics.databoard.binding.VariantBinding;
+import org.simantics.databoard.binding.error.BindingException;
+import org.simantics.databoard.type.Datatype;
/**
* 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,
* you must notify the listeners of the accessor with {@link #notifyValueChanged()}.
- * <p>\r
- * If a lock is not provided, operations cannot be performed simulataneously \r
+ * <p>
+ * If a lock is not provided, operations cannot be performed simulataneously
* in multiple-threads.
*
* @author Toni Kalajainen <toni.kalajainen@vtt.fi>
/** Binding */
Binding binding;
/** Listeners */
- ListenerEntry listeners = null;\r
- /** Key in parent, index for fields/arrays, key for maps, */\r
- Object keyInParent = null;\r
- /** Accessor params, propagated to children */\r
+ ListenerEntry listeners = null;
+ /** Key in parent, index for fields/arrays, key for maps, */
+ Object keyInParent = null;
+ /** Accessor params, propagated to children */
AccessorParams params;
-\r
- /**\r
- * Create a new accessor to a Java Object.<p>\r
- * \r
- * Read and write locks may optionally be provided for locking mechanisms.\r
- * ReadWriteLock can be provied or a signle MutualExclusion lock. \r
- * \r
- * @param parent parent, or <tt>null</tt>\r
- * @param binding\r
- * @param initialValue the java object\r
- * @param params accessor params \r
+
+ /**
+ * Create a new accessor to a Java Object.<p>
+ *
+ * Read and write locks may optionally be provided for locking mechanisms.
+ * ReadWriteLock can be provied or a signle MutualExclusion lock.
+ *
+ * @param parent parent, or <tt>null</tt>
+ * @param binding
+ * @param initialValue the java object
+ * @param params accessor params
*/
public JavaObject(Accessor parent, Binding binding, Object initialValue, AccessorParams params) {
if (binding==null) throw new IllegalArgumentException("null arg");
this.parent = parent;
this.binding = binding;
- this.object = initialValue;\r
- this.params = params;\r
+ this.object = initialValue;
+ this.params = params;
}
/**
public Binding getBinding() {
return binding;
}
- \r
- @Override\r
- public AccessorParams getParams() {\r
- return params;\r
- }\r
+
+ @Override
+ public AccessorParams getParams() {
+ return params;
+ }
public Datatype type() {
return binding.type();
- }\r
- \r
- /**\r
- * Get lock if available. \r
- * \r
- * @return lock or <tt>null</tt>\r
- */\r
- public Lock getReadLock() {\r
- return params.readLock;\r
- }\r
- \r
- /**\r
- * Get lock if available. \r
- * \r
- * @return lock or <tt>null</tt>\r
- */\r
- public Lock getWriteLock() {\r
- return params.writeLock;\r
- }\r
+ }
+
+ /**
+ * Get lock if available.
+ *
+ * @return lock or <tt>null</tt>
+ */
+ public Lock getReadLock() {
+ return params.readLock;
+ }
+
+ /**
+ * Get lock if available.
+ *
+ * @return lock or <tt>null</tt>
+ */
+ public Lock getWriteLock() {
+ return params.writeLock;
+ }
-\r
- /**\r
- * Lock the lock if there is a lock.\r
- */\r
- protected void readLock() {\r
- if (params.readLock!=null) params.readLock.lock();\r
- }\r
- \r
- /**\r
- * Unlock the lock if one exists\r
- */\r
- protected void readUnlock() {\r
- if (params.readLock!=null) params.readLock.unlock();\r
- }\r
-\r
- /**\r
- * Lock the lock if there is a lock.\r
- */\r
- protected void writeLock() {\r
- if (params.writeLock!=null) params.writeLock.lock();\r
- }\r
- \r
- /**\r
- * Unlock the lock if one exists\r
- */\r
- protected void writeUnlock() {\r
- if (params.writeLock!=null) params.writeLock.unlock();\r
- }\r
+
+ /**
+ * Lock the lock if there is a lock.
+ */
+ protected void readLock() {
+ if (params.readLock!=null) params.readLock.lock();
+ }
+
+ /**
+ * Unlock the lock if one exists
+ */
+ protected void readUnlock() {
+ if (params.readLock!=null) params.readLock.unlock();
+ }
+
+ /**
+ * Lock the lock if there is a lock.
+ */
+ protected void writeLock() {
+ if (params.writeLock!=null) params.writeLock.lock();
+ }
+
+ /**
+ * Unlock the lock if one exists
+ */
+ protected void writeUnlock() {
+ if (params.writeLock!=null) params.writeLock.unlock();
+ }
@Override
- public Object getValue(Binding binding) throws AccessorException {\r
+ public Object getValue(Binding binding) throws AccessorException {
readLock();
- try {\r
-// return params.adapterScheme.getAdapter(this.binding, binding, true, true).adapt(object);\r
- if (binding == this.binding) {\r
- return binding.isImmutable() ? object : binding.clone(object);\r
- }\r
+ try {
+// return params.adapterScheme.getAdapter(this.binding, binding, true, true).adapt(object);
+ if (binding == this.binding) {
+ return binding.isImmutable() ? object : binding.clone(object);
+ }
return adapt(object, this.binding, binding);
} catch (AdaptException e) {
throw new AccessorException(e);
- } catch (AdapterConstructionException e) {\r
- throw new AccessorException(e);\r
- } finally {\r
- readUnlock();\r
+ } catch (AdapterConstructionException e) {
+ throw new AccessorException(e);
+ } finally {
+ readUnlock();
+ }
+ }
+
+
+ @Override
+ public void getValue(Binding binding, Object obj) throws AccessorException {
+ readLock();
+ try {
+ this.binding.readFrom(this.binding, object, obj);
+ } catch (BindingException e) {
+ throw new AccessorException(e);
+ } finally {
+ readLock();
+ }
+ }
+
+ @Override
+ public boolean getValue(ChildReference path, Binding binding, Object obj) throws AccessorException {
+ try {
+ Accessor a = getComponent(path);
+ a.getValue(binding, obj);
+ return true;
+ } catch (ReferenceException re) {
+ return false;
+ } catch (AccessorConstructionException e) {
+ throw new AccessorException(e);
+ }
+ }
+
+ public Object getValue(ChildReference path, Binding binding) throws AccessorException {
+ try {
+ Accessor a = getComponent(path);
+ return a.getValue(binding);
+ } catch (ReferenceException re) {
+ return null;
+ } catch (AccessorConstructionException e) {
+ throw new AccessorException(e);
+ }
+ }
+
+ public boolean setValue(ChildReference path, Binding binding, Object obj) throws AccessorException {
+ try {
+ Accessor a = getComponent(path);
+ a.setValue(binding, obj);
+ return true;
+ } catch (ReferenceException re) {
+ return false;
+ } catch (AccessorConstructionException e) {
+ throw new AccessorException(e);
}
- }\r
- \r
- \r
- @Override\r
- public void getValue(Binding binding, Object obj) throws AccessorException {\r
- readLock();\r
- try {\r
- this.binding.readFrom(this.binding, object, obj);\r
- } catch (BindingException e) {\r
- throw new AccessorException(e);\r
- } finally {\r
- readLock();\r
- }\r
- }\r
- \r
- @Override\r
- public boolean getValue(ChildReference path, Binding binding, Object obj) throws AccessorException {\r
- try {\r
- Accessor a = getComponent(path);\r
- a.getValue(binding, obj);\r
- return true;\r
- } catch (ReferenceException re) {\r
- return false;\r
- } catch (AccessorConstructionException e) {\r
- throw new AccessorException(e);\r
- }\r
- } \r
- \r
- public Object getValue(ChildReference path, Binding binding) throws AccessorException {\r
- try {\r
- Accessor a = getComponent(path);\r
- return a.getValue(binding);\r
- } catch (ReferenceException re) {\r
- return null;\r
- } catch (AccessorConstructionException e) {\r
- throw new AccessorException(e);\r
- }\r
- }\r
- \r
- public boolean setValue(ChildReference path, Binding binding, Object obj) throws AccessorException {\r
- try {\r
- Accessor a = getComponent(path);\r
- a.setValue(binding, obj);\r
- return true;\r
- } catch (ReferenceException re) {\r
- return false;\r
- } catch (AccessorConstructionException e) {\r
- throw new AccessorException(e);\r
- }\r
- }\r
- \r
- Object adapt(Object value, Binding domain, Binding range) throws AdaptException, AdapterConstructionException {\r
- return params.adapterScheme.getAdapter(domain, range, true, false).adapt(value);\r
+ }
+
+ Object adapt(Object value, Binding domain, Binding range) throws AdaptException, AdapterConstructionException {
+ return params.adapterScheme.getAdapter(domain, range, true, false).adapt(value);
}
@Override
public void removeListener(Listener listener) throws AccessorException {
detachListener(listener);
}
- \r
- public static JavaObject createAccessor(Accessor parent, Binding b, Object v, AccessorParams params) throws AccessorConstructionException {\r
- return createSubAccessor(parent, b, v, params);\r
- }\r
- \r
+
+ public static JavaObject createAccessor(Accessor parent, Binding b, Object v, AccessorParams params) throws AccessorConstructionException {
+ return createSubAccessor(parent, b, v, params);
+ }
+
public static JavaObject createSubAccessor(Accessor parent, Binding b, Object v, AccessorParams params)
throws AccessorConstructionException {
if (b instanceof BooleanBinding) {
if (b instanceof FloatBinding) {
return new JavaFloat(parent, (FloatBinding)b, v, params);
}
- if (b instanceof DoubleBinding) {\r
- return new JavaDouble(parent, (DoubleBinding)b, v, params);\r
+ if (b instanceof DoubleBinding) {
+ return new JavaDouble(parent, (DoubleBinding)b, v, params);
}
if (b instanceof StringBinding) {
return new JavaString(parent, (StringBinding)b, v, params);
/**
* Apply a change set that has events for the particular accessor.
- * There are no sub-accessor in the path of the event.\r
+ * There are no sub-accessor in the path of the event.
* This is called within lock.
*
* @param cs
abstract Event applyLocal(Event e, boolean makeRollback) throws AccessorException;
@Override
- public void apply(List<Event> cs, LinkedList<Event> rollback) throws AccessorException {\r
+ public void apply(List<Event> cs, LinkedList<Event> rollback) throws AccessorException {
writeLock();
try {
boolean makeRollback = rollback != null;
}
} catch (AccessorConstructionException ae) {
throw new AccessorException(ae);
- } finally {\r
- writeUnlock();\r
+ } finally {
+ writeUnlock();
}
}
} catch (BindingException e) {
return "Java(error="+e.getMessage()+")";
}
- }\r
- \r
- /**\r
- * The Java Object was changed by means other than Accessor.\r
- * ValueAssigned event is emited to listeners. \r
- */\r
- public void notifyValueChanged() {\r
- // Notify\r
- ListenerEntry le = listeners;\r
- while (le!=null) {\r
- ByteInterestSet is = le.getInterestSet();\r
- if (is.inNotifications()) {\r
- Event e = new ValueAssigned( binding, object );\r
- emitEvent(le, e);\r
- }\r
- le = le.next;\r
- } \r
- } \r
-\r
- protected void emitEvent(ListenerEntry le, Event e) { \r
- e.reference = ChildReference.concatenate(le.path, e.reference);\r
- le.emitEvent(e);\r
- } \r
-\r
- protected void emitEvents(ListenerEntry le, Collection<Event> events) {\r
- for (Event e : events)\r
- e.reference = ChildReference.concatenate(le.path, e.reference);\r
- le.emitEvents(events);\r
- } \r
+ }
+
+ /**
+ * The Java Object was changed by means other than Accessor.
+ * ValueAssigned event is emited to listeners.
+ */
+ public void notifyValueChanged() {
+ // Notify
+ ListenerEntry le = listeners;
+ while (le!=null) {
+ ByteInterestSet is = le.getInterestSet();
+ if (is.inNotifications()) {
+ Event e = new ValueAssigned( binding, object );
+ emitEvent(le, e);
+ }
+ le = le.next;
+ }
+ }
+
+ protected void emitEvent(ListenerEntry le, Event e) {
+ e.reference = ChildReference.concatenate(le.path, e.reference);
+ le.emitEvent(e);
+ }
+
+ protected void emitEvents(ListenerEntry le, Collection<Event> events) {
+ for (Event e : events)
+ e.reference = ChildReference.concatenate(le.path, e.reference);
+ le.emitEvents(events);
+ }
}