Revision 47734
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/Code.java | ||
---|---|---|
2 | 2 |
|
3 | 3 |
import org.apache.commons.lang3.StringUtils; |
4 | 4 |
import org.gvsig.expressionevaluator.ExpressionBuilder.Value; |
5 |
import org.gvsig.expressionevaluator.spi.PrettyFormaterImpl; |
|
5 | 6 |
import org.gvsig.tools.visitor.FilteredVisitable; |
6 | 7 |
|
7 | 8 |
public interface Code extends FilteredVisitable, org.gvsig.tools.lang.Cloneable { |
... | ... | |
96 | 97 |
public Object call(Interpreter interpreter, Object[] args) throws Exception; |
97 | 98 |
} |
98 | 99 |
|
99 |
public static final Formatter<Code> EMPTY_FORMATTER = new Formatter<Code>() { |
|
100 |
public static class EmptyFormatter extends PrettyFormaterImpl implements Formatter<Code> { |
|
101 |
|
|
102 |
public EmptyFormatter() { |
|
103 |
|
|
104 |
} |
|
105 |
|
|
106 |
public EmptyFormatter(boolean useNl, int indentSize) { |
|
107 |
super.setIndentSize(indentSize); |
|
108 |
super.setUseNl(useNl); |
|
109 |
} |
|
110 |
|
|
100 | 111 |
@Override |
101 | 112 |
public boolean canApply(Code value) { |
102 | 113 |
return false; |
... | ... | |
106 | 117 |
public String format(Code value) { |
107 | 118 |
return ""; |
108 | 119 |
} |
109 |
}; |
|
110 | 120 |
|
121 |
@Override |
|
122 |
public void setIndentSize(int indentSize) { |
|
123 |
throw new UnsupportedOperationException(); |
|
124 |
} |
|
125 |
|
|
126 |
@Override |
|
127 |
public void setUseNl(boolean useNl) { |
|
128 |
throw new UnsupportedOperationException(); |
|
129 |
} |
|
130 |
|
|
131 |
} |
|
132 |
|
|
133 |
public static final Formatter<Code> EMPTY_FORMATTER = new EmptyFormatter(); |
|
134 |
|
|
111 | 135 |
public int code(); |
112 | 136 |
|
113 | 137 |
public Value toValue(); |
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/spi/PrettyFormaterImpl.java | ||
---|---|---|
1 |
/* |
|
2 |
* To change this license header, choose License Headers in Project Properties. |
|
3 |
* To change this template file, choose Tools | Templates |
|
4 |
* and open the template in the editor. |
|
5 |
*/ |
|
6 |
package org.gvsig.expressionevaluator.spi; |
|
7 |
|
|
8 |
import java.util.ArrayList; |
|
9 |
import java.util.List; |
|
10 |
import java.util.Stack; |
|
11 |
import org.apache.commons.lang3.StringUtils; |
|
12 |
import org.gvsig.expressionevaluator.PrettyFormatter; |
|
13 |
|
|
14 |
/** |
|
15 |
* |
|
16 |
* @author jjdelcerro |
|
17 |
*/ |
|
18 |
public class PrettyFormaterImpl implements PrettyFormatter { |
|
19 |
|
|
20 |
private class PrettyFormaterConfig { |
|
21 |
int indentSize; |
|
22 |
int indentation; |
|
23 |
boolean useNl; |
|
24 |
StringBuilder builder; |
|
25 |
|
|
26 |
public PrettyFormaterConfig() { |
|
27 |
this.indentSize = 4; |
|
28 |
this.indentation = 0; |
|
29 |
this.useNl = false; |
|
30 |
this.builder = null; |
|
31 |
} |
|
32 |
|
|
33 |
public PrettyFormaterConfig(int indentation, boolean useNl) { |
|
34 |
this.indentation = indentation; |
|
35 |
this.useNl = useNl; |
|
36 |
this.builder = null; |
|
37 |
} |
|
38 |
|
|
39 |
public StringBuilder builder() { |
|
40 |
if( this.builder == null ) { |
|
41 |
this.builder = new StringBuilder(); |
|
42 |
} |
|
43 |
return this.builder; |
|
44 |
} |
|
45 |
} |
|
46 |
|
|
47 |
private Stack<PrettyFormaterConfig> config; |
|
48 |
|
|
49 |
public PrettyFormaterImpl() { |
|
50 |
this.config = new Stack<>(); |
|
51 |
this.config.push(new PrettyFormaterConfig()); |
|
52 |
} |
|
53 |
|
|
54 |
@Override |
|
55 |
public void setIndentSize(int indentSize) { |
|
56 |
PrettyFormaterConfig c = this.config.peek(); |
|
57 |
c.indentSize = indentSize; |
|
58 |
} |
|
59 |
|
|
60 |
@Override |
|
61 |
public void setUseNl(boolean useNl) { |
|
62 |
PrettyFormaterConfig c = this.config.peek(); |
|
63 |
c.useNl = useNl; |
|
64 |
} |
|
65 |
|
|
66 |
@Override |
|
67 |
public void indent() { |
|
68 |
PrettyFormaterConfig c = this.config.peek(); |
|
69 |
c.indentation += 4; |
|
70 |
} |
|
71 |
|
|
72 |
@Override |
|
73 |
public void unindent() { |
|
74 |
PrettyFormaterConfig c = this.config.peek(); |
|
75 |
c.indentation -= 4; |
|
76 |
if( c.indentation<0 ) { |
|
77 |
c.indentation = 0; |
|
78 |
} |
|
79 |
} |
|
80 |
|
|
81 |
@Override |
|
82 |
public void nl() { |
|
83 |
PrettyFormaterConfig c = this.config.peek(); |
|
84 |
if( c.useNl ) { |
|
85 |
c.builder().append("\n"); |
|
86 |
c.builder().append(StringUtils.repeat(' ', c.indentation)); |
|
87 |
} |
|
88 |
} |
|
89 |
|
|
90 |
@Override |
|
91 |
public void push() { |
|
92 |
PrettyFormaterConfig c = this.config.peek(); |
|
93 |
this.config.push(new PrettyFormaterConfig(c.indentation,c.useNl)); |
|
94 |
} |
|
95 |
|
|
96 |
@Override |
|
97 |
public void pop() { |
|
98 |
PrettyFormaterConfig c = this.config.pop(); |
|
99 |
if( this.config.isEmpty() ) { |
|
100 |
this.config.push(new PrettyFormaterConfig()); |
|
101 |
} |
|
102 |
} |
|
103 |
|
|
104 |
@Override |
|
105 |
public void append(Object o) { |
|
106 |
PrettyFormaterConfig c = this.config.peek(); |
|
107 |
c.builder().append(o); |
|
108 |
} |
|
109 |
|
|
110 |
@Override |
|
111 |
public String build() { |
|
112 |
PrettyFormaterConfig c = this.config.peek(); |
|
113 |
if( c.builder==null ) { |
|
114 |
return ""; |
|
115 |
} |
|
116 |
return c.builder.toString(); |
|
117 |
} |
|
118 |
|
|
119 |
} |
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/PrettyFormatter.java | ||
---|---|---|
1 |
package org.gvsig.expressionevaluator; |
|
2 |
|
|
3 |
import org.gvsig.expressionevaluator.spi.PrettyFormaterImpl; |
|
4 |
|
|
5 |
/** |
|
6 |
* |
|
7 |
* @author jjdelcerro |
|
8 |
*/ |
|
9 |
public interface PrettyFormatter { |
|
10 |
|
|
11 |
public static PrettyFormatter get(Object x) { |
|
12 |
if( x instanceof PrettyFormatter ) { |
|
13 |
return (PrettyFormatter) x; |
|
14 |
} |
|
15 |
return new PrettyFormaterImpl(); |
|
16 |
} |
|
17 |
|
|
18 |
public void setUseNl(boolean useNl); |
|
19 |
public void setIndentSize(int indentSize); |
|
20 |
|
|
21 |
public void indent(); |
|
22 |
public void unindent(); |
|
23 |
public void nl(); |
|
24 |
public void push(); |
|
25 |
public void pop(); |
|
26 |
public void append(Object o); |
|
27 |
public String build(); |
|
28 |
} |
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/test/java/org/gvsig/expresionevaluator/impl/TestCompiler.java | ||
---|---|---|
9 | 9 |
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator; |
10 | 10 |
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager; |
11 | 11 |
import org.gvsig.expressionevaluator.ExpressionSyntaxException; |
12 |
import org.gvsig.expressionevaluator.Formatter; |
|
12 | 13 |
import org.gvsig.expressionevaluator.MutableSymbolTable; |
13 | 14 |
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer; |
14 | 15 |
|
... | ... | |
744 | 745 |
code.link(); |
745 | 746 |
checkEquals("((\"a\" + 3) BETWEEN (\"b\" + 10) AND (\"b\" + 20))", code.toString()); |
746 | 747 |
} |
748 |
|
|
749 |
public void testBlockExcept1a() { |
|
750 |
String source = "BEGIN LET V1 = 11; LET V2 = 22; EXCEPT print('Hola'); TRUE; END"; |
|
751 |
|
|
752 |
Compiler compiler = createCompiler(); |
|
753 |
Code code = compiler.compileExpression(source); |
|
754 |
code.link(); |
|
755 |
checkEquals("BEGIN \"V1\" := 11; \"V2\" := 22; EXCEPT print('Hola'); TRUE; END ", code.toString()); |
|
756 |
} |
|
757 |
|
|
758 |
public void testBlockExcept1b() { |
|
759 |
String source = "BEGIN LET V1 = 11; LET V2 = 22; EXCEPT print('Hola'); TRUE; END"; |
|
760 |
|
|
761 |
Formatter formatter = new Code.EmptyFormatter(true, 4); |
|
762 |
|
|
763 |
Compiler compiler = createCompiler(); |
|
764 |
Code code = compiler.compileExpression(source); |
|
765 |
code.link(); |
|
766 |
checkEquals("BEGIN \n \"V1\" := 11; \n \"V2\" := 22; \nEXCEPT \n print('Hola'); \n TRUE; \nEND \n", code.toString(formatter)); |
|
767 |
} |
|
768 |
|
|
769 |
public void testBlockExcept2b() { |
|
770 |
String source = "DECLARE V1 := 0; V2 := 0; BEGIN V1 := 11; V2 := 22; EXCEPT print('Hola'); TRUE; END"; |
|
771 |
|
|
772 |
Formatter formatter = new Code.EmptyFormatter(true, 4); |
|
773 |
|
|
774 |
Compiler compiler = createCompiler(); |
|
775 |
Code code = compiler.compileExpression(source); |
|
776 |
code.link(); |
|
777 |
checkEquals("DECLARE \n \"V1\" := 0; \n \"V2\" := 0; \nBEGIN \n \"V1\" := 11; \n \"V2\" := 22; \nEXCEPT \n print('Hola'); \n TRUE; \nEND \n", code.toString(formatter)); |
|
778 |
} |
|
779 |
|
|
747 | 780 |
} |
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/test/java/org/gvsig/expresionevaluator/impl/TestGrammarCompiler.java | ||
---|---|---|
153 | 153 |
|
154 | 154 |
Code code = compiler.compileExpression(source); |
155 | 155 |
link(code); |
156 |
checkEquals("BEGIN \"V1\" := 11; \"V2\" := 22; EXCEPTION -1 END ", code.toString());
|
|
156 |
checkEquals("BEGIN \"V1\" := 11; \"V2\" := 22; EXCEPT -1 END ", code.toString()); |
|
157 | 157 |
} |
158 | 158 |
|
159 | 159 |
public void testBlock3() { |
... | ... | |
187 | 187 |
|
188 | 188 |
Code code = compiler.compileExpression(source); |
189 | 189 |
link(code); |
190 |
checkEquals("IF (\"V1\" = 11) THEN \"V2\" := 11 ELSE \"V2\" := 22 END IF", code.toString());
|
|
190 |
checkEquals("IF (\"V1\" = 11) THEN \"V2\" := 11; ELSE \"V2\" := 22; END IF", code.toString());
|
|
191 | 191 |
} |
192 | 192 |
|
193 | 193 |
public void testIfThenPassElsePass() { |
... | ... | |
197 | 197 |
|
198 | 198 |
Code code = compiler.compileExpression(source); |
199 | 199 |
link(code); |
200 |
checkEquals("IF (\"V1\" = 11) THEN PASS ELSE PASS END IF", code.toString());
|
|
200 |
checkEquals("IF (\"V1\" = 11) THEN PASS; ELSE PASS; END IF", code.toString());
|
|
201 | 201 |
} |
202 | 202 |
|
203 | 203 |
public void testIfThenBlock() { |
... | ... | |
207 | 207 |
|
208 | 208 |
Code code = compiler.compileExpression(source); |
209 | 209 |
link(code); |
210 |
checkEquals("IF (\"V1\" = 11) THEN BEGIN \"V2\" := 22; \"V1\" := 10; END END IF", code.toString());
|
|
210 |
checkEquals("IF (\"V1\" = 11) THEN \"V2\" := 22; \"V1\" := 10; END IF", code.toString());
|
|
211 | 211 |
} |
212 | 212 |
|
213 | 213 |
public void testWhile() { |
... | ... | |
217 | 217 |
|
218 | 218 |
Code code = compiler.compileExpression(source); |
219 | 219 |
link(code); |
220 |
checkEquals("WHILE \"(\"n\" < 10) LOOP \"n\" := (\"n\" + 1) END LOOP", code.toString());
|
|
220 |
checkEquals("WHILE (\"n\" < 10) LOOP \"n\" := (\"n\" + 1) END LOOP ", code.toString());
|
|
221 | 221 |
} |
222 | 222 |
|
223 | 223 |
public void testWhileBlock() { |
... | ... | |
227 | 227 |
|
228 | 228 |
Code code = compiler.compileExpression(source); |
229 | 229 |
link(code); |
230 |
checkEquals("WHILE \"(\"n\" < 10) LOOP BEGIN \"n\" := (\"n\" + 1); print(\"n\"); END END LOOP", code.toString());
|
|
230 |
checkEquals("WHILE (\"n\" < 10) LOOP \"n\" := (\"n\" + 1); print(\"n\"); END LOOP ", code.toString());
|
|
231 | 231 |
} |
232 | 232 |
|
233 | 233 |
public void testWhileBreak() { |
... | ... | |
237 | 237 |
|
238 | 238 |
Code code = compiler.compileExpression(source); |
239 | 239 |
link(code); |
240 |
checkEquals("WHILE \"(\"n\" < 10) LOOP BEGIN \"n\" := (\"n\" + 1); print(\"n\"); BREAK; END END LOOP", code.toString());
|
|
240 |
checkEquals("WHILE (\"n\" < 10) LOOP \"n\" := (\"n\" + 1); print(\"n\"); BREAK; END LOOP ", code.toString());
|
|
241 | 241 |
} |
242 | 242 |
|
243 | 243 |
public void testCast() { |
... | ... | |
298 | 298 |
|
299 | 299 |
Code code = compiler.compileExpression(source); |
300 | 300 |
link(code); |
301 |
checkEquals("FOR \"n\" IN RANGE(10) LOOP BEGIN print(\"n\"); BREAK; END END LOOP", code.toString());
|
|
301 |
checkEquals("FOR \"n\" IN RANGE(10) LOOP print(\"n\"); BREAK; END LOOP", code.toString());
|
|
302 | 302 |
Code code2 = compiler.compileExpression(code.toString()); |
303 | 303 |
link(code2); |
304 |
checkEquals("FOR \"n\" IN RANGE(10) LOOP BEGIN print(\"n\"); BREAK; END END LOOP", code2.toString());
|
|
304 |
checkEquals("FOR \"n\" IN RANGE(10) LOOP print(\"n\"); BREAK; END LOOP", code2.toString());
|
|
305 | 305 |
} |
306 | 306 |
|
307 | 307 |
public void testForEach2() { |
... | ... | |
330 | 330 |
|
331 | 331 |
Code code = compiler.compileExpression(source); |
332 | 332 |
link(code); |
333 |
checkEquals("CASE WHEN (\"software\" LIKE '%gvSIG%') THEN 'gvSIG' ELSE 'Other' END", code.toString());
|
|
333 |
checkEquals("CASE WHEN (\"software\" LIKE '%gvSIG%') THEN 'gvSIG'; ELSE 'Other'; END", code.toString());
|
|
334 | 334 |
} |
335 | 335 |
|
336 | 336 |
public void testCase1() { |
337 |
String source = "CASE WHEN software LIKE '%gvSIG%' THEN 'gvSIG'; ELSE 'Other'; END CASE"; // ;)
|
|
337 |
String source = "CASE WHEN software LIKE '%gvSIG%' THEN 10; 'gvSIG'; ELSE 20;'Other'; END CASE"; // ;)
|
|
338 | 338 |
|
339 | 339 |
Compiler compiler = createCompiler(); |
340 | 340 |
|
341 | 341 |
Code code = compiler.compileExpression(source); |
342 | 342 |
link(code); |
343 |
checkEquals("CASE WHEN (\"software\" LIKE '%gvSIG%') THEN 'gvSIG' ELSE 'Other' END", code.toString());
|
|
343 |
checkEquals("CASE WHEN (\"software\" LIKE '%gvSIG%') THEN 10; 'gvSIG'; ELSE 20; 'Other'; END", code.toString());
|
|
344 | 344 |
} |
345 | 345 |
|
346 | 346 |
public void testCase2() { |
... | ... | |
350 | 350 |
|
351 | 351 |
Code code = compiler.compileExpression(source); |
352 | 352 |
link(code); |
353 |
checkEquals("CASE WHEN ((\"Field_1\" >= 75) AND (\"Field_1\" <= 79)) THEN 100 WHEN ((\"Field_1\" >= 80) AND (\"Field_1\" <= 84)) THEN 110 END", code.toString());
|
|
353 |
checkEquals("CASE WHEN ((\"Field_1\" >= 75) AND (\"Field_1\" <= 79)) THEN 100; WHEN ((\"Field_1\" >= 80) AND (\"Field_1\" <= 84)) THEN 110; END", code.toString());
|
|
354 | 354 |
} |
355 | 355 |
|
356 | 356 |
public void testCase3() { |
... | ... | |
360 | 360 |
|
361 | 361 |
Code code = compiler.compileExpression(source); |
362 | 362 |
link(code); |
363 |
checkEquals("CASE WHEN ((\"Field_1\" >= 75) AND (\"Field_1\" <= 79)) THEN 100 WHEN ((\"Field_1\" >= 80) AND (\"Field_1\" <= 84)) THEN 110 ELSE 120 END", code.toString());
|
|
363 |
checkEquals("CASE WHEN ((\"Field_1\" >= 75) AND (\"Field_1\" <= 79)) THEN 100; WHEN ((\"Field_1\" >= 80) AND (\"Field_1\" <= 84)) THEN 110; ELSE 120; END", code.toString());
|
|
364 | 364 |
} |
365 | 365 |
|
366 | 366 |
public void testCase3b() { |
... | ... | |
369 | 369 |
Compiler compiler = createCompiler(); |
370 | 370 |
Code code = compiler.compileExpression(source); |
371 | 371 |
link(code); |
372 |
checkEquals("CASE WHEN ((\"Field_1\" >= 75) AND (\"Field_1\" <= 79)) THEN 100 WHEN ((\"Field_1\" >= 80) AND (\"Field_1\" <= 84)) THEN 110 ELSE 120 END", code.toString());
|
|
372 |
checkEquals("CASE WHEN ((\"Field_1\" >= 75) AND (\"Field_1\" <= 79)) THEN 100; WHEN ((\"Field_1\" >= 80) AND (\"Field_1\" <= 84)) THEN 110; ELSE 120; END", code.toString());
|
|
373 | 373 |
code = compiler.compileExpression(code.toString()); |
374 | 374 |
link(code); |
375 |
checkEquals("CASE WHEN ((\"Field_1\" >= 75) AND (\"Field_1\" <= 79)) THEN 100 WHEN ((\"Field_1\" >= 80) AND (\"Field_1\" <= 84)) THEN 110 ELSE 120 END", code.toString());
|
|
375 |
checkEquals("CASE WHEN ((\"Field_1\" >= 75) AND (\"Field_1\" <= 79)) THEN 100; WHEN ((\"Field_1\" >= 80) AND (\"Field_1\" <= 84)) THEN 110; ELSE 120; END", code.toString());
|
|
376 | 376 |
} |
377 | 377 |
|
378 | 378 |
public void testDef1() { |
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/DefaultExpression.java | ||
---|---|---|
343 | 343 |
Code code = compiler.compileExpressionQuietly(this.phrase); |
344 | 344 |
if (code != null) { |
345 | 345 |
code.link(); |
346 |
this.phrase = code.toString(); |
|
346 |
this.phrase = code.toString(new Code.EmptyFormatter(true, 4));
|
|
347 | 347 |
} |
348 | 348 |
} |
349 | 349 |
} catch (Throwable t) { |
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/function/programming/CodeBlockFunction.java | ||
---|---|---|
7 | 7 |
import org.gvsig.expressionevaluator.Formatter; |
8 | 8 |
import org.gvsig.expressionevaluator.Function; |
9 | 9 |
import org.gvsig.expressionevaluator.Interpreter; |
10 |
import org.gvsig.expressionevaluator.PrettyFormatter; |
|
10 | 11 |
import org.gvsig.expressionevaluator.impl.DefaultInterpreter; |
11 | 12 |
import org.gvsig.expressionevaluator.impl.HostExpressionUtils; |
12 | 13 |
import org.gvsig.expressionevaluator.impl.function.programming.BreakFunction.BreakException; |
... | ... | |
78 | 79 |
|
79 | 80 |
@Override |
80 | 81 |
public String toString(Codes args, Formatter<Code> formatter) { |
81 |
StringBuilder builder = new StringBuilder(); |
|
82 |
builder.append("BEGIN "); |
|
83 |
for (Code statement : args) { |
|
84 |
builder.append(statement.toString(formatter)); |
|
85 |
builder.append("; "); |
|
82 |
PrettyFormatter builder = PrettyFormatter.get(formatter); |
|
83 |
try { |
|
84 |
builder.push(); |
|
85 |
builder.append("BEGIN "); |
|
86 |
builder.indent(); |
|
87 |
for (Code statement : args) { |
|
88 |
builder.nl(); |
|
89 |
builder.append(statement.toString(formatter)); |
|
90 |
builder.append("; "); |
|
91 |
} |
|
92 |
builder.unindent(); |
|
93 |
builder.nl(); |
|
94 |
builder.append("END "); |
|
95 |
return builder.build(); |
|
96 |
} finally { |
|
97 |
builder.pop(); |
|
86 | 98 |
} |
87 |
builder.append("END "); |
|
88 |
return builder.toString(); |
|
89 | 99 |
} |
90 | 100 |
|
91 | 101 |
|
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/function/programming/CodeBlockWithExceptFunction.java | ||
---|---|---|
19 | 19 |
import org.gvsig.expressionevaluator.impl.function.programming.BreakFunction.BreakException; |
20 | 20 |
import org.gvsig.expressionevaluator.impl.function.programming.ReturnFunction.ReturnException; |
21 | 21 |
import org.gvsig.expressionevaluator.spi.AbstractFunction; |
22 |
import org.gvsig.expressionevaluator.PrettyFormatter; |
|
22 | 23 |
|
23 | 24 |
public class CodeBlockWithExceptFunction extends AbstractFunction { |
24 | 25 |
|
... | ... | |
142 | 143 |
return "unknown"; |
143 | 144 |
} |
144 | 145 |
} |
146 |
|
|
145 | 147 |
@Override |
146 | 148 |
public String toString(Codes args, Formatter<Code> formatter) { |
147 | 149 |
Code exceptionCode = args.get(args.size()-2); |
148 | 150 |
Code declareCode = args.get(args.size()-1); |
149 | 151 |
|
150 |
StringBuilder builder = new StringBuilder(); |
|
151 |
if( declareCode != null ) { |
|
152 |
builder.append("DECLARE "); |
|
153 |
builder.append(declareCode.toString(formatter)); |
|
152 |
PrettyFormatter builder = PrettyFormatter.get(formatter); |
|
153 |
try { |
|
154 |
builder.push(); |
|
155 |
if( declareCode != null ) { |
|
156 |
builder.append("DECLARE "); |
|
157 |
builder.indent(); |
|
158 |
if( Code.isFunction(exceptionCode,"BLOCK") ) { |
|
159 |
Code.Callable block = (Code.Callable)declareCode; |
|
160 |
for (Code parameter : block.parameters()) { |
|
161 |
builder.nl(); |
|
162 |
builder.append(parameter.toString(formatter)); |
|
163 |
builder.append("; "); |
|
164 |
} |
|
165 |
} else { |
|
166 |
builder.nl(); |
|
167 |
builder.append(declareCode.toString(formatter)); |
|
168 |
} |
|
169 |
builder.unindent(); |
|
170 |
builder.nl(); |
|
171 |
} |
|
172 |
builder.append("BEGIN "); |
|
173 |
builder.indent(); |
|
174 |
for (int argn = 0; argn < args.size()-2; argn++) { |
|
175 |
Code statement = args.get(argn); |
|
176 |
builder.nl(); |
|
177 |
builder.append(statement.toString(formatter)); |
|
178 |
builder.append("; "); |
|
179 |
} |
|
180 |
if( exceptionCode != null ) { |
|
181 |
builder.unindent(); |
|
182 |
builder.nl(); |
|
183 |
builder.append("EXCEPT "); |
|
184 |
builder.indent(); |
|
185 |
if( Code.isFunction(exceptionCode,"BLOCK") ) { |
|
186 |
Code.Callable block = (Code.Callable)exceptionCode; |
|
187 |
for (Code parameter : block.parameters()) { |
|
188 |
builder.nl(); |
|
189 |
builder.append(parameter.toString(formatter)); |
|
190 |
builder.append("; "); |
|
191 |
} |
|
192 |
} else { |
|
193 |
builder.nl(); |
|
194 |
builder.append(exceptionCode.toString(formatter)); |
|
195 |
builder.append(" "); |
|
196 |
} |
|
197 |
} |
|
198 |
builder.unindent(); |
|
199 |
builder.nl(); |
|
200 |
builder.append("END "); |
|
201 |
builder.nl(); |
|
202 |
return builder.build(); |
|
203 |
} finally { |
|
204 |
builder.pop(); |
|
154 | 205 |
} |
155 |
builder.append("BEGIN "); |
|
156 |
for (int argn = 0; argn < args.size()-2; argn++) { |
|
157 |
Code statement = args.get(argn); |
|
158 |
builder.append(statement.toString(formatter)); |
|
159 |
builder.append("; "); |
|
160 |
} |
|
161 |
if( exceptionCode != null ) { |
|
162 |
builder.append("EXCEPTION "); |
|
163 |
builder.append(exceptionCode.toString(formatter)); |
|
164 |
builder.append(" "); |
|
165 |
} |
|
166 |
builder.append("END "); |
|
167 |
return builder.toString(); |
|
168 | 206 |
} |
169 | 207 |
} |
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/function/programming/$HostExpressionFunction.java | ||
---|---|---|
46 | 46 |
|
47 | 47 |
@Override |
48 | 48 |
public String toString(Codes args, Formatter<Code> formatter) { |
49 |
return ":IN ("+args.get(0).toString()+")";
|
|
49 |
return ":("+args.get(0).toString()+")"; |
|
50 | 50 |
} |
51 | 51 |
|
52 | 52 |
} |
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/function/programming/WhileFunction.java | ||
---|---|---|
7 | 7 |
import org.gvsig.expressionevaluator.Formatter; |
8 | 8 |
import org.gvsig.expressionevaluator.Function; |
9 | 9 |
import org.gvsig.expressionevaluator.Interpreter; |
10 |
import org.gvsig.expressionevaluator.PrettyFormatter; |
|
10 | 11 |
import org.gvsig.expressionevaluator.impl.function.programming.BreakFunction.BreakException; |
11 | 12 |
import org.gvsig.expressionevaluator.impl.function.programming.ReturnFunction.ReturnException; |
12 | 13 |
import org.gvsig.expressionevaluator.spi.AbstractFunction; |
... | ... | |
79 | 80 |
|
80 | 81 |
@Override |
81 | 82 |
public String toString(Codes args, Formatter<Code> formatter) { |
82 |
StringBuilder builder = new StringBuilder(); |
|
83 |
builder.append("WHILE \""); |
|
84 |
builder.append(args.get(0).toString(formatter)); |
|
85 |
builder.append(" LOOP "); |
|
86 |
builder.append(args.get(1).toString(formatter)); |
|
87 |
builder.append(" END LOOP"); |
|
88 |
return builder.toString(); |
|
83 |
Code codeCondition = args.get(0); |
|
84 |
Code codeLoopBody = args.get(1); |
|
85 |
PrettyFormatter builder = PrettyFormatter.get(formatter); |
|
86 |
try { |
|
87 |
builder.push(); |
|
88 |
builder.append("WHILE "); |
|
89 |
builder.append(codeCondition.toString(formatter)); |
|
90 |
builder.append(" LOOP "); |
|
91 |
builder.indent(); |
|
92 |
builder.nl(); |
|
93 |
if( Code.isFunction(codeLoopBody,"BLOCK") ) { |
|
94 |
Code.Callable block = (Code.Callable)codeLoopBody; |
|
95 |
for (Code parameter : block.parameters()) { |
|
96 |
builder.nl(); |
|
97 |
builder.append(parameter.toString(formatter)); |
|
98 |
builder.append("; "); |
|
99 |
} |
|
100 |
} else { |
|
101 |
builder.nl(); |
|
102 |
builder.append(codeLoopBody.toString(formatter)); |
|
103 |
builder.append(" "); |
|
104 |
} |
|
105 |
builder.unindent(); |
|
106 |
builder.nl(); |
|
107 |
builder.append("END LOOP "); |
|
108 |
return builder.build(); |
|
109 |
} finally { |
|
110 |
builder.pop(); |
|
111 |
} |
|
89 | 112 |
} |
90 |
|
|
91 |
} |
|
113 |
|
|
114 |
} |
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/function/programming/CaseFunction.java | ||
---|---|---|
6 | 6 |
import org.gvsig.expressionevaluator.Formatter; |
7 | 7 |
import org.gvsig.expressionevaluator.Function; |
8 | 8 |
import org.gvsig.expressionevaluator.Interpreter; |
9 |
import org.gvsig.expressionevaluator.PrettyFormatter; |
|
9 | 10 |
import org.gvsig.expressionevaluator.spi.AbstractFunction; |
10 | 11 |
import org.gvsig.tools.ToolsLocator; |
11 | 12 |
import org.gvsig.tools.dataTypes.DataTypes; |
... | ... | |
84 | 85 |
|
85 | 86 |
@Override |
86 | 87 |
public String toString(Codes args, Formatter<Code> formatter) { |
87 |
StringBuilder builder = new StringBuilder(); |
|
88 | 88 |
|
89 |
int count;
|
|
90 |
int firstValue;
|
|
91 |
int elseValue;
|
|
89 |
PrettyFormatter builder = PrettyFormatter.get(formatter);
|
|
90 |
try {
|
|
91 |
builder.push();
|
|
92 | 92 |
|
93 |
if( (args.size() % 2) == 0) { |
|
94 |
count = args.size() / 2; |
|
95 |
firstValue = count; |
|
96 |
elseValue = -1; |
|
97 |
} else { |
|
98 |
count = (args.size()-1) / 2; |
|
99 |
firstValue = count; |
|
100 |
elseValue = args.size()-1; |
|
101 |
} |
|
93 |
int count; |
|
94 |
int firstValue; |
|
95 |
int elseValue; |
|
96 |
Code codeElse = null; |
|
102 | 97 |
|
103 |
Object value = null; |
|
104 |
builder.append("CASE"); |
|
105 |
for( int n=0; n<count; n++ ) { |
|
106 |
builder.append(" WHEN "); |
|
107 |
builder.append(args.get(n).toString(formatter)); |
|
108 |
builder.append(" THEN "); |
|
109 |
builder.append(args.get(n+firstValue).toString(formatter)); |
|
98 |
if( (args.size() % 2) == 0) { |
|
99 |
count = args.size() / 2; |
|
100 |
firstValue = count; |
|
101 |
elseValue = -1; |
|
102 |
} else { |
|
103 |
count = (args.size()-1) / 2; |
|
104 |
firstValue = count; |
|
105 |
elseValue = args.size()-1; |
|
106 |
codeElse = (elseValue>0)? args.get(elseValue):null; |
|
107 |
} |
|
108 |
|
|
109 |
builder.append("CASE "); |
|
110 |
builder.indent(); |
|
111 |
for( int n=0; n<count; n++ ) { |
|
112 |
builder.nl(); |
|
113 |
builder.append("WHEN "); |
|
114 |
builder.append(args.get(n).toString(formatter)); |
|
115 |
builder.append(" THEN "); |
|
116 |
builder.indent(); |
|
117 |
builder.nl(); |
|
118 |
Code codeBody = args.get(n+firstValue); |
|
119 |
if( Code.isFunction(codeBody,"BLOCK") ) { |
|
120 |
Code.Callable block = (Code.Callable)codeBody; |
|
121 |
for (Code parameter : block.parameters()) { |
|
122 |
builder.nl(); |
|
123 |
builder.append(parameter.toString(formatter)); |
|
124 |
builder.append("; "); |
|
125 |
} |
|
126 |
} else { |
|
127 |
builder.nl(); |
|
128 |
builder.append(codeBody.toString(formatter)); |
|
129 |
builder.append("; "); |
|
130 |
} |
|
131 |
builder.unindent(); |
|
132 |
} |
|
133 |
if( codeElse!=null) { |
|
134 |
builder.nl(); |
|
135 |
builder.append("ELSE "); |
|
136 |
builder.indent(); |
|
137 |
builder.nl(); |
|
138 |
if( Code.isFunction(codeElse,"BLOCK") ) { |
|
139 |
Code.Callable block = (Code.Callable)codeElse; |
|
140 |
for (Code parameter : block.parameters()) { |
|
141 |
builder.nl(); |
|
142 |
builder.append(parameter.toString(formatter)); |
|
143 |
builder.append("; "); |
|
144 |
} |
|
145 |
} else { |
|
146 |
builder.nl(); |
|
147 |
builder.append(codeElse.toString(formatter)); |
|
148 |
builder.append("; "); |
|
149 |
} |
|
150 |
builder.unindent(); |
|
151 |
} |
|
152 |
builder.unindent(); |
|
153 |
builder.nl(); |
|
154 |
builder.append("END"); |
|
155 |
|
|
156 |
return builder.build(); |
|
157 |
} finally { |
|
158 |
builder.pop(); |
|
110 | 159 |
} |
111 |
if( elseValue>0 && args.get(elseValue)!=null) { |
|
112 |
builder.append(" ELSE "); |
|
113 |
builder.append(args.get(elseValue).toString(formatter)); |
|
114 |
} |
|
115 |
builder.append(" END"); |
|
116 |
return builder.toString(); |
|
117 |
|
|
118 | 160 |
} |
119 | 161 |
} |
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/function/programming/IFFunction.java | ||
---|---|---|
7 | 7 |
import org.gvsig.expressionevaluator.Formatter; |
8 | 8 |
import org.gvsig.expressionevaluator.Function; |
9 | 9 |
import org.gvsig.expressionevaluator.Interpreter; |
10 |
import org.gvsig.expressionevaluator.PrettyFormatter; |
|
10 | 11 |
import org.gvsig.expressionevaluator.spi.AbstractFunction; |
11 | 12 |
|
12 | 13 |
public class IFFunction extends AbstractFunction { |
... | ... | |
56 | 57 |
|
57 | 58 |
@Override |
58 | 59 |
public String toString(Codes args, Formatter<Code> formatter) { |
59 |
StringBuilder builder = new StringBuilder(); |
|
60 |
builder.append("IF "); |
|
61 |
builder.append(args.get(0).toString(formatter)); |
|
62 |
builder.append(" THEN "); |
|
63 |
builder.append(args.get(1).toString(formatter)); |
|
64 |
if( args.size()>2 && args.get(2)!=null ) { |
|
65 |
builder.append(" ELSE "); |
|
66 |
builder.append(args.get(2).toString(formatter)); |
|
60 |
Code codeCondition = args.get(0); |
|
61 |
Code codeIfTrue = args.get(1); |
|
62 |
Code codeIfFalse = (args.size() > 2)? args.get(2):null; |
|
63 |
|
|
64 |
PrettyFormatter builder = PrettyFormatter.get(formatter); |
|
65 |
try { |
|
66 |
builder.push(); |
|
67 |
|
|
68 |
builder.append("IF "); |
|
69 |
builder.append(codeCondition.toString(formatter)); |
|
70 |
builder.append(" THEN "); |
|
71 |
builder.indent(); |
|
72 |
if( Code.isFunction(codeIfTrue,"BLOCK") ) { |
|
73 |
Code.Callable block = (Code.Callable)codeIfTrue; |
|
74 |
for (Code parameter : block.parameters()) { |
|
75 |
builder.nl(); |
|
76 |
builder.append(parameter.toString(formatter)); |
|
77 |
builder.append("; "); |
|
78 |
} |
|
79 |
} else { |
|
80 |
builder.nl(); |
|
81 |
builder.append(codeIfTrue.toString(formatter)); |
|
82 |
builder.append("; "); |
|
83 |
} |
|
84 |
builder.unindent(); |
|
85 |
if( codeIfFalse!=null ) { |
|
86 |
builder.nl(); |
|
87 |
builder.append("ELSE "); |
|
88 |
builder.indent(); |
|
89 |
if( Code.isFunction(codeIfTrue,"BLOCK") ) { |
|
90 |
Code.Callable block = (Code.Callable)codeIfFalse; |
|
91 |
for (Code parameter : block.parameters()) { |
|
92 |
builder.nl(); |
|
93 |
builder.append(parameter.toString(formatter)); |
|
94 |
builder.append("; "); |
|
95 |
} |
|
96 |
} else { |
|
97 |
builder.nl(); |
|
98 |
builder.append(codeIfFalse.toString(formatter)); |
|
99 |
builder.append("; "); |
|
100 |
} |
|
101 |
} |
|
102 |
builder.nl(); |
|
103 |
builder.append("END IF"); |
|
104 |
return builder.build(); |
|
105 |
} finally { |
|
106 |
builder.pop(); |
|
67 | 107 |
} |
68 |
builder.append(" END IF"); |
|
69 |
return builder.toString(); |
|
70 | 108 |
} |
71 | 109 |
|
72 | 110 |
|
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/function/programming/ForEachFunction.java | ||
---|---|---|
10 | 10 |
import org.gvsig.expressionevaluator.ExpressionRuntimeException; |
11 | 11 |
import org.gvsig.expressionevaluator.Formatter; |
12 | 12 |
import org.gvsig.expressionevaluator.MutableSymbolTable; |
13 |
import org.gvsig.expressionevaluator.PrettyFormatter; |
|
13 | 14 |
import org.gvsig.expressionevaluator.impl.function.programming.BreakFunction.BreakException; |
14 | 15 |
import org.gvsig.expressionevaluator.impl.function.programming.ReturnFunction.ReturnException; |
15 | 16 |
|
... | ... | |
89 | 90 |
|
90 | 91 |
@Override |
91 | 92 |
public String toString(Codes args, Formatter<Code> formatter) { |
92 |
StringBuilder builder = new StringBuilder(); |
|
93 |
builder.append("FOR \""); |
|
94 |
builder.append(Objects.toString(((Code.Constant)args.get(0)).value())); |
|
95 |
builder.append("\" IN "); |
|
96 |
builder.append(args.get(1).toString(formatter)); |
|
97 |
builder.append(" LOOP "); |
|
98 |
builder.append(args.get(2).toString(formatter)); |
|
99 |
builder.append(" END LOOP"); |
|
100 |
return builder.toString(); |
|
93 |
Code codeVarname = args.get(0); |
|
94 |
Code codeList = args.get(1); |
|
95 |
Code codeLoopBody = args.get(2); |
|
96 |
|
|
97 |
PrettyFormatter builder = PrettyFormatter.get(formatter); |
|
98 |
try { |
|
99 |
builder.push(); |
|
100 |
|
|
101 |
builder.append("FOR \""); |
|
102 |
builder.append(Objects.toString(((Code.Constant)codeVarname).value())); |
|
103 |
builder.append("\" IN "); |
|
104 |
builder.append(codeList.toString(formatter)); |
|
105 |
builder.append(" LOOP "); |
|
106 |
builder.indent(); |
|
107 |
builder.nl(); |
|
108 |
if( Code.isFunction(codeLoopBody,"BLOCK") ) { |
|
109 |
Code.Callable block = (Code.Callable)codeLoopBody; |
|
110 |
for (Code parameter : block.parameters()) { |
|
111 |
builder.nl(); |
|
112 |
builder.append(parameter.toString(formatter)); |
|
113 |
builder.append("; "); |
|
114 |
} |
|
115 |
} else { |
|
116 |
builder.nl(); |
|
117 |
builder.append(codeLoopBody.toString(formatter)); |
|
118 |
builder.append(" "); |
|
119 |
} |
|
120 |
builder.unindent(); |
|
121 |
builder.nl(); |
|
122 |
builder.append("END LOOP"); |
|
123 |
|
|
124 |
return builder.build(); |
|
125 |
} finally { |
|
126 |
builder.pop(); |
|
127 |
} |
|
101 | 128 |
} |
102 | 129 |
|
103 | 130 |
} |
Also available in: Unified diff