View Javadoc
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