home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / VCafe / prosrc.bin / RecordDefinition.java < prev    next >
Encoding:
Java Source  |  1998-03-19  |  87.9 KB  |  2,364 lines

  1.  
  2. /*
  3.  * @(#)RecordDefinition.java
  4.  *
  5.  * Copyright (c) 1997 Symantec Corporation. All Rights Reserved.
  6.  *
  7.  */
  8.  
  9. package symantec.itools.db.beans.jdbc;
  10.  
  11. import java.util.*;
  12. import java.sql.SQLException;
  13. import java.sql.Statement;
  14. import java.sql.PreparedStatement;
  15. import java.sql.ResultSet;
  16. import java.sql.ResultSetMetaData;
  17. import java.sql.DatabaseMetaData;
  18. import symantec.itools.db.beans.binding.*;
  19. import java.lang.*;
  20.  
  21. public class RecordDefinition implements PersistentObject, Cloneable
  22. {
  23.     //internal constants
  24.     protected static final int INSERT_SQL=100;
  25.     protected static final int UPDATE_SQL=101;
  26.     protected static final int DELETE_SQL=102;
  27.  
  28.     protected static final String CLASS_NAME="RecordDefinition";
  29.     protected static final String UNEXPECTED_ERROR_MESSAGE="Unexpected error in " + CLASS_NAME + " : ";
  30.     protected static final String IS_NULL=" IS NULL ";
  31.     protected PreparedStatement m_Statement=null;
  32.  
  33.  
  34.     /*this class implements the following logical table:
  35.         ----------------------------------------------------------------------------------------------------------------
  36.         State(Inserted)    State(Modified)  State(Deleted)   State(MisplacedDetail)     ExternalState        Operation
  37.         ----------------------------------------------------------------------------------------------------------------
  38.        true                true            true                true                    DELETED             NOTHING
  39.        true                true            true                false                   DELETED             NOTHING
  40.        true                true            false               true                    INSERTED_MISPLACED  INSERT & REMOVE_INTERNAL(in QN)
  41.        true                true            false               false                   INSERTED            INSERT
  42.        true                false           true                true                    ERROR-INVALID CASE
  43.        true                false           true                false                   DELETED             NOTHING
  44.        true                false           false               true                    ERROR-INVALID CASE
  45.        true                false           false               false                   INSERTED            INSERT
  46.        false               true            true                true                    DELETED             DELETE & REMOVE_INTERNAL(in QN)
  47.        false               true            true                false                   DELETED             DELETE & REMOVE_INTERNAL(in QN)
  48.        false               true            false               true                    MODIFIED_MISPLACED  UPDATE & REMOVE_INTERNAL(in QN)
  49.        false               true            false               false                   MODIFIED            UPDATE
  50.        false               false           true                true                    ERROR-INVALID CASE
  51.        false               false           true                false                   DELETED             DELETE & REMOVE_INTERNAL(in QN)
  52.        false               false           false               true                    ERROR-INVALID CASE
  53.        false               false           false               false                   EXISTING            NOTHING
  54.     */
  55.     private  RecordState  recordState=new RecordState();
  56.  
  57.     //this class
  58.     public static class RecordState{
  59.  
  60.         //these are the states of a record
  61.         //original state, modified, inserted, deleted and any combination of these states
  62.         public  static final int ORIGINAL=0;
  63.         public  static final int INSERTED=1;
  64.         public  static final int MODIFIED=2;
  65.         public  static final int DELETED=4;
  66.         public  static final int MISPLACED=8;
  67.  
  68.         public  static final int INSERTED_MODIFIED=INSERTED+MODIFIED;
  69.         public  static final int INSERTED_DELETED=INSERTED+DELETED;
  70.         public  static final int MODIFIED_DELETED=MODIFIED+DELETED;
  71.         public  static final int INSERTED_MODIFIED_DELETED=INSERTED+MODIFIED+DELETED;
  72.         public  static final int NUMBER_OF_STATES=4;
  73.  
  74.         public  static final int FIRST_VALUE=ORIGINAL;
  75.         public  static final int LAST_VALUE=ORIGINAL+INSERTED+MODIFIED+DELETED+MISPLACED;
  76.  
  77.         //the external state for a row
  78.         public  static final int EXISTING_STATE=109;
  79.         public  static final int INSERTED_STATE=110;
  80.         public  static final int MODIFIED_STATE=111;
  81.         public  static final int DELETED_STATE=112;
  82.         public  static final int INSERTED_MISPLACED=113;
  83.         public  static final int MODIFIED_MISPLACED=114;
  84.  
  85.         //the operations that the save() method implements
  86.         public  static final int NOTHING_OPERATION=13;
  87.         public  static final int INSERTED_OPERATION=14;
  88.         public  static final int MODIFIED_OPERATION=15;
  89.         public  static final int DELETED_OPERATION=16;
  90.  
  91.         int state;
  92.  
  93.         RecordState(){
  94.             state=ORIGINAL;
  95.         }
  96.  
  97.         synchronized void reset(){
  98.             state=ORIGINAL;
  99.         }
  100.         public synchronized boolean equals(RecordState rs){
  101.            return ( rs.state==state);
  102.         }
  103.         synchronized int  getOperation() throws StateException {
  104.             int stateRet=NOTHING_OPERATION;
  105.             // get rid of MISPLACED state; we don't need that for the RD save();
  106.             int stateWhMisplaced=((state>=MISPLACED)? state-MISPLACED:state);
  107.             switch(stateWhMisplaced){
  108.                 case ORIGINAL:
  109.                     stateRet= NOTHING_OPERATION;
  110.                     break;
  111.                 case INSERTED:
  112.                     stateRet= INSERTED_OPERATION;
  113.                     break;
  114.                 case MODIFIED:
  115.                     stateRet= MODIFIED_OPERATION;
  116.                     break;
  117.                 case INSERTED_MODIFIED:
  118.                     stateRet= INSERTED_OPERATION;
  119.                     break;
  120.                 case DELETED:
  121.                     stateRet= DELETED_OPERATION;
  122.                     break;
  123.                 case INSERTED_DELETED:
  124.                     stateRet= NOTHING_OPERATION;
  125.                     break;
  126.                  case MODIFIED_DELETED:
  127.                     stateRet= DELETED_OPERATION;
  128.                     break;
  129.                  case INSERTED_MODIFIED_DELETED:
  130.                     stateRet= NOTHING_OPERATION;
  131.                     break;
  132.                 default:
  133.                     throw new StateException("Invalid call to getOperation()");
  134.             }
  135.             return stateRet;
  136.         }
  137.  
  138.         synchronized void  setState(int newState) throws StateException
  139.         {
  140.             int tempState=0;
  141.             if((state & newState)> 0){
  142.                 return;
  143.             }
  144.             if(state==DELETED && newState==MODIFIED)
  145.                 return ;//throw new StateException("Modify not allow after Delete");
  146.             // MISPLACED comes down only after a modification
  147.             if(((state & MODIFIED)==0) && newState==MISPLACED)
  148.                 throw new StateException("Invalid try to set the State of the Record to MISPLACED.");
  149.  
  150.             tempState=state+newState;
  151.  
  152.             if (tempState>LAST_VALUE || tempState< FIRST_VALUE)
  153.                 throw new StateException("Invalid try to set the State");
  154.             state+=newState;
  155.         }
  156.  
  157.  
  158.         synchronized void  setStateUndo(int newState) throws StateException
  159.         {
  160.             int tempState=0;
  161.             if((state & newState)> 0)
  162.                 tempState=state-newState;
  163.             else
  164.                 return;
  165.  
  166.             if (tempState>LAST_VALUE || tempState< FIRST_VALUE)
  167.                 throw new StateException("Invalid try to set the State");
  168.             state=tempState;
  169.         }
  170.  
  171.  
  172.         synchronized boolean isMisplaced(){
  173.             return (state & MISPLACED) >0;
  174.         }
  175.  
  176.         synchronized int  getExternalState() {
  177.             int stateRet;
  178.             // get rid of MISPLACED state; we don't need that for the QN save();
  179.             int stateWhMisplaced=((state>=MISPLACED)? state-MISPLACED:state);
  180.  
  181.             switch(stateWhMisplaced){
  182.                 case 0:{
  183.                     stateRet= EXISTING_STATE;
  184.                     break;
  185.                 }
  186.                 case 1:{
  187.                     stateRet= INSERTED_STATE;
  188.                     break;
  189.                 }
  190.                 case 2:{
  191.                     stateRet= MODIFIED_STATE;
  192.                     break;
  193.                 }
  194.                 case 3:{
  195.                     stateRet= INSERTED_STATE;
  196.                     break;
  197.                 }
  198.                 case 4:{
  199.                     stateRet= DELETED_STATE;
  200.                     break;
  201.                 }
  202.                 case 5:{
  203.                     stateRet= DELETED_STATE;
  204.                     break;
  205.                 }
  206.                  case 6:{
  207.                     stateRet= DELETED_STATE;
  208.                     break;
  209.                 }
  210.                  case 7:{
  211.                     stateRet= DELETED_STATE;
  212.                     break;
  213.                 }
  214.                 default:
  215.                     throw new StateException("Invalid try to call getState");
  216.             }
  217.             return stateRet;
  218.         }
  219.  
  220.      class StateException extends RuntimeException{
  221.         StateException(String text){
  222.             super(text);
  223.         }
  224.      }
  225.     }
  226.  
  227.  
  228.  
  229.    // this class defines the RecordDefinition internal misfunction
  230.    //and raise an exception
  231.  
  232.    public class RecordDefinitionException extends  PersistentObject.RecordException
  233.    {
  234.     RecordDefinitionException(String text){
  235.             new RuntimeException(text);
  236.         }
  237.    }
  238.    public final static String TableSeparator=Name.TableSeparator;
  239.  
  240.     //the state of on RecordDefinition is set up through these parameters
  241.     //Note: they are exclusive, it means that only one can be true at once
  242.  
  243.     // internal storage for the RecordDefinition data.
  244.    protected  Vector m_OriginalValues;
  245.    protected Vector m_ModifiedValues;
  246.  
  247.     protected final static int COLUMN_VALUE=0;
  248.     protected final static int JOIN_VALUE=1;
  249.     protected final static int OPERATOR_VALUE=2;
  250.     //how many elements are different between m_ModifiedValues and m_OriginalValues
  251.     private int colModif=0;
  252.     boolean debug=true;
  253.  
  254.  
  255.     protected synchronized Statement getInsertStatement() throws SQLException
  256.     {
  257.         throw new RuntimeException("This method must be over-ridden.");
  258.     }
  259.  
  260.     protected synchronized Statement getUpdateStatement() throws SQLException
  261.     {
  262.         throw new RuntimeException("This method must be over-ridden.");
  263.     }
  264.  
  265.     protected synchronized Statement getDeleteStatement() throws SQLException
  266.     {
  267.         throw new RuntimeException("This method must be over-ridden.");
  268.     }
  269.  
  270.  
  271.  
  272.     public RecordDefinition() {
  273.  
  274.     }
  275.  
  276.     public int getValueIndex(String name)
  277.     {
  278.         return 0;
  279.     }
  280.     public synchronized PersistentObjectModel getDataModel()
  281.     {
  282.         throw new RuntimeException("This method must be over-ridden.");
  283.     }
  284.  
  285.     public synchronized void setDataModel(PersistentObjectModel model)
  286.     {
  287.         throw new RuntimeException("This method must be over-ridden.");
  288.     }
  289.  
  290.  
  291.     public synchronized Enumeration querySimilarObjects()
  292.     {
  293.         try {
  294.             return querySimilarObjects(null,null);
  295.         }
  296.         catch (java.sql.SQLException ex) {
  297.             throw new RuntimeException(ex.getMessage());
  298.         }
  299.     }
  300.  
  301.     protected synchronized int getColModif(){
  302.  
  303.         return colModif;
  304.     }
  305.  
  306.     private synchronized void setColModif(int modifiedOccurences){
  307.         colModif=modifiedOccurences;
  308.     }
  309.  
  310.     protected void errorTreaten(Exception e,String procName) {
  311.         final String classNameErrorMessage="ERROR in " + CLASS_NAME + " in the method " + procName+ ": ";
  312.         if(debug){
  313.             System.out.println(classNameErrorMessage+"error message: " + e.getMessage()+" ; instance of : " +e.getClass());
  314.         }
  315.     }
  316.  
  317.     public int getColumnIndex(String name)
  318.     {
  319.         if(name == null) {
  320.             return -1;
  321.         }
  322.  
  323.         int colIndex=-1;
  324.         int column;
  325.         ColumnMetaData colMD;
  326.         for (column = 0, colMD = (ColumnMetaData)getDataModel().getMemberModel(column);
  327.             colMD != null;
  328.             column++, colMD = (ColumnMetaData)getDataModel().getMemberModel(column)) {
  329.             if (colMD.getColumnName().equals(name)) {
  330.                 colIndex=column;
  331.                 break;
  332.             }
  333.         }
  334.  
  335.         if (colIndex == -1) {
  336.             String newValue;
  337.             if (name.startsWith("[") && name.endsWith("]")) {
  338.                 newValue = name.substring(1, name.length() -1);
  339.             }
  340.             else if (!(name.startsWith("[") || name.endsWith("]"))) {
  341.                 newValue = "[" + name + "]";
  342.             }
  343.             else {
  344.                 newValue = name;
  345.             }
  346.  
  347.             for (column = 0, colMD = (ColumnMetaData)getDataModel().getMemberModel(column);
  348.                 colMD != null;
  349.                 column++, colMD = (ColumnMetaData)getDataModel().getMemberModel(column)) {
  350.                 if (colMD.getColumnName().equals(newValue)) {
  351.                      colIndex=column;
  352.                      break;
  353.                 }
  354.             }
  355.         }
  356.  
  357.         return colIndex;
  358.     }
  359.  
  360.     /**
  361.      * Gets the object stored in the RecordDefinition at the given position as a String
  362.      * @param    index.         The position inside the RecordDefinition.
  363.      * @param    orig_modif.    The modified value or the .
  364.      * @return   String.        The value of the object.
  365.      */
  366.     public String getValueAsString(int index, int orig_modif) {
  367.         final String PROCEDURE_NAME="getValueAsString";
  368.         Object ret=null;
  369.         try{
  370.             int type=getMemberModel(index).getType();
  371.             ret=getValueAsObject(index,orig_modif);
  372.             if(ret==null){
  373.                 ret=new String();
  374.             }
  375.             if(type==java.sql.Types.VARBINARY || type==java.sql.Types.BINARY){
  376.                 byte bRet[]= (byte[])ret;
  377.                 StringBuffer buff=null;
  378.                 for(int i=0;i<bRet.length;i++){
  379.                     buff.append(bRet[i]);
  380.                 }
  381.                 ret=buff;
  382.  
  383.             }
  384.         }
  385.         catch(ArrayIndexOutOfBoundsException e){
  386.              throw e;
  387.         }
  388.         catch(Exception e){
  389.             errorTreaten(e,PROCEDURE_NAME);
  390.             throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  391.         }
  392.  
  393.         return  ret.toString();
  394.     }
  395.  
  396.     /**
  397.      * Sets the object stored in the RecordDefinition at the given position
  398.      * @param    index.         The position inside the RecordDefinition.
  399.      * @param    value.          The value
  400.      */
  401.     public void setValueAsString(int index, String value) throws NumberFormatException{
  402.             setValueAsObject(index, value);
  403.     }
  404.  
  405.  
  406.      public void setValueAsInteger(int index, Integer value)throws NumberFormatException{
  407.             setValueAsObject(index, value);
  408.      }
  409.  
  410.  
  411.  
  412.     /**
  413.      * Gets the object stored in the RecordDefinition at the given position as an object
  414.      * @param    index.         The position inside the RecordDefinition.
  415.      * @param    orig_modif.    The modified value or the .
  416.      * @return   Object.        The value of the object.
  417.      */
  418.     public synchronized Object getValueAsObject(int index, int orig_modif)
  419.     {
  420.         final String PROCEDURE_NAME="getValueAsObject";
  421.         Object retObject=null;
  422.         try{
  423.             switch(orig_modif) {
  424.                 case ORIGINAL_VALUE:
  425.                         retObject= m_OriginalValues.elementAt(index);
  426.                         break;
  427.                 case MODIFIED_VALUE:
  428.                         int type=getMemberModel(index).getType();
  429.                         retObject = m_ModifiedValues.elementAt(index);
  430.                         if(type==java.sql.Types.LONGVARBINARY && retObject != null) {
  431.                             if (retObject instanceof java.io.ByteArrayOutputStream) {
  432.                                 java.io.ByteArrayOutputStream stream = (java.io.ByteArrayOutputStream)retObject;
  433.                                 retObject= new java.io.ByteArrayInputStream(((java.io.ByteArrayOutputStream)stream).toByteArray());
  434.                             }
  435.                         }
  436.                         break;
  437.                 default:
  438.                     throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  439.             }
  440.         }
  441.        catch(ArrayIndexOutOfBoundsException e){
  442.              throw e;
  443.         }
  444.         catch(Exception e){
  445.             errorTreaten(e,PROCEDURE_NAME);
  446.             throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  447.         }
  448.         return  retObject;
  449.     }
  450.  
  451.  
  452.  
  453.  
  454.  
  455.     /**
  456.      * Sets the object stored in the RecordDefinition at the given position as an Object
  457.      * @param    index.         The position inside the RecordDefinition.
  458.      * @param    value.         The value.
  459.      */
  460.     public synchronized void setValueAsObject(int index, Object value) throws  NumberFormatException
  461.     {
  462.        final String PROCEDURE_NAME="setValueAsObject";
  463.        try{
  464.            if (m_ModifiedValues == null) {
  465.                 m_ModifiedValues = new Vector(getDataModel().getMemberCount());
  466.             }
  467.             value=setCastJDBCToJava(value,index);
  468.             m_ModifiedValues.setElementAt(value, index);
  469.             if (!equalsVector(m_OriginalValues,m_ModifiedValues)){
  470.                 setMarkedAsModified(true);
  471.             }
  472.             else if(getMarkedAsModified()){
  473.                 recordState.setStateUndo(RecordState.MODIFIED);
  474.             }
  475.        }
  476.        catch(ArrayIndexOutOfBoundsException e){
  477.              throw  e;
  478.        }
  479.        catch(NumberFormatException e){
  480.             throw e;
  481.        }
  482.        catch(Exception e){
  483.             errorTreaten(e,PROCEDURE_NAME);
  484.             throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  485.        }
  486.     }
  487.  
  488.  
  489.     Enumeration resultSetToEnum( ResultSet rs )  throws SQLException{
  490.       final String PROCEDURE_NAME="resultSetToEnum";
  491.       ResultSetEnumeration m_ResultSetEnum ;
  492.       try {
  493.         ResultSetMetaData md = rs.getMetaData();
  494.         int numColumns = md.getColumnCount();
  495.         m_ResultSetEnum = new ResultSetEnumeration(rs, md, this.getClass(),getDataModel().getModelName());
  496.         return m_ResultSetEnum;
  497.       }
  498.       catch(SQLException e){
  499.             throw e;
  500.       }
  501.       catch(Exception e){
  502.             errorTreaten(e,PROCEDURE_NAME);
  503.             throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  504.       }
  505.  
  506.     }
  507.  
  508.  
  509.  
  510.   /**
  511.   *  Saves the current row in the Data Base.
  512.   */
  513.     public synchronized int save()
  514.     {
  515.         final String PROCEDURE_NAME="save";
  516.         final String insert="INSERT";
  517.         final String update="UPDATE";
  518.         final String delete="DELETE";
  519.         int rowsUpdated=0;
  520.         String sStatement="";
  521.         int currentOperation;
  522.         Statement   statement=null;
  523.         JdbcConnection conBean = (JdbcConnection)getConnection();
  524.  
  525.         if (conBean==null){
  526.            throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  527.         }
  528.         try{
  529.            currentOperation=recordState.getOperation();
  530.         }
  531.         catch(RecordState.StateException e){
  532.             throw new RecordDefinitionException("The row was found in an invalid state");
  533.         }
  534.         try{
  535.             if(conBean.isConnectionClosed()){
  536.                 conBean.connect();
  537.             }
  538.  
  539.             switch(currentOperation){
  540.                 case RecordState.INSERTED_OPERATION:
  541.                     statement = getInsertStatement() ;
  542.                     sStatement=insert;
  543.                     break;
  544.                 case RecordState.DELETED_OPERATION:
  545.                     statement = getDeleteStatement();
  546.                     sStatement=delete;
  547.                     break;
  548.                 case RecordState.MODIFIED_OPERATION:
  549.                     statement = getUpdateStatement();
  550.                     sStatement=update;
  551.                     break;
  552.                 case RecordState.NOTHING_OPERATION:
  553.                     return rowsUpdated;
  554.                 default:
  555.                     throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  556.             }
  557.             rowsUpdated=conBean.executeStatement(statement, sStatement);
  558.             //if no rows were updated throws a SQLException
  559.             if(rowsUpdated==0){
  560.                 throw new SQLException("0 row updated");
  561.             }
  562.             //if the execute succeed then the m_OriginalValues is changed to the new value
  563.             if (conBean.isAutoCommit()){
  564.                 recordState.reset();
  565.                 Enumeration   enum = m_ModifiedValues.elements();
  566.                 m_OriginalValues = new Vector();
  567.                 while (enum.hasMoreElements()) {
  568.                     Object  value = enum.nextElement();
  569.                     m_OriginalValues.addElement(value);
  570.                 }
  571.             }
  572.             return rowsUpdated;
  573.         }
  574.         catch(Exception e){
  575.                 errorTreaten(e,PROCEDURE_NAME);
  576.                 throw new RecordDefinitionException(e.getMessage()+UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  577.         }
  578.         finally{
  579.             if(statement!=null){
  580.                 try {
  581.                     statement.close();
  582.                 }
  583.                 catch (SQLException e) {
  584.                     errorTreaten(e,PROCEDURE_NAME);
  585.                     throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  586.                 }
  587.             }
  588.         }
  589.     }
  590.  
  591.  
  592.     public void resetState(){
  593.         recordState.reset();
  594.         Enumeration   enum = m_ModifiedValues.elements();
  595.         m_OriginalValues = new Vector();
  596.         while (enum.hasMoreElements()) {
  597.             Object  value = enum.nextElement();
  598.             m_OriginalValues.addElement(value);
  599.         }
  600.     }
  601.  
  602.  
  603.  
  604.     protected PreparedStatement getStatement(PreparedStatement pstmt, int index) throws SQLException
  605.     {
  606.         final String PROCEDURE_NAME="getStatement";
  607.         String m_SQLString=null;
  608.  
  609.         try {
  610.             if (pstmt == null) {
  611.                  switch(index){
  612.                     case INSERT_SQL:
  613.                         m_SQLString = makeInsertSQLString();
  614.                         break;
  615.                     case UPDATE_SQL:
  616.                         m_SQLString = makeUpdateSQLString();
  617.                         break;
  618.                     case DELETE_SQL:
  619.                         m_SQLString = makeDeleteSQLString();
  620.                         break;
  621.                     default:
  622.                         throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  623.  
  624.                  }
  625.  
  626.             }
  627.             pstmt = prepareStatement(m_SQLString);
  628.         }
  629.         catch(Exception e){
  630.             errorTreaten(e,PROCEDURE_NAME);
  631.             throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  632.         }
  633.         return pstmt;
  634.     }
  635.  
  636.    private boolean columnModifiedCondition(int i){
  637.  
  638.         final String PROCEDURE_NAME="columnModifiedCondition";
  639.         try{
  640.             Object original= m_OriginalValues.elementAt(i);
  641.             Object modified=m_ModifiedValues.elementAt(i);
  642.             if(original==null && modified ==null)
  643.                 return false;
  644.             else if (original==null && modified !=null)
  645.                 return !modified.equals(original);
  646.             else if (original!=null && modified ==null)
  647.                 return !original.equals(modified);
  648.             else if (original!=null && modified !=null)
  649.                 return !modified.equals(original);
  650.             else
  651.                 return false;
  652.         }
  653.         catch(Exception e){
  654.             errorTreaten(e,PROCEDURE_NAME);
  655.             throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  656.         }
  657.     }
  658.  
  659.     private boolean isColumnNull(int i){
  660.         return (m_OriginalValues.elementAt(i)==null);
  661.     }
  662.  
  663.     protected synchronized void setParameterValues(PreparedStatement statement) throws SQLException {
  664.         final String PROCEDURE_NAME="setParameterValues";
  665.         int parameterIndex = 1;
  666.         int length=getDataModel().getMemberCount();
  667.         try{
  668.             int modifCol=0;
  669.             for (int index = 0; index < length; index++) {
  670.                if (columnModifiedCondition(index)){
  671.                   if(getValueAsObject(index,MODIFIED_VALUE)==null){
  672.                         statement.setNull(modifCol +1,(getDataModel().getMemberModel(index)).getType());
  673.                   }
  674.                   else{
  675.                         setObjectInStatement(statement,getValueAsObject(index,MODIFIED_VALUE),index,0,modifCol);
  676.                   }
  677.                   modifCol++;
  678.                }
  679.             }
  680.         }
  681.         catch(SQLException e){
  682.             throw e;
  683.         }
  684.         catch(Exception e){
  685.             errorTreaten(e,PROCEDURE_NAME);
  686.             throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  687.         }
  688.     }
  689.  
  690.  
  691.  
  692.    protected void setObjectInStatement(PreparedStatement stmt, Object value, int col,int offset,int modifCol) throws SQLException{
  693.       final String PROCEDURE_NAME="setObjectInStatement";
  694.  
  695.       try{
  696.         int type=(getDataModel().getMemberModel(col)).getType();
  697.         if(value==null){
  698.             stmt.setNull(modifCol+1+offset,type);
  699.             return;
  700.         }
  701.         switch(type){
  702.             case java.sql.Types.TINYINT:
  703.                 short objByte;
  704.                 if (value instanceof Byte){
  705.                     objByte=((Short)value).shortValue();
  706.                     stmt.setShort(modifCol+1+offset,objByte);
  707.                     break;
  708.                 }
  709.                 else if (value instanceof Short){
  710.                     objByte=((Short)value).shortValue();
  711.                     stmt.setShort(modifCol+1+offset,objByte);
  712.                     break;
  713.                 }
  714.                 else if (value instanceof Integer){
  715.                     objByte=((Integer)value).shortValue();
  716.                     stmt.setShort(modifCol+1+offset,objByte);
  717.                     break;
  718.                 }
  719.                 else if (value instanceof String){
  720.                     objByte = (Short.valueOf((String)value)).shortValue();
  721.                     stmt.setShort(modifCol+1+offset,objByte);
  722.                     break;
  723.                 }
  724.                 else if (value instanceof Number){
  725.                     objByte=((Number)value).shortValue();
  726.                     stmt.setShort(modifCol+1+offset,objByte);
  727.                     break;
  728.                 }
  729.                 else if (value instanceof Object){
  730.                     stmt.setObject(modifCol+1+offset,value);
  731.                     break;
  732.                 }
  733.             case java.sql.Types.SMALLINT:
  734.                 short objShort;
  735.                 if (value instanceof Short){
  736.                     objShort= ((Short)value).shortValue();
  737.                     stmt.setShort(modifCol+1+offset,objShort);
  738.                     break;
  739.                 }else if (value instanceof Integer){
  740.                     objShort=((Integer)value).shortValue();
  741.                     stmt.setShort(modifCol+1+offset,objShort);
  742.                     break;
  743.                 }
  744.                 else if (value instanceof String){
  745.                     objShort = (Short.valueOf((String)value)).shortValue();
  746.                     stmt.setShort(modifCol+1+offset,objShort);
  747.                     break;
  748.                 }
  749.                 else if (value instanceof Number){
  750.                     objShort=((Number)value).shortValue();
  751.                     stmt.setShort(modifCol+1+offset,objShort);
  752.                     break;
  753.                 }
  754.                 else if (value instanceof Object){
  755.                     stmt.setObject(modifCol+1+offset,value);
  756.                     break;
  757.                 }
  758.             case java.sql.Types.INTEGER:
  759.                 int objInt;
  760.                 if (value instanceof Integer){
  761.                     objInt=((Integer)value).intValue();
  762.                     stmt.setInt(modifCol+1+offset,objInt);
  763.                     break;
  764.                 }
  765.                 else if (value instanceof String){
  766.                     objInt = (Integer.valueOf((String)value)).intValue();
  767.                     stmt.setInt(modifCol+1+offset,objInt);
  768.                     break;
  769.                 }
  770.                 else if(value instanceof Number){
  771.                     objInt=((Number)value).intValue();
  772.                     stmt.setInt(modifCol+1+offset,objInt);
  773.                     break;
  774.                 }
  775.                 else if (value instanceof Object){
  776.                     stmt.setObject(modifCol+1+offset,value);
  777.                     break;
  778.                 }
  779.             case java.sql.Types.BIGINT:
  780.                 long objBigInt;
  781.                 if (value instanceof Long){
  782.                     objBigInt=((Long)value).longValue();
  783.                     stmt.setLong(modifCol+1+offset,objBigInt);
  784.                     break;
  785.                 }
  786.                 else if (value instanceof Integer){
  787.                     objBigInt=((Integer)value).longValue();
  788.                     stmt.setLong(modifCol+1+offset,objBigInt);
  789.                     break;
  790.                 }
  791.                 else if (value instanceof String){
  792.                     objBigInt = (Integer.valueOf((String)value)).longValue();
  793.                     stmt.setLong(modifCol+1+offset,objBigInt);
  794.                     break;
  795.                 }
  796.                 else if (value instanceof Number){
  797.                     objBigInt=((Number)value).longValue();
  798.                     stmt.setLong(modifCol+1+offset,objBigInt);
  799.                     break;
  800.                 }
  801.                 else if (value instanceof Object){
  802.                     stmt.setObject(modifCol+1+offset,value);
  803.                     break;
  804.                 }
  805.             case java.sql.Types.REAL:
  806.                 float objDouble;
  807.                 if (value instanceof Float){
  808.                     objDouble=((Float)value).floatValue();
  809.                     stmt.setDouble(modifCol+1+offset,objDouble);
  810.                     break;
  811.                 }
  812.                 else if (value instanceof String){
  813.                     objDouble = (Float.valueOf((String)value)).floatValue();
  814.                     stmt.setDouble(modifCol+1+offset,objDouble);
  815.                     break;
  816.                 }
  817.                 else if(value instanceof Number){
  818.                     objDouble=((Number)value).floatValue();
  819.                     stmt.setDouble(modifCol+1+offset,objDouble);
  820.                     break;
  821.                 }
  822.                 else if (value instanceof Object){
  823.                     stmt.setObject(modifCol+1+offset,value);
  824.                     break;
  825.                 }
  826.             case java.sql.Types.DOUBLE:
  827.                 double objDoub;
  828.                 if (value instanceof Double){
  829.                     objDoub=((Double)value).doubleValue();
  830.                     stmt.setDouble(modifCol+1+offset,objDoub);
  831.                     break;
  832.                 }
  833.                 else if (value instanceof String){
  834.                     objDoub = (Double.valueOf((String)value)).doubleValue();
  835.                     stmt.setDouble(modifCol+1+offset,objDoub);
  836.                     break;
  837.                 }
  838.                 else if(value instanceof Number){
  839.                     objDoub=((Number)value).doubleValue();
  840.                     stmt.setDouble(modifCol+1+offset,objDoub);
  841.                     break;
  842.                 }
  843.                 else if (value instanceof Object){
  844.                     stmt.setObject(modifCol+1+offset,value);
  845.                     break;
  846.                 }
  847.             case java.sql.Types.FLOAT:
  848.                 double objDoubleFloat;
  849.                 if (value instanceof Double){
  850.                     objDoubleFloat=((Double)value).doubleValue();
  851.                     stmt.setDouble(modifCol+1+offset,objDoubleFloat);
  852.                     break;
  853.                 }
  854.                 else if (value instanceof String){
  855.                     objDoubleFloat = (Double.valueOf((String)value)).doubleValue();
  856.                     stmt.setDouble(modifCol+1+offset,objDoubleFloat);
  857.                     break;
  858.                 }
  859.                 else if(value instanceof Number){
  860.                     objDoubleFloat=((Number)value).doubleValue();
  861.                     stmt.setDouble(modifCol+1+offset,objDoubleFloat);
  862.                     break;
  863.                 }
  864.                 else if (value instanceof Object){
  865.                     stmt.setObject(modifCol+1+offset,value);
  866.                     break;
  867.                 }
  868.             case java.sql.Types.DECIMAL:
  869.                 java.math.BigDecimal objDecimal;
  870.                 if (value instanceof java.math.BigDecimal){
  871.                     stmt.setBigDecimal(modifCol+1+offset,(java.math.BigDecimal)value);
  872.                     break;
  873.                 }
  874.                 else if (value instanceof String){
  875.                     double l = Double.valueOf((String)value).doubleValue();
  876.                     objDecimal =new  java.math.BigDecimal(l);
  877.                     stmt.setBigDecimal(modifCol+1+offset,objDecimal);
  878.                     break;
  879.                 }
  880.                 else if (value instanceof Number){
  881.                     double doub=((Number)value).doubleValue();
  882.                     objDecimal=new java.math.BigDecimal(doub);
  883.                     stmt.setBigDecimal(modifCol+1+offset,objDecimal);
  884.                     break;
  885.                 }
  886.                 else if (value instanceof Object){
  887.                     stmt.setObject(modifCol+1+offset,value);
  888.                     break;
  889.                 }
  890.             case java.sql.Types.NUMERIC:
  891.                 java.math.BigDecimal objNumeric;
  892.                 if (value instanceof java.math.BigDecimal){
  893.                     stmt.setBigDecimal(modifCol+1+offset,(java.math.BigDecimal)value);
  894.                     break;
  895.                 }
  896.                 else if (value instanceof String){
  897.                     double l = Double.valueOf((String)value).doubleValue();
  898.                     objNumeric = new java.math.BigDecimal(l);
  899.                     stmt.setBigDecimal(modifCol+1+offset,objNumeric);
  900.                     break;
  901.                 }
  902.                 else if (value instanceof Number){
  903.                     double doub=((Number)value).doubleValue();
  904.                     objDecimal=new java.math.BigDecimal(doub);
  905.                     stmt.setBigDecimal(modifCol+1+offset,objDecimal);
  906.                     break;
  907.                 }
  908.                 else if (value instanceof Object){
  909.                     stmt.setObject(modifCol+1+offset,value);
  910.                     break;
  911.                 }
  912.             case java.sql.Types.BIT:
  913.                 boolean objBool;
  914.                 if (value instanceof Boolean){
  915.                     objBool= ((Boolean)value).booleanValue();
  916.                     stmt.setBoolean(modifCol+1+offset,objBool);
  917.                     break;
  918.                 }
  919.                 else if (value instanceof String){
  920.                     objBool = (Boolean.valueOf((String)value)).booleanValue();
  921.                     stmt.setBoolean(modifCol+1+offset,objBool);
  922.                     break;
  923.                 }
  924.                 else if (value instanceof Object){
  925.                     stmt.setObject(modifCol+1+offset,value);
  926.                     break;
  927.                 }
  928.           case java.sql.Types.CHAR:
  929.                 String objChar;
  930.                 if (value instanceof String){
  931.                     stmt.setString(modifCol+1+offset,(String)value);
  932.                     break;
  933.                 }
  934.                 else if (value instanceof Object){
  935.                     stmt.setObject(modifCol+1+offset,value);
  936.                     break;
  937.                 }
  938.           case java.sql.Types.VARCHAR:
  939.                 String objVarChar;
  940.                 if (value instanceof String){
  941.                     stmt.setString(modifCol+1+offset,(String)value);
  942.                     break;
  943.                 }
  944.                 else if (value instanceof Object){
  945.                     stmt.setObject(modifCol+1+offset,value);
  946.                     break;
  947.                 }
  948.           case java.sql.Types.LONGVARCHAR:
  949.                 java.io.InputStream objInputStream;
  950.                 if (value instanceof java.io.InputStream){
  951.                     objInputStream=(java.io.InputStream)value;
  952.                     stmt.setAsciiStream(modifCol+1+offset,objInputStream,((String)value).length());
  953.                     break;
  954.                 }
  955.                 else if (value instanceof String){
  956.                     stmt.setString(modifCol+1+offset,(String)value);
  957.                     break;
  958.                 }
  959.                 else if (value instanceof Object){
  960.                     objInputStream=(java.io.InputStream)value;
  961.                     stmt.setAsciiStream(modifCol+1+offset,objInputStream,((String)value).length());
  962.                     break;
  963.                 }
  964.           case java.sql.Types.BINARY:
  965.                 stmt.setBytes(modifCol+1+offset,(byte[])value);
  966.                 break;
  967.           case java.sql.Types.VARBINARY:
  968.                 stmt.setBytes(modifCol+1+offset,(byte[])value);
  969.                 break;
  970.           case java.sql.Types.LONGVARBINARY:
  971.                 java.io.ByteArrayInputStream stream = (java.io.ByteArrayInputStream)value;
  972.                 stmt.setBinaryStream(modifCol+1+offset,stream,stream.available());
  973.                 break;
  974.           case java.sql.Types.DATE:
  975.                 java.sql.Date objDate;
  976.                 if (value instanceof java.sql.Date){
  977.                     stmt.setDate(modifCol+1+offset,(java.sql.Date)value);
  978.                     break;
  979.                 }
  980.                 else if (value instanceof String){
  981.                     objDate = java.sql.Date.valueOf((String)value);
  982.                     stmt.setDate(modifCol+1+offset,objDate);
  983.                     break;
  984.                 }
  985.                 else if (value instanceof Object){
  986.                     stmt.setObject(modifCol+1+offset,value);
  987.                     break;
  988.                 }
  989.           case java.sql.Types.TIME:
  990.                 java.sql.Time objTime;
  991.                 if (value instanceof java.sql.Time){
  992.                     stmt.setTime(modifCol+1+offset,(java.sql.Time)value);
  993.                     break;
  994.                 }
  995.                 else if (value instanceof String){
  996.                     objTime = java.sql.Time.valueOf((String)value);
  997.                     stmt.setTime(modifCol+1+offset,objTime);
  998.                     break;
  999.                 }
  1000.                 else if (value instanceof Object){
  1001.                     stmt.setObject(modifCol+1+offset,value);
  1002.                     break;
  1003.                 }
  1004.            case java.sql.Types.TIMESTAMP:
  1005.                 java.sql.Timestamp objTimestamp;
  1006.                 if (value instanceof java.sql.Timestamp){
  1007.                     stmt.setTimestamp(modifCol+1+offset,(java.sql.Timestamp)value);
  1008.                     break;
  1009.                 }
  1010.                 else if (value instanceof String){
  1011.                     objTimestamp = java.sql.Timestamp.valueOf((String)value);
  1012.                     stmt.setTimestamp(modifCol+1+offset,objTimestamp);
  1013.                     break;
  1014.                 }
  1015.                 else if (value instanceof Object){
  1016.                     stmt.setObject(modifCol+1+offset,value);
  1017.                     break;
  1018.                 }
  1019.          case java.sql.Types.OTHER:
  1020.                 stmt.setObject(modifCol+1+offset, value,type);
  1021.                 break;
  1022.          default:
  1023.                 throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  1024.         }
  1025.       }
  1026.       catch(SQLException e){
  1027.         throw e;
  1028.       }
  1029.       catch(Exception e){
  1030.         errorTreaten(e,PROCEDURE_NAME);
  1031.         throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  1032.       }
  1033.  
  1034.    }
  1035.  
  1036.     String modifyStatement(int x, String statement, int modifiedOccurences, String sep, String data){
  1037.         if (columnModifiedCondition(x)) {
  1038.             if (modifiedOccurences > 0)
  1039.                 statement += sep;
  1040.             statement += data;
  1041.         }
  1042.         return statement;
  1043.     }
  1044.  
  1045.        //adiacon 07.29
  1046.     //The syntax for a prepared Insert SQL is:
  1047.     // INSERT INTO table_name (col1,col2...) VALUES (?,?,)
  1048.     //Note: We assume that there is not an auto-incremental field in the row
  1049.     String makeInsertSQLString()
  1050.     {
  1051.        final String PROCEDURE_NAME="makeInsertSQLString";
  1052.        try{
  1053.             String    statement = new String();
  1054.             int modifiedOccurences=0;
  1055.             int colCount=getDataModel().getMemberCount();
  1056.             statement += "INSERT INTO ";
  1057.             statement += getDataModel().getModelName();
  1058.             statement += "( ";
  1059.             String resStatement=statement;
  1060.             for (int x = 0; x < colCount; x++, statement=resStatement)
  1061.             {
  1062.                 resStatement=modifyStatement( x, resStatement,modifiedOccurences,",",getDataModel().getMemberModel(x).getName());
  1063.                 if(!(resStatement.equals(statement)))
  1064.                     modifiedOccurences++;
  1065.  
  1066.             }
  1067.             modifiedOccurences=0;
  1068.             statement += " ) VALUES( ";
  1069.             resStatement=statement;
  1070.             for (int x = 0; x < colCount; x++,statement=resStatement)
  1071.             {
  1072.                resStatement= modifyStatement( x, statement,modifiedOccurences,",","?");
  1073.                if(!(resStatement.equals(statement)))
  1074.                     modifiedOccurences++;
  1075.             }
  1076.             statement += " )";
  1077.             return statement;
  1078.        }
  1079.        catch(Exception e){
  1080.         errorTreaten(e,PROCEDURE_NAME);
  1081.         throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  1082.       }
  1083.  
  1084.     }
  1085.  
  1086.  
  1087.  
  1088.  
  1089.     //adiacon 07.29
  1090.     //The syntax for a prepared Update SQL is:
  1091.     // UPDATE table_name SET col1=?,col2=?... WHERE col1 like ?,col2 like ?...
  1092.     //Note: The row is identified by all its components. For now we ignore a possible primary(s) key(s)
  1093.     String makeUpdateSQLString()
  1094.     {
  1095.         final String PROCEDURE_NAME="makeUpdateSQLString";
  1096.         try{
  1097.             String    statement = new String();
  1098.  
  1099.             statement += "UPDATE ";
  1100.             statement += getDataModel().getModelName();
  1101.             statement += " SET ";
  1102.             int length=getDataModel().getMemberCount();
  1103.             int modifiedOccurences=0;
  1104.             for (int x = 0; x < length; x++)
  1105.             {
  1106.  
  1107.                 if (columnModifiedCondition(x)){
  1108.                     if (modifiedOccurences > 0) statement += ",";
  1109.                     statement += getDataModel().getMemberModel(x).getName();
  1110.                     statement += " = ?";
  1111.                     modifiedOccurences++;
  1112.                 }
  1113.             }
  1114.             setColModif(modifiedOccurences);
  1115.             statement += " WHERE ";
  1116.             statement += getQueryPredicate("=");
  1117.             return statement;
  1118.         }
  1119.         catch(Exception e){
  1120.             errorTreaten(e,PROCEDURE_NAME);
  1121.             throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  1122.       }
  1123.     }
  1124.  
  1125.     //adiacon 07.29
  1126.     //The syntax for a prepared Delete SQL is:
  1127.     // DELETE FROM table_name WHERE col1 like ?,col2 like ?...
  1128.     //Note: The row is identified by all its components. For now we ignore a possible primary(s) key(s)
  1129.     String makeDeleteSQLString()
  1130.     {
  1131.         final String PROCEDURE_NAME="makeDeleteSQLString";
  1132.         try{
  1133.             String    statement = new String();
  1134.  
  1135.             statement += "DELETE FROM ";
  1136.             statement += getDataModel().getModelName();
  1137.             statement += " WHERE ";
  1138.             statement += getQueryPredicate("=");
  1139.             return statement;
  1140.         }
  1141.         catch(Exception e){
  1142.             errorTreaten(e,PROCEDURE_NAME);
  1143.             throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  1144.         }
  1145.  
  1146.     }
  1147.  
  1148.  
  1149.    public Enumeration querySimilarObjects(String whereClause, String[] sortOrder ) throws SQLException
  1150.     {
  1151.         return querySimilarObjects(whereClause,null,sortOrder);
  1152.     }
  1153.  
  1154.    public Enumeration querySimilarObjects(String whereClause,Synchronizable.JoinRecordList joinList, String[] sortOrder ) throws SQLException
  1155.     {
  1156.         final String PROCEDURE_NAME="querySimilarObjects";
  1157.  
  1158.         //PreparedStatement query;
  1159.         StringBuffer query = new StringBuffer(getSelectSQL());
  1160.         boolean isWhereClauseEmpty=true;
  1161.         if (whereClause != null) {
  1162.             StringTokenizer tokens = new StringTokenizer(whereClause, " ");
  1163.             if (tokens.countTokens() >= 2) {
  1164.                 String token1 = tokens.nextToken();
  1165.                 isWhereClauseEmpty=false;
  1166.                 if (!token1.equalsIgnoreCase("where")) {
  1167.                     query.append(" where ");
  1168.                 }
  1169.             }
  1170.             else {
  1171.                 query.append(" where ");
  1172.             }
  1173.             query.append(whereClause);
  1174.         }
  1175.         Enumeration joinEnum=null;
  1176.         if(joinList != null){
  1177.            joinEnum=joinList.getJoinRecords();
  1178.         }
  1179.  
  1180.         if(joinList != null && joinEnum.hasMoreElements()){
  1181.             if (isWhereClauseEmpty) {
  1182.                 query.append(" WHERE ");
  1183.             }
  1184.             int index=0;
  1185.             while(joinEnum.hasMoreElements()){
  1186.                 Synchronizable.JoinRecord joinItem=(Synchronizable.JoinRecord)joinEnum.nextElement();
  1187.                 Object masterValue=joinItem.getMasterCurrentValue();
  1188.                 if(index >0 || !isWhereClauseEmpty){
  1189.                     query.append(" AND ");
  1190.                 }
  1191.                 if(masterValue!=null){
  1192.                     query.append(joinItem.getDetailColumnName() +" " + joinItem.getOperator()+" "+  " ? ");
  1193.                 }
  1194.                 else{
  1195.                     query.append(joinItem.getDetailColumnName() +" IS NULL ");
  1196.                 }
  1197.                 index++;
  1198.             }
  1199.         }
  1200.  
  1201.  
  1202.         if (sortOrder != null && sortOrder.length > 0) {
  1203.             query.append(" order by ");
  1204.             for (int index = 0; index < sortOrder.length; index++) {
  1205.                 if (index > 0) {
  1206.                     query.append(",");
  1207.                 }
  1208.                 query.append(sortOrder[index]);
  1209.             }
  1210.         }
  1211.         JdbcConnection conBean = (JdbcConnection)getConnection();
  1212.         ResultSet rs=null;
  1213.         Enumeration rste=null;
  1214.         try {
  1215.             if(conBean.isConnectionClosed())
  1216.                 conBean.connect();
  1217.  
  1218.             //query=conBean.getJdbcConnection().prepareStatement(queryString);
  1219.             //setWhereClauseParameters(query,MODIFIED_VALUE,0,true);
  1220.             if(m_Statement!=null){
  1221.                 m_Statement.close();
  1222.             }
  1223.             m_Statement = prepareStatement(query.toString());
  1224.             if(joinList!=null)
  1225.             {
  1226.                 setQueryParameters(m_Statement,joinList);
  1227.             }
  1228.             rs = ((JdbcConnection)getConnection()).executeQuery(m_Statement, null);
  1229.             rste=resultSetToEnum(rs);
  1230.  
  1231.             return rste;
  1232.         }
  1233.         catch(SQLException e){
  1234.             throw e;
  1235.         }
  1236.         catch(Exception e){
  1237.             errorTreaten(e,PROCEDURE_NAME);
  1238.             throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  1239.         }
  1240.  
  1241.     }
  1242.  
  1243.     public void setQueryParameters(PreparedStatement stmt) throws SQLException
  1244.     {
  1245.         setQueryParameters(stmt,null);
  1246.     }
  1247.  
  1248.     public void setQueryParameters(PreparedStatement stmt,Synchronizable.JoinRecordList joinList) throws SQLException
  1249.     {
  1250.         Enumeration joinEnum=joinList.getJoinRecords();
  1251.         int index=0;
  1252.         while(joinEnum.hasMoreElements()){
  1253.             Synchronizable.JoinRecord joinItem=(Synchronizable.JoinRecord)joinEnum.nextElement();
  1254.             Object masterValue=joinItem.getMasterCurrentValue();
  1255.             if(masterValue!=null){
  1256.                 setObjectInStatement(stmt,masterValue,joinItem.getDetailColumnNumber() , index,0);
  1257.                 index++;
  1258.             }
  1259.  
  1260.         }
  1261.  
  1262.     }
  1263.  
  1264.     String getQueryString(String comparisonOperator) {
  1265.         final String PROCEDURE_NAME="getQueryString";
  1266.         final String where="WHERE";
  1267.         final int whereLength=where.length();
  1268.  
  1269.         final String orderby="ORDER BY";
  1270.         final int orderbyLength=orderby.length();
  1271.  
  1272.         String mdWhere="";
  1273.         String query = new String();
  1274.         String sql=getSelectSQL();
  1275.         String predicateWhere ="";
  1276.         String beforeOrderBy="";
  1277.         String beforeWhere="";
  1278.         String afterWhere="";
  1279.  
  1280.         String afterOrderby="";
  1281.  
  1282.         try{
  1283.             String predicate = getQueryPredicate(comparisonOperator);
  1284.             if (predicate.length() > 0) {
  1285.             }
  1286.             int posWhere=sql.indexOf(where);
  1287.             int posOrderby=sql.indexOf(orderby);
  1288.  
  1289.             if (posOrderby!=-1){
  1290.  
  1291.                 afterOrderby=sql.substring(posOrderby);
  1292.                 beforeOrderBy=sql.substring(0,posOrderby);
  1293.  
  1294.             }
  1295.             if (posWhere!=-1){
  1296.  
  1297.                 beforeWhere=sql.substring(0,posWhere);
  1298.                 afterWhere=sql.substring(posWhere +whereLength);
  1299.  
  1300.             }
  1301.  
  1302.             if (posWhere!=-1 && posOrderby!=-1){
  1303.  
  1304.                 query+=beforeOrderBy;
  1305.                 if (predicate.length() > 0) {
  1306.                     query+=" AND " + predicate;
  1307.                 }
  1308.                 query+=" " +afterOrderby;
  1309.             }
  1310.             else if (posWhere!=-1 && posOrderby==-1){
  1311.                     query+=sql;
  1312.                     if (predicate.length() > 0) {
  1313.                         query+=" AND " + predicate;
  1314.                     }
  1315.             }
  1316.             else if (posWhere==-1 && posOrderby!=-1){
  1317.                 query+=beforeOrderBy;
  1318.                 if (predicate.length() > 0) {
  1319.                         query+=" " + where + " "  + predicate;
  1320.                 }
  1321.                 query+=" " +afterOrderby;
  1322.             }
  1323.             else if (posOrderby==-1) {
  1324.                 query += sql;
  1325.                 if (predicate.length() > 0) {
  1326.                     predicateWhere += " "+ where +" " +predicate;
  1327.                     query+=predicateWhere;
  1328.                 }
  1329.  
  1330.             }
  1331.             return query;
  1332.         }
  1333.         catch(Exception e){
  1334.             errorTreaten(e,PROCEDURE_NAME);
  1335.             throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  1336.         }
  1337.     }
  1338.  
  1339.     protected boolean shouldColumnBeInWhereClause(ColumnMetaData colMD, int columnNumber)
  1340.     {
  1341.         return isColumnNeeded(colMD, columnNumber) && canColumnBeUsed(colMD);
  1342.     }
  1343.  
  1344.     protected boolean isColumnNeeded(ColumnMetaData colMD, int columnNumber)
  1345.     {
  1346.         DataModel model = (DataModel)getDataModel();
  1347.         boolean useAllColumns = !model.isUnique();
  1348.         return useAllColumns || columnModifiedCondition(columnNumber) || colMD.isPrimaryKey();
  1349.     }
  1350.  
  1351.     protected boolean canColumnBeUsed(ColumnMetaData colMD)
  1352.     {
  1353.         return colMD.canBeIncludedInWhereClause();
  1354.     }
  1355.  
  1356.     String getQueryPredicate(String comparisonOperator) {
  1357.         final String PROCEDURE_NAME="getQueryPredicate";
  1358.         String predicate = new String();
  1359.         try{
  1360.             ColumnMetaData colMD;
  1361.             int column;
  1362.             for (column = 0, colMD = getMemberModel(column);
  1363.                 colMD != null;
  1364.                 column++, colMD = getMemberModel(column)) {
  1365.                 if (shouldColumnBeInWhereClause(colMD, column)){
  1366.                         if (predicate.length() > 0) {
  1367.                             predicate += " AND ";
  1368.                         }
  1369.                         predicate += colMD.getColumnName();
  1370.                         if (isColumnNull(column)){
  1371.                             predicate+=IS_NULL;
  1372.                         }
  1373.                         else
  1374.                         {
  1375.                             predicate += " ";
  1376.                             predicate += comparisonOperator;
  1377.                             predicate += " ?";
  1378.                         }
  1379.                 }
  1380.             }
  1381.             return predicate;
  1382.         }
  1383.         catch(Exception e){
  1384.             errorTreaten(e,PROCEDURE_NAME);
  1385.             throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  1386.         }
  1387.     }
  1388.  
  1389.  
  1390.    ColumnMetaData getMemberModel(int column) {
  1391.         return (ColumnMetaData)getDataModel().getMemberModel(column);
  1392.     }
  1393.  
  1394.     // in the prepared statement replace the '?' pattern in the where clause by the values
  1395.     // from the m_ModifiedValues vector or from m_OriginalValues
  1396.     //if one value is null we replace with the '%'
  1397.     protected void setParameters(PreparedStatement stmt, int orig_modif, int offset,boolean queryByExample) throws SQLException{
  1398.         final String PROCEDURE_NAME="setParameters";
  1399.         ColumnMetaData colMD;
  1400.         Object value=null;
  1401.         int column,colIndex;
  1402.         try{
  1403.             for (column = colIndex=0, colMD = getMemberModel(column);
  1404.                 colMD != null;
  1405.                 column++,colIndex++, colMD = getMemberModel(column)) {
  1406.                 if (shouldColumnBeInWhereClause(colMD, column)) {
  1407.                     //the value from m_ModifiedValues vector or from m_OriginalValues
  1408.  
  1409.                     value = getValueAsObject(column, orig_modif);
  1410.                     if(value==null){
  1411.                         colIndex--;
  1412.                     }
  1413.                     else{
  1414.                         setObjectInStatement(stmt,value,column,offset,colIndex);
  1415.                     }
  1416.                 }
  1417.                 else
  1418.                 {
  1419.                     colIndex--;
  1420.                 }
  1421.             }
  1422.         }
  1423.         catch(SQLException e){
  1424.             throw e;
  1425.         }
  1426.         catch(Exception e){
  1427.             errorTreaten(e,PROCEDURE_NAME);
  1428.             throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  1429.         }
  1430.     }
  1431.  
  1432.     public String getDataName(String pattern){
  1433.         final String PROCEDURE_NAME="getDataName";
  1434.         try{
  1435.             if (getDataModel()==null)  return "";
  1436.             String strName=getDataModel().getModelName()+TableSeparator;
  1437.             int i;
  1438.             for(i=0;i<getDataModel().getMemberCount()-1;i++)
  1439.                 strName+=getDataModel().getMemberModel(i).getName()+pattern;
  1440.             strName+=getDataModel().getMemberModel(i).getName();
  1441.             //System.out.println("**"+strName);
  1442.             return strName;
  1443.         }
  1444.         catch(Exception e){
  1445.             errorTreaten(e,PROCEDURE_NAME);
  1446.             throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  1447.         }
  1448.     }
  1449.  
  1450.  
  1451.  
  1452.     public void initDataStorage() {
  1453.         int colCount=getDataModel().getMemberCount();
  1454.         m_OriginalValues = new Vector(colCount);
  1455.         m_ModifiedValues = new Vector(colCount);
  1456.         for (int x = 0; x < colCount; x++) {
  1457.             m_OriginalValues.addElement(null);
  1458.             m_ModifiedValues.addElement(null);
  1459.         }
  1460.  
  1461.     }
  1462.  
  1463.     private  Object setCastJDBCToJava(Object objSwitch,int colIndex)throws NumberFormatException
  1464.     {
  1465.         final String PROCEDURE_NAME="setCastJDBCToJava";
  1466.         Object objReturn=null;
  1467.         try{
  1468.             if(objSwitch==null){
  1469.                 return null;
  1470.             }
  1471.             switch(getMemberModel(colIndex).getType()){
  1472.                 case java.sql.Types.BIT:
  1473.                     if (objSwitch instanceof String){
  1474.                         objReturn= new Boolean((String)objSwitch);
  1475.                         break;
  1476.                     }
  1477.                     else if (objSwitch instanceof Object){
  1478.                             objReturn=(Boolean)objSwitch;
  1479.                             break;
  1480.                     }
  1481.                 case java.sql.Types.TINYINT:
  1482.                     if (objSwitch instanceof String){
  1483.                         objReturn= new Short ((String)objSwitch);
  1484.                         break;
  1485.                     }
  1486.                     else if (objSwitch instanceof Number){
  1487.                         objReturn=new Short(((Number)objSwitch).shortValue());
  1488.                         break;
  1489.                     }
  1490.                     else if (objSwitch instanceof Object){
  1491.                             objReturn=new Short(objSwitch.toString());
  1492.                             break;
  1493.                     }
  1494.                 case java.sql.Types.SMALLINT:
  1495.                     if (objSwitch instanceof String){
  1496.                         objReturn= new Short ((String)objSwitch);
  1497.                         break;
  1498.                     }
  1499.                     else if (objSwitch instanceof Number){
  1500.                         objReturn=new Short(((Number)objSwitch).shortValue());
  1501.                         break;
  1502.                     }
  1503.                     else if (objSwitch instanceof Object){
  1504.                             objReturn=(Short)objSwitch;
  1505.                             break;
  1506.                     }
  1507.                 case java.sql.Types.BIGINT:
  1508.                     if (objSwitch instanceof String){
  1509.                         objReturn= new Long ((String)objSwitch);
  1510.                         break;
  1511.                     }
  1512.                     else if (objSwitch instanceof Number){
  1513.                         objReturn=new Long(((Number)objSwitch).longValue());
  1514.                         break;
  1515.                     }
  1516.                     else if (objSwitch instanceof Object){
  1517.                             objReturn=(Long)objSwitch;
  1518.                             break;
  1519.                     }
  1520.                 case java.sql.Types.FLOAT:
  1521.                     if (objSwitch instanceof String){
  1522.                         objReturn= new Double ((String)objSwitch);
  1523.                         break;
  1524.                     }
  1525.                     else if (objSwitch instanceof Number){
  1526.                         objReturn=new Double(((Number)objSwitch).doubleValue());
  1527.                         break;
  1528.                     }
  1529.                     else if (objSwitch instanceof Object){
  1530.                             objReturn=(Double)objSwitch;
  1531.                             break;
  1532.                     }
  1533.                 case java.sql.Types.DOUBLE:
  1534.                     if (objSwitch instanceof String){
  1535.                         objReturn= new Double ((String)objSwitch);
  1536.                         break;
  1537.                     }
  1538.                     else if (objSwitch instanceof Number){
  1539.                         objReturn=new Double(((Number)objSwitch).doubleValue());
  1540.                         break;
  1541.                     }
  1542.                     else if (objSwitch instanceof Object){
  1543.                             objReturn=(Double)objSwitch;
  1544.                             break;
  1545.                     }
  1546.                 case java.sql.Types.REAL:
  1547.                     if (objSwitch instanceof String){
  1548.                         objReturn= new Float ((String)objSwitch);
  1549.                         break;
  1550.                     }
  1551.                     else if (objSwitch instanceof Number){
  1552.                         objReturn=new Float(((Number)objSwitch).floatValue());
  1553.                         break;
  1554.                     }
  1555.                     else if (objSwitch instanceof Object){
  1556.                             objReturn=(Float)objSwitch;
  1557.                             break;
  1558.                     }
  1559.                 case java.sql.Types.INTEGER:
  1560.                     if (objSwitch instanceof String){
  1561.                         objReturn=Integer.valueOf((String)objSwitch);
  1562.                         break;
  1563.                     }
  1564.                     else if (objSwitch instanceof Integer){
  1565.                         objReturn=objSwitch;
  1566.                         break;
  1567.                     }
  1568.                     else if (objSwitch instanceof Number){
  1569.                         objReturn=new Integer(((Number)objSwitch).intValue());
  1570.                         break;
  1571.                     }
  1572.                     else if (objSwitch instanceof Object){
  1573.                         objReturn=(Integer)objSwitch;
  1574.                         break;
  1575.                     }
  1576.                 case java.sql.Types.CHAR:
  1577.                     if (objSwitch instanceof String){
  1578.                         objReturn=objSwitch;
  1579.                         break;
  1580.                     }
  1581.                     else if (objSwitch instanceof Object){
  1582.                         objReturn=(String)objSwitch;
  1583.                         break;
  1584.                     }
  1585.                 case java.sql.Types.VARCHAR:
  1586.                     objReturn=(String)objSwitch;
  1587.                     break;
  1588.                 case java.sql.Types.LONGVARCHAR:
  1589.                     objReturn=objSwitch;
  1590.                     break;
  1591.                 case java.sql.Types.BINARY:
  1592.                     if (objSwitch instanceof String){
  1593.                         objReturn=((String)objSwitch).getBytes();
  1594.                     }
  1595.                     else{
  1596.                         objReturn=objSwitch;
  1597.                     }
  1598.                     break;
  1599.                 case java.sql.Types.VARBINARY:
  1600.                     if (objSwitch instanceof String){
  1601.                         objReturn=((String)objSwitch).getBytes();
  1602.                     }
  1603.                     else{
  1604.                         objReturn=objSwitch;
  1605.                     }
  1606.                     break;
  1607.                 case java.sql.Types.LONGVARBINARY:
  1608.                     objReturn=objSwitch;
  1609.                     break;
  1610.                 case java.sql.Types.NUMERIC:
  1611.                     if (objSwitch instanceof java.math.BigDecimal){
  1612.                         objReturn=(java.math.BigDecimal)objSwitch;
  1613.                         break;
  1614.                     }
  1615.  
  1616.                     else if (objSwitch instanceof String){
  1617.                         objReturn=new java.math.BigDecimal((String)objSwitch);
  1618.                         break;
  1619.                     }
  1620.                     else if (objSwitch instanceof Number){
  1621.                         objReturn=new java.math.BigDecimal(((Number)objSwitch).doubleValue());
  1622.                         break;
  1623.                     }
  1624.                     else if (objSwitch instanceof Object){
  1625.                         objReturn=(java.math.BigDecimal)objSwitch;
  1626.                         break;
  1627.                     }
  1628.                 case java.sql.Types.DECIMAL:
  1629.                     if (objSwitch instanceof java.math.BigDecimal){
  1630.                         objReturn=(java.math.BigDecimal)objSwitch;
  1631.                         break;
  1632.                     }
  1633.                     else if (objSwitch instanceof String){
  1634.                         objReturn=new java.math.BigDecimal((String)objSwitch);
  1635.                         break;
  1636.                     }
  1637.                     else if (objSwitch instanceof Number){
  1638.                         objReturn=new java.math.BigDecimal(((Number)objSwitch).doubleValue());
  1639.                         break;
  1640.                     }
  1641.  
  1642.                     else if (objSwitch instanceof Object){
  1643.                         objReturn=(java.math.BigDecimal)objSwitch;
  1644.                         break;
  1645.                     }
  1646.                 case java.sql.Types.DATE:
  1647.                     if (objSwitch instanceof java.sql.Date){
  1648.                         objReturn=objSwitch;
  1649.                         break;
  1650.                     }
  1651.                     else if (objSwitch instanceof String){
  1652.                         try{
  1653.                             objReturn=java.sql.Date.valueOf((String)objSwitch);
  1654.                         }
  1655.                         catch(Exception e){
  1656.                             throw new NumberFormatException("Can't convert to a date");
  1657.                         }
  1658.                         break;
  1659.                     }
  1660.                     else if (objSwitch instanceof Object){
  1661.                         objReturn=(java.sql.Date)objSwitch;
  1662.                         break;
  1663.                     }
  1664.                     break;
  1665.                 case java.sql.Types.TIME:
  1666.                     if (objSwitch instanceof java.sql.Time){
  1667.                         objReturn=objSwitch;
  1668.                         break;
  1669.                     }
  1670.                     else if (objSwitch instanceof String){
  1671.                         try{
  1672.                             objReturn=java.sql.Time.valueOf((String)objSwitch);
  1673.                         }
  1674.                         catch(Exception e){
  1675.                             throw new NumberFormatException("Can't convert to a date");
  1676.                         }
  1677.                         break;
  1678.                     }
  1679.                     else if (objSwitch instanceof Object){
  1680.                         objReturn=(java.sql.Time)objSwitch;
  1681.                         break;
  1682.                     }
  1683.                     break;
  1684.                 case java.sql.Types.TIMESTAMP:
  1685.                     if (objSwitch instanceof java.sql.Timestamp){
  1686.                         objReturn=objSwitch;
  1687.                         break;
  1688.                     }
  1689.                     if (objSwitch instanceof String){
  1690.                         try{
  1691.                             objReturn=java.sql.Timestamp.valueOf((String)objSwitch);
  1692.                         }
  1693.                         catch(Exception e){
  1694.                             throw new NumberFormatException("Can't convert to a date");
  1695.                         }
  1696.                         break;
  1697.                     }
  1698.                     else if (objSwitch instanceof Object){
  1699.                         objReturn=(java.sql.Timestamp)objSwitch;
  1700.  
  1701.                     }
  1702.                     break;
  1703.                 case java.sql.Types.OTHER:
  1704.                     objReturn=objSwitch;
  1705.                     break;
  1706.             }
  1707.         }
  1708.  
  1709.         catch(NumberFormatException e){
  1710.              throw e;
  1711.         }
  1712.         catch(ClassCastException e){
  1713.              throw e;
  1714.         }
  1715.         catch(Exception e){
  1716.             errorTreaten(e,PROCEDURE_NAME);
  1717.             throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  1718.         }
  1719.         return objReturn;
  1720.  
  1721.     }
  1722.  
  1723.  
  1724.  
  1725.     synchronized Object getObjectFromResultSet(int colIndex,ResultSet m_ResultSet) throws SQLException
  1726.     {
  1727.         final String PROCEDURE_NAME="getObjectFromResultSet";
  1728.         int scale=0;
  1729.         Object retObject=null;
  1730.         int type=getMemberModel(colIndex).getType();
  1731.         try{
  1732.             switch(type){
  1733.                 case java.sql.Types.TINYINT:
  1734.                     retObject=new Short(m_ResultSet.getShort(colIndex+1));
  1735.                     //retObject=new Short(modifyValue(retObject,colIndex, Byte.MAX_VALUE).shortValue());
  1736.                     break;
  1737.                 case java.sql.Types.SMALLINT:
  1738.                     retObject=new Short(m_ResultSet.getShort(colIndex+1));
  1739.                     break;
  1740.                 case java.sql.Types.INTEGER:
  1741.                     retObject=new Integer(m_ResultSet.getInt(colIndex+1));
  1742.                     break;
  1743.                 case java.sql.Types.BIGINT:
  1744.                     retObject=new Long(m_ResultSet.getLong(colIndex+1));
  1745.                     break;
  1746.                 case java.sql.Types.REAL:
  1747.                     retObject=new Float(m_ResultSet.getFloat(colIndex+1));
  1748.                     break;
  1749.                 case java.sql.Types.FLOAT:
  1750.                     retObject=new Double(m_ResultSet.getDouble(colIndex+1));
  1751.                     break;
  1752.                 case java.sql.Types.DOUBLE:
  1753.                     retObject=new Double(m_ResultSet.getDouble(colIndex+1));
  1754.                     break;
  1755.                 case java.sql.Types.DECIMAL:
  1756.                     scale=m_ResultSet.getMetaData().getScale(colIndex+1);
  1757.                     retObject=m_ResultSet.getBigDecimal(colIndex+1,scale);
  1758.                     break;
  1759.                 case java.sql.Types.NUMERIC:
  1760.                     scale=m_ResultSet.getMetaData().getScale(colIndex);
  1761.                     retObject=m_ResultSet.getBigDecimal(colIndex+1,scale);
  1762.                     break;
  1763.                 case java.sql.Types.BIT:
  1764.                     retObject=new Boolean(m_ResultSet.getBoolean(colIndex+1));
  1765.                     break;
  1766.                 case java.sql.Types.CHAR:
  1767.                     retObject=m_ResultSet.getString(colIndex+1);
  1768.                     break;
  1769.                 case java.sql.Types.VARCHAR:
  1770.                     retObject=m_ResultSet.getString(colIndex+1);
  1771.                     break;
  1772.                 case java.sql.Types.LONGVARCHAR:
  1773.                     StringBuffer buf=null;
  1774.                     String value=null;
  1775.                     java.io.InputStream ras=m_ResultSet.getAsciiStream(colIndex+1);
  1776.                     java.io.DataInputStream dis = new java.io.DataInputStream(ras);
  1777.                     String s = dis.readLine();
  1778.                     buf = new StringBuffer();
  1779.                     while(s != null){
  1780.                         buf.append(s);
  1781.                         buf.append("\n");
  1782.                         s = dis.readLine();
  1783.                     }
  1784.                     value = buf.toString();
  1785.                     retObject=value;
  1786.                     break;
  1787.                 case java.sql.Types.BINARY:
  1788.                     retObject=m_ResultSet.getBytes(colIndex+1);
  1789.                     break;
  1790.                 case java.sql.Types.VARBINARY:
  1791.                     retObject=m_ResultSet.getBytes(colIndex+1);
  1792.                     break;
  1793.                 case java.sql.Types.LONGVARBINARY:
  1794.                     java.io.InputStream in= m_ResultSet.getBinaryStream(colIndex+1);
  1795.                     java.io.ByteArrayOutputStream baos=new java.io.ByteArrayOutputStream ();
  1796.                     byte buff[]=new byte[4096];
  1797.                     for(;;){
  1798.                         int size=in.read(buff);
  1799.                         if(size==-1){
  1800.                             break;
  1801.                         }
  1802.                         baos.write(buff,0,size);
  1803.                     }
  1804.                     retObject=baos;
  1805.                     break;
  1806.                 case java.sql.Types.DATE:
  1807.                     retObject=m_ResultSet.getDate(colIndex+1);
  1808.                     break;
  1809.                 case java.sql.Types.TIME:
  1810.                     retObject=m_ResultSet.getTime(colIndex+1);
  1811.                     break;
  1812.                 case java.sql.Types.TIMESTAMP:
  1813.                     retObject=m_ResultSet.getTimestamp(colIndex+1);
  1814.                     break;
  1815.                 case java.sql.Types.OTHER:
  1816.                     retObject=m_ResultSet.getObject(colIndex+1);
  1817.                     break;
  1818.                 default:
  1819.                     throw new SQLException("Call getObjectFromResultSet with an invalid java.sql.Type");
  1820.             }
  1821.             return retObject;
  1822.         }
  1823.         catch(SQLException e){
  1824.              throw e;
  1825.         }
  1826.         catch(Exception e){
  1827.             errorTreaten(e,PROCEDURE_NAME);
  1828.             throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  1829.         }
  1830.     }
  1831.  
  1832.  
  1833.  
  1834.         /**
  1835.     *  Undoes the changes on the current row .
  1836.     */
  1837.     public synchronized void undoChanges() {
  1838.         Enumeration   enum = m_OriginalValues.elements();
  1839.         m_ModifiedValues = new Vector();
  1840.         while (enum.hasMoreElements()) {
  1841.             Object  value = enum.nextElement();
  1842.             m_ModifiedValues.addElement(value);
  1843.         }
  1844.         setMarkedAsModified(false);
  1845.         setMarkedAsDeleted(false);
  1846.         setMarkedAsDisplaced(false);
  1847.     }
  1848.  
  1849.  
  1850.     public synchronized void setMarkedAsNew(boolean markedAsNew) {
  1851.         try{
  1852.             if(markedAsNew)
  1853.                 recordState.setState(RecordState.INSERTED);
  1854.             else
  1855.                 recordState.setStateUndo(RecordState.INSERTED);
  1856.         }
  1857.         catch(RecordState.StateException e){
  1858.             throw new RecordDefinitionException("The row was found in a invalid state");
  1859.         }
  1860.  
  1861.     }
  1862.  
  1863.     public synchronized boolean getMarkedAsNew() {
  1864.         return (recordState.getExternalState()==RecordState.INSERTED_STATE);
  1865.     }
  1866.  
  1867.     public synchronized void setMarkedAsDeleted(boolean markedAsDeleted) {
  1868.        try{
  1869.            if(markedAsDeleted)
  1870.                 recordState.setState(RecordState.DELETED);
  1871.             else
  1872.                 recordState.setStateUndo(RecordState.DELETED);
  1873.        }
  1874.        catch(RecordState.StateException e){
  1875.             throw new RecordDefinitionException("The row was found in a invalid state");
  1876.         }
  1877.     }
  1878.  
  1879.     public  boolean getMarkedAsDeleted() {
  1880.         return (recordState.getExternalState()==RecordState.DELETED_STATE);
  1881.     }
  1882.  
  1883.  
  1884.     public  boolean getMarkedAsMisplaced() {
  1885.         return (recordState.isMisplaced());
  1886.     }
  1887.  
  1888.  
  1889.     public synchronized void setMarkedAsDisplaced(boolean markedAsMisplaced) {
  1890.         try{
  1891.             if(markedAsMisplaced)
  1892.                 recordState.setState(RecordState.MISPLACED);
  1893.             else
  1894.                 recordState.setStateUndo(RecordState.MISPLACED);
  1895.         }
  1896.  
  1897.         catch(RecordState.StateException e){
  1898.             throw new RecordDefinitionException("The row was found in a invalid state");
  1899.         }
  1900.     }
  1901.  
  1902.  
  1903.     public synchronized void setMarkedAsModified(boolean markedAsModified) {
  1904.         try{
  1905.             if(markedAsModified)
  1906.                 recordState.setState(RecordState.MODIFIED);
  1907.             else
  1908.                 recordState.setStateUndo(RecordState.MODIFIED);
  1909.         }
  1910.  
  1911.         catch(RecordState.StateException e){
  1912.             throw new RecordDefinitionException("The row was found in a invalid state");
  1913.         }
  1914.     }
  1915.  
  1916.     public synchronized boolean getMarkedAsModified() {
  1917.         return (recordState.getExternalState()==RecordState.MODIFIED_STATE);
  1918.     }
  1919.  
  1920.     void bringUpToDate() {
  1921.         Enumeration   enum = m_ModifiedValues.elements();
  1922.         m_OriginalValues = new Vector();
  1923.         while (enum.hasMoreElements()) {
  1924.             Object  value = enum.nextElement();
  1925.             m_OriginalValues.addElement(value);
  1926.         }
  1927.         setMarkedAsModified(false);
  1928.     }
  1929.  
  1930.  
  1931.  
  1932.  
  1933.     public DataModel generateDataModel() throws SQLException
  1934.     {
  1935.     final String PROCEDURE_NAME="getMetaData";
  1936.     Vector primaryKeyNames=new Vector(0);
  1937.     Vector indexUniqueNames=new Vector(0);
  1938.     DataModel model = new DataModel();
  1939.     String tableName=getTableName();
  1940.     String col[]=getColumns();
  1941.     Statement stmt =null;
  1942.     ResultSet rs=null;
  1943.     try {
  1944.             model.setTableName(tableName);
  1945.             ColumnMetaData colMetaData;
  1946.             DatabaseMetaData dbMetaData = getDatabaseMetaData();
  1947.             ResultSet primaryKeysMetaDataResultSet = null;
  1948.             ResultSet indexMetaDataResultSet = null;
  1949.             try {
  1950.                 primaryKeysMetaDataResultSet = dbMetaData.getPrimaryKeys(null,null,tableName.substring(tableName.indexOf(".")+1));
  1951.                 while (primaryKeysMetaDataResultSet.next()){
  1952.                     String primaryKeyName = primaryKeysMetaDataResultSet.getString(4);
  1953.                     primaryKeyNames.addElement(removeBrackets(primaryKeyName));
  1954.                 }
  1955.             }
  1956.             catch (SQLException ex) {
  1957.                 // swallow it.
  1958.             }
  1959.             finally {
  1960.                 if (primaryKeysMetaDataResultSet != null) {
  1961.                     primaryKeysMetaDataResultSet.close();
  1962.                 }
  1963.             }
  1964.  
  1965.             try {
  1966.                 if (primaryKeyNames.isEmpty()){
  1967.                     indexMetaDataResultSet = dbMetaData.getIndexInfo(null,null,tableName.substring(tableName.indexOf(".")+1),true,false);
  1968.                     while (indexMetaDataResultSet.next()){
  1969.                     String indexUniqueName = indexMetaDataResultSet.getString(9);
  1970.                         indexUniqueNames.addElement(removeBrackets(indexUniqueName));
  1971.                     }
  1972.                 }
  1973.             }
  1974.             catch (SQLException ex) {
  1975.                 // swallow it.
  1976.             }
  1977.             finally {
  1978.                 if (indexMetaDataResultSet != null) {
  1979.                     indexMetaDataResultSet.close();
  1980.                 }
  1981.             }
  1982.  
  1983.             stmt = createStatement();
  1984.             rs = ((JdbcConnection)getConnection()).executeQuery(stmt, getSelectSQL());
  1985.             ResultSetMetaData rsMetaData = rs.getMetaData();
  1986.             int numCols =rsMetaData.getColumnCount();
  1987.             for(int i=1;i<=numCols;i++) {
  1988.                 colMetaData = new ColumnMetaData();
  1989.                 String columnName = "";
  1990.                 try {
  1991.                     columnName = rsMetaData.getColumnName(i);
  1992.                 }
  1993.                 catch (SQLException ex) {
  1994.                     // swallow it.
  1995.                 }
  1996.                 colMetaData.setColumnName(columnName);
  1997.                 if (!primaryKeyNames.isEmpty() && primaryKeyNames.contains(columnName)){
  1998.                     colMetaData.setPrimaryKey(true);
  1999.                     model.setUnique(true);
  2000.                 }
  2001.                 else {
  2002.                     if (!indexUniqueNames.isEmpty() && indexUniqueNames.contains(columnName)){
  2003.                         colMetaData.setPrimaryKey(true);
  2004.                         model.setUnique(true);
  2005.                     }
  2006.                 }
  2007.  
  2008.                 try {
  2009.                     int columnType = rsMetaData.getColumnType(i);
  2010.                     colMetaData.setColumnDataType(columnType);
  2011.                 }
  2012.                 catch(SQLException e){
  2013.                     //swallow it; for flat DB
  2014.                 }
  2015.                 try{
  2016.                     colMetaData.setIsComparable(rsMetaData.isSearchable(i));
  2017.                     }
  2018.                 catch(SQLException e){
  2019.                     //swallow it; for flat DB
  2020.                 }
  2021.                 try{
  2022.                     colMetaData.setIsAutoIncrement(rsMetaData.isAutoIncrement(i));
  2023.                     }
  2024.                 catch(SQLException e){
  2025.                     //swallow it; for flat DB
  2026.                 }
  2027.                 try{
  2028.                     colMetaData.setIsReadOnly(rsMetaData.isReadOnly(i));
  2029.                     }
  2030.                 catch(SQLException e){
  2031.                     //swallow it; for flat DB
  2032.                 }
  2033.                 try{
  2034.                     colMetaData.setIsSigned(rsMetaData.isSigned(i));
  2035.                     }
  2036.                 catch(SQLException e){
  2037.                     //swallow it; for flat DB
  2038.                 }
  2039.  
  2040.                 model.addColumnMetaData(colMetaData);
  2041.             }
  2042.             setDataModel(model);
  2043.             return model;
  2044.     }
  2045.     catch(SQLException e){
  2046.              throw e;
  2047.     }
  2048.     catch(Exception e){
  2049.             errorTreaten(e,PROCEDURE_NAME);
  2050.             throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  2051.     }
  2052.     finally{
  2053.  
  2054.         if(rs!=null){
  2055.             rs.close();
  2056.         }
  2057.         if(stmt!=null){
  2058.             stmt.close();
  2059.         }
  2060.     }
  2061.     }
  2062.  
  2063.     String removeBrackets(String text)
  2064.     {
  2065.         if(text==null){
  2066.             return null;
  2067.         }
  2068.         if (text.startsWith("[") && text.endsWith("]")) {
  2069.             text = text.substring(1, text.length() -1);
  2070.         }
  2071.         return text;
  2072.     }
  2073.  
  2074.     private boolean equalsColumn(Vector orig, int i, Vector modif){
  2075.         Object original= orig.elementAt(i);
  2076.         Object modified=modif.elementAt(i);
  2077.         try{
  2078.             if(original==null && modified ==null)
  2079.                 return true;
  2080.             else if (original==null && modified !=null)
  2081.                 return modified.equals(original);
  2082.             else if (original!=null && modified ==null)
  2083.                 return original.equals(modified);
  2084.             else if (original!=null && modified !=null)
  2085.                 return modified.toString().equals(original.toString());
  2086.             else
  2087.                 return false;
  2088.         }
  2089.         catch(Exception e){
  2090.             //if something wrong we'd rather to assume that the values are different
  2091.             return false;
  2092.         }
  2093.     }
  2094.     public boolean isDirty(){
  2095.         return (!equalsVector(m_OriginalValues,m_ModifiedValues) || recordState.getExternalState()!=RecordState.EXISTING_STATE);
  2096.     }
  2097.  
  2098.     private synchronized boolean equalsVector(Vector orig,Vector modif){
  2099.         final String PROCEDURE_NAME="equalsVector";
  2100.         boolean valRet=true;
  2101.         if(orig==null && modif==null){
  2102.             return true;
  2103.         }
  2104.         else if((orig==null && modif!=null)||(orig!=null && modif==null)){
  2105.             return false;
  2106.         }
  2107.         int sizeOrig=orig.size();
  2108.         int sizeModif=modif.size();
  2109.         if (sizeOrig!=sizeModif){
  2110.             return false;
  2111.         }
  2112.         for(int i=0; i<sizeOrig;i++){
  2113.             valRet=valRet && equalsColumn(orig,i,modif);
  2114.             if(!valRet){
  2115.                 break;
  2116.             }
  2117.         }
  2118.         return valRet;
  2119.     }
  2120.  
  2121.  
  2122.     public boolean equals(RecordDefinition rDef){
  2123.         final String PROCEDURE_NAME="equals";
  2124.         boolean valRet=false;
  2125.         int size=rDef.m_OriginalValues.size();
  2126.         try{
  2127.             boolean condModVector=false;
  2128.             boolean condOrigVector=(rDef.m_OriginalValues.size()==m_OriginalValues.size());
  2129.             if(condOrigVector){
  2130.                 for(int i=0;i<size;i++){
  2131.                     condOrigVector=(condOrigVector && equalsColumn(rDef.m_OriginalValues,i,m_OriginalValues));
  2132.                     if (!condOrigVector)
  2133.                         break;
  2134.                 }
  2135.             }
  2136.  
  2137.             if(condOrigVector){
  2138.                 condModVector=(rDef.m_ModifiedValues.size()==m_ModifiedValues.size());
  2139.                 if(condModVector){
  2140.                     for(int i=0;i<size;i++){
  2141.                         condModVector=(condModVector && equalsColumn(rDef.m_ModifiedValues,i,m_ModifiedValues));
  2142.                         if (!condModVector)
  2143.                         break;
  2144.                     }
  2145.                 }
  2146.             }
  2147.             valRet=condOrigVector && condModVector ;
  2148.             return valRet;
  2149.  
  2150.         }
  2151.         catch(Exception e){
  2152.             errorTreaten(e,PROCEDURE_NAME);
  2153.             throw new RecordDefinitionException(UNEXPECTED_ERROR_MESSAGE + PROCEDURE_NAME);
  2154.         }
  2155.     }
  2156.  
  2157.     public String getSelectSQL()
  2158.     {
  2159.         String sql = null;
  2160.         if (sql == null) {
  2161.             sql = "SELECT ";
  2162.             String tableName=getTableName();
  2163.             String col[]=getColumns();
  2164.  
  2165.             if (col == null || col.length==0){
  2166.                 sql+=" * FROM ";
  2167.             }
  2168.             else {
  2169.                 for(int i=0; i<col.length-1;i++){
  2170.                     sql+=col[i] + ",";
  2171.                 }
  2172.                 sql+=col[col.length-1] + " FROM ";
  2173.             }
  2174.             sql+=tableName;
  2175.         }
  2176.  
  2177.         return sql;
  2178.     }
  2179.  
  2180.     public Object getKey()
  2181.     {
  2182.         return getClass().getName();
  2183.     }
  2184.  
  2185.     protected class DesignTimeProperties
  2186.     {
  2187.         String              connectionName = "";
  2188.         String              managerClassName = "";
  2189.         String              tableName;
  2190.         String[]            columns = null;
  2191.     }
  2192.     protected static Hashtable m_DesignTimePropertiesTable = new Hashtable();
  2193.  
  2194.     protected DesignTimeProperties getDesignTimeProperties()
  2195.     {
  2196.         DesignTimeProperties properties = null;
  2197.  
  2198.         if (m_DesignTimePropertiesTable.containsKey(getKey())) {
  2199.             properties = (DesignTimeProperties)m_DesignTimePropertiesTable.get(getKey());
  2200.         }
  2201.         else {
  2202.             properties = new DesignTimeProperties();
  2203.             m_DesignTimePropertiesTable.put(getKey(), properties);
  2204.         }
  2205.         return properties;
  2206.     }
  2207.  
  2208.     protected void replaceDesignTimeProperties(DesignTimeProperties newProperties)
  2209.     {
  2210.         DesignTimeProperties oldProperties = getDesignTimeProperties();
  2211.         oldProperties.connectionName = newProperties.connectionName;
  2212.         oldProperties.managerClassName = newProperties.managerClassName;
  2213.         oldProperties.tableName = newProperties.tableName;
  2214.         oldProperties.columns = newProperties.columns;
  2215.     }
  2216.  
  2217.     public synchronized void setConnectionName(String propertyValue)
  2218.     {
  2219.         DesignTimeProperties properties = getDesignTimeProperties();
  2220.         properties.connectionName = propertyValue;
  2221.         replaceDesignTimeProperties(properties);
  2222.     }
  2223.     public synchronized String getConnectionName()
  2224.     {
  2225.         DesignTimeProperties properties = getDesignTimeProperties();
  2226.         return properties.connectionName;
  2227.     }
  2228.  
  2229.     public synchronized void setConnectionManagerClassName(String propertyValue)
  2230.     {
  2231.         DesignTimeProperties properties = getDesignTimeProperties();
  2232.         properties.managerClassName = propertyValue;
  2233.         replaceDesignTimeProperties(properties);
  2234.     }
  2235.     public synchronized String getConnectionManagerClassName()
  2236.     {
  2237.         DesignTimeProperties properties = getDesignTimeProperties();
  2238.         return properties.managerClassName;
  2239.     }
  2240.  
  2241.     public synchronized void setTableName(String propertyValue)
  2242.     {
  2243.         DesignTimeProperties properties = getDesignTimeProperties();
  2244.         properties.tableName = propertyValue;
  2245.         replaceDesignTimeProperties(properties);
  2246.     }
  2247.     public synchronized String getTableName()
  2248.     {
  2249.         DesignTimeProperties properties = getDesignTimeProperties();
  2250.         return properties.tableName;
  2251.     }
  2252.  
  2253.     public synchronized void addColumn(String propertyValue)
  2254.     {
  2255.         DesignTimeProperties properties = getDesignTimeProperties();
  2256.         if (properties.columns == null) {
  2257.             properties.columns = new String[1];
  2258.             properties.columns[0] = propertyValue;
  2259.         }
  2260.         else {
  2261.             int length = properties.columns.length;
  2262.             String[] temp = new String[length + 1];
  2263.             System.arraycopy(properties.columns, 0, temp, 0, length);
  2264.             temp[length] = propertyValue;
  2265.             properties.columns = temp;
  2266.         }
  2267.         replaceDesignTimeProperties(properties);
  2268.     }
  2269.  
  2270.     public synchronized void setColumns(String[] propertyValue)
  2271.     {
  2272.         DesignTimeProperties properties = getDesignTimeProperties();
  2273.         properties.columns = propertyValue;
  2274.         replaceDesignTimeProperties(properties);
  2275.     }
  2276.     public synchronized String[] getColumns()
  2277.     {
  2278.         DesignTimeProperties properties = getDesignTimeProperties();
  2279.         return properties.columns;
  2280.     }
  2281.  
  2282.     protected class RunTimeProperties
  2283.     {
  2284.         ConnectionManager   connectionManager = null;
  2285.         JdbcConnection      jdbcConnection = null;
  2286.     }
  2287.     protected static Hashtable m_RunTimePropertiesTable = new Hashtable();
  2288.  
  2289.     protected RunTimeProperties getRunTimeProperties()
  2290.     {
  2291.         RunTimeProperties properties = null;
  2292.  
  2293.         if (m_RunTimePropertiesTable.containsKey(getKey())) {
  2294.             properties = (RunTimeProperties)m_RunTimePropertiesTable.get(getKey());
  2295.         }
  2296.         else {
  2297.             properties = new RunTimeProperties();
  2298.             m_RunTimePropertiesTable.put(getKey(), properties);
  2299.         }
  2300.         return properties;
  2301.     }
  2302.  
  2303.     protected void replaceRunTimeProperties(RunTimeProperties newProperties)
  2304.     {
  2305.         RunTimeProperties oldProperties = getRunTimeProperties();
  2306.         oldProperties.connectionManager = newProperties.connectionManager;
  2307.         oldProperties.jdbcConnection = newProperties.jdbcConnection;
  2308.     }
  2309.  
  2310.     public ConnectionManager getConnectionManager()
  2311.     {
  2312.         RunTimeProperties runTimeProperties = getRunTimeProperties();
  2313.  
  2314.         if (runTimeProperties.connectionManager == null) {
  2315.             String className = getConnectionManagerClassName();
  2316.             runTimeProperties.connectionManager = ConnectionManager.getManager(className);
  2317.             replaceRunTimeProperties(runTimeProperties);
  2318.         }
  2319.  
  2320.         return runTimeProperties.connectionManager;
  2321.     }
  2322.  
  2323.     public Connection getConnection()
  2324.     {
  2325.         RunTimeProperties properties = getRunTimeProperties();
  2326.  
  2327.         if (properties.jdbcConnection == null) {
  2328.             try {
  2329.                 ConnectionManager connectionManager = getConnectionManager();
  2330.                 String connectionName = getConnectionName();
  2331.                 properties.jdbcConnection = connectionManager.getConnectionBean(connectionName);
  2332.             }
  2333.             catch (SQLException ex) {
  2334.                 throw new RuntimeException(ex.getMessage());
  2335.             }
  2336.             replaceRunTimeProperties(properties);
  2337.         }
  2338.  
  2339.         return properties.jdbcConnection;
  2340.     }
  2341.  
  2342.     public void releaseConnection()
  2343.     {
  2344.         getConnectionManager().releaseConnection(getConnectionName());
  2345.     }
  2346.  
  2347.     protected PreparedStatement prepareStatement(String sql) throws SQLException
  2348.     {
  2349.         JdbcConnection connection = (JdbcConnection)getConnection();
  2350.         return connection.prepareStatement(sql);
  2351.     }
  2352.  
  2353.     protected Statement createStatement() throws SQLException
  2354.     {
  2355.         JdbcConnection connection = (JdbcConnection)getConnection();
  2356.         return connection.createStatement();
  2357.     }
  2358.  
  2359.     protected DatabaseMetaData getDatabaseMetaData() throws SQLException
  2360.     {
  2361.         JdbcConnection connection = (JdbcConnection)getConnection();
  2362.         return connection.getMetaData();
  2363.     }
  2364. }