]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/ResourceImpl.java
Fixed ClusterTable cluster hash/importance map book-keeping problem
[simantics/platform.git] / bundles / org.simantics.db.procore / src / fi / vtt / simantics / procore / internal / ResourceImpl.java
index 03cde32605175c7a353e9c1d3f06a5e843acbe0c..d4e7c648a1ac874ab210a758645b27315d6a8813 100644 (file)
-/*******************************************************************************\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.");
+//     }
+//}