1   package net.sourceforge.backpedal.kodo;
2   
3   import net.mikehogan.veggie.exceptions.VeggieSystemException;
4   import net.sourceforge.backpedal.api.core.BackpedalFactory;
5   import net.sourceforge.backpedal.api.core.ParsedStatement;
6   import net.sourceforge.backpedal.api.core.StatementParser;
7   import net.sourceforge.backpedal.impl.AbstractComponent;
8   
9   import java.util.ArrayList;
10  import java.util.Collection;
11  import java.util.Collections;
12  import java.util.StringTokenizer;
13  
14  public class KodoStatementParser extends AbstractComponent implements StatementParser {
15      private final BackpedalFactory backpedalFactory;
16  
17      public KodoStatementParser(BackpedalFactory backpedalFactory) {
18          this.backpedalFactory = backpedalFactory;
19      }
20  
21      public ParsedStatement parseInsertStatement(final String statement) {
22          final StringTokenizer tokenizer = new StringTokenizer(statement, " (),");
23          final Collection changedColumnNames = new ArrayList();
24          final String mainKeyword = "INSERT";
25          parse(mainKeyword, tokenizer);
26          parse("INTO", tokenizer);
27          final String tableName = tokenizer.nextToken();
28          String token = tokenizer.nextToken();
29          do {
30              changedColumnNames.add(token);
31              token = tokenizer.nextToken();
32          } while (!"VALUES".equals(token));
33          return createParsedStatement(statement, Collections.EMPTY_LIST, changedColumnNames, mainKeyword, tableName);
34      }
35  
36      public ParsedStatement parseDeleteStatement(String sql) {
37          final StringTokenizer tokenizer = new StringTokenizer(sql, " (),=?");
38          final Collection columnNames = new ArrayList();
39          final String mainKeyword = "DELETE";
40          parse(mainKeyword, tokenizer);
41          parse("FROM", tokenizer);
42          final String tableName = tokenizer.nextToken();
43          parse("WHERE", tokenizer);
44          while (tokenizer.hasMoreTokens()) {
45              final String token = tokenizer.nextToken();
46              if (!"AND".equals(token)) {
47                  columnNames.add(token);
48              }
49          }
50          return createParsedStatement(sql, columnNames, Collections.EMPTY_LIST, mainKeyword, tableName);
51      }
52  
53      private ParsedStatement createParsedStatement(final String originalSql, final Collection whereColumnNames, final Collection changedColumnNames, final String mainKeyword, final String tableName) {
54          String[] whereCols = new String[whereColumnNames.size()];
55          whereCols = (String[]) whereColumnNames.toArray(whereCols);
56          String[] changedCols = new String[changedColumnNames.size()];
57          changedCols = (String[]) changedColumnNames.toArray(changedCols);
58          return backpedalFactory.createParsedStatement(originalSql, mainKeyword, whereCols, changedCols, tableName);
59      }
60  
61      private void parse(String expectedToken, StringTokenizer tokenizer) {
62          final String nextToken = tokenizer.nextToken();
63          if (!expectedToken.equals(nextToken)) {
64              throw new VeggieSystemException("Expected token " + expectedToken + ", got " + nextToken);
65          }
66      }
67  
68      public ParsedStatement parseUpdateStatement(String sql) {
69          final StringTokenizer tokenizer = new StringTokenizer(sql, " (),=?");
70          final Collection whereColumnNames = new ArrayList();
71          final Collection changedColumnNames = new ArrayList();
72          final String mainKeyword = "UPDATE";
73          parse(mainKeyword, tokenizer);
74          final String tableName = tokenizer.nextToken();
75          parse("SET", tokenizer);
76          String token = tokenizer.nextToken();
77          while (!"WHERE".equals(token)) {
78              changedColumnNames.add(token);
79              token = tokenizer.nextToken();
80          }
81          while (tokenizer.hasMoreTokens()) {
82              token = tokenizer.nextToken();
83              if (!"AND".equals(token)) {
84                  whereColumnNames.add(token);
85              }
86          }
87          return createParsedStatement(sql, whereColumnNames, changedColumnNames, mainKeyword, tableName);
88      }
89  }
This page was automatically generated by Maven