]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.mapping/src/org/simantics/mapping/rule/instructions/IfRuleInstruction.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.mapping / src / org / simantics / mapping / rule / instructions / IfRuleInstruction.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.rule.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.WriteGraph;\r
19 import org.simantics.db.exception.DatabaseException;\r
20 import org.simantics.layer0.utils.triggers.IModification;\r
21 import org.simantics.mapping.constraint.instructions.IInstruction;\r
22 \r
23 public class IfRuleInstruction implements IRuleInstruction {\r
24         IInstruction condition;\r
25         IRuleInstruction rule;\r
26         IRuleInstruction elseRule;      \r
27         \r
28         public IfRuleInstruction(IInstruction condition, IRuleInstruction rule, IRuleInstruction elseRule) {\r
29                 this.condition = condition;\r
30                 this.rule = rule;\r
31                 this.elseRule = elseRule;\r
32         }\r
33         \r
34         public IfRuleInstruction(IInstruction condition, IRuleInstruction rule) {\r
35                 this(condition, rule, null);\r
36         }       \r
37         \r
38         @Override\r
39         public IModification execute(ReadGraph g, final Object[] bindings) throws DatabaseException {\r
40                 if(DEBUG)\r
41                         System.out.println("IfRuleInstruction: condition");\r
42                 Object cont = condition.query(g, bindings);\r
43                 if(cont == IInstruction.FAILURE) {\r
44                         if(DEBUG)\r
45                           System.out.println("IfRuleInstruction: else");\r
46                         if(elseRule!=null)\r
47                                 return elseRule.execute(g, bindings);\r
48                         else\r
49                                 return null;\r
50                 }\r
51                 do {\r
52                         if(DEBUG)\r
53                                 System.out.println("IfRuleInstruction: modification");\r
54                         final IModification modi = rule.execute(g, bindings);\r
55                         if(modi != null) {\r
56                                 if(cont==null)\r
57                                         return modi;\r
58                                 final Object curCont = condition.next(g, bindings, cont);\r
59                                 if(curCont==IInstruction.FAILURE)\r
60                                         return modi;\r
61                                 return new IModification() {\r
62                                         @Override\r
63                                         public void perform(WriteGraph g) throws DatabaseException {\r
64                                                 modi.perform(g);\r
65                                                 Object cont = curCont;\r
66                                                 do {\r
67                                                         rule.doExecute(g, bindings);\r
68                                                         if(cont==null)\r
69                                                                 break;\r
70                                                         cont = condition.next(g, bindings, cont);\r
71                                                 } while(cont != IInstruction.FAILURE);\r
72                                         }                               \r
73                                 };      \r
74                         }\r
75                         if(cont==null)\r
76                                 break;\r
77                         cont = condition.next(g, bindings, cont);\r
78                 } while(cont != IInstruction.FAILURE);\r
79                 return null;\r
80         }\r
81         \r
82         @Override\r
83         public void doExecute(WriteGraph g, Object[] bindings) throws DatabaseException {\r
84                 Object cont = condition.query(g, bindings);\r
85                 if(cont == IInstruction.FAILURE) {\r
86                         if(elseRule!=null) \r
87                                 elseRule.doExecute(g, bindings);\r
88                         return;\r
89                 }\r
90                 do {\r
91                         rule.doExecute(g, bindings);\r
92                         if(cont==null)\r
93                                 break;\r
94                         cont = condition.next(g, bindings, cont);\r
95                 } while(cont != IInstruction.FAILURE);\r
96         }\r
97         \r
98         @Override\r
99         public void collectVariables(TIntHashSet reads, TIntHashSet writes) {\r
100                 condition.collectVariables(reads, writes);\r
101                 rule.collectVariables(reads, writes);\r
102                 if(elseRule != null)\r
103                         elseRule.collectVariables(reads, writes);\r
104         }\r
105 \r
106         @Override\r
107         public void mapVariables(TIntIntHashMap map) {\r
108                 condition.mapVariables(map);\r
109                 rule.mapVariables(map);\r
110                 if(elseRule != null)\r
111                         elseRule.mapVariables(map);\r
112         }\r
113 \r
114         @Override\r
115         public void toString(StringBuilder b, int indent) {             \r
116                 b.append("if   ");\r
117                 condition.toString(b, indent+1);\r
118                 \r
119                 b.append('\n');         \r
120                 for(int i=0;i<indent;++i)\r
121                         b.append(INDENTATION);\r
122                 b.append("then ");\r
123                 rule.toString(b, indent+1);             \r
124                 \r
125                 if(elseRule != null) {\r
126                         b.append('\n');\r
127                         for(int i=0;i<indent;++i)\r
128                                 b.append(INDENTATION);\r
129                         b.append("else ");\r
130                         elseRule.toString(b, indent+1);\r
131                 }\r
132         }\r
133 }\r