]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.mapping/src/org/simantics/mapping/constraint/instructions/OrInstruction.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.mapping / src / org / simantics / mapping / constraint / instructions / OrInstruction.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 org.simantics.db.ReadGraph;\r
15 import org.simantics.db.exception.DatabaseException;\r
16 \r
17 public class OrInstruction extends CombinedInstruction {\r
18         \r
19         public OrInstruction(IInstruction... instructions) {\r
20                 super(instructions);\r
21         }\r
22 \r
23         static class Continuation {\r
24                 Object continuation;\r
25                 int instructionId;      \r
26                 \r
27                 public Continuation(Object continuation, int instructionId) {\r
28                         this.continuation = continuation;\r
29                         this.instructionId = instructionId;\r
30                 }\r
31         }\r
32         \r
33         @Override\r
34         public Object query(ReadGraph g, Object[] bindings) throws DatabaseException {\r
35                 int instructionId;\r
36                 for(instructionId=0;instructionId<instructions.length-1;++instructionId) {\r
37                         if(DEBUG)\r
38                                 System.out.println("OrInstruction.query " + instructionId + "/" + instructions.length);\r
39                         Object continuation = instructions[instructionId].query(g, bindings);\r
40                         if(continuation != IInstruction.FAILURE)\r
41                                 return new Continuation(continuation, instructionId);\r
42                 }\r
43                 return instructions[instructionId].query(g, bindings);\r
44         }\r
45         \r
46         @Override\r
47         public Object next(ReadGraph g, Object[] bindings, Object ret_) throws DatabaseException {\r
48                 Continuation ret = (Continuation)ret_;\r
49                 int instructionId = ret.instructionId;\r
50                 Object continuation = ret.continuation;\r
51                 \r
52                 if(continuation != null) {\r
53                         continuation = instructions[instructionId].next(g, bindings, continuation);\r
54                         if(continuation != IInstruction.FAILURE) {\r
55                                 ret.continuation = continuation;\r
56                                 return ret;\r
57                         }\r
58                 }\r
59                 \r
60                 for(++instructionId;instructionId<instructions.length-1;++instructionId) {\r
61                         continuation = instructions[instructionId].query(g, bindings);\r
62                         if(continuation != IInstruction.FAILURE) {\r
63                                 ret.continuation = continuation;\r
64                                 ret.instructionId = instructionId;                              \r
65                                 return ret;\r
66                         }\r
67                 }\r
68                 return instructions[instructionId].query(g, bindings);\r
69         }\r
70 \r
71         @Override\r
72         public void toString(StringBuilder b, int indent) {             \r
73                 b.append("(    ");\r
74                 boolean first = true;\r
75                 for(IInstruction inst : instructions) {\r
76                         if(first)\r
77                                 first = false;\r
78                         else {\r
79                                 b.append(";\n");\r
80                                 for(int i=0;i<indent+1;++i)\r
81                                         b.append(INDENTATION);\r
82                         }\r
83                         inst.toString(b, indent + 1);                   \r
84                 }\r
85                 b.append('\n');\r
86                 for(int i=0;i<indent;++i)\r
87                         b.append(INDENTATION);\r
88                 b.append(")");          \r
89         }\r
90 }\r