]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.procore/src/org/simantics/db/procore/cluster/ValueTable.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.procore / src / org / simantics / db / procore / cluster / ValueTable.java
diff --git a/bundles/org.simantics.db.procore/src/org/simantics/db/procore/cluster/ValueTable.java b/bundles/org.simantics.db.procore/src/org/simantics/db/procore/cluster/ValueTable.java
new file mode 100644 (file)
index 0000000..2a3d11d
--- /dev/null
@@ -0,0 +1,117 @@
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in 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
+package org.simantics.db.procore.cluster;\r
+\r
+import java.util.Map;\r
+import java.util.TreeMap;\r
+\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.exception.ValidationException;\r
+import org.simantics.db.impl.ClusterI.ObjectProcedure;\r
+import org.simantics.db.impl.ClusterI.Procedure;\r
+import org.simantics.db.impl.ClusterSupport;\r
+import org.simantics.db.impl.Modifier;\r
+import org.simantics.db.impl.Table;\r
+import org.simantics.db.impl.TableFactory;\r
+import org.simantics.db.impl.TableSizeListener;\r
+\r
+public final class ValueTable extends Table<byte[]> {\r
+    public ValueTable(TableSizeListener sizeListener, int[] header, int headerBase) {\r
+        super(TableFactory.getByteFactory(), sizeListener, header, headerBase);\r
+    }\r
+    public ValueTable(TableSizeListener sizeListener, int[] header, int headerBase, byte[] bytes) {\r
+        super(TableFactory.getByteFactory(), sizeListener, header, headerBase, bytes);\r
+    }\r
+    void getValue(int valueIndex, byte[] to, int start, int size) {\r
+        getCopy(valueIndex, to, start, size);\r
+    }\r
+    void getString(int valueIndex, char[] to, int start, int size) {\r
+        byte[] bs = (byte[])table;\r
+        start += valueIndex+offset+1;\r
+        for(int i=0;i<size;i++) to[i] = (char)bs[start++];\r
+//     \r
+//        getCopy(valueIndex, to, start, size);\r
+    }\r
+    void setValue(int valueIndex, byte[] value, int length) {\r
+        setCopy(valueIndex, length, value, 0);\r
+    }\r
+    int createValue(byte[] value, int voffset, int vsize) {\r
+        int valueIndex = createNewElement(vsize);\r
+        setCopy(valueIndex, vsize, value, voffset);\r
+        return valueIndex;\r
+    }\r
+    int createValue(byte[] value) {\r
+        int valueIndex = createNewElement(value.length);\r
+        setCopy(valueIndex, value.length, value, 0);\r
+        return valueIndex;\r
+    }\r
+    void removeValue(int valueIndex, int size) {\r
+        deleteOldElement(valueIndex, size);\r
+    }\r
+    boolean isEqual(int valueIndex, byte[] value) {\r
+        return isEqual(valueIndex, value, 0, value.length);\r
+    }\r
+    private TreeMap<Integer, Integer> valueMap =\r
+        new TreeMap<Integer, Integer>();\r
+    \r
+    private int VALUE_SIZE = 0;\r
+    private int VALUE_OFFSET = 0;\r
+    public void checkValueInit()\r
+    throws DatabaseException {\r
+        valueMap.clear();\r
+        final int s = getTableSize();\r
+        final int c = getTableCapacity();\r
+        if (s < 0 || s > c)\r
+            throw new ValidationException("Illegal value table size=" + s + " cap=" + c);\r
+        VALUE_SIZE = s;\r
+        VALUE_OFFSET = getTableBase() - ValueTable.ZERO_SHIFT; \r
+    }\r
+    public void checkValue(int capacity, int index)\r
+    throws DatabaseException {\r
+        if (0 == capacity && 0 == index)\r
+            return;\r
+        if (capacity < 1)\r
+            throw new ValidationException("Illegal resource value capacity=" + capacity);\r
+        if (index < 1)\r
+            throw new ValidationException("Illegal resource value index=" + index);\r
+        if (VALUE_SIZE < capacity + index + VALUE_OFFSET)\r
+            throw new ValidationException("Illegal resource value c=" + capacity +\r
+                    " i=" + index + " ts=" + VALUE_SIZE + " off=" + VALUE_OFFSET);\r
+        // Duplicate index is allowed because new index is created only if new size is greater than old.\r
+        Integer valueCap = valueMap.get(index);\r
+        if (null == valueCap)\r
+            valueMap.put(index, capacity);\r
+        else if (capacity > valueCap)\r
+            valueMap.put(index, capacity);\r
+        else\r
+            valueMap.put(index, valueCap);\r
+    }\r
+    public void checkValueFini()\r
+    throws DatabaseException {\r
+        int last = 0;\r
+        for (Map.Entry<Integer, Integer> e : valueMap.entrySet()) {\r
+            int i = e.getKey();\r
+            int c = e.getValue();\r
+            int cur = VALUE_OFFSET + i;\r
+            if (last > cur)\r
+                throw new ValidationException("Index error with resource value c=" + c +\r
+                        " i=" + i + " ts=" + VALUE_SIZE + " off=" + VALUE_OFFSET);\r
+            last = cur + c;\r
+        }\r
+    }\r
+\r
+    @Override\r
+    public <Context> boolean foreach(int setIndex, Procedure procedure, Context context, ClusterSupport support, Modifier modifier) throws DatabaseException {\r
+        throw new UnsupportedOperationException();\r
+    }\r
+\r
+}\r