1 14 package org.compiere.util; 15 16 import java.sql.*; 17 import java.io.*; 18 import java.math.*; 19 20 27 public class GenerateModel 28 { 29 34 public GenerateModel (int AD_Table_ID, String directory) 35 { 36 StringBuffer mandatory = new StringBuffer (); 38 StringBuffer sb = createColumns(AD_Table_ID, mandatory); 39 String tableName = createHeader(AD_Table_ID, sb, mandatory); 41 writeToFile (sb, directory + tableName + ".java"); 43 } 45 52 private String createHeader (int AD_Table_ID, StringBuffer sb, StringBuffer mandatory) 53 { 54 String tableName = ""; 55 String sql = "SELECT TableName FROM AD_Table WHERE AD_Table_ID=?"; 56 PreparedStatement pstmt = null; 57 try 58 { 59 pstmt = DB.prepareStatement(sql); 60 pstmt.setInt(1, AD_Table_ID); 61 ResultSet rs = pstmt.executeQuery(); 62 if (rs.next()) 63 tableName = rs.getString(1); 64 rs.close(); 65 pstmt.close(); 66 pstmt = null; 67 } 68 catch (Exception e) 69 { 70 Log.error("GenerateModel.createHeader", e); 71 } 72 finally 73 { 74 try 75 { 76 if (pstmt != null) 77 pstmt.close (); 78 } 79 catch (Exception e) 80 {} 81 pstmt = null; 82 } 83 if (tableName == null) 84 throw new RuntimeException ("TableName not found for ID=" + AD_Table_ID); 85 String keyColumn = tableName + "_ID"; 87 String className = "X_" + tableName; 88 StringBuffer start = new StringBuffer () 90 .append ( 91 "/** Generated Model - DO NOT CHANGE - Copyright (C) 1999-2003 Jorg Janke **/\n" 92 + "package org.compiere.model;" 93 + "import java.util.*;" 94 + "import java.sql.*;" 95 + "import java.math.*;" 96 + "import java.io.Serializable;" 97 + "import org.compiere.util.*;" 98 + "/** Generated Model for ").append(tableName).append("\n" 100 + " ** @version $Id: GenerateModel.java,v 1.9 2003/10/31 05:30:56 jjanke Exp $ **/\n" 101 + "public class ").append(className).append(" extends PO" 102 + "{" 103 + "/** Standard Constructor **/\n" 105 + "public ").append(className).append(" (Properties ctx, int ").append(keyColumn).append(")" 106 + "{" 107 + "super (ctx, ").append(keyColumn).append(");" 108 + "/** if (").append(keyColumn).append(" == 0)" 109 + "{").append(mandatory).append("} **/\n" 110 + "}" + "/** Load Constructor **/\n" 113 + "public ").append(className).append(" (Properties ctx, ResultSet rs)" 114 + "{" 115 + "super (ctx, rs);" 116 + "}" + "/** Load Meta Data **/\n" 119 + "protected POInfo initPO (Properties ctx)" 120 + "{" 121 + "int AD_Table_ID = ").append(AD_Table_ID).append(";" 122 + "POInfo poi = POInfo.getPOInfo (ctx, AD_Table_ID);" 123 + "return poi;" 124 + "}" + "public String toString()" 127 + "{" 128 + "StringBuffer sb = new StringBuffer (\"").append(className).append("[\")" 129 + ".append(getID()).append(\"]\");" 130 + "return sb.toString();" 131 + "}"); 132 133 StringBuffer end = new StringBuffer ("}"); 134 sb.insert(0, start); 136 sb.append(end); 137 138 return className; 139 } 141 142 148 private StringBuffer createColumns (int AD_Table_ID, StringBuffer mandatory) 149 { 150 StringBuffer sb = new StringBuffer (); 151 String sql = "SELECT c.ColumnName, c.IsUpdateable, c.IsMandatory," 152 + " c.AD_Reference_ID, c.AD_Reference_Value_ID " 153 + "FROM AD_Column c " 154 + "WHERE c.AD_Table_ID=?" 155 + " AND c.ColumnName <> 'AD_Client_ID'" 156 + " AND c.ColumnName <> 'AD_Org_ID'" 157 + " AND c.ColumnName <> 'IsActive'" 158 + " AND c.ColumnName NOT LIKE 'Created%'" 159 + " AND c.ColumnName NOT LIKE 'Updated%' " 160 + "ORDER BY c.ColumnName"; 161 PreparedStatement pstmt = null; 162 try 163 { 164 pstmt = DB.prepareStatement(sql); 165 pstmt.setInt(1, AD_Table_ID); 166 ResultSet rs = pstmt.executeQuery(); 167 while (rs.next()) 168 { 169 String columnName = rs.getString(1); 170 boolean isUpdateable = "Y".equals(rs.getString(2)); 171 boolean isMandatory = "Y".equals(rs.getString(3)); 172 int displayType = rs.getInt(4); 173 int AD_Reference_Value_ID = rs.getInt(5); 174 sb.append(createMethods (mandatory, 176 columnName, isUpdateable, isMandatory, displayType, AD_Reference_Value_ID)); 177 } 178 rs.close(); 179 pstmt.close(); 180 pstmt = null; 181 } 182 catch (Exception e) 183 { 184 Log.error("GenerateModel.createColumns", e); 185 } 186 finally 187 { 188 try 189 { 190 if (pstmt != null) 191 pstmt.close (); 192 } 193 catch (Exception e) 194 {} 195 pstmt = null; 196 } 197 return sb; 198 } 200 210 private String createMethods (StringBuffer mandatory, 211 String columnName, boolean isUpdateable, boolean isMandatory, 212 int displayType, int AD_Reference_ID) 213 { 214 Class clazz = DisplayType.getClass(displayType, true); 215 if (columnName.equalsIgnoreCase("Posted")) 217 { 218 clazz = Boolean .class; 219 AD_Reference_ID = 0; 220 } 221 else if (columnName.equalsIgnoreCase("Record_ID")) 223 { 224 clazz = Integer .class; 225 AD_Reference_ID = 0; 226 } 227 else if (DisplayType.isID(displayType) && !((columnName.endsWith("_ID") || columnName.endsWith("No")))) 230 clazz = String .class; 231 232 String dataType = clazz.getName(); 234 dataType = dataType.substring(dataType.lastIndexOf('.')+1); 235 if (dataType.equals("Boolean")) 236 dataType = "boolean"; 237 else if (dataType.equals("Integer")) 238 dataType = "int"; 239 240 StringBuffer sb = new StringBuffer (); 241 242 String setValue = "setValue"; 244 if (isUpdateable) 246 sb.append("public "); 247 else 248 setValue = "setValueNoCheck"; 249 sb.append("void set").append(columnName).append(" (").append(dataType).append(" ").append(columnName).append(")" 250 + "{"); 251 if (AD_Reference_ID != 0) 253 { 254 String staticVar = addListValidation (sb, AD_Reference_ID, columnName); 255 sb.insert(0, staticVar); 256 } 257 if (clazz.equals(Integer .class)) 259 { 260 if (columnName.endsWith("_ID") && !isMandatory) sb.append("if (").append (columnName).append (" == 0) ") 262 .append(setValue).append(" (\"").append(columnName).append("\", null); else \n"); 263 sb.append(setValue).append(" (\"").append(columnName).append("\", new Integer(").append(columnName).append("));"); 264 } 265 else if (clazz.equals(Boolean .class)) 266 sb.append(setValue).append(" (\"").append(columnName).append("\", new Boolean(").append(columnName).append("));"); 267 else 268 { 269 if (isMandatory) sb.append ("if (").append (columnName).append (" == null)" 271 + " throw new IllegalArgumentException (\"").append(columnName).append(" is mandatory\");"); 272 sb.append (setValue).append(" (\"").append (columnName).append ("\", ") 274 .append (columnName).append (");"); 275 } 276 sb.append("}"); 277 278 if (isMandatory) 280 { 281 mandatory.append("set").append(columnName).append(" ("); 282 if (clazz.equals(Integer .class)) 283 mandatory.append("0"); 284 else if (clazz.equals(Boolean .class)) 285 mandatory.append("false"); 286 else if (clazz.equals(BigDecimal.class)) 287 mandatory.append("Env.ZERO"); 288 else if (clazz.equals(Timestamp.class)) 289 mandatory.append("new Timestamp(System.currentTimeMillis())"); 290 else 291 mandatory.append("null"); 292 mandatory.append(");"); 293 } 294 295 sb.append("public ").append(dataType); 297 if (clazz.equals(Boolean .class)) 298 { 299 sb.append(" is"); 300 if (columnName.toLowerCase().startsWith("is")) 301 sb.append(columnName.substring(2)); 302 else 303 sb.append(columnName); 304 } 305 else 306 sb.append(" get").append(columnName); 307 sb.append("() {"); 308 if (clazz.equals(Integer .class)) 309 sb.append("Integer ii = (Integer)getValue(\"").append(columnName).append("\");" 310 + "if (ii == null)" 311 + " return 0;" 312 + "return ii.intValue();"); 313 else if (clazz.equals(BigDecimal.class)) 314 sb.append("BigDecimal bd = (BigDecimal)getValue(\"").append(columnName).append("\");" 315 + "if (bd == null)" 316 + " return Env.ZERO;" 317 + "return bd;"); 318 else if (clazz.equals(Boolean .class)) 319 sb.append("Boolean bb = (Boolean)getValue(\"").append(columnName).append("\");" 320 + "if (bb != null)" 321 + " return bb.booleanValue();" 322 + "return false;"); 323 else if (dataType.equals("Object")) 324 sb.append("return getValue(\"").append(columnName).append("\");"); 325 else 326 sb.append("return (").append(dataType).append(")getValue(\"").append(columnName).append("\");"); 327 sb.append("}"); 328 return sb.toString(); 330 } 332 339 private String addListValidation (StringBuffer sb, int AD_Reference_ID, String columnName) 340 { 341 StringBuffer retValue = new StringBuffer (); 342 boolean found = false; 344 StringBuffer values = new StringBuffer ("Reference_ID=") 345 .append(AD_Reference_ID); 346 StringBuffer statement = new StringBuffer (); 347 String sql = "SELECT Value, Name FROM AD_Ref_List WHERE AD_Reference_ID=?"; 348 PreparedStatement pstmt = null; 349 try 350 { 351 pstmt = DB.prepareStatement(sql); 352 pstmt.setInt(1, AD_Reference_ID); 353 ResultSet rs = pstmt.executeQuery(); 354 while (rs.next()) 355 { 356 String value = rs.getString(1); 357 values.append(" - ").append(value); 358 if (statement.length() == 0) 359 statement.append("if (").append(columnName).append(".equals(\"").append(value).append("\")"); 360 else 361 statement.append(" || ").append(columnName).append(".equals(\"").append(value).append("\")"); 362 found = true; 363 String name = rs.getString(2); 365 char[] nameArray = name.toCharArray(); 366 StringBuffer nameClean = new StringBuffer (); 367 boolean initCap = true; 368 for (int i = 0; i < nameArray.length; i++) 369 { 370 char c = nameArray[i]; 371 if (Character.isJavaIdentifierPart(c)) 372 { 373 if (initCap) 374 nameClean.append(Character.toUpperCase(c)); 375 else 376 nameClean.append(c); 377 initCap = false; 378 } 379 else 380 { 381 if (c == '+') 382 nameClean.append("Plus"); 383 else if (c == '-') 384 nameClean.append("Minus"); 385 else if (c == '>') 386 nameClean.append("Gt"); 387 else if (c == '<') 388 nameClean.append("Le"); 389 else if (c == '=') 390 nameClean.append("Eq"); 391 else if (c == '~') 392 nameClean.append("Like"); 393 initCap = true; 394 } 395 } 396 retValue.append("public static final String ").append(columnName.toUpperCase()) 397 .append("_").append(nameClean) 398 .append(" = \"").append(value).append("\";"); 399 } 400 rs.close(); 401 pstmt.close(); 402 pstmt = null; 403 } 404 catch (Exception e) 405 { 406 Log.error("GenerateMethod.addListValidation", e); 407 found = false; 408 } 409 finally 410 { 411 try 412 { 413 if (pstmt != null) 414 pstmt.close (); 415 } 416 catch (Exception e) 417 {} 418 pstmt = null; 419 } 420 statement.append(")" 421 + "; " 422 + "else " 423 + "throw new IllegalArgumentException (\"").append(columnName) 424 .append(" Invalid value - ").append(values).append("\");"); 425 if (found) 427 sb.append (statement); 428 return retValue.toString(); 429 } 431 432 433 438 private void writeToFile (StringBuffer sb, String fileName) 439 { 440 boolean wroteCR = false; 441 442 try 443 { 444 File out = new File (fileName); 445 FileWriter fw = new FileWriter (out); 446 for (int i = 0; i < sb.length(); i++) 447 { 448 char c = sb.charAt(i); 449 if (c == ';' || c == '}') 451 { 452 fw.write (c); 453 fw.write(Env.NL); 454 } 455 else if (c == '{') 457 { 458 fw.write(Env.NL); 459 fw.write (c); 460 fw.write(Env.NL); 461 } 462 else 463 fw.write (c); 464 } 465 fw.flush (); 466 fw.close (); 467 float size = out.length(); 468 size /= 1024; 469 Log.trace(Log.l1_User, out.getAbsolutePath() + " - " + size + " kB"); 470 } 471 catch (Exception ex) 472 { 473 Log.error("GenerateModel.writeToFile", ex); 474 } 475 } 477 481 public String toString() 482 { 483 StringBuffer sb = new StringBuffer ("GenerateModel[") 484 .append("]"); 485 return sb.toString(); 486 } 488 489 490 491 492 498 public static void main (String [] args) 499 { 500 String directory = "C:\\Compiere\\compiere-all2\\dbPort\\src\\org\\compiere\\model\\"; 502 if (args.length > 0) 503 directory = args[0]; 504 if (directory == null || directory.length() == 0) 505 { 506 System.err.println("No Directory"); 507 System.exit(1); 508 } 509 510 String entityType = "DC"; if (args.length > 1) 513 entityType = args[1]; 514 if (entityType == null || entityType.length() == 0) 515 { 516 System.err.println("No EntityType"); 517 System.exit(1); 518 } 519 StringBuffer sql = new StringBuffer ("EntityType IN ("); 520 for (int i = 0; i < entityType.length(); i++) 521 { 522 if (i > 0) 523 sql.append(","); 524 sql.append("'").append(entityType.charAt(i)).append("'"); 525 } 526 sql.append(")"); System.out.println("Generate Model to " + directory + " for " + sql); 528 System.out.println("-----------------------------------------------"); 529 530 sql.insert(0, "SELECT AD_Table_ID " 532 + "FROM AD_Table " 533 + "WHERE IsView='N' AND TableName NOT LIKE '%_Trl' AND "); 534 sql.append(" ORDER BY TableName"); 535 536 org.compiere.Compiere.startupClient(); 538 int count = 0; 539 PreparedStatement pstmt = null; 540 try 541 { 542 pstmt = DB.prepareStatement(sql.toString()); 543 ResultSet rs = pstmt.executeQuery(); 544 while (rs.next()) 545 { 546 new GenerateModel(rs.getInt(1), directory); 547 count++; 548 } 549 rs.close(); 550 pstmt.close(); 551 pstmt = null; 552 } 553 catch (Exception e) 554 { 555 System.err.println("GenerateModel.main - " + e); 556 } 557 finally 558 { 559 try 560 { 561 if (pstmt != null) 562 pstmt.close (); 563 } 564 catch (Exception e) 565 {} 566 pstmt = null; 567 } 568 System.out.println("Generated = " + count); 569 570 } 572 } | Popular Tags |