-/*******************************************************************************\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.binding;
-import java.util.Collection;\r
-import java.util.IdentityHashMap;\r
-import java.util.Iterator;\r
-import java.util.Set;\r
-\r
-import org.simantics.databoard.Bindings;\r
-import org.simantics.databoard.accessor.reference.ChildReference;\r
-import org.simantics.databoard.accessor.reference.IndexReference;\r
-import org.simantics.databoard.accessor.reference.LabelReference;\r
-import org.simantics.databoard.adapter.AdaptException;\r
-import org.simantics.databoard.adapter.Adapter;\r
-import org.simantics.databoard.adapter.AdapterConstructionException;\r
-import org.simantics.databoard.binding.error.BindingException;\r
-import org.simantics.databoard.binding.error.RuntimeBindingException;\r
-import org.simantics.databoard.binding.impl.ArrayListBinding;\r
-import org.simantics.databoard.binding.impl.BindingPrintContext;\r
-import org.simantics.databoard.binding.impl.ByteArrayBinding;\r
-import org.simantics.databoard.binding.impl.DoubleArrayBinding;\r
-import org.simantics.databoard.binding.impl.FloatArrayBinding;\r
-import org.simantics.databoard.binding.impl.IntArrayBinding;\r
-import org.simantics.databoard.binding.impl.LinkedListBinding;\r
-import org.simantics.databoard.binding.impl.LongArrayBinding;\r
-import org.simantics.databoard.binding.impl.ObjectArrayBinding;\r
-import org.simantics.databoard.type.ArrayType;\r
-import org.simantics.databoard.util.IdentityPair;\r
-import org.simantics.databoard.util.Range;\r
+import java.util.Collection;
+import java.util.IdentityHashMap;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.simantics.databoard.Bindings;
+import org.simantics.databoard.accessor.reference.ChildReference;
+import org.simantics.databoard.accessor.reference.IndexReference;
+import org.simantics.databoard.accessor.reference.LabelReference;
+import org.simantics.databoard.adapter.AdaptException;
+import org.simantics.databoard.adapter.Adapter;
+import org.simantics.databoard.adapter.AdapterConstructionException;
+import org.simantics.databoard.binding.error.BindingException;
+import org.simantics.databoard.binding.error.RuntimeBindingException;
+import org.simantics.databoard.binding.impl.ArrayListBinding;
+import org.simantics.databoard.binding.impl.BindingPrintContext;
+import org.simantics.databoard.binding.impl.ByteArrayBinding;
+import org.simantics.databoard.binding.impl.DoubleArrayBinding;
+import org.simantics.databoard.binding.impl.FloatArrayBinding;
+import org.simantics.databoard.binding.impl.IntArrayBinding;
+import org.simantics.databoard.binding.impl.LinkedListBinding;
+import org.simantics.databoard.binding.impl.LongArrayBinding;
+import org.simantics.databoard.binding.impl.ObjectArrayBinding;
+import org.simantics.databoard.type.ArrayType;
+import org.simantics.databoard.util.IdentityPair;
+import org.simantics.databoard.util.Range;
/**
* This is a binding of Array type and a Java Object.
*
- * @see ArrayType\r
- * @see ArrayListBinding for Binding of java.util.ArrayList<?>\r
- * @see LinkedListBinding for Binding of java.util.LinkedList<?>\r
- * @see ObjectArrayBinding for Binding of Object[]\r
- * @see IntArrayBinding for primitive array int[] binding\r
- * @see ByteArrayBinding for primitive array byte[] binding\r
- * @see LongArrayBinding for primitive array long[] binding\r
- * @see DoubleArrayBinding for primitive array double[] binding\r
- * @see FloatArrayBinding for primitive array float[] binding \r
+ * @see ArrayType
+ * @see ArrayListBinding for Binding of java.util.ArrayList<?>
+ * @see LinkedListBinding for Binding of java.util.LinkedList<?>
+ * @see ObjectArrayBinding for Binding of Object[]
+ * @see IntArrayBinding for primitive array int[] binding
+ * @see ByteArrayBinding for primitive array byte[] binding
+ * @see LongArrayBinding for primitive array long[] binding
+ * @see DoubleArrayBinding for primitive array double[] binding
+ * @see FloatArrayBinding for primitive array float[] binding
* @author Toni Kalajainen <toni.kalajainen@vtt.fi>
*/
public abstract class ArrayBinding extends Binding {
this.componentBinding = componentBinding;
this.type = type;
}
- \r
- @Override\r
- public Binding getComponentBinding(ChildReference path) {\r
- if (path==null) return this; \r
- if (path instanceof org.simantics.databoard.accessor.reference.ComponentReference) {\r
- return componentBinding.getComponentBinding(path.childReference);\r
- }\r
- if (path instanceof IndexReference) {\r
- IndexReference ir = (IndexReference) path; \r
- if (ir.index == 0) { \r
- return componentBinding.getComponentBinding(path.childReference);\r
- }\r
- }\r
- if (path instanceof LabelReference) {\r
- LabelReference lr = (LabelReference) path;\r
- if (lr.label.equals("v")) { \r
- return componentBinding.getComponentBinding(path.childReference);\r
- }\r
- }\r
- throw new IllegalArgumentException();\r
- }\r
+
+ @Override
+ public Binding getComponentBinding(ChildReference path) {
+ if (path==null) return this;
+ if (path instanceof org.simantics.databoard.accessor.reference.ComponentReference) {
+ return componentBinding.getComponentBinding(path.childReference);
+ }
+ if (path instanceof IndexReference) {
+ IndexReference ir = (IndexReference) path;
+ if (ir.index == 0) {
+ return componentBinding.getComponentBinding(path.childReference);
+ }
+ }
+ if (path instanceof LabelReference) {
+ LabelReference lr = (LabelReference) path;
+ if (lr.label.equals("v")) {
+ return componentBinding.getComponentBinding(path.childReference);
+ }
+ }
+ throw new IllegalArgumentException();
+ }
/**
* Returns true if array length can be modified.
@Override
public boolean isImmutable() {
return super.isImmutable();
- }\r
- \r
- /**\r
- * Return true if the array's size can be adjusted and false if not\r
- * \r
- * @return true if array is resizable\r
- */\r
- public abstract boolean isResizable();\r
+ }
+
+ /**
+ * Return true if the array's size can be adjusted and false if not
+ *
+ * @return true if array is resizable
+ */
+ public abstract boolean isResizable();
@Override
public ArrayType type() {
* @return new instance
*/
public abstract Object create(int length, Iterator<Object> values)
- throws BindingException;\r
- \r
- /**\r
- * \r
- * @param length\r
- * @return array\r
- * @throws BindingException\r
- */\r
- public Object create(int length) throws BindingException\r
- {\r
- try {\r
- return create(length, new Iterator<Object>() {\r
- @Override\r
- public boolean hasNext() {\r
- return true;\r
- }\r
- \r
- @Override\r
- public Object next() {\r
- try {\r
- return componentBinding.createDefault();\r
- } catch (BindingException e) {\r
- throw new RuntimeBindingException(e);\r
- }\r
- }\r
- \r
- @Override\r
- public void remove() {\r
- }});\r
- } catch (RuntimeBindingException e) {\r
- throw e.getCause();\r
- }\r
+ throws BindingException;
+
+ /**
+ *
+ * @param length
+ * @return array
+ * @throws BindingException
+ */
+ public Object create(int length) throws BindingException
+ {
+ try {
+ return create(length, new Iterator<Object>() {
+ @Override
+ public boolean hasNext() {
+ return true;
+ }
+
+ @Override
+ public Object next() {
+ try {
+ return componentBinding.createDefault();
+ } catch (BindingException e) {
+ throw new RuntimeBindingException(e);
+ }
+ }
+
+ @Override
+ public void remove() {
+ }});
+ } catch (RuntimeBindingException e) {
+ throw e.getCause();
+ }
}
/**
} catch (BindingException e) {
throw new RuntimeBindingException(e);
}
- }\r
-\r
- @Override\r
- public void readFrom(Binding srcBinding, Object src, Object dst)\r
- throws BindingException {\r
- \r
- try {\r
- \r
- // Src Binding\r
- ArrayBinding sb = (ArrayBinding) srcBinding;\r
- // Src Component Binding\r
- Binding scb = sb.getComponentBinding();\r
- \r
- // Dst Component Binding\r
- Binding dcb = getComponentBinding();\r
- \r
- int newLen = sb.size(src);\r
- int oldLen = size(dst);\r
- boolean cbImmutable = dcb.isImmutable();\r
- Adapter cloner = cbImmutable ? Bindings.adapterFactory.getAdapter(scb, dcb, false, true) : null;\r
- \r
- // Set elements\r
- for (int i=0; i<newLen; i++) {\r
- if (cbImmutable) {\r
- // Create new instance\r
- Object sc = sb.get(src, i);\r
- Object dc = cloner.adapt(sc);\r
- if (i<oldLen) set(dst, i, dc); else add(dst, dc); \r
- } else \r
- if (i<oldLen) {\r
- // Read over old instance\r
- Object dc = get(dst, i);\r
- Object sc = sb.get(src, i);\r
- dc = dcb.readFromTry(scb, sc, dc);\r
- // Safety-writeback - clone/reference nature of get is unknown\r
- set(dst, i, dc);\r
- } else {\r
- // New instance\r
- Object sc = sb.get(src, i);\r
- Object dc = dcb.createDefault();\r
- dc = dcb.readFromTry(scb, sc, dc);\r
- add(dst, dc);\r
- }\r
- }\r
- \r
- // Remove excess elements\r
- if (oldLen>newLen) {\r
- setSize(dst, newLen);\r
- }\r
- \r
- if (!Bindings.equals(srcBinding, src, this, dst))\r
- throw new BindingException("internal error");\r
-\r
- } catch (AdaptException e) {\r
- throw new BindingException(e);\r
- } catch (AdapterConstructionException e) {\r
- throw new BindingException(e);\r
- }\r
- \r
- } \r
-\r
+ }
+
+ @Override
+ public void readFrom(Binding srcBinding, Object src, Object dst)
+ throws BindingException {
+
+ try {
+
+ // Src Binding
+ ArrayBinding sb = (ArrayBinding) srcBinding;
+ // Src Component Binding
+ Binding scb = sb.getComponentBinding();
+
+ // Dst Component Binding
+ Binding dcb = getComponentBinding();
+
+ int newLen = sb.size(src);
+ int oldLen = size(dst);
+ boolean cbImmutable = dcb.isImmutable();
+ Adapter cloner = cbImmutable ? Bindings.adapterFactory.getAdapter(scb, dcb, false, true) : null;
+
+ // Set elements
+ for (int i=0; i<newLen; i++) {
+ if (cbImmutable) {
+ // Create new instance
+ Object sc = sb.get(src, i);
+ Object dc = cloner.adapt(sc);
+ if (i<oldLen) set(dst, i, dc); else add(dst, dc);
+ } else
+ if (i<oldLen) {
+ // Read over old instance
+ Object dc = get(dst, i);
+ Object sc = sb.get(src, i);
+ dc = dcb.readFromTry(scb, sc, dc);
+ // Safety-writeback - clone/reference nature of get is unknown
+ set(dst, i, dc);
+ } else {
+ // New instance
+ Object sc = sb.get(src, i);
+ Object dc = dcb.createDefault();
+ dc = dcb.readFromTry(scb, sc, dc);
+ add(dst, dc);
+ }
+ }
+
+ // Remove excess elements
+ if (oldLen>newLen) {
+ setSize(dst, newLen);
+ }
+
+ if (!Bindings.equals(srcBinding, src, this, dst))
+ throw new BindingException("internal error");
+
+ } catch (AdaptException e) {
+ throw new BindingException(e);
+ } catch (AdapterConstructionException e) {
+ throw new BindingException(e);
+ }
+
+ }
+
public void add(Object array, Object element) throws BindingException
{
public abstract void remove(Object array, int index, int count) throws BindingException, IndexOutOfBoundsException;
public abstract Object get(Object array, int index) throws BindingException, IndexOutOfBoundsException;
public abstract void getAll(Object array, Object[] result) throws BindingException;
- public abstract void set(Object array, int index, Object value) throws BindingException;\r
+ public abstract void set(Object array, int index, Object value) throws BindingException;
public abstract void setSize(Object array, int newSize) throws BindingException;
public abstract int size(Object array) throws BindingException;
}
return 0;
}
-\r
- @Override\r
- protected void toString(Object value, BindingPrintContext ctx) throws BindingException {\r
- Binding componentBinding = getComponentBinding();\r
- ctx.b.append('[');\r
- int size = size(value);\r
- boolean numberArray = componentBinding instanceof NumberBinding;\r
- boolean hasMany = size > 1;\r
- for(int i=0;i<size;++i) {\r
- if(i>0) {\r
- ctx.b.append(", ");\r
- if ( hasMany && !numberArray && !ctx.singleLine ) {\r
- ctx.b.append("\n");\r
- }\r
- }\r
- componentBinding.toString(get(value, i), ctx);\r
- }\r
- ctx.b.append(']');\r
- }\r
- \r
- /**\r
- * Get the number of component bindings\r
- */\r
- @Override\r
- public int getComponentCount() {\r
- return 1;\r
- }\r
- \r
- @Override\r
- public Binding getComponentBinding(int index) {\r
- if (index!=0) throw new IllegalArgumentException();\r
- return componentBinding;\r
- }\r
-\r
- @Override\r
- protected boolean deepEquals(Object obj,\r
- Set<IdentityPair<Binding, Binding>> compareHistory) {\r
- return super.deepEquals( obj, compareHistory ) && componentBinding.equals(((ArrayBinding)obj).componentBinding, compareHistory);\r
- }\r
- \r
- @Override\r
- public int deepHashCode(IdentityHashMap<Object, Object> hashedObjects) {\r
- return super.deepHashCode(hashedObjects) + 13 * componentBinding.hashCode(hashedObjects);\r
- }\r
+
+ @Override
+ protected void toString(Object value, BindingPrintContext ctx) throws BindingException {
+ Binding componentBinding = getComponentBinding();
+ ctx.b.append('[');
+ int size = size(value);
+ boolean numberArray = componentBinding instanceof NumberBinding;
+ boolean hasMany = size > 1;
+ for(int i=0;i<size;++i) {
+ if(i>0) {
+ ctx.b.append(", ");
+ if ( hasMany && !numberArray && !ctx.singleLine ) {
+ ctx.b.append("\n");
+ }
+ }
+ componentBinding.toString(get(value, i), ctx);
+ }
+ ctx.b.append(']');
+ }
+
+ /**
+ * Get the number of component bindings
+ */
+ @Override
+ public int getComponentCount() {
+ return 1;
+ }
+
+ @Override
+ public Binding getComponentBinding(int index) {
+ if (index!=0) throw new IllegalArgumentException();
+ return componentBinding;
+ }
+
+ @Override
+ protected boolean deepEquals(Object obj,
+ Set<IdentityPair<Binding, Binding>> compareHistory) {
+ return super.deepEquals( obj, compareHistory ) && componentBinding.equals(((ArrayBinding)obj).componentBinding, compareHistory);
+ }
+
+ @Override
+ public int deepHashCode(IdentityHashMap<Object, Object> hashedObjects) {
+ return super.deepHashCode(hashedObjects) + 13 * componentBinding.hashCode(hashedObjects);
+ }
}