Merge branch 'feature/funcwrite'
[simantics/platform.git] / bundles / org.simantics.db.procore / src / fi / vtt / simantics / procore / internal / ResourceImpl.java
1 /*******************************************************************************
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management
3  * in Industry THTH ry.
4  * All rights reserved. This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License v1.0
6  * which accompanies this distribution, and is available at
7  * http://www.eclipse.org/legal/epl-v10.html
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package fi.vtt.simantics.procore.internal;
13
14
15
16 //public abstract class ResourceImpl implements Resource {
17 //    public final static ResourceImpl[] NONE = new ResourceImpl[0];
18 //}
19
20 //class ResourceProxy {
21 //    private final int offset;
22 //    private final int size;
23 //    private WeakReference<ResourceImpl> weakResource = null; 
24 //    private ResourceImplModified modifiedResourceImpl = null;
25 //    private Value_ value;
26 //    ResourceProxy(int offset, int size) {
27 //        this.offset = offset;
28 //        this.size = size;
29 //    }
30 //    boolean isNew() {
31 //        return 0 == size;
32 //    }
33 //    private ResourceImpl getResourceImplModified(Cluster cluster, long subject) {
34 //        ResourceImpl r;
35 //        if (null == weakResource || null == (r = weakResource.get())) {
36 //            if (null == modifiedResourceImpl)
37 //                modifiedResourceImpl = new ResourceImplModified(cluster, offset, size, value);
38 //            r = new ResourceImpl(subject, modifiedResourceImpl);
39 //            weakResource = new WeakReference<ResourceImpl>(r); 
40 //        } else if (!r.isModified()) {
41 //            if (null == modifiedResourceImpl)
42 //                modifiedResourceImpl = new ResourceImplModified(cluster, offset, size, value);
43 //            r.setImpl(modifiedResourceImpl);
44 //        }
45 //        return r;
46 //    }
47 //    void setValue(Value_ value) {
48 //        this.value = value;
49 //    }
50 //    ResourceImpl addRelation(Cluster cluster, long subject, long predicate, long predicateCluster, long object, long objectCluster) {
51 //        ResourceImpl r = getResourceImplModified(cluster, subject);
52 //        return r.addRelation(predicate, predicateCluster, object, objectCluster);
53 //    }
54 //    void removeRelation(Cluster cluster, long subject, long predicate, long predicateCluster, long object, long objectCluster) throws StatementNotFoundException {
55 //        ResourceImpl r = getResourceImplModified(cluster, subject);
56 //        r.removeRelation(predicate, predicateCluster, object, objectCluster);
57 //    }
58 //    ResourceImpl getResource(Cluster cluster, long id) {
59 //        ResourceImpl r;
60 //        if (null != weakResource) {
61 //            r = weakResource.get();
62 //            if (null != r)
63 //                return r;
64 //        }
65 //        if (isNew()) {
66 //            if (null == modifiedResourceImpl)
67 //                modifiedResourceImpl = new ResourceImplModified(cluster, offset, size, value);
68 //            r = new ResourceImpl(id, modifiedResourceImpl);
69 //        } else
70 //            r = new ResourceImpl(id, new ResourceImplFixed(cluster, offset, size, value));
71 //        weakResource = new WeakReference<ResourceImpl>(r); 
72 //        return r;
73 //    }
74 //    ResourceImpl getResourceImpl(long id, ResourceImplModified impl) {
75 //        ResourceImpl r;
76 //        assert(null == modifiedResourceImpl);
77 //        assert(null == weakResource);
78 //        modifiedResourceImpl = impl;
79 //        r = new ResourceImpl(id, impl);
80 //        weakResource = new WeakReference<ResourceImpl>(r); 
81 //        return r;
82 //    }
83 //    void release() {
84 //        if (null == weakResource)
85 //            return;
86 //        weakResource = null;
87 //        modifiedResourceImpl = null;
88 //    }
89 //}
90 //
91 //abstract class ResourceImplAbstract {
92 //    abstract void init(ResourceImpl self);
93 //    abstract void dispose();
94 //    abstract Value_ getValue(ResourceImpl self);
95 //    abstract long getClusterId();
96 //    abstract boolean isModified();
97 //    abstract int getNumberOfRelations(ResourceImpl self);
98 //    abstract StatementImpl[] getStatements(ResourceImpl self) throws ResourceNotFoundException;
99 //    abstract void addRelation(ResourceImpl self, long predicate, long predicateCluster, long object, long objectCluster);
100 //    abstract void removeRelation(long predicate, long predicateCluster, long object, long objectCluster) throws StatementNotFoundException;
101 //    abstract void addValue(ResourceImpl self, Value_ value); // TODO: Remove return value, inefficient.
102 //}
103 //
104 //abstract class ResourceImplCluster extends ResourceImplAbstract {
105 //    private Cluster cluster;
106 //    protected Value_ value;
107 //    protected Value_ valueOld = null;
108 //    protected Cluster getCluster() {
109 //        return cluster;
110 //    }
111 //    ResourceImplCluster(Cluster cluster) {
112 //        this.cluster = cluster;
113 //        cluster.incReferenceCount();
114 //    }
115 //    void setCluster(Cluster c) {
116 //        this.cluster = c;
117 //    }
118 //    @Override
119 //    void init(ResourceImpl self) {
120 //    }
121 //    @Override
122 //    void dispose() {
123 //        cluster.decReferenceCount();
124 //    }
125 //    @Override
126 //    long getClusterId() {
127 //        return cluster.getId();
128 //    }
129 //    @Override
130 //    Value_ getValue(ResourceImpl self) {
131 //        return value;
132 //    }
133 //    protected void setValue(Value_ value) {
134 //        this.value = this.valueOld = value;
135 //    }
136 //    void moveValue() {
137 //        valueOld = value;
138 //    }
139 //    void removeValue() {
140 //        value = valueOld;
141 //    }
142 //    void addValue(ResourceImpl self, Value_ value) { // TODO: Remove return value, inefficient.
143 //        this.value = value;
144 //    }
145 //}
146 //
147 //class ResourceImplFixed extends ResourceImplCluster {
148 //    final int fixedOffset;
149 //    final int fixedSize;
150 //    public ResourceImplFixed(Cluster cluster, int offset, int size, Value_ value) {
151 //        super(cluster);
152 //        this.fixedOffset = offset;
153 //        this.fixedSize = size;
154 //        setValue(value);
155 //    }
156 //    @Override
157 //    int getNumberOfRelations(ResourceImpl self) {
158 //        return fixedSize;
159 //    }
160 //    @Override
161 //    StatementImpl[] getStatements(ResourceImpl self) throws ResourceNotFoundException {
162 //        StatementImpl[] stms = new StatementImpl[fixedSize];
163 //        GraphSession gs = this.getCluster().client;
164 //        int end = fixedOffset + fixedSize;
165 //        for (int i=fixedOffset, j=0; i<end; ++i, ++j) {
166 //            ResourceImpl p = gs.getResourceOrThrow(getCluster().raw.predicates[i], getCluster().raw.predicateClusters[i]);
167 //            stms[j] = new StatementImplNew(self, p, getCluster().raw.objects[i], getCluster().raw.objectClusters[i], gs);
168 ////            ResourceImpl o = gs.getResourceOrThrow(getCluster().raw.objects[i], getCluster().raw.objectClusters[i]);
169 ////            stms[j] = new StatementImplOld(self, p, o);
170 //        }
171 //        return stms;
172 //    }
173 //    @Override
174 //    boolean isModified() {
175 //        return false;
176 //    }
177 //    @Override
178 //    void addRelation(ResourceImpl self, long predicate, long predicateCluster, long object, long objectCluster) {
179 //        throw new Error("Not allowed");
180 //    }
181 //    @Override
182 //    void removeRelation(long predicate, long predicateCluster, long object, long objectCluster) {
183 //        throw new Error("Not allowed");
184 //    }
185 //}
186 //
187 //class ResourceImplModifiedStatement {
188 //    long predicate;
189 //    long predicateCluster;
190 //    long object;
191 //    long objectCluster;
192 //    ResourceImplModifiedStatement(long predicate, long predicateCluster, long object, long objectCluster) {
193 //        this.predicate = predicate;
194 //        this.predicateCluster = predicateCluster;
195 //        this.object = object;
196 //        this.objectCluster = objectCluster;
197 //    }
198 //    @Override
199 //    public int hashCode() {
200 //        return (int)(object^(object>>32)^predicate^(predicate>>>32));
201 //    }
202 //    @Override
203 //    public boolean equals(Object obj) {
204 //        if (this == obj)
205 //            return true;
206 //        else if (obj == null)
207 //            return false;
208 //        else if (ResourceImplModifiedStatement.class != obj.getClass())
209 //            return false;
210 //        ResourceImplModifiedStatement d = (ResourceImplModifiedStatement)obj;
211 //        return (d.object == object) && (d.predicate == predicate);
212 //    }
213 //}
214 //
215 //class ResourceImplModified extends ResourceImplCluster {
216 //    static ResourceImplModifiedStatement findStatement = new ResourceImplModifiedStatement(0, 0, 0, 0);
217 //    THashSet<ResourceImplModifiedStatement> statements = new THashSet<ResourceImplModifiedStatement>();
218 //    THashSet<ResourceImplModifiedStatement> reclusteringStatements = new THashSet<ResourceImplModifiedStatement>();
219 //    public ResourceImplModified(Cluster cluster, int offset, int size, Value_ value) {
220 //        super(cluster);
221 //        setValue(value);
222 //        statements.ensureCapacity(size);
223 //        for (int i=0,j=offset; i<size; ++i,++j) {
224 //            assert(Constants.ReservedClusterId != cluster.raw.predicateClusters[j]);
225 //            assert(Constants.ReservedClusterId != cluster.raw.objectClusters[j]);
226 //            statements.add(new ResourceImplModifiedStatement(cluster.raw.predicates[j], cluster.raw.predicateClusters[j], cluster.raw.objects[j], cluster.raw.objectClusters[j]));
227 //        }
228 //    }
229 //    void moveStatements(HashMap<Long, Long> oldResourceIdToNewClusterIdMap) {
230 //        for (ResourceImplModifiedStatement s : reclusteringStatements) {
231 //            statements.remove(s);
232 //            if (Constants.ReservedClusterId == s.predicateCluster)
233 //                s.predicateCluster = oldResourceIdToNewClusterIdMap.get(s.predicate);
234 //            if (Constants.ReservedClusterId == s.objectCluster)
235 //                s.objectCluster = oldResourceIdToNewClusterIdMap.get(s.object);
236 //            statements.add(s);
237 //        }
238 //        reclusteringStatements.clear();
239 //    }
240 //
241 //    void removeStatements() {
242 //        for (ResourceImplModifiedStatement s : reclusteringStatements) {
243 //            statements.remove(s);
244 //        }
245 //        reclusteringStatements.clear();
246 //    }
247 //
248 //    @Override
249 //    int getNumberOfRelations(ResourceImpl self) {
250 //        return statements.size();
251 //    }
252 //    @Override
253 //    boolean isModified() {
254 //        return true; // HACK: This is not necessarily true. In creation no modifications given and modifications can cancel each other out.
255 //    }
256 //    @Override
257 //    StatementImpl[] getStatements(ResourceImpl self) throws ResourceNotFoundException {
258 //        int size = statements.size();
259 //        StatementImpl[] stms = new StatementImpl[size];
260 //        GraphSession gs = getCluster().client;
261 //        int i = -1;
262 //        for (ResourceImplModifiedStatement s : statements) {
263 //            ResourceImpl p;
264 //            if (Constants.ReservedClusterId == s.predicateCluster)
265 //                p = this.getCluster().getResourceReservedOrThrow(Constants.ReservedClusterId, s.predicate);
266 //            else
267 //                p = gs.getResourceOrThrow(s.predicate, s.predicateCluster);
268 //            if (Constants.ReservedClusterId == s.objectCluster) {
269 //                ResourceImpl o = this.getCluster().getResourceReservedOrThrow(Constants.ReservedClusterId, s.object);
270 //                stms[++i] = new StatementImplOld(self, p, o);
271 //            } else
272 //                stms[++i] = new StatementImplNew(self, p, s.object, s.objectCluster, gs);
273 //        }
274 //        return stms;
275 //    }
276 //    private boolean find(long predicate, long predicateCluster, long object, long objectCluster) {
277 //        findStatement.predicate = predicate;
278 //        findStatement.predicateCluster = predicateCluster;
279 //        findStatement.object = object;
280 //        findStatement.objectCluster = objectCluster;
281 //        return statements.contains(findStatement);
282 //    }
283 //    @Override
284 //    void addRelation(ResourceImpl self, long predicate, long predicateCluster, long object, long objectCluster) {
285 //        if (find(predicate, predicateCluster, object, objectCluster))
286 //            return;
287 //        //System.out.println(self + "." + getNumberOfRelations(self) + ": " + predicate + "." + predicateCluster + " " + object + "." + objectCluster);
288 //        ResourceImplModifiedStatement s = new ResourceImplModifiedStatement(predicate, predicateCluster, object, objectCluster);
289 //        statements.add(s);
290 //        if (Constants.ReservedClusterId == predicateCluster ||
291 //                Constants.ReservedClusterId == objectCluster) {
292 //            reclusteringStatements.add(s);
293 //            getCluster().addModifiedResource(self);
294 //        }
295 //    }
296 //    @Override
297 //    void removeRelation(long predicate, long predicateCluster, long object, long objectCluster) throws StatementNotFoundException {
298 //        findStatement.predicate = predicate;
299 //        findStatement.predicateCluster = predicateCluster;
300 //        findStatement.object = object;
301 //        findStatement.objectCluster = objectCluster;
302 //        if (!statements.remove(findStatement))
303 //            throw new StatementNotFoundException();
304 //        reclusteringStatements.remove(findStatement);
305 //    }
306 //}
307 //
308 //class ResourceImplChangeSet extends ResourceImplAbstract {
309 //    private SessionImplHistorical session;
310 //    private long cluster;
311 //    private ResourceImpl original;
312 //    public ResourceImplChangeSet(SessionImplHistorical session, long cluster) {
313 //        this.session = session;
314 //        this.cluster = cluster;
315 //    }
316 //    @Override
317 //    void init(ResourceImpl self) {
318 //        Cluster c = session.getCluster(cluster);
319 //        if (null != c)
320 //            this.original = c.getResource(self.id);
321 //    }
322 //    @Override
323 //    void dispose() {
324 //    }
325 //    @Override
326 //    long getClusterId() {
327 //        return cluster;
328 //    }
329 //    @Override
330 //    Value_ getValue(ResourceImpl self) {
331 //        Value_ value = null;
332 //        if (null != original)
333 //            value = original.getValue();
334 //        return session.getValue(self.id, value);
335 //    }
336 //    @Override
337 //    int getNumberOfRelations(ResourceImpl self) {
338 //        int n = 0;
339 //        if (null != original)
340 //            n = original.getNumberOfRelations();
341 //        n += session.getNumberOfAddedRelations(self.id);
342 //        n -= session.getNumberOfRemovedRelations(self.id);
343 //        return n;
344 //    }
345 //    @Override
346 //    StatementImpl[] getStatements(ResourceImpl self) throws ResourceNotFoundException {
347 //        StatementImpl[] stms = StatementImpl.NONE;
348 //        if (null != original)
349 //            stms = original.getStatements();
350 //        return session.getStatements(self.id, stms);
351 //    }
352 //    @Override
353 //    boolean isModified() {
354 //        return false;
355 //    }
356 //    @Override
357 //    void addValue(ResourceImpl self, Value_ value) {
358 //        throw new Error("Not allowed");
359 //    }
360 //    @Override
361 //    void addRelation(ResourceImpl self, long predicate, long predicateCluster, long object, long objectCluster) {
362 //        throw new Error("Not allowed");
363 //    }
364 //    @Override
365 //    void removeRelation(long predicate, long predicateCluster, long object, long objectCluster) {
366 //        throw new Error("Not allowed");
367 //    }
368 //}
369 //
370 //class ResourceImplClusterNew extends ResourceImplAbstract {
371 //    //private Cluster clusterOld;
372 //      private final long id;
373 //    private org.simantics.db.procore.cluster.Cluster cluster;
374 //    protected Cluster getCluster() {
375 //        throw new Error("No can do.");
376 //    }
377 //    ResourceImplClusterNew(long id, org.simantics.db.procore.cluster.Cluster cluster) {
378 //        this.id = id;
379 //        this.cluster = cluster;
380 //    }
381 //    final org.simantics.db.procore.cluster.Cluster getClusterNew() {
382 //      return cluster;
383 //    }
384 //    void setCluster(Cluster c) {
385 //        throw new Error("No can do.");
386 //    }
387 //    @Override
388 //    void init(ResourceImpl self) {
389 //    }
390 //    @Override
391 //    void dispose() {
392 //    }
393 //    @Override
394 //    long getClusterId() {
395 //        return cluster.getId();
396 //    }
397 //    @Override
398 //    Value_ getValue(ResourceImpl self) {
399 //      byte[] value = cluster.getValue(id);
400 //      return new Zany(value);
401 //    }
402 //    protected void setValue(Value_ value) {
403 //      throw new Error("No can do.");
404 //    }
405 //    void moveValue() {
406 //      throw new Error("No can do.");
407 //    }
408 //    void removeValue() {
409 //      throw new Error("No can do.");
410 //    }
411 //    void addValue(ResourceImpl self, Value_ value) { // TODO: Remove return value, inefficient.
412 //      throw new Error("No can do.");
413 //    }
414 //      @Override
415 //      void addRelation(ResourceImpl self, long predicate, long predicateCluster,
416 //                      long object, long objectCluster) {
417 //              throw new Error("No can do.");
418 //      }
419 //      @Override
420 //      int getNumberOfRelations(ResourceImpl self) {
421 //              throw new Error("No can do.");
422 //      }
423 //      @Override
424 //      StatementImpl[] getStatements(ResourceImpl self) {
425 //              throw new Error("No can do.");
426 //      }
427 //      @Override
428 //      boolean isModified() {
429 //              throw new Error("No can do.");
430 //      }
431 //      @Override
432 //      void removeRelation(long predicate, long predicateCluster, long object,
433 //                      long objectCluster) throws StatementNotFoundException {
434 //              throw new Error("No can do.");
435 //      }
436 //}