-/*******************************************************************************\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 fi.vtt.simantics.procore.internal;\r
-\r
-\r
-\r
-//public abstract class ResourceImpl implements Resource {\r
-// public final static ResourceImpl[] NONE = new ResourceImpl[0];\r
-//}\r
-\r
-//class ResourceProxy {\r
-// private final int offset;\r
-// private final int size;\r
-// private WeakReference<ResourceImpl> weakResource = null; \r
-// private ResourceImplModified modifiedResourceImpl = null;\r
-// private Value_ value;\r
-// ResourceProxy(int offset, int size) {\r
-// this.offset = offset;\r
-// this.size = size;\r
-// }\r
-// boolean isNew() {\r
-// return 0 == size;\r
-// }\r
-// private ResourceImpl getResourceImplModified(Cluster cluster, long subject) {\r
-// ResourceImpl r;\r
-// if (null == weakResource || null == (r = weakResource.get())) {\r
-// if (null == modifiedResourceImpl)\r
-// modifiedResourceImpl = new ResourceImplModified(cluster, offset, size, value);\r
-// r = new ResourceImpl(subject, modifiedResourceImpl);\r
-// weakResource = new WeakReference<ResourceImpl>(r); \r
-// } else if (!r.isModified()) {\r
-// if (null == modifiedResourceImpl)\r
-// modifiedResourceImpl = new ResourceImplModified(cluster, offset, size, value);\r
-// r.setImpl(modifiedResourceImpl);\r
-// }\r
-// return r;\r
-// }\r
-// void setValue(Value_ value) {\r
-// this.value = value;\r
-// }\r
-// ResourceImpl addRelation(Cluster cluster, long subject, long predicate, long predicateCluster, long object, long objectCluster) {\r
-// ResourceImpl r = getResourceImplModified(cluster, subject);\r
-// return r.addRelation(predicate, predicateCluster, object, objectCluster);\r
-// }\r
-// void removeRelation(Cluster cluster, long subject, long predicate, long predicateCluster, long object, long objectCluster) throws StatementNotFoundException {\r
-// ResourceImpl r = getResourceImplModified(cluster, subject);\r
-// r.removeRelation(predicate, predicateCluster, object, objectCluster);\r
-// }\r
-// ResourceImpl getResource(Cluster cluster, long id) {\r
-// ResourceImpl r;\r
-// if (null != weakResource) {\r
-// r = weakResource.get();\r
-// if (null != r)\r
-// return r;\r
-// }\r
-// if (isNew()) {\r
-// if (null == modifiedResourceImpl)\r
-// modifiedResourceImpl = new ResourceImplModified(cluster, offset, size, value);\r
-// r = new ResourceImpl(id, modifiedResourceImpl);\r
-// } else\r
-// r = new ResourceImpl(id, new ResourceImplFixed(cluster, offset, size, value));\r
-// weakResource = new WeakReference<ResourceImpl>(r); \r
-// return r;\r
-// }\r
-// ResourceImpl getResourceImpl(long id, ResourceImplModified impl) {\r
-// ResourceImpl r;\r
-// assert(null == modifiedResourceImpl);\r
-// assert(null == weakResource);\r
-// modifiedResourceImpl = impl;\r
-// r = new ResourceImpl(id, impl);\r
-// weakResource = new WeakReference<ResourceImpl>(r); \r
-// return r;\r
-// }\r
-// void release() {\r
-// if (null == weakResource)\r
-// return;\r
-// weakResource = null;\r
-// modifiedResourceImpl = null;\r
-// }\r
-//}\r
-//\r
-//abstract class ResourceImplAbstract {\r
-// abstract void init(ResourceImpl self);\r
-// abstract void dispose();\r
-// abstract Value_ getValue(ResourceImpl self);\r
-// abstract long getClusterId();\r
-// abstract boolean isModified();\r
-// abstract int getNumberOfRelations(ResourceImpl self);\r
-// abstract StatementImpl[] getStatements(ResourceImpl self) throws ResourceNotFoundException;\r
-// abstract void addRelation(ResourceImpl self, long predicate, long predicateCluster, long object, long objectCluster);\r
-// abstract void removeRelation(long predicate, long predicateCluster, long object, long objectCluster) throws StatementNotFoundException;\r
-// abstract void addValue(ResourceImpl self, Value_ value); // TODO: Remove return value, inefficient.\r
-//}\r
-//\r
-//abstract class ResourceImplCluster extends ResourceImplAbstract {\r
-// private Cluster cluster;\r
-// protected Value_ value;\r
-// protected Value_ valueOld = null;\r
-// protected Cluster getCluster() {\r
-// return cluster;\r
-// }\r
-// ResourceImplCluster(Cluster cluster) {\r
-// this.cluster = cluster;\r
-// cluster.incReferenceCount();\r
-// }\r
-// void setCluster(Cluster c) {\r
-// this.cluster = c;\r
-// }\r
-// @Override\r
-// void init(ResourceImpl self) {\r
-// }\r
-// @Override\r
-// void dispose() {\r
-// cluster.decReferenceCount();\r
-// }\r
-// @Override\r
-// long getClusterId() {\r
-// return cluster.getId();\r
-// }\r
-// @Override\r
-// Value_ getValue(ResourceImpl self) {\r
-// return value;\r
-// }\r
-// protected void setValue(Value_ value) {\r
-// this.value = this.valueOld = value;\r
-// }\r
-// void moveValue() {\r
-// valueOld = value;\r
-// }\r
-// void removeValue() {\r
-// value = valueOld;\r
-// }\r
-// void addValue(ResourceImpl self, Value_ value) { // TODO: Remove return value, inefficient.\r
-// this.value = value;\r
-// }\r
-//}\r
-//\r
-//class ResourceImplFixed extends ResourceImplCluster {\r
-// final int fixedOffset;\r
-// final int fixedSize;\r
-// public ResourceImplFixed(Cluster cluster, int offset, int size, Value_ value) {\r
-// super(cluster);\r
-// this.fixedOffset = offset;\r
-// this.fixedSize = size;\r
-// setValue(value);\r
-// }\r
-// @Override\r
-// int getNumberOfRelations(ResourceImpl self) {\r
-// return fixedSize;\r
-// }\r
-// @Override\r
-// StatementImpl[] getStatements(ResourceImpl self) throws ResourceNotFoundException {\r
-// StatementImpl[] stms = new StatementImpl[fixedSize];\r
-// GraphSession gs = this.getCluster().client;\r
-// int end = fixedOffset + fixedSize;\r
-// for (int i=fixedOffset, j=0; i<end; ++i, ++j) {\r
-// ResourceImpl p = gs.getResourceOrThrow(getCluster().raw.predicates[i], getCluster().raw.predicateClusters[i]);\r
-// stms[j] = new StatementImplNew(self, p, getCluster().raw.objects[i], getCluster().raw.objectClusters[i], gs);\r
-//// ResourceImpl o = gs.getResourceOrThrow(getCluster().raw.objects[i], getCluster().raw.objectClusters[i]);\r
-//// stms[j] = new StatementImplOld(self, p, o);\r
-// }\r
-// return stms;\r
-// }\r
-// @Override\r
-// boolean isModified() {\r
-// return false;\r
-// }\r
-// @Override\r
-// void addRelation(ResourceImpl self, long predicate, long predicateCluster, long object, long objectCluster) {\r
-// throw new Error("Not allowed");\r
-// }\r
-// @Override\r
-// void removeRelation(long predicate, long predicateCluster, long object, long objectCluster) {\r
-// throw new Error("Not allowed");\r
-// }\r
-//}\r
-//\r
-//class ResourceImplModifiedStatement {\r
-// long predicate;\r
-// long predicateCluster;\r
-// long object;\r
-// long objectCluster;\r
-// ResourceImplModifiedStatement(long predicate, long predicateCluster, long object, long objectCluster) {\r
-// this.predicate = predicate;\r
-// this.predicateCluster = predicateCluster;\r
-// this.object = object;\r
-// this.objectCluster = objectCluster;\r
-// }\r
-// @Override\r
-// public int hashCode() {\r
-// return (int)(object^(object>>32)^predicate^(predicate>>>32));\r
-// }\r
-// @Override\r
-// public boolean equals(Object obj) {\r
-// if (this == obj)\r
-// return true;\r
-// else if (obj == null)\r
-// return false;\r
-// else if (ResourceImplModifiedStatement.class != obj.getClass())\r
-// return false;\r
-// ResourceImplModifiedStatement d = (ResourceImplModifiedStatement)obj;\r
-// return (d.object == object) && (d.predicate == predicate);\r
-// }\r
-//}\r
-//\r
-//class ResourceImplModified extends ResourceImplCluster {\r
-// static ResourceImplModifiedStatement findStatement = new ResourceImplModifiedStatement(0, 0, 0, 0);\r
-// THashSet<ResourceImplModifiedStatement> statements = new THashSet<ResourceImplModifiedStatement>();\r
-// THashSet<ResourceImplModifiedStatement> reclusteringStatements = new THashSet<ResourceImplModifiedStatement>();\r
-// public ResourceImplModified(Cluster cluster, int offset, int size, Value_ value) {\r
-// super(cluster);\r
-// setValue(value);\r
-// statements.ensureCapacity(size);\r
-// for (int i=0,j=offset; i<size; ++i,++j) {\r
-// assert(Constants.ReservedClusterId != cluster.raw.predicateClusters[j]);\r
-// assert(Constants.ReservedClusterId != cluster.raw.objectClusters[j]);\r
-// statements.add(new ResourceImplModifiedStatement(cluster.raw.predicates[j], cluster.raw.predicateClusters[j], cluster.raw.objects[j], cluster.raw.objectClusters[j]));\r
-// }\r
-// }\r
-// void moveStatements(HashMap<Long, Long> oldResourceIdToNewClusterIdMap) {\r
-// for (ResourceImplModifiedStatement s : reclusteringStatements) {\r
-// statements.remove(s);\r
-// if (Constants.ReservedClusterId == s.predicateCluster)\r
-// s.predicateCluster = oldResourceIdToNewClusterIdMap.get(s.predicate);\r
-// if (Constants.ReservedClusterId == s.objectCluster)\r
-// s.objectCluster = oldResourceIdToNewClusterIdMap.get(s.object);\r
-// statements.add(s);\r
-// }\r
-// reclusteringStatements.clear();\r
-// }\r
-//\r
-// void removeStatements() {\r
-// for (ResourceImplModifiedStatement s : reclusteringStatements) {\r
-// statements.remove(s);\r
-// }\r
-// reclusteringStatements.clear();\r
-// }\r
-//\r
-// @Override\r
-// int getNumberOfRelations(ResourceImpl self) {\r
-// return statements.size();\r
-// }\r
-// @Override\r
-// boolean isModified() {\r
-// return true; // HACK: This is not necessarily true. In creation no modifications given and modifications can cancel each other out.\r
-// }\r
-// @Override\r
-// StatementImpl[] getStatements(ResourceImpl self) throws ResourceNotFoundException {\r
-// int size = statements.size();\r
-// StatementImpl[] stms = new StatementImpl[size];\r
-// GraphSession gs = getCluster().client;\r
-// int i = -1;\r
-// for (ResourceImplModifiedStatement s : statements) {\r
-// ResourceImpl p;\r
-// if (Constants.ReservedClusterId == s.predicateCluster)\r
-// p = this.getCluster().getResourceReservedOrThrow(Constants.ReservedClusterId, s.predicate);\r
-// else\r
-// p = gs.getResourceOrThrow(s.predicate, s.predicateCluster);\r
-// if (Constants.ReservedClusterId == s.objectCluster) {\r
-// ResourceImpl o = this.getCluster().getResourceReservedOrThrow(Constants.ReservedClusterId, s.object);\r
-// stms[++i] = new StatementImplOld(self, p, o);\r
-// } else\r
-// stms[++i] = new StatementImplNew(self, p, s.object, s.objectCluster, gs);\r
-// }\r
-// return stms;\r
-// }\r
-// private boolean find(long predicate, long predicateCluster, long object, long objectCluster) {\r
-// findStatement.predicate = predicate;\r
-// findStatement.predicateCluster = predicateCluster;\r
-// findStatement.object = object;\r
-// findStatement.objectCluster = objectCluster;\r
-// return statements.contains(findStatement);\r
-// }\r
-// @Override\r
-// void addRelation(ResourceImpl self, long predicate, long predicateCluster, long object, long objectCluster) {\r
-// if (find(predicate, predicateCluster, object, objectCluster))\r
-// return;\r
-// //System.out.println(self + "." + getNumberOfRelations(self) + ": " + predicate + "." + predicateCluster + " " + object + "." + objectCluster);\r
-// ResourceImplModifiedStatement s = new ResourceImplModifiedStatement(predicate, predicateCluster, object, objectCluster);\r
-// statements.add(s);\r
-// if (Constants.ReservedClusterId == predicateCluster ||\r
-// Constants.ReservedClusterId == objectCluster) {\r
-// reclusteringStatements.add(s);\r
-// getCluster().addModifiedResource(self);\r
-// }\r
-// }\r
-// @Override\r
-// void removeRelation(long predicate, long predicateCluster, long object, long objectCluster) throws StatementNotFoundException {\r
-// findStatement.predicate = predicate;\r
-// findStatement.predicateCluster = predicateCluster;\r
-// findStatement.object = object;\r
-// findStatement.objectCluster = objectCluster;\r
-// if (!statements.remove(findStatement))\r
-// throw new StatementNotFoundException();\r
-// reclusteringStatements.remove(findStatement);\r
-// }\r
-//}\r
-//\r
-//class ResourceImplChangeSet extends ResourceImplAbstract {\r
-// private SessionImplHistorical session;\r
-// private long cluster;\r
-// private ResourceImpl original;\r
-// public ResourceImplChangeSet(SessionImplHistorical session, long cluster) {\r
-// this.session = session;\r
-// this.cluster = cluster;\r
-// }\r
-// @Override\r
-// void init(ResourceImpl self) {\r
-// Cluster c = session.getCluster(cluster);\r
-// if (null != c)\r
-// this.original = c.getResource(self.id);\r
-// }\r
-// @Override\r
-// void dispose() {\r
-// }\r
-// @Override\r
-// long getClusterId() {\r
-// return cluster;\r
-// }\r
-// @Override\r
-// Value_ getValue(ResourceImpl self) {\r
-// Value_ value = null;\r
-// if (null != original)\r
-// value = original.getValue();\r
-// return session.getValue(self.id, value);\r
-// }\r
-// @Override\r
-// int getNumberOfRelations(ResourceImpl self) {\r
-// int n = 0;\r
-// if (null != original)\r
-// n = original.getNumberOfRelations();\r
-// n += session.getNumberOfAddedRelations(self.id);\r
-// n -= session.getNumberOfRemovedRelations(self.id);\r
-// return n;\r
-// }\r
-// @Override\r
-// StatementImpl[] getStatements(ResourceImpl self) throws ResourceNotFoundException {\r
-// StatementImpl[] stms = StatementImpl.NONE;\r
-// if (null != original)\r
-// stms = original.getStatements();\r
-// return session.getStatements(self.id, stms);\r
-// }\r
-// @Override\r
-// boolean isModified() {\r
-// return false;\r
-// }\r
-// @Override\r
-// void addValue(ResourceImpl self, Value_ value) {\r
-// throw new Error("Not allowed");\r
-// }\r
-// @Override\r
-// void addRelation(ResourceImpl self, long predicate, long predicateCluster, long object, long objectCluster) {\r
-// throw new Error("Not allowed");\r
-// }\r
-// @Override\r
-// void removeRelation(long predicate, long predicateCluster, long object, long objectCluster) {\r
-// throw new Error("Not allowed");\r
-// }\r
-//}\r
-//\r
-//class ResourceImplClusterNew extends ResourceImplAbstract {\r
-// //private Cluster clusterOld;\r
-// private final long id;\r
-// private org.simantics.db.procore.cluster.Cluster cluster;\r
-// protected Cluster getCluster() {\r
-// throw new Error("No can do.");\r
-// }\r
-// ResourceImplClusterNew(long id, org.simantics.db.procore.cluster.Cluster cluster) {\r
-// this.id = id;\r
-// this.cluster = cluster;\r
-// }\r
-// final org.simantics.db.procore.cluster.Cluster getClusterNew() {\r
-// return cluster;\r
-// }\r
-// void setCluster(Cluster c) {\r
-// throw new Error("No can do.");\r
-// }\r
-// @Override\r
-// void init(ResourceImpl self) {\r
-// }\r
-// @Override\r
-// void dispose() {\r
-// }\r
-// @Override\r
-// long getClusterId() {\r
-// return cluster.getId();\r
-// }\r
-// @Override\r
-// Value_ getValue(ResourceImpl self) {\r
-// byte[] value = cluster.getValue(id);\r
-// return new Zany(value);\r
-// }\r
-// protected void setValue(Value_ value) {\r
-// throw new Error("No can do.");\r
-// }\r
-// void moveValue() {\r
-// throw new Error("No can do.");\r
-// }\r
-// void removeValue() {\r
-// throw new Error("No can do.");\r
-// }\r
-// void addValue(ResourceImpl self, Value_ value) { // TODO: Remove return value, inefficient.\r
-// throw new Error("No can do.");\r
-// }\r
-// @Override\r
-// void addRelation(ResourceImpl self, long predicate, long predicateCluster,\r
-// long object, long objectCluster) {\r
-// throw new Error("No can do.");\r
-// }\r
-// @Override\r
-// int getNumberOfRelations(ResourceImpl self) {\r
-// throw new Error("No can do.");\r
-// }\r
-// @Override\r
-// StatementImpl[] getStatements(ResourceImpl self) {\r
-// throw new Error("No can do.");\r
-// }\r
-// @Override\r
-// boolean isModified() {\r
-// throw new Error("No can do.");\r
-// }\r
-// @Override\r
-// void removeRelation(long predicate, long predicateCluster, long object,\r
-// long objectCluster) throws StatementNotFoundException {\r
-// throw new Error("No can do.");\r
-// }\r
-//}\r
+/*******************************************************************************
+ * Copyright (c) 2007, 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 fi.vtt.simantics.procore.internal;
+
+
+
+//public abstract class ResourceImpl implements Resource {
+// public final static ResourceImpl[] NONE = new ResourceImpl[0];
+//}
+
+//class ResourceProxy {
+// private final int offset;
+// private final int size;
+// private WeakReference<ResourceImpl> weakResource = null;
+// private ResourceImplModified modifiedResourceImpl = null;
+// private Value_ value;
+// ResourceProxy(int offset, int size) {
+// this.offset = offset;
+// this.size = size;
+// }
+// boolean isNew() {
+// return 0 == size;
+// }
+// private ResourceImpl getResourceImplModified(Cluster cluster, long subject) {
+// ResourceImpl r;
+// if (null == weakResource || null == (r = weakResource.get())) {
+// if (null == modifiedResourceImpl)
+// modifiedResourceImpl = new ResourceImplModified(cluster, offset, size, value);
+// r = new ResourceImpl(subject, modifiedResourceImpl);
+// weakResource = new WeakReference<ResourceImpl>(r);
+// } else if (!r.isModified()) {
+// if (null == modifiedResourceImpl)
+// modifiedResourceImpl = new ResourceImplModified(cluster, offset, size, value);
+// r.setImpl(modifiedResourceImpl);
+// }
+// return r;
+// }
+// void setValue(Value_ value) {
+// this.value = value;
+// }
+// ResourceImpl addRelation(Cluster cluster, long subject, long predicate, long predicateCluster, long object, long objectCluster) {
+// ResourceImpl r = getResourceImplModified(cluster, subject);
+// return r.addRelation(predicate, predicateCluster, object, objectCluster);
+// }
+// void removeRelation(Cluster cluster, long subject, long predicate, long predicateCluster, long object, long objectCluster) throws StatementNotFoundException {
+// ResourceImpl r = getResourceImplModified(cluster, subject);
+// r.removeRelation(predicate, predicateCluster, object, objectCluster);
+// }
+// ResourceImpl getResource(Cluster cluster, long id) {
+// ResourceImpl r;
+// if (null != weakResource) {
+// r = weakResource.get();
+// if (null != r)
+// return r;
+// }
+// if (isNew()) {
+// if (null == modifiedResourceImpl)
+// modifiedResourceImpl = new ResourceImplModified(cluster, offset, size, value);
+// r = new ResourceImpl(id, modifiedResourceImpl);
+// } else
+// r = new ResourceImpl(id, new ResourceImplFixed(cluster, offset, size, value));
+// weakResource = new WeakReference<ResourceImpl>(r);
+// return r;
+// }
+// ResourceImpl getResourceImpl(long id, ResourceImplModified impl) {
+// ResourceImpl r;
+// assert(null == modifiedResourceImpl);
+// assert(null == weakResource);
+// modifiedResourceImpl = impl;
+// r = new ResourceImpl(id, impl);
+// weakResource = new WeakReference<ResourceImpl>(r);
+// return r;
+// }
+// void release() {
+// if (null == weakResource)
+// return;
+// weakResource = null;
+// modifiedResourceImpl = null;
+// }
+//}
+//
+//abstract class ResourceImplAbstract {
+// abstract void init(ResourceImpl self);
+// abstract void dispose();
+// abstract Value_ getValue(ResourceImpl self);
+// abstract long getClusterId();
+// abstract boolean isModified();
+// abstract int getNumberOfRelations(ResourceImpl self);
+// abstract StatementImpl[] getStatements(ResourceImpl self) throws ResourceNotFoundException;
+// abstract void addRelation(ResourceImpl self, long predicate, long predicateCluster, long object, long objectCluster);
+// abstract void removeRelation(long predicate, long predicateCluster, long object, long objectCluster) throws StatementNotFoundException;
+// abstract void addValue(ResourceImpl self, Value_ value); // TODO: Remove return value, inefficient.
+//}
+//
+//abstract class ResourceImplCluster extends ResourceImplAbstract {
+// private Cluster cluster;
+// protected Value_ value;
+// protected Value_ valueOld = null;
+// protected Cluster getCluster() {
+// return cluster;
+// }
+// ResourceImplCluster(Cluster cluster) {
+// this.cluster = cluster;
+// cluster.incReferenceCount();
+// }
+// void setCluster(Cluster c) {
+// this.cluster = c;
+// }
+// @Override
+// void init(ResourceImpl self) {
+// }
+// @Override
+// void dispose() {
+// cluster.decReferenceCount();
+// }
+// @Override
+// long getClusterId() {
+// return cluster.getId();
+// }
+// @Override
+// Value_ getValue(ResourceImpl self) {
+// return value;
+// }
+// protected void setValue(Value_ value) {
+// this.value = this.valueOld = value;
+// }
+// void moveValue() {
+// valueOld = value;
+// }
+// void removeValue() {
+// value = valueOld;
+// }
+// void addValue(ResourceImpl self, Value_ value) { // TODO: Remove return value, inefficient.
+// this.value = value;
+// }
+//}
+//
+//class ResourceImplFixed extends ResourceImplCluster {
+// final int fixedOffset;
+// final int fixedSize;
+// public ResourceImplFixed(Cluster cluster, int offset, int size, Value_ value) {
+// super(cluster);
+// this.fixedOffset = offset;
+// this.fixedSize = size;
+// setValue(value);
+// }
+// @Override
+// int getNumberOfRelations(ResourceImpl self) {
+// return fixedSize;
+// }
+// @Override
+// StatementImpl[] getStatements(ResourceImpl self) throws ResourceNotFoundException {
+// StatementImpl[] stms = new StatementImpl[fixedSize];
+// GraphSession gs = this.getCluster().client;
+// int end = fixedOffset + fixedSize;
+// for (int i=fixedOffset, j=0; i<end; ++i, ++j) {
+// ResourceImpl p = gs.getResourceOrThrow(getCluster().raw.predicates[i], getCluster().raw.predicateClusters[i]);
+// stms[j] = new StatementImplNew(self, p, getCluster().raw.objects[i], getCluster().raw.objectClusters[i], gs);
+//// ResourceImpl o = gs.getResourceOrThrow(getCluster().raw.objects[i], getCluster().raw.objectClusters[i]);
+//// stms[j] = new StatementImplOld(self, p, o);
+// }
+// return stms;
+// }
+// @Override
+// boolean isModified() {
+// return false;
+// }
+// @Override
+// void addRelation(ResourceImpl self, long predicate, long predicateCluster, long object, long objectCluster) {
+// throw new Error("Not allowed");
+// }
+// @Override
+// void removeRelation(long predicate, long predicateCluster, long object, long objectCluster) {
+// throw new Error("Not allowed");
+// }
+//}
+//
+//class ResourceImplModifiedStatement {
+// long predicate;
+// long predicateCluster;
+// long object;
+// long objectCluster;
+// ResourceImplModifiedStatement(long predicate, long predicateCluster, long object, long objectCluster) {
+// this.predicate = predicate;
+// this.predicateCluster = predicateCluster;
+// this.object = object;
+// this.objectCluster = objectCluster;
+// }
+// @Override
+// public int hashCode() {
+// return (int)(object^(object>>32)^predicate^(predicate>>>32));
+// }
+// @Override
+// public boolean equals(Object obj) {
+// if (this == obj)
+// return true;
+// else if (obj == null)
+// return false;
+// else if (ResourceImplModifiedStatement.class != obj.getClass())
+// return false;
+// ResourceImplModifiedStatement d = (ResourceImplModifiedStatement)obj;
+// return (d.object == object) && (d.predicate == predicate);
+// }
+//}
+//
+//class ResourceImplModified extends ResourceImplCluster {
+// static ResourceImplModifiedStatement findStatement = new ResourceImplModifiedStatement(0, 0, 0, 0);
+// THashSet<ResourceImplModifiedStatement> statements = new THashSet<ResourceImplModifiedStatement>();
+// THashSet<ResourceImplModifiedStatement> reclusteringStatements = new THashSet<ResourceImplModifiedStatement>();
+// public ResourceImplModified(Cluster cluster, int offset, int size, Value_ value) {
+// super(cluster);
+// setValue(value);
+// statements.ensureCapacity(size);
+// for (int i=0,j=offset; i<size; ++i,++j) {
+// assert(Constants.ReservedClusterId != cluster.raw.predicateClusters[j]);
+// assert(Constants.ReservedClusterId != cluster.raw.objectClusters[j]);
+// statements.add(new ResourceImplModifiedStatement(cluster.raw.predicates[j], cluster.raw.predicateClusters[j], cluster.raw.objects[j], cluster.raw.objectClusters[j]));
+// }
+// }
+// void moveStatements(HashMap<Long, Long> oldResourceIdToNewClusterIdMap) {
+// for (ResourceImplModifiedStatement s : reclusteringStatements) {
+// statements.remove(s);
+// if (Constants.ReservedClusterId == s.predicateCluster)
+// s.predicateCluster = oldResourceIdToNewClusterIdMap.get(s.predicate);
+// if (Constants.ReservedClusterId == s.objectCluster)
+// s.objectCluster = oldResourceIdToNewClusterIdMap.get(s.object);
+// statements.add(s);
+// }
+// reclusteringStatements.clear();
+// }
+//
+// void removeStatements() {
+// for (ResourceImplModifiedStatement s : reclusteringStatements) {
+// statements.remove(s);
+// }
+// reclusteringStatements.clear();
+// }
+//
+// @Override
+// int getNumberOfRelations(ResourceImpl self) {
+// return statements.size();
+// }
+// @Override
+// boolean isModified() {
+// return true; // HACK: This is not necessarily true. In creation no modifications given and modifications can cancel each other out.
+// }
+// @Override
+// StatementImpl[] getStatements(ResourceImpl self) throws ResourceNotFoundException {
+// int size = statements.size();
+// StatementImpl[] stms = new StatementImpl[size];
+// GraphSession gs = getCluster().client;
+// int i = -1;
+// for (ResourceImplModifiedStatement s : statements) {
+// ResourceImpl p;
+// if (Constants.ReservedClusterId == s.predicateCluster)
+// p = this.getCluster().getResourceReservedOrThrow(Constants.ReservedClusterId, s.predicate);
+// else
+// p = gs.getResourceOrThrow(s.predicate, s.predicateCluster);
+// if (Constants.ReservedClusterId == s.objectCluster) {
+// ResourceImpl o = this.getCluster().getResourceReservedOrThrow(Constants.ReservedClusterId, s.object);
+// stms[++i] = new StatementImplOld(self, p, o);
+// } else
+// stms[++i] = new StatementImplNew(self, p, s.object, s.objectCluster, gs);
+// }
+// return stms;
+// }
+// private boolean find(long predicate, long predicateCluster, long object, long objectCluster) {
+// findStatement.predicate = predicate;
+// findStatement.predicateCluster = predicateCluster;
+// findStatement.object = object;
+// findStatement.objectCluster = objectCluster;
+// return statements.contains(findStatement);
+// }
+// @Override
+// void addRelation(ResourceImpl self, long predicate, long predicateCluster, long object, long objectCluster) {
+// if (find(predicate, predicateCluster, object, objectCluster))
+// return;
+// //System.out.println(self + "." + getNumberOfRelations(self) + ": " + predicate + "." + predicateCluster + " " + object + "." + objectCluster);
+// ResourceImplModifiedStatement s = new ResourceImplModifiedStatement(predicate, predicateCluster, object, objectCluster);
+// statements.add(s);
+// if (Constants.ReservedClusterId == predicateCluster ||
+// Constants.ReservedClusterId == objectCluster) {
+// reclusteringStatements.add(s);
+// getCluster().addModifiedResource(self);
+// }
+// }
+// @Override
+// void removeRelation(long predicate, long predicateCluster, long object, long objectCluster) throws StatementNotFoundException {
+// findStatement.predicate = predicate;
+// findStatement.predicateCluster = predicateCluster;
+// findStatement.object = object;
+// findStatement.objectCluster = objectCluster;
+// if (!statements.remove(findStatement))
+// throw new StatementNotFoundException();
+// reclusteringStatements.remove(findStatement);
+// }
+//}
+//
+//class ResourceImplChangeSet extends ResourceImplAbstract {
+// private SessionImplHistorical session;
+// private long cluster;
+// private ResourceImpl original;
+// public ResourceImplChangeSet(SessionImplHistorical session, long cluster) {
+// this.session = session;
+// this.cluster = cluster;
+// }
+// @Override
+// void init(ResourceImpl self) {
+// Cluster c = session.getCluster(cluster);
+// if (null != c)
+// this.original = c.getResource(self.id);
+// }
+// @Override
+// void dispose() {
+// }
+// @Override
+// long getClusterId() {
+// return cluster;
+// }
+// @Override
+// Value_ getValue(ResourceImpl self) {
+// Value_ value = null;
+// if (null != original)
+// value = original.getValue();
+// return session.getValue(self.id, value);
+// }
+// @Override
+// int getNumberOfRelations(ResourceImpl self) {
+// int n = 0;
+// if (null != original)
+// n = original.getNumberOfRelations();
+// n += session.getNumberOfAddedRelations(self.id);
+// n -= session.getNumberOfRemovedRelations(self.id);
+// return n;
+// }
+// @Override
+// StatementImpl[] getStatements(ResourceImpl self) throws ResourceNotFoundException {
+// StatementImpl[] stms = StatementImpl.NONE;
+// if (null != original)
+// stms = original.getStatements();
+// return session.getStatements(self.id, stms);
+// }
+// @Override
+// boolean isModified() {
+// return false;
+// }
+// @Override
+// void addValue(ResourceImpl self, Value_ value) {
+// throw new Error("Not allowed");
+// }
+// @Override
+// void addRelation(ResourceImpl self, long predicate, long predicateCluster, long object, long objectCluster) {
+// throw new Error("Not allowed");
+// }
+// @Override
+// void removeRelation(long predicate, long predicateCluster, long object, long objectCluster) {
+// throw new Error("Not allowed");
+// }
+//}
+//
+//class ResourceImplClusterNew extends ResourceImplAbstract {
+// //private Cluster clusterOld;
+// private final long id;
+// private org.simantics.db.procore.cluster.Cluster cluster;
+// protected Cluster getCluster() {
+// throw new Error("No can do.");
+// }
+// ResourceImplClusterNew(long id, org.simantics.db.procore.cluster.Cluster cluster) {
+// this.id = id;
+// this.cluster = cluster;
+// }
+// final org.simantics.db.procore.cluster.Cluster getClusterNew() {
+// return cluster;
+// }
+// void setCluster(Cluster c) {
+// throw new Error("No can do.");
+// }
+// @Override
+// void init(ResourceImpl self) {
+// }
+// @Override
+// void dispose() {
+// }
+// @Override
+// long getClusterId() {
+// return cluster.getId();
+// }
+// @Override
+// Value_ getValue(ResourceImpl self) {
+// byte[] value = cluster.getValue(id);
+// return new Zany(value);
+// }
+// protected void setValue(Value_ value) {
+// throw new Error("No can do.");
+// }
+// void moveValue() {
+// throw new Error("No can do.");
+// }
+// void removeValue() {
+// throw new Error("No can do.");
+// }
+// void addValue(ResourceImpl self, Value_ value) { // TODO: Remove return value, inefficient.
+// throw new Error("No can do.");
+// }
+// @Override
+// void addRelation(ResourceImpl self, long predicate, long predicateCluster,
+// long object, long objectCluster) {
+// throw new Error("No can do.");
+// }
+// @Override
+// int getNumberOfRelations(ResourceImpl self) {
+// throw new Error("No can do.");
+// }
+// @Override
+// StatementImpl[] getStatements(ResourceImpl self) {
+// throw new Error("No can do.");
+// }
+// @Override
+// boolean isModified() {
+// throw new Error("No can do.");
+// }
+// @Override
+// void removeRelation(long predicate, long predicateCluster, long object,
+// long objectCluster) throws StatementNotFoundException {
+// throw new Error("No can do.");
+// }
+//}