1
2 package org.webdocwf.util.xml;
3
4 import java.util.ArrayList;
5 import java.util.Vector;
6 import java.util.StringTokenizer;
7
8 /***
9 * This is a very crude and SQL simple parser used by the Xml JDBC driver.
10 *
11 * @author Sinisa Milosevic
12 * @version 1.0
13 */
14 public class SqlParser
15 {
16 /***
17 *Description of the Field
18 *
19 * @since
20 */
21
22
23 public static final String CREATE_TABLE = "create_table";
24 public static final String DROP_TABLE = "drop_table";
25 public static final String INSERT = "insert";
26 public static final String UPDATE = "update";
27 public static final String SELECT = "select";
28 public static final String DELETE = "delete";
29
30
31 private String fileName;
32
33 public String tableName;
34
35 public String whereStatement;
36
37 public String sqlType;
38
39 private String sqlStatement = "";
40
41
42
43
44 public String[] columnNames;
45
46 public String[] primaryKeyColumns;
47
48 public String[] notnullColumns;
49
50 public String[] columnValues;
51
52 public String[] columnWhereNames;
53
54 public String[] columnWhereValues;
55
56
57
58 public SqlParser(String fileName) {
59 this.fileName = fileName;
60 }
61
62 /***
63 *Gets the tableName attribute of the SqlParser object
64 *
65 * @return The tableName value
66 * @since
67 */
68 public String getTableName()
69 {
70 return tableName;
71 }
72
73 /***
74 *Gets columns which can not be NULL
75 *
76 * @return The tableName value
77 * @since
78 */
79 public String[] getNotnullColumns()
80 {
81 return this.notnullColumns;
82 }
83
84 /***
85 *Gets the type of sql statement.INSERT , UPDATE , CREATE , SELECT
86 *
87 * @return The type of sql statement.
88 * @since
89 */
90 public String getSQLType()
91 {
92 return this.sqlType;
93 }
94
95
96 /***
97 *Gets the columnNames attribute of the SqlParser object
98 *
99 * @return The columnNames value
100 * @since
101 */
102 public String[] getColumnNames()
103 {
104 return columnNames;
105 }
106
107 public String[] getWhereColumnNames()
108 {
109 return columnWhereNames;
110 }
111
112 /***
113 * Gets array of column values.Used in INSERT , UPDATE statements
114 * @return columnValues as array of string.
115 */
116 public String[] getColumnValues()
117 {
118 return columnValues;
119 }
120
121 /***
122 * Gets array of column which are primarykeys.Used in INSERT statements
123 * @return primarykeys as array of string.
124 */
125 public String[] getPrimaryKeys()
126 {
127 return primaryKeyColumns;
128 }
129
130 public String[] getWhereColumnValues()
131 {
132 return columnWhereValues;
133 }
134
135
136
137 public String getSqlStatement() {
138 return this.sqlStatement;
139 }
140
141 /***
142 * Description of the Method
143 *
144 * @param sql Description of Parameter
145 * @exception Exception Description of Exception
146 * @since
147 */
148 public void parse(String sql) throws Exception
149 {
150 this.sqlStatement = sql;
151 tableName = null;
152 columnNames = new String[0];
153 columnValues = new String[0];
154 columnWhereNames = new String[0];
155 columnWhereValues = new String[0];
156 whereStatement=null;
157 sqlType=null;
158 sql=sql.trim();
159 //removing line brakes
160 sql = sql.replaceAll("\n","");
161 //removing semicolon
162 sql = sql.replaceAll(";","");
163
164 //removing comments
165 if( sql.indexOf("/*") != -1 ) {
166 StringBuffer buf = new StringBuffer( sql );
167 buf.delete( sql.indexOf("/*") , sql.indexOf("*/")+2 );
168 sql = buf.toString();
169 }
170 String upperSql = sql.toUpperCase();
171
172
173 if (!upperSql.startsWith("DROP TABLE"))
174 {
175 if (!upperSql.startsWith("DELETE "))
176 {
177 if (!upperSql.startsWith("SELECT "))
178 {
179 if (!upperSql.startsWith("INSERT ")) {
180 if (!upperSql.startsWith("UPDATE ")) {
181 if (upperSql.indexOf("CREATE TABLE ") == -1)
182 throw new Exception("Malformed SQL. Wrong SQL statement.");
183 else {
184 sqlType=CREATE_TABLE;
185 int createPos = upperSql.indexOf("CREATE TABLE");
186 int tableStartPos = upperSql.indexOf("(");
187 int tableEndPos = upperSql.lastIndexOf(")");
188 //manage decimal comma problem
189 int start = 0;
190 while( upperSql.indexOf( "DECIMAL" , start ) != -1 ) {
191 int decimalPos = upperSql.indexOf( "DECIMAL" , start );
192 start = decimalPos+1;
193 int closeParPos = upperSql.indexOf(")" , decimalPos );
194 if( decimalPos != -1 ) {
195 String token = upperSql.substring( decimalPos , closeParPos );
196 StringBuffer buf = new StringBuffer( upperSql );
197 int commaPos = decimalPos + token.indexOf(",");
198 if( commaPos != -1 ) {
199 buf.replace( commaPos , commaPos+1 , String.valueOf('.') );
200 upperSql = buf.toString();
201 }
202 }
203 }
204
205 tableName = sql.substring(createPos+12, tableStartPos).trim().toUpperCase();
206 String createString = sql.substring(tableStartPos+1, tableEndPos).trim();
207 StringTokenizer tokenizerCreate = new StringTokenizer(createString.toUpperCase(), "\n");
208 ArrayList setColumnNames = new ArrayList();
209 ArrayList setPrimaryKeys = new ArrayList();
210 ArrayList setNotnullColumns = new ArrayList();
211 String token = ( (String)upperSql.subSequence( tableStartPos+1 , tableEndPos ) ).trim();
212 StringTokenizer comma = new StringTokenizer( token , "," );
213 while( comma.hasMoreTokens() ) {
214 String nextComma = comma.nextToken();
215 StringTokenizer space = new StringTokenizer( nextComma , " " );
216 String nextSpace = space.nextToken();
217 setColumnNames.add( nextSpace );
218 if( nextComma.indexOf("PRIMARYKEY") != -1 ) {
219 setPrimaryKeys.add( nextSpace );
220 setNotnullColumns.add( nextSpace );
221 }
222 if( nextComma.indexOf("NOT NULL") != -1 ) {
223 setNotnullColumns.add( nextSpace );
224 }
225 }
226 columnNames = new String[setColumnNames.size()];
227 setColumnNames.toArray(columnNames);
228 this.primaryKeyColumns = new String[ setPrimaryKeys.size() ];
229 setPrimaryKeys.toArray(this.primaryKeyColumns);
230 this.notnullColumns = new String[ setNotnullColumns.size() ];
231 setNotnullColumns.toArray(this.notnullColumns);
232 }
233 }
234 else{
235 if (upperSql.lastIndexOf(" SET ") == -1)
236 throw new Exception("Malformed SQL. Missing SET statement.");
237 sqlType=UPDATE;
238 int updatePos = upperSql.indexOf("UPDATE");
239 int setPos = upperSql.indexOf(" SET ");
240 int equalPos = upperSql.indexOf("=");
241 int wherePos = upperSql.indexOf(" WHERE ");
242 tableName = sql.substring(updatePos + 6, setPos).trim().toUpperCase();
243
244 String setString = sql.substring(setPos+5, wherePos);
245 StringTokenizer tokenizerSet = new StringTokenizer(setString, ",");
246 Vector setNames = new Vector();
247 Vector setValues = new Vector();
248
249 while (tokenizerSet.hasMoreTokens())
250 {
251 String strToken = tokenizerSet.nextToken();
252 int delimiter = strToken.indexOf("=");
253 setNames.add(strToken.substring(0,delimiter).trim().toUpperCase());
254 String value = strToken.substring(delimiter+1).trim();
255 if( value.indexOf("'") != -1 )
256 setValues.add( value.substring( value.indexOf("'")+1 ,value.lastIndexOf("'") ) );
257 else
258 setValues.add( value );
259 // setValues.add( value.substring(1,value.length()-1) );
260 }
261 columnNames = new String[setNames.size()];
262 columnValues = new String[setValues.size()];
263 setNames.copyInto(columnNames);
264 setValues.copyInto(columnValues);
265
266 if(wherePos!=-1)
267 {
268 String strWhere=sql.substring(wherePos+6).trim();
269 Vector whereCols = new Vector();
270 Vector whereValues = new Vector();
271 StringTokenizer tokenizerWhere = new StringTokenizer(strWhere, ",");
272
273 while (tokenizerWhere.hasMoreTokens())
274 {
275 String strToken = tokenizerWhere.nextToken();
276 if(strToken.toUpperCase().indexOf(" AND ")!=-1) {
277 String temp=strToken;
278 int andPos=0;
279 out:
280 do
281 {
282 andPos = temp.toUpperCase().indexOf(" AND ");
283 String strTokenAdd;
284 if(andPos!=-1)
285 strTokenAdd = temp.substring(0,andPos).trim();
286 else
287 strTokenAdd = temp.trim();
288 int delimiter2 = strTokenAdd.indexOf("=");
289 if(delimiter2!=-1) {
290 String valueAdd = strTokenAdd.substring(delimiter2+1).trim();
291 if((valueAdd.indexOf("'")!=-1) ||(valueAdd.indexOf("\"")!=-1))
292 valueAdd=valueAdd.trim().substring(1,valueAdd.trim().length()-1);
293 whereCols.add(strTokenAdd.substring(0,delimiter2).trim().toUpperCase());
294 whereValues.add(valueAdd);
295 }
296 else {
297 int delimiter3 = strTokenAdd.toUpperCase().indexOf(" is ");
298 whereCols.add(strTokenAdd.substring(0,delimiter3).trim().toUpperCase());
299 whereValues.add(null);
300 }
301 temp=temp.substring(andPos+5);
302 if(temp.toUpperCase().indexOf(" AND ")==-1) {
303 strTokenAdd = temp.trim();
304 int delimiter4 = strTokenAdd.indexOf("=");
305 if(delimiter4!=-1) {
306 String valueAdd = strTokenAdd.substring(delimiter4+1).trim();
307 if((valueAdd.indexOf("'")!=-1) ||(valueAdd.indexOf("\"")!=-1))
308 valueAdd=valueAdd.trim().substring(1,valueAdd.trim().length()-1);
309 whereCols.add(strTokenAdd.substring(0,delimiter4).trim().toUpperCase());
310 whereValues.add(valueAdd);
311 }
312 else {
313 int delimiter3 = strTokenAdd.toUpperCase().indexOf(" is ");
314 whereCols.add(strTokenAdd.substring(0,delimiter3).trim().toUpperCase());
315 whereValues.add(null);
316 }
317 break out;
318 }
319
320
321 }while(true);
322
323 }
324 else {
325 int delimiter = strToken.indexOf("=");
326 if(delimiter!=-1) {
327 String value = strToken.substring(delimiter+1).trim();
328 if((value.indexOf("'")!=-1) ||(value.indexOf("\"")!=-1))
329 value=value.trim().substring(1,value.trim().length()-1);
330 whereCols.add(strToken.substring(0,delimiter).trim().toUpperCase());
331 whereValues.add(value);
332 }
333 else {
334 int delimiter1 = strToken.toUpperCase().indexOf(" IS ");
335 whereCols.add(strToken.substring(0,delimiter1).trim().toUpperCase());
336 whereValues.add(null);
337 }
338 }
339 }
340 columnWhereNames = new String[whereCols.size()];
341 columnWhereValues = new String[whereValues.size()];
342 whereCols.copyInto(columnWhereNames);
343 whereValues.copyInto(columnWhereValues);
344
345
346 }
347
348 }
349
350 }
351 else {
352 if (upperSql.lastIndexOf(" VALUES") == -1) {
353 throw new Exception("Malformed SQL. Missing VALUES statement.");
354 }
355 sqlType=INSERT;
356 int intoPos = 0;
357 if(upperSql.indexOf(" INTO ")!=-1)
358 intoPos = upperSql.indexOf(" INTO ")+6;
359 else
360 intoPos = upperSql.indexOf("INSERT ")+7;
361 int bracketPos = upperSql.indexOf("(");
362 int lastBracketPos = upperSql.indexOf(")");
363 tableName = sql.substring(intoPos, bracketPos).trim().toUpperCase();
364
365 Vector cols = new Vector();
366 StringTokenizer tokenizer = new StringTokenizer(upperSql.substring(bracketPos+1,lastBracketPos), ",");
367 while (tokenizer.hasMoreTokens())
368 {
369 cols.add(tokenizer.nextToken().trim());
370 }
371 columnNames = new String[cols.size()];
372 cols.copyInto(columnNames);
373
374 int valuesPos = upperSql.indexOf("VALUES");
375 String endStatement = sql.substring(valuesPos+6).trim();
376 bracketPos = endStatement.indexOf("(");
377 lastBracketPos = endStatement.lastIndexOf(")");
378 Vector values = new Vector();
379 StringTokenizer tokenizer2 = new StringTokenizer(endStatement.substring(bracketPos+1,lastBracketPos), ",");
380 while (tokenizer2.hasMoreTokens())
381 {
382 String value = tokenizer2.nextToken().trim();
383 if( value.indexOf("'") != -1 )
384 values.add( value.substring( value.indexOf("'")+1 ,value.lastIndexOf("'") ) );
385 else
386 values.add( value );
387 }
388 columnValues = new String[values.size()];
389 values.copyInto(columnValues);
390
391 }
392 }
393 else {
394 if (upperSql.lastIndexOf(" FROM ") == -1)
395 {
396 throw new Exception("Malformed SQL. Missing FROM statement.");
397 }
398
399 sqlType=SELECT;
400 int fromPos = upperSql.lastIndexOf(" FROM ");
401 int wherePos=upperSql.lastIndexOf(" WHERE ");
402 if(wherePos==-1)
403 tableName = sql.substring(fromPos + 6).trim().toUpperCase();
404 else
405 tableName = sql.substring(fromPos + 6, wherePos).trim().toUpperCase();
406
407 if( upperSql.indexOf("*") == -1 ) {
408 Vector cols = new Vector();
409 StringTokenizer tokenizer = new StringTokenizer(upperSql.substring(7, fromPos), ",");
410
411 while (tokenizer.hasMoreTokens())
412 {
413 cols.add(tokenizer.nextToken().trim());
414 }
415
416 columnNames = new String[cols.size()];
417 cols.copyInto(columnNames);
418 } else {
419 columnNames = (String[])(new XmlWriter( this.fileName ).getTableProperties( this.tableName ).get(0));
420 }
421 if(wherePos!=-1)
422 {
423 String strWhere=sql.substring(wherePos+7);
424 Vector whereCols = new Vector();
425 Vector whereValues = new Vector();
426 StringTokenizer tokenizerWhere = new StringTokenizer(strWhere, ",");
427
428 while (tokenizerWhere.hasMoreTokens())
429 {
430 String strToken = tokenizerWhere.nextToken();
431 if(strToken.toUpperCase().indexOf(" AND ")!=-1) {
432 String temp=strToken;
433 int andPos=0;
434 out:
435 do
436 {
437 andPos = temp.toUpperCase().indexOf(" AND ");
438 String strTokenAdd;
439 if(andPos!=-1)
440 strTokenAdd = temp.substring(0,andPos).trim();
441 else
442 strTokenAdd = temp.trim();
443 int delimiter2 = strTokenAdd.indexOf("=");
444 if(delimiter2!=-1) {
445 String valueAdd = strTokenAdd.substring(delimiter2+1).trim();
446 if((valueAdd.indexOf("'")!=-1) ||(valueAdd.indexOf("\"")!=-1))
447 valueAdd=valueAdd.trim().substring(1,valueAdd.trim().length()-1);
448 whereCols.add(strTokenAdd.substring(0,delimiter2).trim().toUpperCase());
449 whereValues.add(valueAdd);
450 }
451 else {
452 int delimiter3 = strTokenAdd.toUpperCase().indexOf(" is ");
453 whereCols.add(strTokenAdd.substring(0,delimiter3).trim().toUpperCase());
454 whereValues.add(null);
455 }
456 temp=temp.substring(andPos+5);
457 if(temp.toUpperCase().indexOf(" AND ")==-1) {
458 strTokenAdd = temp.trim();
459 int delimiter4 = strTokenAdd.indexOf("=");
460 if(delimiter4!=-1) {
461 String valueAdd = strTokenAdd.substring(delimiter4+1).trim();
462 if((valueAdd.indexOf("'")!=-1) ||(valueAdd.indexOf("\"")!=-1))
463 valueAdd=valueAdd.trim().substring(1,valueAdd.trim().length()-1);
464 whereCols.add(strTokenAdd.substring(0,delimiter4).trim().toUpperCase());
465 whereValues.add(valueAdd);
466 }
467 else {
468 int delimiter3 = strTokenAdd.toUpperCase().indexOf(" is ");
469 whereCols.add(strTokenAdd.substring(0,delimiter3).trim().toUpperCase());
470 whereValues.add(null);
471 }
472 break out;
473 }
474
475
476 }while(true);
477
478 }
479 else {
480 int delimiter = strToken.indexOf("=");
481 if(delimiter!=-1) {
482 String value = strToken.substring(delimiter+1).trim();
483 if((value.indexOf("'")!=-1) ||(value.indexOf("\"")!=-1))
484 value=value.trim().substring(1,value.trim().length()-1);
485 whereCols.add(strToken.substring(0,delimiter).trim().toUpperCase());
486 whereValues.add(value);
487 }
488 else {
489 int delimiter1 = strToken.toUpperCase().indexOf(" IS ");
490 whereCols.add(strToken.substring(0,delimiter1).trim().toUpperCase());
491 whereValues.add(null);
492 }
493 }
494 }
495 columnWhereNames = new String[whereCols.size()];
496 columnWhereValues = new String[whereValues.size()];
497 whereCols.copyInto(columnWhereNames);
498 whereValues.copyInto(columnWhereValues);
499
500
501 }
502 }
503 } else {
504 //delete start
505 sqlType=DELETE;
506 int deletePos = upperSql.indexOf("DELETE");
507 int wherePos = upperSql.indexOf(" WHERE ");
508 int fromPos = upperSql.lastIndexOf(" FROM ");
509 if(wherePos==-1)
510 tableName = sql.substring(fromPos + 6).trim().toUpperCase();
511 else
512 tableName = sql.substring(fromPos + 6, wherePos).trim().toUpperCase();
513
514 if(wherePos!=-1)
515 {
516 String strWhere=sql.substring(wherePos+6).trim();
517 Vector whereCols = new Vector();
518 Vector whereValues = new Vector();
519 StringTokenizer tokenizerWhere = new StringTokenizer(strWhere, ",");
520
521 while (tokenizerWhere.hasMoreTokens())
522 {
523 String strToken = tokenizerWhere.nextToken();
524 if(strToken.toUpperCase().indexOf(" AND ")!=-1) {
525 String temp=strToken;
526 int andPos=0;
527 out:
528 do
529 {
530 andPos = temp.toUpperCase().indexOf(" AND ");
531 String strTokenAdd;
532 if(andPos!=-1)
533 strTokenAdd = temp.substring(0,andPos).trim();
534 else
535 strTokenAdd = temp.trim();
536 int delimiter2 = strTokenAdd.indexOf("=");
537 if(delimiter2!=-1) {
538 String valueAdd = strTokenAdd.substring(delimiter2+1).trim();
539 if((valueAdd.indexOf("'")!=-1) ||(valueAdd.indexOf("\"")!=-1))
540 valueAdd=valueAdd.trim().substring(1,valueAdd.trim().length()-1);
541 whereCols.add(strTokenAdd.substring(0,delimiter2).trim().toUpperCase());
542 whereValues.add(valueAdd);
543 }
544 else {
545 int delimiter3 = strTokenAdd.toUpperCase().indexOf(" is ");
546 whereCols.add(strTokenAdd.substring(0,delimiter3).trim().toUpperCase());
547 whereValues.add(null);
548 }
549 temp=temp.substring(andPos+5);
550 if(temp.toUpperCase().indexOf(" AND ")==-1) {
551 strTokenAdd = temp.trim();
552 int delimiter4 = strTokenAdd.indexOf("=");
553 if(delimiter4!=-1) {
554 String valueAdd = strTokenAdd.substring(delimiter4+1).trim();
555 if((valueAdd.indexOf("'")!=-1) ||(valueAdd.indexOf("\"")!=-1))
556 valueAdd=valueAdd.trim().substring(1,valueAdd.trim().length()-1);
557 whereCols.add(strTokenAdd.substring(0,delimiter4).trim().toUpperCase());
558 whereValues.add(valueAdd);
559 }
560 else {
561 int delimiter3 = strTokenAdd.toUpperCase().indexOf(" is ");
562 whereCols.add(strTokenAdd.substring(0,delimiter3).trim().toUpperCase());
563 whereValues.add(null);
564 }
565 break out;
566 }
567
568
569 } while(true);
570
571 }
572 else {
573 int delimiter = strToken.indexOf("=");
574 if(delimiter!=-1) {
575 String value = strToken.substring(delimiter+1).trim();
576 if((value.indexOf("'")!=-1) ||(value.indexOf("\"")!=-1))
577 value=value.trim().substring(1,value.trim().length()-1);
578 whereCols.add(strToken.substring(0,delimiter).trim().toUpperCase());
579 whereValues.add(value);
580 }
581 else {
582 int delimiter1 = strToken.toUpperCase().indexOf(" IS ");
583 whereCols.add(strToken.substring(0,delimiter1).trim().toUpperCase());
584 whereValues.add(null);
585 }
586 }
587 }
588 columnWhereNames = new String[whereCols.size()];
589 columnWhereValues = new String[whereValues.size()];
590 whereCols.copyInto(columnWhereNames);
591 whereValues.copyInto(columnWhereValues);
592 }
593 //delete end
594 }
595 } else { //drop table start
596 sqlType=DROP_TABLE;
597 int dropPos = upperSql.indexOf("DROP TABLE");
598 tableName = sql.substring(dropPos + 10).trim().toUpperCase();
599 //drop table end
600 }
601 }
602 }
This page automatically generated by Maven