Revision 47734

View differences:

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