]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.procore/src/org/simantics/db/procore/cluster/CompleteTableSmall.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.db.procore / src / org / simantics / db / procore / cluster / CompleteTableSmall.java
1 package org.simantics.db.procore.cluster;
2
3 import gnu.trove.set.hash.TIntHashSet;
4
5 import org.simantics.db.exception.DatabaseException;
6 import org.simantics.db.impl.ClusterI;
7 import org.simantics.db.impl.ClusterSupport;
8 import org.simantics.db.impl.ClusterTraitsBase;
9 import org.simantics.db.impl.Modifier;
10 import org.simantics.db.impl.TableSizeListener;
11
12 public class CompleteTableSmall extends CompleteTable {
13     public CompleteTableSmall(TableSizeListener sizeListener, int[] header, int headerBase) {
14         super(sizeListener, header, headerBase);
15     }
16     public CompleteTableSmall(TableSizeListener sizeListener, int[] header, int headerBase, int[] ints) {
17         super(sizeListener, header, headerBase, ints);
18     }
19
20     @Override
21     public <Context> boolean foreachPredicate(int setIndex,
22             ClusterI.PredicateProcedure<Context> procedure,
23             Context context, ClusterSupport support, Modifier modifier)
24     throws DatabaseException {
25         ForeachPredicate<Context> t = new ForeachPredicate<Context>(procedure, support, modifier);
26         return foreachComplete(setIndex, t, context, null, null);
27     }
28
29     @Override
30     public <Context> boolean foreachObject(int setIndex,
31             ClusterI.ObjectProcedure<Context> procedure,
32             Context context, ClusterSupport support, Modifier modifier,
33             ClusterI.CompleteTypeEnum completeType)
34     throws DatabaseException {
35         ForeachObject<Context> t = new ForeachObject<Context>
36         (procedure, support, modifier, completeType);
37         return foreachComplete(setIndex, t, context, null, null);
38     }
39     
40     private static final class ForeachPredicate<Context>
41     implements ClusterI.ObjectProcedure<Context> {
42         private TIntHashSet completeTypes = new TIntHashSet();
43         private ClusterI.PredicateProcedure<Context> procedure; 
44         public ForeachPredicate(ClusterI.PredicateProcedure<Context>
45             procedure, ClusterSupport support, Modifier modifier) {
46             this.procedure = procedure;
47         }
48         @Override
49         public boolean execute(Context context, int completeRef) {
50                 ClusterI.CompleteTypeEnum completeType = ClusterTraitsSmall.completeRefAndTypeGetType(completeRef);
51             if (!completeTypes.contains(completeType.getValue())) {
52                 completeTypes.add(completeType.getValue());
53                 try {
54                     int pKey = ClusterTraitsBase.getCompleteTypeResourceKeyFromEnum(completeType);
55                     if (procedure.execute(context, pKey, 0))
56                         return true; // loop broken by procedure
57                 } catch (DatabaseException e) {
58                     e.printStackTrace();
59                     return false;
60                 }
61             }
62             return false; // Continue looping.
63         }
64         
65     }
66     private static class ForeachObject<Context>
67     implements ClusterI.ObjectProcedure<Context> {
68         private ClusterI.ObjectProcedure<Context> procedure; 
69         private Modifier modifier;
70         private ClusterI.CompleteTypeEnum completeType;
71         public ForeachObject(ClusterI.ObjectProcedure<Context>
72             procedure, ClusterSupport support, Modifier modifier, ClusterI.CompleteTypeEnum completeType) {
73             this.procedure = procedure;
74             this.modifier = modifier;
75             this.completeType = completeType;
76         }
77         @Override
78         public boolean execute(Context context, int completeRef) throws DatabaseException {
79                 ClusterI.CompleteTypeEnum completeType2 = ClusterTraitsSmall.completeRefAndTypeGetType(completeRef);
80             if (completeType == completeType2) { // same predicate
81                 int objectRef = ClusterTraitsSmall.completeRefAndTypeGetRef(completeRef);
82                 int externalRef;
83                 if (null == modifier)
84                     externalRef = objectRef;
85                 else
86                     externalRef = modifier.execute(objectRef);
87                 return procedure.execute(context, externalRef);
88             }
89             return false; // Continue looping.
90         }
91         
92     }
93 }