X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.databoard%2Fsrc%2Forg%2Fsimantics%2Fdataboard%2Faccessor%2Fjava%2FJavaObject.java;h=38b5001e2a24dc2eb6b3d42b757985f17f456582;hb=refs%2Fchanges%2F15%2F3015%2F1;hp=f5a0d334a3afd597deb9a3eafb16ae4a22f2f088;hpb=969bd23cab98a79ca9101af33334000879fb60c5;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.databoard/src/org/simantics/databoard/accessor/java/JavaObject.java b/bundles/org.simantics.databoard/src/org/simantics/databoard/accessor/java/JavaObject.java index f5a0d334a..38b5001e2 100644 --- a/bundles/org.simantics.databoard/src/org/simantics/databoard/accessor/java/JavaObject.java +++ b/bundles/org.simantics.databoard/src/org/simantics/databoard/accessor/java/JavaObject.java @@ -1,54 +1,54 @@ -/******************************************************************************* - * 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 - *******************************************************************************/ +/******************************************************************************* + * 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; -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; +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. @@ -56,8 +56,8 @@ import org.simantics.databoard.type.Datatype; * 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()}. - *

- * If a lock is not provided, operations cannot be performed simulataneously + *

+ * If a lock is not provided, operations cannot be performed simulataneously * in multiple-threads. * * @author Toni Kalajainen @@ -75,29 +75,29 @@ public abstract class JavaObject implements Accessor, ParametrisedAccessor { /** Binding */ Binding binding; /** Listeners */ - ListenerEntry listeners = null; - /** Key in parent, index for fields/arrays, key for maps, */ - Object keyInParent = null; - /** Accessor params, propagated to children */ + ListenerEntry listeners = null; + /** Key in parent, index for fields/arrays, key for maps, */ + Object keyInParent = null; + /** Accessor params, propagated to children */ AccessorParams params; - - /** - * Create a new accessor to a Java Object.

- * - * Read and write locks may optionally be provided for locking mechanisms. - * ReadWriteLock can be provied or a signle MutualExclusion lock. - * - * @param parent parent, or null - * @param binding - * @param initialValue the java object - * @param params accessor params + + /** + * Create a new accessor to a Java Object.

+ * + * Read and write locks may optionally be provided for locking mechanisms. + * ReadWriteLock can be provied or a signle MutualExclusion lock. + * + * @param parent parent, or null + * @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; - this.params = params; + this.object = initialValue; + this.params = params; } /** @@ -112,132 +112,132 @@ public abstract class JavaObject implements Accessor, ParametrisedAccessor { public Binding getBinding() { return binding; } - - @Override - public AccessorParams getParams() { - return params; - } + + @Override + public AccessorParams getParams() { + return params; + } public Datatype type() { return binding.type(); - } - - /** - * Get lock if available. - * - * @return lock or null - */ - public Lock getReadLock() { - return params.readLock; - } - - /** - * Get lock if available. - * - * @return lock or null - */ - public Lock getWriteLock() { - return params.writeLock; - } + } + + /** + * Get lock if available. + * + * @return lock or null + */ + public Lock getReadLock() { + return params.readLock; + } + + /** + * Get lock if available. + * + * @return lock or null + */ + public Lock getWriteLock() { + return params.writeLock; + } - - /** - * 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(); - } + + /** + * 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 { + public Object getValue(Binding binding) throws AccessorException { readLock(); - try { -// return params.adapterScheme.getAdapter(this.binding, binding, true, true).adapt(object); - if (binding == this.binding) { - return binding.isImmutable() ? object : binding.clone(object); - } + 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) { - throw new AccessorException(e); - } finally { - readUnlock(); + } 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); } - } - - - @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); - } - } - - Object adapt(Object value, Binding domain, Binding range) throws AdaptException, AdapterConstructionException { - return params.adapterScheme.getAdapter(domain, range, true, false).adapt(value); + } + + Object adapt(Object value, Binding domain, Binding range) throws AdaptException, AdapterConstructionException { + return params.adapterScheme.getAdapter(domain, range, true, false).adapt(value); } @Override @@ -270,11 +270,11 @@ public abstract class JavaObject implements Accessor, ParametrisedAccessor { public void removeListener(Listener listener) throws AccessorException { detachListener(listener); } - - public static JavaObject createAccessor(Accessor parent, Binding b, Object v, AccessorParams params) throws AccessorConstructionException { - return createSubAccessor(parent, b, v, params); - } - + + 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) { @@ -292,8 +292,8 @@ public abstract class JavaObject implements Accessor, ParametrisedAccessor { if (b instanceof FloatBinding) { return new JavaFloat(parent, (FloatBinding)b, v, params); } - if (b instanceof DoubleBinding) { - return new JavaDouble(parent, (DoubleBinding)b, v, params); + if (b instanceof DoubleBinding) { + return new JavaDouble(parent, (DoubleBinding)b, v, params); } if (b instanceof StringBinding) { return new JavaString(parent, (StringBinding)b, v, params); @@ -336,7 +336,7 @@ public abstract class JavaObject implements Accessor, ParametrisedAccessor { /** * Apply a change set that has events for the particular accessor. - * There are no sub-accessor in the path of the event. + * There are no sub-accessor in the path of the event. * This is called within lock. * * @param cs @@ -347,7 +347,7 @@ public abstract class JavaObject implements Accessor, ParametrisedAccessor { abstract Event applyLocal(Event e, boolean makeRollback) throws AccessorException; @Override - public void apply(List cs, LinkedList rollback) throws AccessorException { + public void apply(List cs, LinkedList rollback) throws AccessorException { writeLock(); try { boolean makeRollback = rollback != null; @@ -363,8 +363,8 @@ public abstract class JavaObject implements Accessor, ParametrisedAccessor { } } catch (AccessorConstructionException ae) { throw new AccessorException(ae); - } finally { - writeUnlock(); + } finally { + writeUnlock(); } } @@ -377,35 +377,35 @@ public abstract class JavaObject implements Accessor, ParametrisedAccessor { } catch (BindingException e) { return "Java(error="+e.getMessage()+")"; } - } - - /** - * 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 events) { - for (Event e : events) - e.reference = ChildReference.concatenate(le.path, e.reference); - le.emitEvents(events); - } + } + + /** + * 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 events) { + for (Event e : events) + e.reference = ChildReference.concatenate(le.path, e.reference); + le.emitEvents(events); + } }