Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libGDBMS / src / com / hardcode / gdbms / control / SemanticParser.java @ 466

History | View | Annotate | Download (17.6 KB)

1
package com.hardcode.gdbms.control;
2

    
3
import com.hardcode.gdbms.parser.ASTSQLAndExpr;
4
import com.hardcode.gdbms.parser.ASTSQLBetweenClause;
5
import com.hardcode.gdbms.parser.ASTSQLColRef;
6
import com.hardcode.gdbms.parser.ASTSQLCompareExpr;
7
import com.hardcode.gdbms.parser.ASTSQLCompareExprRight;
8
import com.hardcode.gdbms.parser.ASTSQLCompareOp;
9
import com.hardcode.gdbms.parser.ASTSQLDelete;
10
import com.hardcode.gdbms.parser.ASTSQLExistsClause;
11
import com.hardcode.gdbms.parser.ASTSQLFunction;
12
import com.hardcode.gdbms.parser.ASTSQLFunctionArgs;
13
import com.hardcode.gdbms.parser.ASTSQLGroupBy;
14
import com.hardcode.gdbms.parser.ASTSQLInClause;
15
import com.hardcode.gdbms.parser.ASTSQLInsert;
16
import com.hardcode.gdbms.parser.ASTSQLIsClause;
17
import com.hardcode.gdbms.parser.ASTSQLLValueElement;
18
import com.hardcode.gdbms.parser.ASTSQLLValueList;
19
import com.hardcode.gdbms.parser.ASTSQLLeftJoinClause;
20
import com.hardcode.gdbms.parser.ASTSQLLikeClause;
21
import com.hardcode.gdbms.parser.ASTSQLLiteral;
22
import com.hardcode.gdbms.parser.ASTSQLLvalue;
23
import com.hardcode.gdbms.parser.ASTSQLLvalueTerm;
24
import com.hardcode.gdbms.parser.ASTSQLNotExpr;
25
import com.hardcode.gdbms.parser.ASTSQLOrExpr;
26
import com.hardcode.gdbms.parser.ASTSQLOrderBy;
27
import com.hardcode.gdbms.parser.ASTSQLOrderByElem;
28
import com.hardcode.gdbms.parser.ASTSQLOrderByList;
29
import com.hardcode.gdbms.parser.ASTSQLOrderDirection;
30
import com.hardcode.gdbms.parser.ASTSQLPattern;
31
import com.hardcode.gdbms.parser.ASTSQLProductExpr;
32
import com.hardcode.gdbms.parser.ASTSQLRightJoinClause;
33
import com.hardcode.gdbms.parser.ASTSQLSelect;
34
import com.hardcode.gdbms.parser.ASTSQLSelectCols;
35
import com.hardcode.gdbms.parser.ASTSQLSelectList;
36
import com.hardcode.gdbms.parser.ASTSQLStatement;
37
import com.hardcode.gdbms.parser.ASTSQLSumExpr;
38
import com.hardcode.gdbms.parser.ASTSQLTableList;
39
import com.hardcode.gdbms.parser.ASTSQLTableRef;
40
import com.hardcode.gdbms.parser.ASTSQLTerm;
41
import com.hardcode.gdbms.parser.ASTSQLUnaryExpr;
42
import com.hardcode.gdbms.parser.ASTSQLUnion;
43
import com.hardcode.gdbms.parser.ASTSQLUpdate;
44
import com.hardcode.gdbms.parser.ASTSQLUpdateAssignment;
45
import com.hardcode.gdbms.parser.ASTSQLWhere;
46
import com.hardcode.gdbms.parser.Node;
47
import com.hardcode.gdbms.parser.SQLEngineVisitor;
48
import com.hardcode.gdbms.parser.SimpleNode;
49
import com.hardcode.gdbms.parser.Token;
50

    
51
import org.xml.sax.ContentHandler;
52
import org.xml.sax.SAXException;
53
import org.xml.sax.helpers.AttributesImpl;
54

    
55
import java.util.Stack;
56

    
57

    
58
/**
59
 * Se encarga de obtener una estructura de datos que defina la instrucci?n SQL
60
 * en t?rminos de DataSources y dem?s estructuras internas a partir del ?rbol
61
 * obtenido en el an?lisis sint?ctico
62
 *
63
 * @author Fernando Gonz?lez Cort?s
64
 */
