1 14 package org.compiere.model; 15 16 import java.util.*; 17 import java.sql.*; 18 import javax.sql.*; 19 import java.math.*; 20 import java.io.*; 21 22 import oracle.sql.*; 23 import oracle.jdbc.*; 24 25 import org.compiere.util.*; 26 27 34 public abstract class PO implements Serializable, Comparator 35 { 36 40 public PO (Properties ctx) 41 { 42 this (ctx, 0, null); 43 } 45 51 public PO (Properties ctx, int ID) 52 { 53 this (ctx, ID, null); 54 } 56 71 public PO (Properties ctx, ResultSet rs) 72 { 73 this (ctx, 0, rs); 74 } 76 92 public PO (Properties ctx, int ID, ResultSet rs) 93 { 94 p_ctx = ctx; 95 p_info = initPO(ctx); 96 int size = p_info.getColumnCount(); 98 m_oldValues = new Object [size]; 99 m_newValues = new Object [size]; 100 if (rs != null) 101 load(rs); 102 else 103 load(ID); 104 } 106 113 public PO (Properties ctx, PO source, int AD_Client_ID, int AD_Org_ID) 114 { 115 this (ctx, 0, null); if (source != null) 118 copyValues (source, this); 119 setAD_Client_ID(AD_Client_ID); 120 setAD_Org_ID(AD_Org_ID); 121 } 123 124 125 protected Logger log = Logger.getCLogger (getClass()); 126 private static Logger s_log = Logger.getCLogger (PO.class); 127 128 129 protected Properties p_ctx; 130 131 protected POInfo p_info = null; 132 133 134 private Object [] m_oldValues = null; 135 136 private Object [] m_newValues = null; 137 138 139 private Object [] m_IDs = new Object [] {new Integer (0)}; 140 141 private String [] m_KeyColumns = null; 142 143 private boolean m_createNew = false; 144 145 146 private static final Object NULL = new Object (); 147 148 153 abstract protected POInfo initPO (Properties ctx); 154 155 159 public String toString() 160 { 161 StringBuffer sb = new StringBuffer ("PO[") 162 .append(getWhereClause(true)).append("]"); 163 return sb.toString(); 164 } 166 171 public boolean equals (Object cmp) 172 { 173 if (cmp == null) 174 return false; 175 if (cmp.getClass().equals(this.getClass())) 176 return ((PO)cmp).getID() == getID(); 177 return equals(cmp); 178 } 180 186 public int compare (Object o1, Object o2) 187 { 188 if (o1 == null) 189 return -1; 190 else if (o2 == null) 191 return 1; 192 if (!(o1 instanceof PO)) 193 throw new ClassCastException ("Not PO -1- " + o1); 194 if (!(o2 instanceof PO)) 195 throw new ClassCastException ("Not PO -2- " + o2); 196 if (o1.getClass().equals(o2.getClass())) 198 { 199 int index = getColumnIndex("DocumentNo"); 200 if (index == -1) 201 index = getColumnIndex("Value"); 202 if (index == -1) 203 index = getColumnIndex("Name"); 204 if (index == -1) 205 index = getColumnIndex("Description"); 206 if (index != -1) 207 { 208 PO po1 = (PO)o1; 209 Object comp1 = po1.getValue(index); 210 PO po2 = (PO)o2; 211 Object comp2 = po2.getValue(index); 212 if (comp1 == null) 213 return -1; 214 else if (comp2 == null) 215 return 1; 216 return comp1.toString().compareTo(comp2.toString()); 217 } 218 } 219 return o1.toString().compareTo(o2.toString()); 220 } 222 226 protected String getTableName() 227 { 228 return p_info.getTableName(); 229 } 231 235 public int getID() 236 { 237 Object oo = m_IDs[0]; 238 if (oo != null && oo instanceof Integer ) 239 return ((Integer )oo).intValue(); 240 return 0; 241 } 243 247 public Properties getCtx() 248 { 249 return p_ctx; 250 } 252 253 258 protected Object getValue (int index) 259 { 260 if (index < 0 || index >= getColumnCount()) 261 { 262 log.error("getValue - Index invalid - " + index); 263 return null; 264 } 265 if (m_newValues[index] != null) 266 { 267 if (m_newValues[index].equals(NULL)) 268 return null; 269 return m_newValues[index]; 270 } 271 return m_oldValues[index]; 272 } 274 279 protected int getValueAsInt (int index) 280 { 281 Object value = getValue(index); 282 if (value == null) 283 return 0; 284 if (value instanceof Integer ) 285 return ((Integer )value).intValue(); 286 try 287 { 288 return Integer.parseInt(value.toString()); 289 } 290 catch (NumberFormatException ex) 291 { 292 log.warn("getValueAsInt - " + p_info.getColumnName(index) + " - " + ex.getMessage()); 293 return 0; 294 } 295 } 297 302 protected Object getValue (String columnName) 303 { 304 int index = getColumnIndex(columnName); 305 if (index < 0) 306 { 307 log.error("getValue - Column not found - " + columnName); 308 return null; 309 } 310 return getValue (index); 311 } 313 320 protected final boolean setValue (int index, Object value) 321 { 322 if (index < 0 || index >= getColumnCount()) 323 { 324 log.error("setValue - Index invalid - " + index); 325 return false; 326 } 327 String ColumnName = p_info.getColumnName(index); 328 String colInfo = " - " + ColumnName; 329 if (p_info.isColumnUpdateable(index)) 330 { 331 if (value == null) 332 { 333 if (p_info.isColumnMandatory(index)) 334 { 335 log.error("setValue - Cannot set mandatory column to null " + colInfo); 336 return false; 338 } 339 m_newValues[index] = NULL; if (Log.isTraceLevel(Log.l6_Database)) 341 log.debug("setValue - " + ColumnName + " = null"); 342 } 343 else 344 { 345 if (value.getClass().equals(p_info.getColumnClass(index)) || p_info.getColumnClass(index) == Object .class) 347 m_newValues[index] = value; else if (value.getClass() == BigDecimal.class && p_info.getColumnClass(index) == Integer .class) 350 m_newValues[index] = new Integer (((BigDecimal)value).intValue()); 351 else 352 { 353 log.error("setValue - " + ColumnName 354 + " - Class invalid: " + value.getClass().toString() 355 + ", Should be " + p_info.getColumnClass(index).toString() + colInfo); 356 return false; 357 } 358 String error = p_info.validate(index, value); 360 if (error != null) 361 { 362 log.error("setValue - " + ColumnName + "=" + value + " - " + error); 363 return false; 364 } 365 if (Log.isTraceLevel(8)) 367 log.debug("setValue - " + ColumnName + " = " + value); 368 if (p_info.getColumnClass(index) == String .class) 370 { 371 String stringValue = value.toString(); 372 int length = p_info.getFieldLength(index); 373 if (stringValue.length() > length) 374 { 375 log.warn("setValue - " + ColumnName + " - Value too long - truncated to length=" + length); 376 m_newValues[index] = stringValue.substring(0,length-1); 377 } 378 } 379 } 380 } 381 else 382 { 383 colInfo += " - NewValue=" + value + " - OldValue=" + getValue(index); 384 log.error("setValue - Column not updateable" + colInfo); 385 return false; 386 } 387 setKeys (ColumnName, value); 388 return true; 389 } 391 397 protected final boolean setValue (String ColumnName, Object value) 398 { 399 int index = getColumnIndex(ColumnName); 400 if (index < 0) 401 { 402 log.error("setValue - Column not found - " + ColumnName); 403 return false; 404 } 405 return setValue (index, value); 406 } 408 415 protected final boolean setValueNoCheck (String ColumnName, Object value) 416 { 417 int index = getColumnIndex(ColumnName); 418 if (index < 0) 419 { 420 log.error("setValueNoCheck - Column not found - " + ColumnName); 421 return false; 422 } 423 m_newValues[index] = value; if (Log.isTraceLevel(Log.l6_Database)) 425 log.debug("setValueNoCheck - " + ColumnName + " = " + value); 426 setKeys (ColumnName, value); 427 return true; 428 } 430 435 private void setKeys (String ColumnName, Object value) 436 { 437 for (int i = 0; i < m_IDs.length; i++) 439 { 440 if (ColumnName.equals (m_KeyColumns[i])) 441 { 442 m_IDs[i] = value; 443 } 444 } } 447 448 449 453 protected int getColumnCount() 454 { 455 return p_info.getColumnCount(); 456 } 458 463 protected String getColumnName (int index) 464 { 465 return p_info.getColumnName (index); 466 } 468 473 protected String getColumnLabel (int index) 474 { 475 return p_info.getColumnLabel (index); 476 } 478 483 protected String getColumnDescription (int index) 484 { 485 return p_info.getColumnDescription (index); 486 } 488 493 protected boolean isColumnMandatory (int index) 494 { 495 return p_info.isColumnMandatory(index); 496 } 498 503 protected boolean isColumnUpdateable (int index) 504 { 505 return p_info.isColumnUpdateable(index); 506 } 508 513 protected void setColumnUpdateable (int index, boolean updateable) 514 { 515 p_info.setColumnUpdateable(index, updateable); 516 } 518 522 protected void setUpdateable (boolean updateable) 523 { 524 p_info.setUpdateable (updateable); 525 } 527 532 protected int getColumnIndex (String columnName) 533 { 534 return p_info.getColumnIndex(columnName); 535 } 537 542 protected Lookup getColumnLookup(int index) 543 { 544 return p_info.getColumnLookup(index); 545 } 547 548 556 protected static void copyValues (PO from, PO to, int AD_Client_ID, int AD_Org_ID) 557 { 558 copyValues (from, to); 559 to.setAD_Client_ID(AD_Client_ID); 560 to.setAD_Org_ID(AD_Org_ID); 561 } 563 569 protected static void copyValues (PO from, PO to) 570 { 571 s_log.debug("copyValues - From ID=" + from.getID() + " - To ID=" + to.getID()); 572 if (from.getClass() != to.getClass()) 573 throw new IllegalArgumentException ("PO.copyValues - To class=" + to.getClass() + " NOT From=" + from.getClass()); 574 for (int i = 0; i < from.m_oldValues.length; i++) 576 { 577 String colName = from.p_info.getColumnName(i); 578 if (colName.startsWith("Created") || colName.startsWith("Updated") 580 || from.p_info.isColumnKey(i) 582 || colName.equals("IsActive") 583 || colName.equals("AD_Client_ID") || colName.equals("AD_Org_ID")) 584 ; else 586 to.m_newValues[i] = from.m_oldValues[i]; 587 } 588 } 590 591 592 596 protected void load (int ID) 597 { 598 if (Log.isTraceLevel(10)) 599 log.debug("load - ID=" + ID); 600 if (ID > 0) 601 { 602 m_IDs = new Object [] {new Integer (ID)}; 603 m_KeyColumns = new String [] {getTableName() + "_ID"}; 604 load(); 605 } 606 else { 608 loadDefaults(); 609 m_createNew = true; 610 setKeyInfo(); } 612 } 614 615 618 protected void load () 619 { 620 StringBuffer sql = new StringBuffer ("SELECT "); 621 int size = getColumnCount(); 622 for (int i = 0; i < size; i++) 623 { 624 if (i != 0) 625 sql.append(","); 626 sql.append(getColumnName(i)); 627 } 628 sql.append(" FROM ").append(getTableName()) 629 .append(" WHERE ") 630 .append(getWhereClause(false)); 631 int index = -1; 633 if (Log.isTraceLevel(10)) 634 log.debug("load - " + getWhereClause(true)); 635 try 636 { 637 PreparedStatement pstmt = DB.prepareStatement(sql.toString()); 638 for (int i = 0; i < m_IDs.length; i++) 639 { 640 Object oo = m_IDs[i]; 641 if (oo instanceof Integer ) 642 pstmt.setInt(i+1, ((Integer )m_IDs[i]).intValue()); 643 else 644 pstmt.setString(i+1, m_IDs[i].toString()); 645 } 646 ResultSet rs = pstmt.executeQuery(); 647 if (rs.next()) 648 { 649 for (index = 0; index < size; index++) 651 { 652 Class clazz = p_info.getColumnClass(index); 653 int dt = p_info.getColumnDisplayType(index); 654 if (clazz == Integer .class) 656 m_oldValues[index] = new Integer (rs.getInt(index+1)); 657 else if (clazz == BigDecimal.class) 658 m_oldValues[index] = rs.getBigDecimal(index+1); 659 else if (clazz == Boolean .class) 660 m_oldValues[index] = new Boolean ("Y".equals(rs.getString(index+1))); 661 else if (clazz == Timestamp.class) 662 m_oldValues[index] = rs.getTimestamp(index+1); 663 else if (dt == DisplayType.TextLong) 664 m_oldValues[index] = getLOB (rs.getObject(index+1)); 665 else if (clazz == String .class) 666 m_oldValues[index] = rs.getString(index+1); 667 else 668 m_oldValues[index] = loadSpecial(rs, index); 669 if (rs.wasNull() && m_oldValues[index] != null) 670 m_oldValues[index] = null; 671 if (Log.isTraceLevel(10)) 673 log.debug(String.valueOf(index) + ": " + p_info.getColumnName(index) + "(" + p_info.getColumnClass(index) + ") = " + m_oldValues[index]); 674 } 675 } 676 else 677 { 678 log.error("load - NO Data found for " + getWhereClause(true)); 679 m_IDs = new Object [] {new Integer (0)}; 680 } 681 rs.close(); 682 pstmt.close(); 683 m_createNew = false; 684 m_newValues = new Object [size]; 686 } 687 catch (SQLException e) 688 { 689 log.error ("load - " + getWhereClause(true) 690 + ", Index=" + index + ", Column=" + getColumnName(index) 691 + ", " + p_info.toString(index) 692 + ", SQL=" + sql.toString(), e); 693 } 694 } 696 697 701 protected void load (ResultSet rs) 702 { 703 int size = getColumnCount(); 704 int index = 0; 705 if (Log.isTraceLevel(10)) 706 log.debug("load(rs)"); 707 try 708 { 709 for (index = 0; index < size; index++) 711 { 712 String columnName = p_info.getColumnName(index); 713 Class clazz = p_info.getColumnClass(index); 714 int dt = p_info.getColumnDisplayType(index); 715 if (clazz == Integer .class) 717 m_oldValues[index] = new Integer (rs.getInt(columnName)); 718 else if (clazz == BigDecimal.class) 719 m_oldValues[index] = rs.getBigDecimal(columnName); 720 else if (clazz == Boolean .class) 721 m_oldValues[index] = new Boolean ("Y".equals(rs.getString(columnName))); 722 else if (clazz == Timestamp.class) 723 m_oldValues[index] = rs.getTimestamp(columnName); 724 else if (dt == DisplayType.TextLong) 725 m_oldValues[index] = getLOB (rs.getObject(columnName)); 726 else if (clazz == String .class) 727 m_oldValues[index] = rs.getString(columnName); 728 else 729 m_oldValues[index] = loadSpecial(rs, index); 730 if (rs.wasNull() && m_oldValues[index] != null) 731 m_oldValues[index] = null; 732 if (Log.isTraceLevel(10)) 734 log.debug(String.valueOf(index) + ": " + p_info.getColumnName(index) 735 + "(" + p_info.getColumnClass(index) + ") = " + m_oldValues[index]); 736 } 737 m_createNew = false; 738 } 739 catch (SQLException e) 740 { 741 log.error ("load(rs) - " + String.valueOf(index) + ": " + p_info.getColumnName(index) 742 + "(" + p_info.getColumnClass(index) + ")", e); 743 744 } 745 setKeyInfo(); 746 } 748 749 757 protected Object loadSpecial (ResultSet rs, int index) throws SQLException 758 { 759 if (Log.isTraceLevel(Log.l4_Data)) 760 log.debug("loadSpecial - " + p_info.getColumnName(index)); 761 return null; 762 } 764 767 protected void loadDefaults() 768 { 769 setStandardDefaults(); 770 772 } 775 779 protected void setStandardDefaults() 780 { 781 int size = getColumnCount(); 782 for (int i = 0; i < size; i++) 783 { 784 String colName = p_info.getColumnName(i); 785 if (colName.endsWith("tedBy")) 787 m_newValues[i] = new Integer (Env.getContextAsInt(p_ctx, "#AD_User_ID")); 788 else if (colName.equals("Created") || colName.equals("Updated")) 789 m_newValues[i] = new Timestamp (System.currentTimeMillis()); 790 else if (colName.equals(getTableName() + "_ID")) m_newValues[i] = new Integer (0); 792 else if (colName.equals("IsActive")) 793 m_newValues[i] = new Boolean (true); 794 else if (colName.equals("AD_Client_ID")) 795 m_newValues[i] = new Integer (Env.getContextAsInt(p_ctx, "#AD_Client_ID")); 796 else if (colName.equals("AD_Org_ID")) 797 m_newValues[i] = new Integer (Env.getContextAsInt(p_ctx, "#AD_Org_ID")); 798 } 799 } 801 804 private void setKeyInfo() 805 { 806 for (int i = 0; i < p_info.getColumnCount(); i++) 808 { 809 if (p_info.isColumnKey(i) && p_info.getColumnName(i).endsWith("_ID")) 810 { 811 String ColumnName = p_info.getColumnName(i); 812 m_KeyColumns = new String [] {ColumnName}; 813 Integer ii = (Integer )getValue(i); 814 if (ii == null) 815 m_IDs = new Object [] {new Integer (0)}; 816 else 817 m_IDs = new Object [] {ii}; 818 if (Log.isTraceLevel(10)) 819 log.debug("PO.setKeyInfo (PK) - " + ColumnName + "=" + ii); 820 return; 821 } 822 } 824 ArrayList columnNames = new ArrayList(); 826 for (int i = 0; i < p_info.getColumnCount(); i++) 827 { 828 if (p_info.isColumnParent(i)) 829 columnNames.add(p_info.getColumnName(i)); 830 } 831 int size = columnNames.size(); 833 if (size == 0) 834 throw new IllegalStateException ("PO.setKeyInfo - no PK nor FK - " + p_info.getTableName()); 835 m_IDs = new Object [size]; 836 m_KeyColumns = new String [size]; 837 for (int i = 0; i < size; i++) 838 { 839 m_KeyColumns[i] = (String )columnNames.get(i); 840 if (m_KeyColumns[i].endsWith("_ID")) 841 { 842 Integer ii = null; 843 try 844 { 845 ii = (Integer )getValue(m_KeyColumns[i]); 846 } 847 catch (Exception e) 848 { 849 log.error("setKeyInfo", e); 850 } 851 if (ii != null) 852 m_IDs[i] = ii; 853 } 854 else 855 m_IDs[i] = getValue(m_KeyColumns[i]); 856 if (Log.isTraceLevel(10)) 857 log.debug("setKeyInfo (FK) " + m_KeyColumns[i] + "=" + m_IDs[i]); 858 } 859 } 861 862 863 868 protected boolean isMandatoryOK() 869 { 870 int size = getColumnCount(); 871 for (int i = 0; i < size; i++) 872 { 873 if (p_info.isColumnMandatory(i)) 874 { 875 if (getValue(i) == null || getValue(i).equals(NULL)) 876 { 877 log.info("isMandatoryOK " + p_info.getColumnName(i)); 878 return false; 879 } 880 } 881 } 882 return true; 883 } 885 886 887 891 final protected void setAD_Client_ID (int AD_Client_ID) 892 { 893 setValueNoCheck ("AD_Client_ID", new Integer (AD_Client_ID)); 894 } 896 900 public final int getAD_Client_ID() 901 { 902 return ((Integer )getValue("AD_Client_ID")).intValue(); 903 } 905 909 final protected void setAD_Org_ID (int AD_Org_ID) 910 { 911 setValueNoCheck ("AD_Org_ID", new Integer (AD_Org_ID)); 912 } 914 918 public final int getAD_Org_ID() 919 { 920 return ((Integer )getValue("AD_Org_ID")).intValue(); 921 } 923 928 protected void setClientOrg (int AD_Client_ID, int AD_Org_ID) 929 { 930 if (AD_Client_ID != getAD_Client_ID()) 931 setAD_Client_ID(AD_Client_ID); 932 if (AD_Org_ID != getAD_Org_ID()) 933 setAD_Org_ID(AD_Org_ID); 934 } 936 940 public final void setIsActive (boolean active) 941 { 942 setValue("IsActive", new Boolean (active)); 943 } 945 949 public final boolean isActive() 950 { 951 Boolean bb = (Boolean )getValue("IsActive"); 952 if (bb != null) 953 return bb.booleanValue(); 954 return false; 955 } 957 961 final public Timestamp getCreated() 962 { 963 return (Timestamp)getValue("Created"); 964 } 966 970 final public Timestamp getUpdated() 971 { 972 return (Timestamp)getValue("Updated"); 973 } 975 979 final public int getCreatedBy() 980 { 981 Integer ii = (Integer )getValue("CreatedBy"); 982 if (ii == null) 983 return 0; 984 return ii.intValue(); 985 } 987 991 final public int getUpdatedBy() 992 { 993 Integer ii = (Integer )getValue("UpdatedBy"); 994 if (ii == null) 995 return 0; 996 return ii.intValue(); 997 } 999 1003 final protected void setUpdatedBy (int AD_User_ID) 1004 { 1005 setValueNoCheck ("UpdatedBy", new Integer (AD_User_ID)); 1006 } 1008 1009 1010 1014 public boolean save() 1015 { 1016 if (!m_createNew && m_IDs[0].equals(new Integer (0))) m_createNew = true; 1019 if (m_createNew) 1020 return saveNew(); 1021 return saveUpdate(); 1022 } 1023 1024 1028 protected boolean saveUpdate() 1029 { 1030 String where = getWhereClause(true); 1031 log.info("saveUpdate - " + p_info.getTableName() + where); 1032 boolean changes = false; 1034 StringBuffer sql = new StringBuffer ("UPDATE "); 1035 sql.append(getTableName()).append( " SET "); 1036 boolean updated = false; 1037 boolean updatedBy = false; 1038 resetLOB(); 1039 1040 int size = getColumnCount(); 1041 for (int i = 0; i < size; i++) 1042 { 1043 if (m_newValues[i] != null) 1045 { 1046 Object value = m_newValues[i]; 1047 Class c = p_info.getColumnClass(i); 1048 int dt = p_info.getColumnDisplayType(i); 1049 if (dt == DisplayType.TextLong) 1051 saveLOBprepare (value, i, dt); 1052 1053 if (changes) 1054 sql.append(", "); 1055 changes = true; 1056 sql.append(p_info.getColumnName(i)).append("="); 1057 1058 if (value == NULL) 1060 sql.append("NULL"); 1061 else if (c == Integer .class || c == BigDecimal.class) 1062 sql.append(m_newValues[i]); 1063 else if (c == Boolean .class) 1064 { 1065 value = "'N'"; 1066 if (((Boolean )m_newValues[i]).booleanValue()) 1067 value = "'Y'"; 1068 sql.append(value); 1069 } 1070 else if (c == Timestamp.class) 1071 sql.append(DB.TO_DATE((Timestamp)m_newValues[i],p_info.getColumnDisplayType(i) == DisplayType.Date)); 1072 else 1073 sql.append(DB.TO_STRING(m_newValues[i].toString())); 1074 if (p_info.getColumnName(i).equals("UpdatedBy")) 1076 updatedBy = true; 1077 else if (p_info.getColumnName(i).equals("Updated")) 1078 updated = true; 1079 } } if (changes) 1083 { 1084 if (!updated) { 1086 Timestamp now = new Timestamp(System.currentTimeMillis()); 1087 setValueNoCheck("Updated", now); 1088 sql.append(",Updated=").append(DB.TO_DATE(now, false)); 1089 } 1090 if (!updatedBy) { 1092 int AD_User_ID = Env.getContextAsInt(p_ctx, "#AD_User_ID"); 1093 setValueNoCheck("UpdatedBy", new Integer (AD_User_ID)); 1094 sql.append(",UpdatedBy=").append(AD_User_ID); 1095 } 1096 sql.append(" WHERE ").append(where); 1097 1098 } 1099 1100 if (changes) 1101 { 1102 int no = DB.executeUpdate(sql.toString()); 1103 if (no == 1) 1104 saveLOB(false); 1105 return saveComplete (false, no == 1); 1106 } 1107 return saveComplete (false, true); 1109 } 1111 1115 private boolean saveNew() 1116 { 1117 if (m_IDs.length == 1 && !m_KeyColumns[0].equals("AD_Language")) 1119 { 1120 m_IDs[0] = new Integer (DB.getKeyNextNo(getAD_Client_ID(), getTableName())); 1121 setValueNoCheck(m_KeyColumns[0], m_IDs[0]); 1122 } 1123 log.debug("saveNew - " + p_info.getTableName() + " - " + getWhereClause(true)); 1124 String DN = "DocumentNo"; 1126 int index = p_info.getColumnIndex(DN); 1127 if (index != -1) 1128 { 1129 Object value = getValue(index); 1130 if (value == null || value.toString().length() == 0) 1131 { 1132 int AD_Client_ID = getAD_Client_ID(); 1133 int dt = p_info.getColumnIndex("C_DocType_ID"); 1134 if (dt != -1) 1135 value = DB.getDocumentNo(AD_Client_ID, getValueAsInt(dt)); 1136 else 1137 value = DB.getDocumentNo(AD_Client_ID, "N", getTableName()); 1138 setValueNoCheck(DN, value); 1139 } 1140 } 1141 resetLOB(); 1142 1143 StringBuffer sqlInsert = new StringBuffer ("INSERT INTO "); 1145 sqlInsert.append(getTableName()).append(" ("); 1146 StringBuffer sql = new StringBuffer (") VALUES ("); 1147 int size = getColumnCount(); 1148 for (int i = 0; i < size; i++) 1149 { 1150 Object value = getValue(i); 1151 int dt = p_info.getColumnDisplayType(index); 1152 if (dt == DisplayType.TextLong) 1153 saveLOBprepare (value, i, dt); 1154 1155 if (i > 0) 1157 { 1158 sqlInsert.append(","); 1159 sql.append(","); 1160 } 1161 sqlInsert.append(p_info.getColumnName(i)); 1162 Class c = p_info.getColumnClass(i); 1165 try 1166 { 1167 if (c == Object .class) sql.append (saveNewSpecial (value, i)); 1169 else if (value == null || value.equals (NULL)) 1170 sql.append ("NULL"); 1171 else if (c == Integer .class) 1172 sql.append (((Integer )value).intValue ()); 1173 else if (c == BigDecimal.class) 1174 sql.append (((BigDecimal)value).toString ()); 1175 else if (c == Boolean .class) 1176 sql.append (((Boolean )value).booleanValue () ? "'Y'" 1177 : "'N'"); 1178 else if (c == Timestamp.class) 1179 sql.append (DB.TO_DATE ((Timestamp)value, 1180 p_info.getColumnDisplayType (i) == DisplayType.Date)); 1181 else if (c == String .class) 1182 sql.append (DB.TO_STRING ((String )value)); 1183 else if (dt == DisplayType.TextLong) 1184 sql.append("empty_clob()"); 1185 else 1186 sql.append (saveNewSpecial (value, i)); 1187 } 1188 catch (Exception e) 1189 { 1190 log.error("PO.saveNew - " + p_info.toString(i) + " - " + value, e); 1191 throw new RuntimeException (e); 1192 } 1193 } 1194 sqlInsert.append(sql) 1195 .append(")"); 1196 int no = DB.executeUpdate(sqlInsert.toString()); 1198 if (no == 1) 1199 { 1200 saveLOB(true); 1201 load(); } 1203 else 1204 log.error("PO.saveNew - Not inserted - " + sql.toString()); 1205 return saveComplete(true, no == 1); 1207 } 1209 1214 private String getWhereClause (boolean withValues) 1215 { 1216 StringBuffer sb = new StringBuffer (); 1217 for (int i = 0; i < m_IDs.length; i++) 1218 { 1219 if (i != 0) 1220 sb.append(" AND "); 1221 sb.append(m_KeyColumns[i]).append("="); 1222 if (withValues) 1223 sb.append(m_IDs[i]); 1224 else 1225 sb.append("?"); 1226 } 1227 return sb.toString(); 1228 } 1230 1231 1238 protected String saveNewSpecial (Object value, int index) 1239 { 1240 String colName = p_info.getColumnName(index); 1241 String colClass = p_info.getColumnClass(index).toString(); 1242 String colValue = value == null ? "null" : value.getClass().toString(); 1243 int dt = p_info.getColumnDisplayType(index); 1244 1245 log.error("PO.saveNewSpecial - Unknown class for column " + colName 1246 + " (" + colClass + ") - Value=" + colValue); 1247 1248 if (value == null) 1249 return "NULL"; 1250 return value.toString(); 1251 } 1253 1260 protected boolean saveComplete (boolean newRecord, boolean success) 1261 { 1262 log.debug("saveComplete - Success=" + success); 1263 m_createNew = false; 1264 return success; 1265 } 1267 1268 1269 1270 1274 public boolean delete() 1275 { 1276 if (m_createNew || m_IDs[0].equals(new Integer (0))) return true; 1278 1279 StringBuffer sql = new StringBuffer ("DELETE ") 1280 .append(getTableName()) 1281 .append(" WHERE ") 1282 .append(getWhereClause(true)); 1283 int no = DB.executeUpdate(sql.toString()); 1285 if (no == 0) 1286 m_IDs[0] = new Integer (0); 1287 return no == 1; 1288 } 1290 1291 1292 1295 public void dump () 1296 { 1297 if (Log.isTraceLevel(8)) 1298 { 1299 log.debug (getWhereClause (true)); 1300 for (int i = 0; i < getColumnCount (); i++) 1301 dump (i); 1302 } 1303 } 1305 1309 public void dump (int index) 1310 { 1311 StringBuffer sb = new StringBuffer (" ").append(index); 1312 if (index < 0 || index >= getColumnCount()) 1313 { 1314 log.debug(sb.append(": invalid").toString()); 1315 return; 1316 } 1317 sb.append(": ").append(getColumnName(index)) 1318 .append(" = ").append(m_oldValues[index]) 1319 .append(" (").append(m_newValues[index]).append(")"); 1320 log.debug(sb.toString()); 1321 } 1323 1324 1325 1331 public static int[] getAllIDs (String TableName, String WhereClause) 1332 { 1333 ArrayList list = new ArrayList(); 1334 StringBuffer sql = new StringBuffer ("SELECT "); 1335 sql.append(TableName).append("_ID FROM ").append(TableName); 1336 if (WhereClause != null && WhereClause.length() > 0) 1337 sql.append(" WHERE ").append(WhereClause); 1338 try 1339 { 1340 PreparedStatement pstmt = DB.prepareStatement(sql.toString()); 1341 ResultSet rs = pstmt.executeQuery(); 1342 while (rs.next()) 1343 list.add(new Integer (rs.getInt(1))); 1344 rs.close(); 1345 pstmt.close(); 1346 } 1347 catch (SQLException e) 1348 { 1349 s_log.error("getAllIDs\nSQL=" + sql.toString(), e); 1350 } 1351 int[] retValue = new int[list.size()]; 1353 for (int i = 0; i < retValue.length; i++) 1354 retValue[i] = ((Integer )list.get(i)).intValue(); 1355 return retValue; 1356 } 1358 1359 1360 1364 private Object getLOB (Object value) 1365 { 1366 log.debug("getLOB - " + value); 1367 if (value == null) 1368 return null; 1369 String retValue = null; 1371 try 1372 { 1373 if (value instanceof Clob) 1374 { 1375 Clob lob = (Clob)value; 1376 long length = lob.length(); 1377 retValue = lob.getSubString(1, (int)length); 1378 } 1379 } 1380 catch (Exception e) 1381 { 1382 log.error("getLOB", e); 1383 } 1384 return retValue; 1385 } 1387 1388 private ArrayList m_lobInfo = null; 1389 1390 private void resetLOB() 1391 { 1392 m_lobInfo = null; 1393 } 1394 private void saveLOBprepare (Object value, int index, int displayType) 1395 { 1396 log.debug("saveLOBprepare - " + value); 1397 LOBInfoVO info = new LOBInfoVO(); 1398 info.value = value; 1399 info.index = index; 1400 info.displayType = displayType; 1401 if (m_lobInfo == null) 1402 m_lobInfo = new ArrayList(); 1403 m_lobInfo.add(info); 1404 } 1405 1406 private void saveLOB (boolean newRecord) 1407 { 1408 if (m_lobInfo == null) 1409 return; 1410 for (int i = 0; i < m_lobInfo.size(); i++) 1411 { 1412 LOBInfoVO info = (LOBInfoVO)m_lobInfo.get(i); 1413 log.debug("saveLOB - " + info.value); 1414 StringBuffer sql = new StringBuffer ("SELECT "); 1417 sql.append(getColumnName(info.index)) 1418 .append(" FROM ").append(getTableName()) 1419 .append(" WHERE ").append(getWhereClause(true)) 1420 .append(" FOR UPDATE"); 1421 log.debug("saveLOB - " + sql); 1422 Connection con = null; 1423 PreparedStatement pstmt = null; 1424 try 1425 { 1426 con = DB.createConnection(false, Connection.TRANSACTION_SERIALIZABLE); 1427 pstmt = con.prepareStatement(sql.toString(), ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); 1428 OracleResultSet rs = (OracleResultSet)pstmt.executeQuery(); 1429 if (rs.next()) 1430 { 1431 CLOB lob = rs.getCLOB(1); 1432 Writer writer = lob.getCharacterOutputStream(); 1433 writer.write((String )info.value); 1434 writer.flush(); 1435 writer.close(); 1436 } 1437 rs.close(); 1438 pstmt.close(); 1439 pstmt = null; 1440 con.close(); 1441 con = null; 1442 } 1443 catch (Exception e) 1444 { 1445 log.error("saveLOB", e); 1446 } 1447 try 1448 { 1449 if (pstmt != null) 1450 pstmt.close(); 1451 pstmt = null; 1452 if (con != null) 1453 con.close(); 1454 con = null; 1455 } 1456 catch (Exception e) 1457 { 1458 pstmt = null; 1459 con = null; 1460 } 1461 } resetLOB(); 1463 } 1465 1466 private boolean newLOB (LOBInfoVO info) 1467 { 1468 StringBuffer sql = new StringBuffer ("UPDATE "); 1469 sql.append(getTableName()) 1470 .append(" SET ").append(getColumnName(info.index)).append("="); 1471 if (info.displayType == DisplayType.TextLong) 1472 sql.append("empty_clob()"); 1473 else 1474 sql.append("empty_blob()"); 1475 sql.append(" WHERE ").append(getWhereClause(true)); 1476 int no = DB.executeUpdate(sql.toString()); 1477 log.debug("newLOB - " + no + " - " + sql.toString()); 1478 return no == 1; 1479 } 1481 class LOBInfoVO 1482 { 1483 public Object value; 1484 public int index; 1485 public int displayType; 1486 } 1488 1489 1490 1491 1495 public static void main (String [] args) 1496 { 1497 BigDecimal min = new BigDecimal (1); 1498 1499 } 1501} | Popular Tags |