]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.mapping/src/org/simantics/mapping/constraint/instructions/ExistsInstruction.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.mapping / src / org / simantics / mapping / constraint / instructions / ExistsInstruction.java
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
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.mapping.constraint.instructions;\r
13 \r
14 import gnu.trove.map.hash.TIntIntHashMap;\r
15 import gnu.trove.set.hash.TIntHashSet;\r
16 \r
17 import org.simantics.db.ReadGraph;\r
18 import org.simantics.db.Resource;\r
19 import org.simantics.db.WriteGraph;\r
20 import org.simantics.db.common.utils.NameUtils;\r
21 import org.simantics.db.exception.DatabaseException;\r
22 import org.simantics.db.layer0.util.RemoverUtil;\r
23 import org.simantics.mapping.IContextualModification;\r
24 \r
25 public class ExistsInstruction implements IInstruction {\r
26 \r
27         IInstruction instruction;\r
28         int[] variables;        \r
29         \r
30         public ExistsInstruction(IInstruction instruction, int ... variables) {\r
31                 this.instruction = instruction;\r
32                 this.variables = variables;\r
33         }       \r
34 \r
35         @Override\r
36         public void collectVariables(TIntHashSet reads, TIntHashSet writes) {\r
37                 instruction.collectVariables(reads, writes);\r
38         }\r
39         \r
40         class Claim implements IContextualModification {\r
41                         \r
42                 public Claim() {\r
43                 }\r
44 \r
45                 @Override\r
46                 public void perform(WriteGraph g, Object[] bindings) throws DatabaseException {\r
47 //                      ITask task = ThreadLogger.getInstance().begin("g");\r
48                         for(int var : variables) {\r
49                                 bindings[var] = DISABLE_MODI ? null : g.newResource();\r
50                                 if(DEBUG)\r
51                                     System.out.println("@ newResource " + NameUtils.getSafeName(g, (Resource)bindings[var]));\r
52                 if(DEBUG_MODI)\r
53                     System.out.println("claim exists " + NameUtils.getSafeName(g, (Resource)bindings[var]));\r
54                         }\r
55 //                      task.finish();\r
56                         instruction.doClaim(g, bindings);       \r
57                 }\r
58         }\r
59         \r
60         @Override\r
61         public IContextualModification claim(ReadGraph g, Object[] bindings) throws DatabaseException {\r
62                 if(instruction.query(g, bindings)==IInstruction.FAILURE) {\r
63 //                      System.out.println("Creates Claim");\r
64                         return new Claim();\r
65                 }\r
66                 return null;\r
67         }\r
68         \r
69         class Deny implements IContextualModification {\r
70                 Object continuation;\r
71                 \r
72                 public Deny(Object continuation) {\r
73                         this.continuation = continuation;\r
74                 }\r
75 \r
76                 @Override\r
77                 public void perform(WriteGraph g, Object[] bindings) throws DatabaseException {\r
78                         Object continuation = this.continuation;\r
79                         do {\r
80                             for(int var : variables) {\r
81                                 if(DEBUG_MODI)\r
82                                     System.out.println("deny exists " + \r
83                                             NameUtils.getSafeName(g, (Resource)bindings[var]));\r
84                                 if(!DISABLE_MODI)\r
85                                         RemoverUtil.remove(g, (Resource)bindings[var]);\r
86                                 }\r
87                                 continuation = instruction.next(g, bindings, continuation);\r
88                         } while(continuation != null && continuation != IInstruction.FAILURE);  \r
89                 }\r
90         }\r
91         \r
92         @Override\r
93         public IContextualModification deny(ReadGraph g, Object[] bindings) throws DatabaseException {\r
94                 Object continuation = instruction.query(g, bindings);\r
95                 if(continuation != IInstruction.FAILURE)\r
96                         return new Deny(continuation);\r
97                 return null;\r
98         }\r
99 \r
100         @Override\r
101         public void doClaim(WriteGraph g, Object[] bindings) throws DatabaseException {\r
102                 if(instruction.query(g, bindings)==IInstruction.FAILURE) {\r
103 //                      ITask task = ThreadLogger.getInstance().begin("g");\r
104                         for(int var : variables) {\r
105                                 bindings[var] = DISABLE_MODI ? null : g.newResource();\r
106                                 if(DEBUG)\r
107                                         System.out.println("@ newResource " + NameUtils.getSafeName(g, (Resource)bindings[var]));\r
108                                 if(DEBUG_MODI)\r
109                                         System.out.println("claim exists " + NameUtils.getSafeName(g, (Resource)bindings[var]));\r
110                         }                       \r
111 //                      task.finish();\r
112                         instruction.doClaim(g, bindings);\r
113                 }               \r
114         }\r
115 \r
116         @Override\r
117         public void doDeny(WriteGraph g, Object[] bindings) throws DatabaseException {\r
118                 Object continuation = instruction.query(g, bindings);\r
119                 if(continuation != IInstruction.FAILURE)\r
120                         do {\r
121                                 for(int var : variables) {\r
122                             if(DEBUG_MODI)\r
123                                 System.out.println("deny exists " + \r
124                                         NameUtils.getSafeName(g, (Resource)bindings[var]));\r
125                             if(!DISABLE_MODI)\r
126                                 RemoverUtil.remove(g, (Resource)bindings[var]);\r
127                                 }\r
128                                 continuation = instruction.next(g, bindings, continuation);\r
129                         } while(continuation != null && continuation != IInstruction.FAILURE);          \r
130         }\r
131 \r
132         @Override\r
133         public void mapVariables(TIntIntHashMap map) {\r
134                 instruction.mapVariables(map);\r
135                 for(int i=0;i<variables.length;++i)\r
136                         variables[i] = map.get(variables[i]);\r
137         }\r
138 \r
139         @Override\r
140         public Object next(ReadGraph g, Object[] bindings, Object continuation) throws DatabaseException {\r
141                 return instruction.next(g, bindings, continuation);\r
142         }\r
143 \r
144         @Override\r
145         public Object query(ReadGraph g, Object[] bindings) throws DatabaseException {\r
146                 return instruction.query(g, bindings);\r
147         }\r
148         \r
149         @Override\r
150         public void toString(StringBuilder b, int indent) {\r
151                 b.append('[');\r
152                 boolean first = true;\r
153                 for(int v : variables) {\r
154                         if(first)\r
155                                 first = false;\r
156                         else \r
157                                 b.append(',');\r
158                         b.append(v);            \r
159                 }\r
160                 b.append("] ");\r
161                 instruction.toString(b, indent+1);\r
162         }\r
163 \r
164 }\r