65
public class SemanticParser implements SQLEngineVisitor {
66
    private Stack childs = new Stack();
67
    private int current = -1;
68
    private Stack infos = new Stack();
69
    private ContentHandler handler;
70

    
71
    /**
72
     * Obtiene el texto del nodo
73
     *
74
     * @param s Nodo del cual se quiere obtener el texto
75
     *
76
     * @return String
77
     */
78
    private String getText(SimpleNode s) {
79
        String ret = "";
80

    
81
        for (Token tok = s.first_token; tok != s.last_token.next;
82
                tok = tok.next) {
83
            ret += (" " + tok.image);
84
        }
85

    
86
        return ret;
87
    }
88

    
89
    /**
90
     * Obtiene el nombre de la clase a partir de dicha clase. El nombre no
91
     * cualificado, es decir, sin el paquete
92
     *
93
     * @param clase Clase de la cual se quiere obtener el nombre
94
     *
95
     * @return String con el nombre
96
     */
97
    private String getClassName(Class clase) {
98
        String name = clase.getName();
99

    
100
        return name.substring(name.lastIndexOf('.') + 1);
101
    }
102

    
103
    /**
104
     * Lanza un evento SAX de startElement con la informaci?n del nodo que se
105
     * pasa como parametro
106
     *
107
     * @param node nodo del arbol sint?ctico
108
     */
109
    private void start(SimpleNode node) {
110
        String info = node.getClass().getName() + "(" + getText(node) + ")";
111

    
112
        int numChilds = node.jjtGetNumChildren();
113

    
114
        childs.push(new Integer(current));
115
        infos.push(node);
116

    
117
        current = numChilds;
118

    
119
        AttributesImpl atts = new AttributesImpl();
120
        atts.addAttribute("", "image", "image", "CDATA", getText(node));
121

    
122
        if (node.first_token == node.last_token) {
123
            atts.addAttribute("", "type", "type", "CDATA",
124
                "" + node.first_token.kind);
125
        }
126

    
127
        try {
128
            handler.startElement("", getClassName(node.getClass()),
129
                getClassName(node.getClass()), atts);
130
        } catch (SAXException e) {
131
        }
132

    
133
        if (numChilds == 0) {
134
            end();
135
        }
136
    }
137

    
138
    /**
139
     * metodo que procesa un nodo
140
     *
141
     * @param node nodo a procesar
142
     */
143
    private void process(SimpleNode node) {
144
        start(node);
145
    }
146

    
147
    /**
148
     * Lanza un evento SAX de endElement con la informaci?n del nodo que se
149
     * encuentra encima de la pila
150
     */
151
    private void end() {
152
        current--;
153

    
154
        if (current <= 0) {
155
            current = ((Integer) childs.pop()).intValue();
156

    
157
            Node node = (Node) infos.pop();
158

    
159
            try {
160
                handler.endElement("", getClassName(node.getClass()),
161
                    getClassName(node.getClass()));
162
            } catch (SAXException e) {
163
            }
164

    
165
            if (!childs.isEmpty()) {
166
                end();
167
            }
168
        }
169
    }
170

    
171
    /**
172
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.SimpleNode,
173
     *      java.lang.Object)
174
     */
175
    public Object visit(SimpleNode node, Object data) {
176
        process(node);
177

    
178
        return null;
179
    }
180

    
181
    /**
182
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLAndExpr,
183
     *      java.lang.Object)
184
     */
185
    public Object visit(ASTSQLAndExpr node, Object data) {
186
        process(node);
187

    
188
        return null;
189
    }
190

    
191
    /**
192
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLBetweenClause,
193
     *      java.lang.Object)
194
     */
195
    public Object visit(ASTSQLBetweenClause node, Object data) {
196
        process(node);
197

    
198
        return null;
199
    }
200

    
201
    /**
202
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLColRef,
203
     *      java.lang.Object)
204
     */
205
    public Object visit(ASTSQLColRef node, Object data) {
206
        process(node);
207

    
208
        return null;
209
    }
210

    
211
    /**
212
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLCompareExpr,
213
     *      java.lang.Object)
214
     */
215
    public Object visit(ASTSQLCompareExpr node, Object data) {
216
        process(node);
217

    
218
        return null;
219
    }
220

    
221
    /**
222
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLCompareExprRight,
223
     *      java.lang.Object)
224
     */
225
    public Object visit(ASTSQLCompareExprRight node, Object data) {
226
        process(node);
227

    
228
        return null;
229
    }
230

    
231
    /**
232
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLCompareOp,
233
     *      java.lang.Object)
234
     */
235
    public Object visit(ASTSQLCompareOp node, Object data) {
236
        process(node);
237

    
238
        return null;
239
    }
240

    
241
    /**
242
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLDelete,
243
     *      java.lang.Object)
244
     */
245
    public Object visit(ASTSQLDelete node, Object data) {
246
        process(node);
247

    
248
        return null;
249
    }
250

    
251
    /**
252
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLExistsClause,
253
     *      java.lang.Object)
254
     */
255
    public Object visit(ASTSQLExistsClause node, Object data) {
256
        process(node);
257

    
258
        return null;
259
    }
260

    
261
    /**
262
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLFunction,
263
     *      java.lang.Object)
264
     */
265
    public Object visit(ASTSQLFunction node, Object data) {
266
        process(node);
267

    
268
        return null;
269
    }
270

    
271
    /**
272
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLFunctionArgs,
273
     *      java.lang.Object)
274
     */
275
    public Object visit(ASTSQLFunctionArgs node, Object data) {
276
        process(node);
277

    
278
        return null;
279
    }
280

    
281
    /**
282
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLGroupBy,
283
     *      java.lang.Object)
284
     */
285
    public Object visit(ASTSQLGroupBy node, Object data) {
286
        process(node);
287

    
288
        return null;
289
    }
290

    
291
    /**
292
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLInClause,
293
     *      java.lang.Object)
294
     */
295
    public Object visit(ASTSQLInClause node, Object data) {
296
        process(node);
297

    
298
        return null;
299
    }
300

    
301
    /**
302
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLInsert,
303
     *      java.lang.Object)
304
     */
305
    public Object visit(ASTSQLInsert node, Object data) {
306
        process(node);
307

    
308
        return null;
309
    }
310

    
311
    /**
312
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLIsClause,
313
     *      java.lang.Object)
314
     */
315
    public Object visit(ASTSQLIsClause node, Object data) {
316
        process(node);
317

    
318
        return null;
319
    }
320

    
321
    /**
322
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLLeftJoinClause,
323
     *      java.lang.Object)
324
     */
325
    public Object visit(ASTSQLLeftJoinClause node, Object data) {
326
        process(node);
327

    
328
        return null;
329
    }
330

    
331
    /**
332
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLLikeClause,
333
     *      java.lang.Object)
334
     */
335
    public Object visit(ASTSQLLikeClause node, Object data) {
336
        process(node);
337

    
338
        return null;
339
    }
340

    
341
    /**
342
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLLiteral,
343
     *      java.lang.Object)
344
     */
345
    public Object visit(ASTSQLLiteral node, Object data) {
346
        process(node);
347

    
348
        return null;
349
    }
350

    
351
    /**
352
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLLvalue,
353
     *      java.lang.Object)
354
     */
355
    public Object visit(ASTSQLLvalue node, Object data) {
356
        process(node);
357

    
358
        return null;
359
    }
360

    
361
    /**
362
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLLvalueTerm,
363
     *      java.lang.Object)
364
     */
365
    public Object visit(ASTSQLLvalueTerm node, Object data) {
366
        process(node);
367

    
368
        return null;
369
    }
370

    
371
    /**
372
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLNotExpr,
373
     *      java.lang.Object)
374
     */
375
    public Object visit(ASTSQLNotExpr node, Object data) {
376
        process(node);
377

    
378
        return null;
379
    }
380

    
381
    /**
382
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLOrderBy,
383
     *      java.lang.Object)
384
     */
385
    public Object visit(ASTSQLOrderBy node, Object data) {
386
        process(node);
387

    
388
        return null;
389
    }
390

    
391
    /**
392
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLOrderByElem,
393
     *      java.lang.Object)
394
     */
395
    public Object visit(ASTSQLOrderByElem node, Object data) {
396
        process(node);
397

    
398
        return null;
399
    }
400

    
401
    /**
402
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLOrderByList,
403
     *      java.lang.Object)
404
     */
405
    public Object visit(ASTSQLOrderByList node, Object data) {
406
        process(node);
407

    
408
        return null;
409
    }
410

    
411
    /**
412
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLOrderDirection,
413
     *      java.lang.Object)
414
     */
415
    public Object visit(ASTSQLOrderDirection node, Object data) {
416
        process(node);
417

    
418
        return null;
419
    }
420

    
421
    /**
422
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLOrExpr,
423
     *      java.lang.Object)
424
     */
425
    public Object visit(ASTSQLOrExpr node, Object data) {
426
        process(node);
427

    
428
        return null;
429
    }
430

    
431
    /**
432
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLPattern,
433
     *      java.lang.Object)
434
     */
435
    public Object visit(ASTSQLPattern node, Object data) {
436
        process(node);
437

    
438
        return null;
439
    }
440

    
441
    /**
442
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLProductExpr,
443
     *      java.lang.Object)
444
     */
445
    public Object visit(ASTSQLProductExpr node, Object data) {
446
        process(node);
447

    
448
        return null;
449
    }
450

    
451
    /**
452
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLRightJoinClause,
453
     *      java.lang.Object)
454
     */
455
    public Object visit(ASTSQLRightJoinClause node, Object data) {
456
        process(node);
457

    
458
        return null;
459
    }
460

    
461
    /**
462
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLSelect,
463
     *      java.lang.Object)
464
     */
465
    public Object visit(ASTSQLSelect node, Object data) {
466
        process(node);
467

    
468
        return null;
469
    }
470

    
471
    /**
472
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLSelectCols,
473
     *      java.lang.Object)
474
     */
475
    public Object visit(ASTSQLSelectCols node, Object data) {
476
        process(node);
477

    
478
        return null;
479
    }
480

    
481
    /**
482
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLSelectList,
483
     *      java.lang.Object)
484
     */
485
    public Object visit(ASTSQLSelectList node, Object data) {
486
        process(node);
487

    
488
        return null;
489
    }
490

    
491
    /**
492
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLStatement,
493
     *      java.lang.Object)
494
     */
495
    public Object visit(ASTSQLStatement node, Object data) {
496
        process(node);
497

    
498
        return null;
499
    }
500

    
501
    /**
502
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLSumExpr,
503
     *      java.lang.Object)
504
     */
505
    public Object visit(ASTSQLSumExpr node, Object data) {
506
        process(node);
507

    
508
        return null;
509
    }
510

    
511
    /**
512
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLTableList,
513
     *      java.lang.Object)
514
     */
515
    public Object visit(ASTSQLTableList node, Object data) {
516
        process(node);
517

    
518
        return null;
519
    }
520

    
521
    /**
522
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLTableRef,
523
     *      java.lang.Object)
524
     */
525
    public Object visit(ASTSQLTableRef node, Object data) {
526
        process(node);
527

    
528
        return null;
529
    }
530

    
531
    /**
532
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLTerm,
533
     *      java.lang.Object)
534
     */
535
    public Object visit(ASTSQLTerm node, Object data) {
536
        process(node);
537

    
538
        return null;
539
    }
540

    
541
    /**
542
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLUnaryExpr,
543
     *      java.lang.Object)
544
     */
545
    public Object visit(ASTSQLUnaryExpr node, Object data) {
546
        process(node);
547

    
548
        return null;
549
    }
550

    
551
    /**
552
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLUpdate,
553
     *      java.lang.Object)
554
     */
555
    public Object visit(ASTSQLUpdate node, Object data) {
556
        process(node);
557

    
558
        return null;
559
    }
560

    
561
    /**
562
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLUpdateAssignment,
563
     *      java.lang.Object)
564
     */
565
    public Object visit(ASTSQLUpdateAssignment node, Object data) {
566
        process(node);
567

    
568
        return null;
569
    }
570

    
571
    /**
572
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLLValueElement,
573
     *      java.lang.Object)
574
     */
575
    public Object visit(ASTSQLLValueElement node, Object data) {
576
        process(node);
577

    
578
        return null;
579
    }
580

    
581
    /**
582
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLLValueList,
583
     *      java.lang.Object)
584
     */
585
    public Object visit(ASTSQLLValueList node, Object data) {
586
        process(node);
587

    
588
        return null;
589
    }
590

    
591
    /**
592
     * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLWhere,
593
     *      java.lang.Object)
594
     */
595
    public Object visit(ASTSQLWhere node, Object data) {
596
        process(node);
597

    
598
        return null;
599
    }
600

    
601
    /**
602
     * @see org.xml.sax.XMLReader#getContentHandler()
603
     */
604
    public ContentHandler getContentHandler() {
605
        return handler;
606
    }
607

    
608
    /**
609
     * @see org.xml.sax.XMLReader#setContentHandler(org.xml.sax.ContentHandler)
610
     */
611
    public void setContentHandler(ContentHandler arg0) {
612
        handler = arg0;
613
    }
614

    
615
    /**
616
     * Hace que este visitor sp visite el nodo que se pasa como par?metro y
617
     * cada uno de sus hijos
618
     *
619
     * @param root nodo raiz que se va a visitar
620
     *
621
     * @throws SAXException DOCUMENT ME!
622
     */
623
    public void parse(Node root) throws SAXException {
624
        handler.startDocument();
625
        parsing(root);
626
        handler.endDocument();
627
    }
628

    
629
    /**
630
     * DOCUMENT ME!
631
     *
632
     * @param root DOCUMENT ME!
633
     *
634
     * @throws SAXException DOCUMENT ME!
635
     */
636
    private void parsing(Node root) throws SAXException {
637
        root.jjtAccept(this, null);
638

    
639
        for (int i = 0; i < root.jjtGetNumChildren(); i++) {
640
            parsing(root.jjtGetChild(i));
641
        }
642
    }
643

    
644
        /**
645
         * @see com.hardcode.gdbms.parser.SQLEngineVisitor#visit(com.hardcode.gdbms.parser.ASTSQLUnion, java.lang.Object)
646
         */
647
        public Object visit(ASTSQLUnion node, Object data) {
648
                process(node);
649
                return null;
650
        }
651
}