-/*******************************************************************************\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.IdentityHashMap;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Map.Entry;\r
-import java.util.Set;\r
-import java.util.TreeMap;\r
-import java.util.TreeSet;\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.accessor.reference.NameReference;\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.BindingPrintContext;\r
-import org.simantics.databoard.type.MapType;\r
-import org.simantics.databoard.util.IdentityPair;\r
+import java.util.IdentityHashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+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.accessor.reference.NameReference;
+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.BindingPrintContext;
+import org.simantics.databoard.type.MapType;
+import org.simantics.databoard.util.IdentityPair;
/**
* This is a binding of Map Type and a Java Object
public abstract Object[] getKeys(Object map) throws BindingException;
public abstract void getKeys(Object map, Set<Object> keys) throws BindingException;
- \r
- /**\r
- * Count the number of entries between two keyes\r
- * \r
- * @param src\r
- * @param from\r
- * @param fromInclusive\r
- * @param end \r
- * @param endInclusive\r
- * @throws BindingException\r
- */\r
- public abstract int count(Object src, Object from, boolean fromInclusive, Object end, boolean endInclusive) throws BindingException;\r
- \r
- /**\r
- * Read a range of entries\r
- * \r
- * @param src\r
- * @param from\r
- * @param fromInclusive\r
- * @param end \r
- * @param endInclusive\r
- * @param dstKeyArrayBinding\r
- * @param dstKeyArray\r
- * @param dstValueArrayBinding\r
- * @param dstValueArray\r
- * @param resultLimit maximum number of entries to read, -1 for no limit\r
- * @return the number of entries read \r
- * @throws BindingException\r
- */\r
- public abstract int getEntries(\r
- Object src, \r
- Object from, boolean fromInclusive, Object end, boolean endInclusive, \r
- ArrayBinding dstKeyArrayBinding, Object dstKeyArray, \r
- ArrayBinding dstValueArrayBinding, Object dstValueArray, \r
- int resultLimit) throws BindingException;\r
+
+ /**
+ * Count the number of entries between two keyes
+ *
+ * @param src
+ * @param from
+ * @param fromInclusive
+ * @param end
+ * @param endInclusive
+ * @throws BindingException
+ */
+ public abstract int count(Object src, Object from, boolean fromInclusive, Object end, boolean endInclusive) throws BindingException;
+
+ /**
+ * Read a range of entries
+ *
+ * @param src
+ * @param from
+ * @param fromInclusive
+ * @param end
+ * @param endInclusive
+ * @param dstKeyArrayBinding
+ * @param dstKeyArray
+ * @param dstValueArrayBinding
+ * @param dstValueArray
+ * @param resultLimit maximum number of entries to read, -1 for no limit
+ * @return the number of entries read
+ * @throws BindingException
+ */
+ public abstract int getEntries(
+ Object src,
+ Object from, boolean fromInclusive, Object end, boolean endInclusive,
+ ArrayBinding dstKeyArrayBinding, Object dstKeyArray,
+ ArrayBinding dstValueArrayBinding, Object dstValueArray,
+ int resultLimit) throws BindingException;
/**
* Get values in order
public <T> T accept(Visitor<T> v) {
return v.visit(this);
}
- \r
- @Override\r
- public void readFrom(Binding srcBinding, Object src, Object dst)\r
- throws BindingException {\r
- try {\r
- MapBinding sb = (MapBinding) srcBinding;\r
- Binding dkb = getKeyBinding();\r
- Binding dvb = getValueBinding();\r
- Set<Object> oldKeys = new TreeSet<Object>(dkb);\r
- getKeys(dst, oldKeys);\r
- Binding skb = sb.getKeyBinding();\r
- Binding svb = sb.getValueBinding();\r
- boolean cbImmutable = dvb.isImmutable();\r
- Adapter ka = Bindings.adapterFactory.getAdapter(skb, dkb, false, false);\r
- Adapter va = cbImmutable ? Bindings.adapterFactory.getAdapter(svb, dvb, false, true) : null;\r
- \r
- // Copy keys from other map\r
- for (Object sk : sb.getKeys(src)) {\r
- Object dk = ka.adapt(sk);\r
- Object sv = sb.get(src, sk);\r
- if (cbImmutable) {\r
- Object dv = va.adapt(sv);\r
- put(dst, dk, dv);\r
- } else\r
- if (containsKey(dst, dk)) {\r
- Object dv = get(dst, dk);\r
- dv = dvb.readFromTry(svb, sv, dv);\r
- put(dst, dk, dv);\r
- } else {\r
- Object dv = dvb.createDefault();\r
- dv = dvb.readFromTry(svb, sv, dv);\r
- put(dst, dk, dv);\r
- }\r
- oldKeys.remove(dk);\r
- }\r
- \r
- // Remove unused keys\r
- for (Object k : oldKeys) remove(dst, k);\r
-\r
- } catch (AdapterConstructionException e) {\r
- throw new BindingException(e);\r
- } catch (AdaptException e) {\r
- throw new BindingException(e);\r
- }\r
- }\r
- \r
+
+ @Override
+ public void readFrom(Binding srcBinding, Object src, Object dst)
+ throws BindingException {
+ try {
+ MapBinding sb = (MapBinding) srcBinding;
+ Binding dkb = getKeyBinding();
+ Binding dvb = getValueBinding();
+ Set<Object> oldKeys = new TreeSet<Object>(dkb);
+ getKeys(dst, oldKeys);
+ Binding skb = sb.getKeyBinding();
+ Binding svb = sb.getValueBinding();
+ boolean cbImmutable = dvb.isImmutable();
+ Adapter ka = Bindings.adapterFactory.getAdapter(skb, dkb, false, false);
+ Adapter va = cbImmutable ? Bindings.adapterFactory.getAdapter(svb, dvb, false, true) : null;
+
+ // Copy keys from other map
+ for (Object sk : sb.getKeys(src)) {
+ Object dk = ka.adapt(sk);
+ Object sv = sb.get(src, sk);
+ if (cbImmutable) {
+ Object dv = va.adapt(sv);
+ put(dst, dk, dv);
+ } else
+ if (containsKey(dst, dk)) {
+ Object dv = get(dst, dk);
+ dv = dvb.readFromTry(svb, sv, dv);
+ put(dst, dk, dv);
+ } else {
+ Object dv = dvb.createDefault();
+ dv = dvb.readFromTry(svb, sv, dv);
+ put(dst, dk, dv);
+ }
+ oldKeys.remove(dk);
+ }
+
+ // Remove unused keys
+ for (Object k : oldKeys) remove(dst, k);
+
+ } catch (AdapterConstructionException e) {
+ throw new BindingException(e);
+ } catch (AdaptException e) {
+ throw new BindingException(e);
+ }
+ }
+
@Override
public int deepHashValue(Object map, IdentityHashMap<Object, Object> hashedObjects) throws BindingException {
public abstract Object getCeilingKey(Object map, Object key);
public abstract Object getHigherKey(Object map, Object key);
- \r
- @Override\r
- protected void toString(Object value, BindingPrintContext ctx) throws BindingException {\r
- Binding keyBinding = getKeyBinding();\r
- Binding valueBinding = getValueBinding();\r
- ctx.b.append("{ ");\r
- boolean first = true;\r
- for(Object key : getKeys(value)) {\r
- if(first)\r
- first = false;\r
- else {\r
- ctx.b.append(", ");\r
- if ( !ctx.singleLine ) ctx.b.append('\n');\r
- }\r
- keyBinding.toString(key, ctx);\r
- ctx.b.append(" = ");\r
- valueBinding.toString(get(value, key), ctx);\r
- }\r
- ctx.b.append(" }");\r
- }\r
-\r
- @Override\r
- public Binding getComponentBinding(ChildReference path) {\r
- if (path==null) return this;\r
- if (path instanceof IndexReference) {\r
- IndexReference ir = (IndexReference) path;\r
- if (ir.index==0) return keyBinding.getComponentBinding(path.childReference);\r
- if (ir.index==1) return valueBinding.getComponentBinding(path.childReference);\r
- }\r
- if (path instanceof LabelReference) {\r
- LabelReference lr = (LabelReference) path;\r
- if (lr.label.equals("0") || lr.label.equals("key")) return keyBinding.getComponentBinding(path.childReference);\r
- if (lr.label.equals("1") || lr.label.equals("value")) return valueBinding.getComponentBinding(path.childReference);\r
- }\r
- if (path instanceof NameReference) {\r
- NameReference nr = (NameReference) path;\r
- if (nr.name.equals("key")) return keyBinding.getComponentBinding(path.childReference);\r
- if (nr.name.equals("value")) return valueBinding.getComponentBinding(path.childReference);\r
- }\r
- throw new IllegalArgumentException();\r
- } \r
-\r
- \r
- @Override\r
- public int getComponentCount() {\r
- return 2;\r
- }\r
- \r
- @Override\r
- public Binding getComponentBinding(int index) {\r
- if (index==0) return keyBinding;\r
- if (index==1) return valueBinding;\r
- throw new IllegalArgumentException();\r
- } \r
-\r
- @Override\r
- protected boolean deepEquals(Object obj,\r
- Set<IdentityPair<Binding, Binding>> compareHistory) {\r
- MapBinding o = (MapBinding)obj;\r
- return super.deepEquals( obj, compareHistory ) && keyBinding.equals(o.keyBinding, compareHistory) && valueBinding.equals(o.valueBinding, compareHistory);\r
- }\r
- \r
- @Override\r
- public int deepHashCode(IdentityHashMap<Object, Object> hashedObjects) {\r
- return super.deepHashCode(hashedObjects) + 13 * keyBinding.hashCode(hashedObjects) + 17 * valueBinding.hashCode(hashedObjects);\r
+
+ @Override
+ protected void toString(Object value, BindingPrintContext ctx) throws BindingException {
+ Binding keyBinding = getKeyBinding();
+ Binding valueBinding = getValueBinding();
+ ctx.b.append("{ ");
+ boolean first = true;
+ for(Object key : getKeys(value)) {
+ if(first)
+ first = false;
+ else {
+ ctx.b.append(", ");
+ if ( !ctx.singleLine ) ctx.b.append('\n');
+ }
+ keyBinding.toString(key, ctx);
+ ctx.b.append(" = ");
+ valueBinding.toString(get(value, key), ctx);
+ }
+ ctx.b.append(" }");
+ }
+
+ @Override
+ public Binding getComponentBinding(ChildReference path) {
+ if (path==null) return this;
+ if (path instanceof IndexReference) {
+ IndexReference ir = (IndexReference) path;
+ if (ir.index==0) return keyBinding.getComponentBinding(path.childReference);
+ if (ir.index==1) return valueBinding.getComponentBinding(path.childReference);
+ }
+ if (path instanceof LabelReference) {
+ LabelReference lr = (LabelReference) path;
+ if (lr.label.equals("0") || lr.label.equals("key")) return keyBinding.getComponentBinding(path.childReference);
+ if (lr.label.equals("1") || lr.label.equals("value")) return valueBinding.getComponentBinding(path.childReference);
+ }
+ if (path instanceof NameReference) {
+ NameReference nr = (NameReference) path;
+ if (nr.name.equals("key")) return keyBinding.getComponentBinding(path.childReference);
+ if (nr.name.equals("value")) return valueBinding.getComponentBinding(path.childReference);
+ }
+ throw new IllegalArgumentException();
+ }
+
+
+ @Override
+ public int getComponentCount() {
+ return 2;
+ }
+
+ @Override
+ public Binding getComponentBinding(int index) {
+ if (index==0) return keyBinding;
+ if (index==1) return valueBinding;
+ throw new IllegalArgumentException();
+ }
+
+ @Override
+ protected boolean deepEquals(Object obj,
+ Set<IdentityPair<Binding, Binding>> compareHistory) {
+ MapBinding o = (MapBinding)obj;
+ return super.deepEquals( obj, compareHistory ) && keyBinding.equals(o.keyBinding, compareHistory) && valueBinding.equals(o.valueBinding, compareHistory);
+ }
+
+ @Override
+ public int deepHashCode(IdentityHashMap<Object, Object> hashedObjects) {
+ return super.deepHashCode(hashedObjects) + 13 * keyBinding.hashCode(hashedObjects) + 17 * valueBinding.hashCode(hashedObjects);
}
}