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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package fi.vtt.simantics.procore.internal;
\r
16 //public abstract class ResourceImpl implements Resource {
\r
17 // public final static ResourceImpl[] NONE = new ResourceImpl[0];
\r
20 //class ResourceProxy {
\r
21 // private final int offset;
\r
22 // private final int size;
\r
23 // private WeakReference<ResourceImpl> weakResource = null;
\r
24 // private ResourceImplModified modifiedResourceImpl = null;
\r
25 // private Value_ value;
\r
26 // ResourceProxy(int offset, int size) {
\r
27 // this.offset = offset;
\r
28 // this.size = size;
\r
30 // boolean isNew() {
\r
31 // return 0 == size;
\r
33 // private ResourceImpl getResourceImplModified(Cluster cluster, long subject) {
\r
35 // if (null == weakResource || null == (r = weakResource.get())) {
\r
36 // if (null == modifiedResourceImpl)
\r
37 // modifiedResourceImpl = new ResourceImplModified(cluster, offset, size, value);
\r
38 // r = new ResourceImpl(subject, modifiedResourceImpl);
\r
39 // weakResource = new WeakReference<ResourceImpl>(r);
\r
40 // } else if (!r.isModified()) {
\r
41 // if (null == modifiedResourceImpl)
\r
42 // modifiedResourceImpl = new ResourceImplModified(cluster, offset, size, value);
\r
43 // r.setImpl(modifiedResourceImpl);
\r
47 // void setValue(Value_ value) {
\r
48 // this.value = value;
\r
50 // ResourceImpl addRelation(Cluster cluster, long subject, long predicate, long predicateCluster, long object, long objectCluster) {
\r
51 // ResourceImpl r = getResourceImplModified(cluster, subject);
\r
52 // return r.addRelation(predicate, predicateCluster, object, objectCluster);
\r
54 // void removeRelation(Cluster cluster, long subject, long predicate, long predicateCluster, long object, long objectCluster) throws StatementNotFoundException {
\r
55 // ResourceImpl r = getResourceImplModified(cluster, subject);
\r
56 // r.removeRelation(predicate, predicateCluster, object, objectCluster);
\r
58 // ResourceImpl getResource(Cluster cluster, long id) {
\r
60 // if (null != weakResource) {
\r
61 // r = weakResource.get();
\r
66 // if (null == modifiedResourceImpl)
\r
67 // modifiedResourceImpl = new ResourceImplModified(cluster, offset, size, value);
\r
68 // r = new ResourceImpl(id, modifiedResourceImpl);
\r
70 // r = new ResourceImpl(id, new ResourceImplFixed(cluster, offset, size, value));
\r
71 // weakResource = new WeakReference<ResourceImpl>(r);
\r
74 // ResourceImpl getResourceImpl(long id, ResourceImplModified impl) {
\r
76 // assert(null == modifiedResourceImpl);
\r
77 // assert(null == weakResource);
\r
78 // modifiedResourceImpl = impl;
\r
79 // r = new ResourceImpl(id, impl);
\r
80 // weakResource = new WeakReference<ResourceImpl>(r);
\r
84 // if (null == weakResource)
\r
86 // weakResource = null;
\r
87 // modifiedResourceImpl = null;
\r
91 //abstract class ResourceImplAbstract {
\r
92 // abstract void init(ResourceImpl self);
\r
93 // abstract void dispose();
\r
94 // abstract Value_ getValue(ResourceImpl self);
\r
95 // abstract long getClusterId();
\r
96 // abstract boolean isModified();
\r
97 // abstract int getNumberOfRelations(ResourceImpl self);
\r
98 // abstract StatementImpl[] getStatements(ResourceImpl self) throws ResourceNotFoundException;
\r
99 // abstract void addRelation(ResourceImpl self, long predicate, long predicateCluster, long object, long objectCluster);
\r
100 // abstract void removeRelation(long predicate, long predicateCluster, long object, long objectCluster) throws StatementNotFoundException;
\r
101 // abstract void addValue(ResourceImpl self, Value_ value); // TODO: Remove return value, inefficient.
\r
104 //abstract class ResourceImplCluster extends ResourceImplAbstract {
\r
105 // private Cluster cluster;
\r
106 // protected Value_ value;
\r
107 // protected Value_ valueOld = null;
\r
108 // protected Cluster getCluster() {
\r
111 // ResourceImplCluster(Cluster cluster) {
\r
112 // this.cluster = cluster;
\r
113 // cluster.incReferenceCount();
\r
115 // void setCluster(Cluster c) {
\r
116 // this.cluster = c;
\r
119 // void init(ResourceImpl self) {
\r
122 // void dispose() {
\r
123 // cluster.decReferenceCount();
\r
126 // long getClusterId() {
\r
127 // return cluster.getId();
\r
130 // Value_ getValue(ResourceImpl self) {
\r
133 // protected void setValue(Value_ value) {
\r
134 // this.value = this.valueOld = value;
\r
136 // void moveValue() {
\r
137 // valueOld = value;
\r
139 // void removeValue() {
\r
140 // value = valueOld;
\r
142 // void addValue(ResourceImpl self, Value_ value) { // TODO: Remove return value, inefficient.
\r
143 // this.value = value;
\r
147 //class ResourceImplFixed extends ResourceImplCluster {
\r
148 // final int fixedOffset;
\r
149 // final int fixedSize;
\r
150 // public ResourceImplFixed(Cluster cluster, int offset, int size, Value_ value) {
\r
152 // this.fixedOffset = offset;
\r
153 // this.fixedSize = size;
\r
154 // setValue(value);
\r
157 // int getNumberOfRelations(ResourceImpl self) {
\r
158 // return fixedSize;
\r
161 // StatementImpl[] getStatements(ResourceImpl self) throws ResourceNotFoundException {
\r
162 // StatementImpl[] stms = new StatementImpl[fixedSize];
\r
163 // GraphSession gs = this.getCluster().client;
\r
164 // int end = fixedOffset + fixedSize;
\r
165 // for (int i=fixedOffset, j=0; i<end; ++i, ++j) {
\r
166 // ResourceImpl p = gs.getResourceOrThrow(getCluster().raw.predicates[i], getCluster().raw.predicateClusters[i]);
\r
167 // stms[j] = new StatementImplNew(self, p, getCluster().raw.objects[i], getCluster().raw.objectClusters[i], gs);
\r
168 //// ResourceImpl o = gs.getResourceOrThrow(getCluster().raw.objects[i], getCluster().raw.objectClusters[i]);
\r
169 //// stms[j] = new StatementImplOld(self, p, o);
\r
174 // boolean isModified() {
\r
178 // void addRelation(ResourceImpl self, long predicate, long predicateCluster, long object, long objectCluster) {
\r
179 // throw new Error("Not allowed");
\r
182 // void removeRelation(long predicate, long predicateCluster, long object, long objectCluster) {
\r
183 // throw new Error("Not allowed");
\r
187 //class ResourceImplModifiedStatement {
\r
189 // long predicateCluster;
\r
191 // long objectCluster;
\r
192 // ResourceImplModifiedStatement(long predicate, long predicateCluster, long object, long objectCluster) {
\r
193 // this.predicate = predicate;
\r
194 // this.predicateCluster = predicateCluster;
\r
195 // this.object = object;
\r
196 // this.objectCluster = objectCluster;
\r
199 // public int hashCode() {
\r
200 // return (int)(object^(object>>32)^predicate^(predicate>>>32));
\r
203 // public boolean equals(Object obj) {
\r
204 // if (this == obj)
\r
206 // else if (obj == null)
\r
208 // else if (ResourceImplModifiedStatement.class != obj.getClass())
\r
210 // ResourceImplModifiedStatement d = (ResourceImplModifiedStatement)obj;
\r
211 // return (d.object == object) && (d.predicate == predicate);
\r
215 //class ResourceImplModified extends ResourceImplCluster {
\r
216 // static ResourceImplModifiedStatement findStatement = new ResourceImplModifiedStatement(0, 0, 0, 0);
\r
217 // THashSet<ResourceImplModifiedStatement> statements = new THashSet<ResourceImplModifiedStatement>();
\r
218 // THashSet<ResourceImplModifiedStatement> reclusteringStatements = new THashSet<ResourceImplModifiedStatement>();
\r
219 // public ResourceImplModified(Cluster cluster, int offset, int size, Value_ value) {
\r
221 // setValue(value);
\r
222 // statements.ensureCapacity(size);
\r
223 // for (int i=0,j=offset; i<size; ++i,++j) {
\r
224 // assert(Constants.ReservedClusterId != cluster.raw.predicateClusters[j]);
\r
225 // assert(Constants.ReservedClusterId != cluster.raw.objectClusters[j]);
\r
226 // statements.add(new ResourceImplModifiedStatement(cluster.raw.predicates[j], cluster.raw.predicateClusters[j], cluster.raw.objects[j], cluster.raw.objectClusters[j]));
\r
229 // void moveStatements(HashMap<Long, Long> oldResourceIdToNewClusterIdMap) {
\r
230 // for (ResourceImplModifiedStatement s : reclusteringStatements) {
\r
231 // statements.remove(s);
\r
232 // if (Constants.ReservedClusterId == s.predicateCluster)
\r
233 // s.predicateCluster = oldResourceIdToNewClusterIdMap.get(s.predicate);
\r
234 // if (Constants.ReservedClusterId == s.objectCluster)
\r
235 // s.objectCluster = oldResourceIdToNewClusterIdMap.get(s.object);
\r
236 // statements.add(s);
\r
238 // reclusteringStatements.clear();
\r
241 // void removeStatements() {
\r
242 // for (ResourceImplModifiedStatement s : reclusteringStatements) {
\r
243 // statements.remove(s);
\r
245 // reclusteringStatements.clear();
\r
249 // int getNumberOfRelations(ResourceImpl self) {
\r
250 // return statements.size();
\r
253 // boolean isModified() {
\r
254 // return true; // HACK: This is not necessarily true. In creation no modifications given and modifications can cancel each other out.
\r
257 // StatementImpl[] getStatements(ResourceImpl self) throws ResourceNotFoundException {
\r
258 // int size = statements.size();
\r
259 // StatementImpl[] stms = new StatementImpl[size];
\r
260 // GraphSession gs = getCluster().client;
\r
262 // for (ResourceImplModifiedStatement s : statements) {
\r
264 // if (Constants.ReservedClusterId == s.predicateCluster)
\r
265 // p = this.getCluster().getResourceReservedOrThrow(Constants.ReservedClusterId, s.predicate);
\r
267 // p = gs.getResourceOrThrow(s.predicate, s.predicateCluster);
\r
268 // if (Constants.ReservedClusterId == s.objectCluster) {
\r
269 // ResourceImpl o = this.getCluster().getResourceReservedOrThrow(Constants.ReservedClusterId, s.object);
\r
270 // stms[++i] = new StatementImplOld(self, p, o);
\r
272 // stms[++i] = new StatementImplNew(self, p, s.object, s.objectCluster, gs);
\r
276 // private boolean find(long predicate, long predicateCluster, long object, long objectCluster) {
\r
277 // findStatement.predicate = predicate;
\r
278 // findStatement.predicateCluster = predicateCluster;
\r
279 // findStatement.object = object;
\r
280 // findStatement.objectCluster = objectCluster;
\r
281 // return statements.contains(findStatement);
\r
284 // void addRelation(ResourceImpl self, long predicate, long predicateCluster, long object, long objectCluster) {
\r
285 // if (find(predicate, predicateCluster, object, objectCluster))
\r
287 // //System.out.println(self + "." + getNumberOfRelations(self) + ": " + predicate + "." + predicateCluster + " " + object + "." + objectCluster);
\r
288 // ResourceImplModifiedStatement s = new ResourceImplModifiedStatement(predicate, predicateCluster, object, objectCluster);
\r
289 // statements.add(s);
\r
290 // if (Constants.ReservedClusterId == predicateCluster ||
\r
291 // Constants.ReservedClusterId == objectCluster) {
\r
292 // reclusteringStatements.add(s);
\r
293 // getCluster().addModifiedResource(self);
\r
297 // void removeRelation(long predicate, long predicateCluster, long object, long objectCluster) throws StatementNotFoundException {
\r
298 // findStatement.predicate = predicate;
\r
299 // findStatement.predicateCluster = predicateCluster;
\r
300 // findStatement.object = object;
\r
301 // findStatement.objectCluster = objectCluster;
\r
302 // if (!statements.remove(findStatement))
\r
303 // throw new StatementNotFoundException();
\r
304 // reclusteringStatements.remove(findStatement);
\r
308 //class ResourceImplChangeSet extends ResourceImplAbstract {
\r
309 // private SessionImplHistorical session;
\r
310 // private long cluster;
\r
311 // private ResourceImpl original;
\r
312 // public ResourceImplChangeSet(SessionImplHistorical session, long cluster) {
\r
313 // this.session = session;
\r
314 // this.cluster = cluster;
\r
317 // void init(ResourceImpl self) {
\r
318 // Cluster c = session.getCluster(cluster);
\r
320 // this.original = c.getResource(self.id);
\r
323 // void dispose() {
\r
326 // long getClusterId() {
\r
330 // Value_ getValue(ResourceImpl self) {
\r
331 // Value_ value = null;
\r
332 // if (null != original)
\r
333 // value = original.getValue();
\r
334 // return session.getValue(self.id, value);
\r
337 // int getNumberOfRelations(ResourceImpl self) {
\r
339 // if (null != original)
\r
340 // n = original.getNumberOfRelations();
\r
341 // n += session.getNumberOfAddedRelations(self.id);
\r
342 // n -= session.getNumberOfRemovedRelations(self.id);
\r
346 // StatementImpl[] getStatements(ResourceImpl self) throws ResourceNotFoundException {
\r
347 // StatementImpl[] stms = StatementImpl.NONE;
\r
348 // if (null != original)
\r
349 // stms = original.getStatements();
\r
350 // return session.getStatements(self.id, stms);
\r
353 // boolean isModified() {
\r
357 // void addValue(ResourceImpl self, Value_ value) {
\r
358 // throw new Error("Not allowed");
\r
361 // void addRelation(ResourceImpl self, long predicate, long predicateCluster, long object, long objectCluster) {
\r
362 // throw new Error("Not allowed");
\r
365 // void removeRelation(long predicate, long predicateCluster, long object, long objectCluster) {
\r
366 // throw new Error("Not allowed");
\r
370 //class ResourceImplClusterNew extends ResourceImplAbstract {
\r
371 // //private Cluster clusterOld;
\r
372 // private final long id;
\r
373 // private org.simantics.db.procore.cluster.Cluster cluster;
\r
374 // protected Cluster getCluster() {
\r
375 // throw new Error("No can do.");
\r
377 // ResourceImplClusterNew(long id, org.simantics.db.procore.cluster.Cluster cluster) {
\r
379 // this.cluster = cluster;
\r
381 // final org.simantics.db.procore.cluster.Cluster getClusterNew() {
\r
384 // void setCluster(Cluster c) {
\r
385 // throw new Error("No can do.");
\r
388 // void init(ResourceImpl self) {
\r
391 // void dispose() {
\r
394 // long getClusterId() {
\r
395 // return cluster.getId();
\r
398 // Value_ getValue(ResourceImpl self) {
\r
399 // byte[] value = cluster.getValue(id);
\r
400 // return new Zany(value);
\r
402 // protected void setValue(Value_ value) {
\r
403 // throw new Error("No can do.");
\r
405 // void moveValue() {
\r
406 // throw new Error("No can do.");
\r
408 // void removeValue() {
\r
409 // throw new Error("No can do.");
\r
411 // void addValue(ResourceImpl self, Value_ value) { // TODO: Remove return value, inefficient.
\r
412 // throw new Error("No can do.");
\r
415 // void addRelation(ResourceImpl self, long predicate, long predicateCluster,
\r
416 // long object, long objectCluster) {
\r
417 // throw new Error("No can do.");
\r
420 // int getNumberOfRelations(ResourceImpl self) {
\r
421 // throw new Error("No can do.");
\r
424 // StatementImpl[] getStatements(ResourceImpl self) {
\r
425 // throw new Error("No can do.");
\r
428 // boolean isModified() {
\r
429 // throw new Error("No can do.");
\r
432 // void removeRelation(long predicate, long predicateCluster, long object,
\r
433 // long objectCluster) throws StatementNotFoundException {
\r
434 // throw new Error("No can do.");
\r