1 14 package org.compiere.model; 15 16 import java.util.*; 17 18 import org.compiere.util.*; 19 20 26 public class AccessSqlParser 27 { 28 32 public AccessSqlParser () 33 { 34 } 36 40 public AccessSqlParser (String sql) 41 { 42 setSql(sql); 43 } 45 46 private static final String FROM = " FROM "; 47 private static final int FROM_LENGTH = FROM.length(); 48 private static final String WHERE = " WHERE "; 49 private static final String ON = " ON "; 50 51 52 private Logger log = Logger.getCLogger(getClass()); 53 54 private String m_sqlOriginal; 55 56 private String [] m_sql; 57 58 private ArrayList m_tableInfo = new ArrayList(); 59 60 64 public void setSql (String sql) 65 { 66 if (sql == null) 67 throw new IllegalArgumentException ("AccessSqlParser - no SQL"); 68 m_sqlOriginal = sql; 69 parse(); 71 } 73 77 public String getSql() 78 { 79 return m_sqlOriginal; 80 } 82 86 public boolean parse() 87 { 88 if (m_sqlOriginal == null || m_sqlOriginal.length() == 0) 89 throw new IllegalArgumentException ("AccessSqlParser - no SQL"); 90 getSelectStatements(); 94 for (int i = 0; i < m_sql.length; i++) 96 { 97 TableInfo[] info = getTableInfo(m_sql[i].trim()); 98 m_tableInfo.add(info); 99 } 100 if (Log.isTraceLevel(10)) 102 log.debug(toString()); 103 return m_tableInfo.size() > 0; 104 } 106 109 private void getSelectStatements() 110 { 111 String [] sqlIn = new String [] {m_sqlOriginal}; 112 String [] sqlOut = getSubSQL (sqlIn); 113 while (sqlIn.length != sqlOut.length) 115 { 116 sqlIn = sqlOut; 117 sqlOut = getSubSQL (sqlIn); 118 } 119 m_sql = sqlOut; 120 129 } 131 136 private String [] getSubSQL (String [] sqlIn) 137 { 138 ArrayList list = new ArrayList(); 139 for (int sqlIndex = 0; sqlIndex < sqlIn.length; sqlIndex++) 140 { 141 String sql = sqlIn[sqlIndex]; 142 int index = sql.indexOf("(SELECT ", 7); 143 while (index != -1) 144 { 145 int endIndex = index+1; 146 int parenthesisLevel = 0; 147 while (endIndex++ < sql.length()) 149 { 150 char c = sql.charAt(endIndex); 151 if (c == ')') 152 { 153 if (parenthesisLevel == 0) 154 break; 155 else 156 parenthesisLevel--; 157 } 158 else if (c == '(') 159 parenthesisLevel++; 160 } 161 String subSQL = sql.substring(index, endIndex+1); 162 list.add(subSQL); 163 sql = sql.substring(0,index+1) + "##" 165 + sql.substring(endIndex); 166 index = sql.indexOf("(SELECT ", 7); 167 } 168 list.add(sql); } 170 String [] retValue = new String [list.size()]; 171 list.toArray(retValue); 172 return retValue; 173 } 175 180 private TableInfo[] getTableInfo (String sql) 181 { 182 ArrayList list = new ArrayList(); 183 if (sql.startsWith("(") && sql.endsWith(")")) 185 sql = sql.substring(1,sql.length()-1); 186 187 int fromIndex = sql.indexOf(FROM); 188 if (fromIndex != sql.lastIndexOf(FROM)) 189 log.error("getTableInfo - More than one FROM clause - " + sql); 190 while (fromIndex != -1) 191 { 192 String from = sql.substring(fromIndex+FROM_LENGTH); 193 int index = from.lastIndexOf(WHERE); if (index != -1) 195 from = from.substring(0, index); 196 from = Util.replace(from, " AS ", " "); 197 from = Util.replace(from, " as ", " "); 198 from = Util.replace(from, " INNER JOIN ", ", "); 199 from = Util.replace(from, " LEFT OUTER JOIN ", ", "); 200 from = Util.replace(from, " RIGHT OUTER JOIN ", ", "); 201 index = from.indexOf(ON); 203 while (index != -1) 204 { 205 int indexClose = from.indexOf(')'); 206 if (indexClose != -1) 207 from = from.substring(0, index) + from.substring(indexClose+1); 208 else 209 { 210 log.error("parse - could not remove ON " + from); 211 break; 212 } 213 index = from.indexOf(ON); 214 } 215 216 StringTokenizer tableST = new StringTokenizer (from, ","); 218 while (tableST.hasMoreTokens()) 219 { 220 String tableString = tableST.nextToken().trim(); 221 StringTokenizer synST = new StringTokenizer (tableString, " "); 222 TableInfo tableInfo = null; 223 if (synST.countTokens() > 1) 224 tableInfo = new TableInfo(synST.nextToken(), synST.nextToken()); 225 else 226 tableInfo = new TableInfo(tableString); 227 list.add(tableInfo); 229 } 230 sql = sql.substring(0, fromIndex); 232 fromIndex = sql.lastIndexOf(FROM); 233 } 234 TableInfo[] retValue = new TableInfo[list.size()]; 235 list.toArray(retValue); 236 return retValue; 237 } 239 240 244 public String toString() 245 { 246 StringBuffer sb = new StringBuffer ("AccessSqlParser["); 247 if (m_tableInfo == null) 248 sb.append(m_sqlOriginal); 249 else 250 { 251 for (int i = 0; i < m_tableInfo.size(); i++) 252 { 253 if (i > 0) 254 sb.append("|"); 255 TableInfo[] info = (TableInfo[])m_tableInfo.get(i); 256 for (int ii = 0; ii < info.length; ii++) 257 { 258 if (ii > 0) 259 sb.append(","); 260 sb.append(info[ii].toString()); 261 } 262 } 263 } 264 sb.append("|").append(getMainSqlIndex()); 265 sb.append("]"); 266 return sb.toString(); 267 } 269 273 public TableInfo[] getTableInfo (int index) 274 { 275 if (index < 0 || index > m_tableInfo.size()) 276 return null; 277 TableInfo[] retValue = (TableInfo[])m_tableInfo.get(index); 278 return retValue; 279 } 281 285 public String getSqlStatement (int index) 286 { 287 if (index < 0 || index > m_sql.length) 288 return null; 289 return m_sql[index]; 290 } 292 296 public int getNoSqlStatments() 297 { 298 if (m_sql == null) 299 return 0; 300 return m_sql.length; 301 } 303 307 public int getMainSqlIndex() 308 { 309 if (m_sql == null) 310 return -1; 311 else if (m_sql.length == 1) 312 return 0; 313 for (int i = m_sql.length-1; i >= 0; i--) 314 { 315 if (m_sql[i].charAt(0) != '(') 316 return i; 317 } 318 return -1; 319 } 321 325 public String getMainSql() 326 { 327 if (m_sql == null) 328 return m_sqlOriginal; 329 330 if (m_sql.length == 1) 331 return m_sql[0]; 332 for (int i = m_sql.length-1; i >= 0; i--) 333 { 334 if (m_sql[i].charAt(0) != '(') 335 return m_sql[i]; 336 } 337 return ""; 338 } 340 343 public class TableInfo 344 { 345 350 public TableInfo (String tableName, String synonym) 351 { 352 m_tableName = tableName; 353 m_synonym = synonym; 354 } 356 360 public TableInfo (String tableName) 361 { 362 this (tableName, null); 363 } 365 private String m_tableName; 366 private String m_synonym; 367 368 372 public String getSynonym() 373 { 374 if (m_synonym == null) 375 return ""; 376 return m_synonym; 377 } 379 383 public String getTableName() 384 { 385 return m_tableName; 386 } 388 392 public String toString() 393 { 394 StringBuffer sb = new StringBuffer (m_tableName); 395 if (getSynonym().length() > 0) 396 sb.append("=").append(m_synonym); 397 return sb.toString(); 398 } 400 } 402 }
| Popular Tags
|