1 14 package org.compiere.model; 15 16 import java.util.*; 17 import java.sql.*; 18 import java.math.*; 19 20 import org.compiere.util.*; 21 22 29 public class POInfo 30 { 31 37 public static POInfo getPOInfo (Properties ctx, int AD_Table_ID) 38 { 39 Integer key = new Integer (AD_Table_ID); 40 POInfo retValue = (POInfo)s_cache.get(key); 41 if (retValue == null) 42 { 43 retValue = new POInfo(ctx, AD_Table_ID); 44 if (retValue.getColumnCount() > 0) 45 s_cache.put(key, retValue); 46 } 47 return retValue; 48 } 50 51 private static CCache s_cache = new CCache("poInfo", 300); 52 53 54 55 60 private POInfo (Properties ctx, int AD_Table_ID) 61 { 62 m_ctx = ctx; 63 m_AD_Table_ID = AD_Table_ID; 64 loadInfo (); 65 } 67 68 private Properties m_ctx = null; 69 70 private int m_AD_Table_ID = 0; 71 72 private String m_TableName = null; 73 74 private Column[] m_columns = null; 75 76 private Logger log = Logger.getCLogger(getClass()); 77 78 81 private void loadInfo() 82 { 83 ArrayList list = new ArrayList(15); 84 boolean english = Env.isBaseLanguage(m_ctx, "AD_Table"); 85 StringBuffer sql = new StringBuffer (); 86 sql.append("SELECT t.TableName, c.ColumnName,c.AD_Reference_ID," + "c.IsMandatory,c.IsUpdateable,c.DefaultValue," + "e.Name,e.Description, c.AD_Column_ID, " + "c.IsKey,c.IsParent, " + "c.AD_Reference_Value_ID, vr.Code, " + "c.FieldLength, c.ValueMin, c.ValueMax "); sql.append("FROM AD_Table t" 93 + " INNER JOIN AD_Column c ON (t.AD_Table_ID=c.AD_Table_ID)" 94 + " LEFT OUTER JOIN AD_Val_Rule vr ON (c.AD_Val_Rule_ID=vr.AD_Val_Rule_ID)" 95 + " INNER JOIN AD_Element"); 96 if (!english) 97 sql.append("_Trl"); 98 sql.append(" e " 99 + " ON (c.AD_Element_ID=e.AD_Element_ID) " 100 + "WHERE t.AD_Table_ID=?" 101 + " AND c.IsActive='Y'"); 102 if (!english) 103 sql.append(" AND e.AD_Language='").append(Env.getAD_Language(m_ctx)).append("'"); 104 try 106 { 107 PreparedStatement pstmt = DB.prepareStatement(sql.toString()); 108 pstmt.setInt(1, m_AD_Table_ID); 109 ResultSet rs = pstmt.executeQuery(); 110 while (rs.next()) 111 { 112 if (m_TableName == null) 113 m_TableName = rs.getString(1); 114 String ColumnName = rs.getString(2); 115 int AD_Reference_ID = rs.getInt(3); 116 boolean IsMandatory = "Y".equals(rs.getString(4)); 117 boolean IsUpdateable = "Y".equals(rs.getString(5)); 118 String DefaultLogic = rs.getString(6); 119 String Name = rs.getString(7); 120 String Description = rs.getString(8); 121 int AD_Column_ID = rs.getInt(9); 122 boolean IsKey = "Y".equals(rs.getString(10)); 123 boolean IsParent = "Y".equals(rs.getString(11)); 124 int AD_Reference_Value_ID = rs.getInt(12); 125 String ValidationCode = rs.getString(13); 126 int FieldLength = rs.getInt(14); 127 String ValueMin = rs.getString(15); 128 String ValueMax = rs.getString(16); 129 130 Column col = new Column ( 131 AD_Column_ID, ColumnName, AD_Reference_ID, 132 IsMandatory, IsUpdateable, 133 DefaultLogic, Name, Description, 134 IsKey, IsParent, 135 AD_Reference_Value_ID, ValidationCode, 136 FieldLength, ValueMin, ValueMax); 137 list.add(col); 138 } 139 rs.close(); 140 pstmt.close(); 141 } 142 catch (SQLException e) 143 { 144 log.error("POInfo.loadInfo - " + sql.toString(), e); 145 } 146 m_columns = new Column[list.size()]; 148 list.toArray(m_columns); 149 } 151 155 public String toString() 156 { 157 return "POInfo[" + getTableName() + ",AD_Table_ID=" + getAD_Table_ID() + "]"; 158 } 160 165 public String toString (int index) 166 { 167 if (index < 0 || index >= m_columns.length) 168 return "POInfo[" + getTableName() + "-InvalidIndex]"; 169 return "POInfo[" + getTableName() + "-" + m_columns[index].toString() + "]"; 170 } 172 176 public String getTableName() 177 { 178 return m_TableName; 179 } 181 185 public int getAD_Table_ID() 186 { 187 return m_AD_Table_ID; 188 } 190 191 192 196 public int getColumnCount() 197 { 198 return m_columns.length; 199 } 201 206 public int getColumnIndex (String ColumnName) 207 { 208 for (int i = 0; i < m_columns.length; i++) 209 { 210 if (ColumnName.equals(m_columns[i].ColumnName)) 211 return i; 212 } 213 return -1; 214 } 216 221 public String getColumnName (int index) 222 { 223 if (index < 0 || index >= m_columns.length) 224 return null; 225 return m_columns[index].ColumnName; 226 } 228 233 public String getColumnLabel (int index) 234 { 235 if (index < 0 || index >= m_columns.length) 236 return null; 237 return m_columns[index].ColumnLabel; 238 } 240 245 public String getColumnDescription (int index) 246 { 247 if (index < 0 || index >= m_columns.length) 248 return null; 249 return m_columns[index].ColumnDescription; 250 } 252 257 public Class getColumnClass (int index) 258 { 259 if (index < 0 || index >= m_columns.length) 260 return null; 261 return m_columns[index].ColumnClass; 262 } 264 269 public int getColumnDisplayType (int index) 270 { 271 if (index < 0 || index >= m_columns.length) 272 return DisplayType.String; 273 return m_columns[index].DisplayType; 274 } 276 281 public String getDefaultLogic (int index) 282 { 283 if (index < 0 || index >= m_columns.length) 284 return null; 285 return m_columns[index].DefaultLogic; 286 } 288 293 public boolean isColumnMandatory (int index) 294 { 295 if (index < 0 || index >= m_columns.length) 296 return false; 297 return m_columns[index].IsMandatory; 298 } 300 305 public boolean isColumnUpdateable (int index) 306 { 307 if (index < 0 || index >= m_columns.length) 308 return false; 309 return m_columns[index].IsUpdateable; 310 } 312 317 public void setColumnUpdateable (int index, boolean updateable) 318 { 319 if (index < 0 || index >= m_columns.length) 320 return; 321 m_columns[index].IsUpdateable = updateable; 322 } 324 328 public void setUpdateable (boolean updateable) 329 { 330 for (int i = 0; i < m_columns.length; i++) 331 m_columns[i].IsUpdateable = updateable; 332 } 334 339 public boolean isColumnLookup (int index) 340 { 341 if (index < 0 || index >= m_columns.length) 342 return false; 343 return DisplayType.isLookup(m_columns[index].DisplayType); 344 } 346 351 public Lookup getColumnLookup (int index) 352 { 353 if (!isColumnLookup(index)) 354 return null; 355 int WindowNo = 0; 357 Lookup lookup = null; 359 try 360 { 361 lookup = MLookupFactory.get (m_ctx, WindowNo, 362 m_columns[index].AD_Column_ID, m_columns[index].DisplayType, 363 Env.getLanguage(m_ctx), m_columns[index].ColumnName, 364 m_columns[index].AD_Reference_Value_ID, 365 m_columns[index].IsParent, m_columns[index].ValidationCode); 366 } 367 catch (Exception e) 368 { 369 lookup = null; } 371 return lookup; 372 373 } 375 380 public boolean isColumnKey (int index) 381 { 382 if (index < 0 || index >= m_columns.length) 383 return false; 384 return m_columns[index].IsKey; 385 } 387 392 public boolean isColumnParent (int index) 393 { 394 if (index < 0 || index >= m_columns.length) 395 return false; 396 return m_columns[index].IsParent; 397 } 399 404 public int getFieldLength (int index) 405 { 406 if (index < 0 || index >= m_columns.length) 407 return 0; 408 return m_columns[index].FieldLength; 409 } 411 417 public String validate (int index, Object value) 418 { 419 if (index < 0 || index >= m_columns.length) 420 return "RangeError"; 421 if (m_columns[index].IsMandatory && value == null) 423 { 424 return "IsMandatory"; 425 } 426 428 if (m_columns[index].ValueMin != null) 430 { 431 BigDecimal value_BD = null; 432 try 433 { 434 if (m_columns[index].ValueMin_BD != null) 435 value_BD = new BigDecimal(value.toString()); 436 } 437 catch (Exception ex){} 438 if (m_columns[index].ValueMin_BD != null && value_BD != null) 440 { int comp = m_columns[index].ValueMin_BD.compareTo(value_BD); 442 if (comp > 0) 443 { 444 return "MinValue=" + m_columns[index].ValueMin_BD + "(" + m_columns[index].ValueMin + ")" 445 + " - compared with Numeric Value=" + value_BD + "(" + value + ")" 446 + " - results in " + comp; 447 } 448 } 449 else { 451 int comp = m_columns[index].ValueMin.compareTo(value); 452 if (comp > 0) 453 { 454 return "MinValue=" + m_columns[index].ValueMin 455 + " - compared with String Value=" + value 456 + " - results in " + comp; 457 } 458 } 459 } 460 if (m_columns[index].ValueMax != null) 461 { 462 BigDecimal value_BD = null; 463 try 464 { 465 if (m_columns[index].ValueMax_BD != null) 466 value_BD = new BigDecimal(value.toString()); 467 } 468 catch (Exception ex){} 469 if (m_columns[index].ValueMax_BD != null && value_BD != null) 471 { int comp = m_columns[index].ValueMax_BD.compareTo(value_BD); 473 if (comp < 0) 474 { 475 return "MaxValue=" + m_columns[index].ValueMax_BD + "(" + m_columns[index].ValueMax + ")" 476 + " - compared with Numeric Value=" + value_BD + "(" + value + ")" 477 + " - results in " + comp; 478 } 479 } 480 else { 482 int comp = m_columns[index].ValueMax.compareTo(value); 483 if (comp < 0) 484 { 485 return "MaxValue=" + m_columns[index].ValueMax 486 + " - compared with String Value=" + value 487 + " - results in " + comp; 488 } 489 } 490 } 491 return null; 492 } 494 495 496 499 class Column 500 { 501 519 Column (int ad_Column_ID, String columnName, int displayType, 520 boolean isMandatory, boolean isUpdateable, String defaultLogic, 521 String columnLabel, String columnDescription, 522 boolean isKey, boolean isParent, 523 int ad_Reference_Value_ID, String validationCode, 524 int fieldLength, String valueMin, String valueMax) 525 { 526 AD_Column_ID = ad_Column_ID; 527 ColumnName = columnName; 528 DisplayType = displayType; 529 if (columnName.equals("AD_Language")) 530 { 531 DisplayType = org.compiere.util.DisplayType.String; 532 ColumnClass = String .class; 533 } 534 else if (columnName.equals("Posted")) 535 { 536 ColumnClass = Boolean .class; 537 } 538 else if (columnName.equals("Record_ID")) 539 { 540 DisplayType = org.compiere.util.DisplayType.ID; 541 ColumnClass = Integer .class; 542 } 543 else 544 ColumnClass = org.compiere.util.DisplayType.getClass(displayType, true); 545 IsMandatory = isMandatory; 546 IsUpdateable = isUpdateable; 547 DefaultLogic = defaultLogic; 548 ColumnLabel = columnLabel; 549 ColumnDescription = columnDescription; 550 IsKey = isKey; 551 IsParent = isParent; 552 AD_Reference_Value_ID = ad_Reference_Value_ID; 554 ValidationCode = validationCode; 555 FieldLength = fieldLength; 557 ValueMin = valueMin; 558 try 559 { 560 if (valueMin != null && valueMin.length() > 0) 561 ValueMin_BD = new BigDecimal(valueMin); 562 } 563 catch (Exception ex) 564 { 565 log.error("Column - ValueMin=" + valueMin, ex); 566 } 567 ValueMax = valueMax; 568 try 569 { 570 if (valueMax != null && valueMax.length() > 0) 571 ValueMax_BD = new BigDecimal(valueMax); 572 } 573 catch (Exception ex) 574 { 575 log.error("Column - ValueMax=" + valueMax, ex); 576 } 577 } 579 public int AD_Column_ID; 580 public String ColumnName; 581 public int DisplayType; 582 public Class ColumnClass; 583 public boolean IsMandatory; 584 public String DefaultLogic; 585 public boolean IsUpdateable; 586 public String ColumnLabel; 587 public String ColumnDescription; 588 public boolean IsKey; 589 public boolean IsParent; 590 public int AD_Reference_Value_ID; 592 public String ValidationCode; 593 public int FieldLength; 595 public String ValueMin; 596 public String ValueMax; 597 public BigDecimal ValueMin_BD = null; 598 public BigDecimal ValueMax_BD = null; 599 600 604 public String toString() 605 { 606 StringBuffer sb = new StringBuffer ("POInfo.Column["); 607 sb.append(ColumnName).append(",ID=").append(AD_Column_ID) 608 .append(",DisplayType=").append(DisplayType) 609 .append(",ColumnClass=").append(ColumnClass); 610 sb.append("]"); 611 return sb.toString(); 612 } } } | Popular Tags |