]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.mapping/src/org/simantics/mapping/constraint/instructions/TypedBracketInstruction.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.mapping / src / org / simantics / mapping / constraint / instructions / TypedBracketInstruction.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.mapping.IContextualModification;\r
23 \r
24 public class TypedBracketInstruction implements IInstruction {\r
25 \r
26         public static abstract class CreationInstruction {\r
27                 protected int variableId;\r
28                 \r
29                 public CreationInstruction(int variableId) {\r
30                         this.variableId = variableId;\r
31                 }\r
32 \r
33                 public abstract Resource create(WriteGraph g, Object[] bindings) throws DatabaseException;\r
34 \r
35                 public void mapVariables(TIntIntHashMap map) {\r
36                         variableId = map.get(variableId);                       \r
37                 }\r
38                 \r
39                 public void collectVariables(TIntHashSet reads, TIntHashSet writes) {                   \r
40                 }\r
41         }\r
42         \r
43         IInstruction instruction;\r
44         CreationInstruction[] variables;        \r
45         \r
46         public TypedBracketInstruction(IInstruction instruction, CreationInstruction ... variables) {\r
47                 this.instruction = instruction;\r
48                 this.variables = variables;\r
49         }       \r
50 \r
51         @Override\r
52         public void collectVariables(TIntHashSet reads, TIntHashSet writes) {\r
53                 instruction.collectVariables(reads, writes);\r
54                 for(CreationInstruction var : variables)\r
55                         var.collectVariables(reads, writes);\r
56         }\r
57         \r
58         class Claim implements IContextualModification {\r
59                         \r
60                 public Claim() {\r
61                 }\r
62 \r
63                 @Override\r
64                 public void perform(WriteGraph g, Object[] bindings) throws DatabaseException {\r
65                         for(CreationInstruction var : variables) {\r
66                                 bindings[var.variableId] = var.create(g, bindings);\r
67                                 if(DEBUG)\r
68                                     System.out.println("@ newResource " + NameUtils.getSafeName(g, (Resource)bindings[var.variableId]));\r
69                         }\r
70                         instruction.doClaim(g, bindings);       \r
71                 }\r
72         }\r
73         \r
74         @Override\r
75         public IContextualModification claim(ReadGraph g, Object[] bindings) throws DatabaseException {\r
76                 if(instruction.query(g, bindings)==IInstruction.FAILURE)\r
77                         return new Claim();\r
78                 return null;\r
79         }\r
80         \r
81         class Deny implements IContextualModification {\r
82                 Object continuation;\r
83                 \r
84                 public Deny(Object continuation) {\r
85                         this.continuation = continuation;\r
86                 }\r
87 \r
88                 @Override\r
89                 public void perform(WriteGraph g, Object[] bindings) throws DatabaseException {\r
90                         do {\r
91                                 for(CreationInstruction var : variables)\r
92                                         g.deny((Resource)bindings[var.variableId]);\r
93                                 continuation = instruction.next(g, bindings, continuation);\r
94                         } while(continuation != null && continuation != IInstruction.FAILURE);  \r
95                 }\r
96         }\r
97         \r
98         @Override\r
99         public IContextualModification deny(ReadGraph g, Object[] bindings) throws DatabaseException {\r
100                 Object continuation = instruction.query(g, bindings);\r
101                 if(continuation != IInstruction.FAILURE)\r
102                         return new Deny(continuation);\r
103                 return null;\r
104         }\r
105 \r
106         @Override\r
107         public void doClaim(WriteGraph g, Object[] bindings) throws DatabaseException {\r
108                 if(instruction.query(g, bindings)==IInstruction.FAILURE) {\r
109                         for(CreationInstruction var : variables) {\r
110                                 bindings[var.variableId] = var.create(g, bindings);\r
111                                 if(DEBUG)\r
112                                     System.out.println("@ newResource " + NameUtils.getSafeName(g, (Resource)bindings[var.variableId]));\r
113                         }\r
114                         instruction.doClaim(g, bindings);\r
115                 }               \r
116         }\r
117 \r
118         @Override\r
119         public void doDeny(WriteGraph g, Object[] bindings) throws DatabaseException {\r
120                 Object continuation = instruction.query(g, bindings);\r
121                 if(continuation != IInstruction.FAILURE)\r
122                         do {\r
123                                 for(CreationInstruction var : variables)\r
124                                         g.deny((Resource)bindings[var.variableId]);\r
125                                 continuation = instruction.next(g, bindings, continuation);\r
126                         } while(continuation != null && continuation != IInstruction.FAILURE);          \r
127         }\r
128 \r
129         @Override\r
130         public void mapVariables(TIntIntHashMap map) {\r
131                 instruction.mapVariables(map);\r
132                 for(int i=0;i<variables.length;++i)\r
133                         variables[i].mapVariables(map);\r
134         }\r
135 \r
136         @Override\r
137         public Object next(ReadGraph g, Object[] bindings, Object continuation) throws DatabaseException {\r
138                 return instruction.next(g, bindings, continuation);\r
139         }\r
140 \r
141         @Override\r
142         public Object query(ReadGraph g, Object[] bindings) throws DatabaseException {\r
143                 return instruction.query(g, bindings);\r
144         }\r
145 \r
146     @Override\r
147     public void toString(StringBuilder b, int indent) {\r
148         b.append('[');\r
149         b.append(']');\r
150     }\r
151 \r
152 }\r