]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.db.procore.cluster;\r
13 \r
14 import java.util.Map;\r
15 import java.util.TreeMap;\r
16 \r
17 import org.simantics.db.exception.DatabaseException;\r
18 import org.simantics.db.exception.ValidationException;\r
19 import org.simantics.db.impl.ClusterI.ObjectProcedure;\r
20 import org.simantics.db.impl.ClusterI.Procedure;\r
21 import org.simantics.db.impl.ClusterSupport;\r
22 import org.simantics.db.impl.Modifier;\r
23 import org.simantics.db.impl.Table;\r
24 import org.simantics.db.impl.TableFactory;\r
25 import org.simantics.db.impl.TableSizeListener;\r
26 \r
27 public final class ValueTable extends Table<byte[]> {\r
28     public ValueTable(TableSizeListener sizeListener, int[] header, int headerBase) {\r
29         super(TableFactory.getByteFactory(), sizeListener, header, headerBase);\r
30     }\r
31     public ValueTable(TableSizeListener sizeListener, int[] header, int headerBase, byte[] bytes) {\r
32         super(TableFactory.getByteFactory(), sizeListener, header, headerBase, bytes);\r
33     }\r
34     void getValue(int valueIndex, byte[] to, int start, int size) {\r
35         getCopy(valueIndex, to, start, size);\r
36     }\r
37     void getString(int valueIndex, char[] to, int start, int size) {\r
38         byte[] bs = (byte[])table;\r
39         start += valueIndex+offset+1;\r
40         for(int i=0;i<size;i++) to[i] = (char)bs[start++];\r
41 //      \r
42 //        getCopy(valueIndex, to, start, size);\r
43     }\r
44     void setValue(int valueIndex, byte[] value, int length) {\r
45         setCopy(valueIndex, length, value, 0);\r
46     }\r
47     int createValue(byte[] value, int voffset, int vsize) {\r
48         int valueIndex = createNewElement(vsize);\r
49         setCopy(valueIndex, vsize, value, voffset);\r
50         return valueIndex;\r
51     }\r
52     int createValue(byte[] value) {\r
53         int valueIndex = createNewElement(value.length);\r
54         setCopy(valueIndex, value.length, value, 0);\r
55         return valueIndex;\r
56     }\r
57     void removeValue(int valueIndex, int size) {\r
58         deleteOldElement(valueIndex, size);\r
59     }\r
60     boolean isEqual(int valueIndex, byte[] value) {\r
61         return isEqual(valueIndex, value, 0, value.length);\r
62     }\r
63     private TreeMap<Integer, Integer> valueMap =\r
64         new TreeMap<Integer, Integer>();\r
65     \r
66     private int VALUE_SIZE = 0;\r
67     private int VALUE_OFFSET = 0;\r
68     public void checkValueInit()\r
69     throws DatabaseException {\r
70         valueMap.clear();\r
71         final int s = getTableSize();\r
72         final int c = getTableCapacity();\r
73         if (s < 0 || s > c)\r
74             throw new ValidationException("Illegal value table size=" + s + " cap=" + c);\r
75         VALUE_SIZE = s;\r
76         VALUE_OFFSET = getTableBase() - ValueTable.ZERO_SHIFT; \r
77     }\r
78     public void checkValue(int capacity, int index)\r
79     throws DatabaseException {\r
80         if (0 == capacity && 0 == index)\r
81             return;\r
82         if (capacity < 1)\r
83             throw new ValidationException("Illegal resource value capacity=" + capacity);\r
84         if (index < 1)\r
85             throw new ValidationException("Illegal resource value index=" + index);\r
86         if (VALUE_SIZE < capacity + index + VALUE_OFFSET)\r
87             throw new ValidationException("Illegal resource value c=" + capacity +\r
88                     " i=" + index + " ts=" + VALUE_SIZE + " off=" + VALUE_OFFSET);\r
89         // Duplicate index is allowed because new index is created only if new size is greater than old.\r
90         Integer valueCap = valueMap.get(index);\r
91         if (null == valueCap)\r
92             valueMap.put(index, capacity);\r
93         else if (capacity > valueCap)\r
94             valueMap.put(index, capacity);\r
95         else\r
96             valueMap.put(index, valueCap);\r
97     }\r
98     public void checkValueFini()\r
99     throws DatabaseException {\r
100         int last = 0;\r
101         for (Map.Entry<Integer, Integer> e : valueMap.entrySet()) {\r
102             int i = e.getKey();\r
103             int c = e.getValue();\r
104             int cur = VALUE_OFFSET + i;\r
105             if (last > cur)\r
106                 throw new ValidationException("Index error with resource value c=" + c +\r
107                         " i=" + i + " ts=" + VALUE_SIZE + " off=" + VALUE_OFFSET);\r
108             last = cur + c;\r
109         }\r
110     }\r
111 \r
112     @Override\r
113     public <Context> boolean foreach(int setIndex, Procedure procedure, Context context, ClusterSupport support, Modifier modifier) throws DatabaseException {\r
114         throw new UnsupportedOperationException();\r
115     }\r
116 \r
117 }\r