--- /dev/null
+/*******************************************************************************\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