1 32 33 package com.knowgate.datacopy; 34 35 import java.util.HashMap ; 36 import java.util.Iterator ; 37 38 import java.sql.Connection ; 39 import java.sql.Statement ; 40 import java.sql.PreparedStatement ; 41 import java.sql.ResultSet ; 42 import java.sql.SQLException ; 43 44 import com.knowgate.debug.DebugFile; 45 import com.knowgate.misc.Gadgets; 46 47 public class DataTransformation { 48 49 public DataTransformation() { 50 Values = new HashMap (); 51 } 52 53 public DataTransformation(String sOpDesc, String sOrTable, String sOrField, 54 String sTrTable, String sTrField) { 55 Values = new HashMap (); 56 57 if (sOpDesc.equalsIgnoreCase("NEXTVAL") || 58 sOpDesc.equalsIgnoreCase("REFER")) { 59 NextVals = new HashMap (); 60 NextVals.put(sTrTable + "." + sTrField, new Integer (0)); 61 } 62 63 setOperation (sOpDesc); 64 OriginTable = sOrTable; 65 OriginField = sOrField; 66 TargetTable = sTrTable; 67 TargetField = sTrField; 68 } 69 70 public DataTransformation(int iOpCode, String sOrTable, String sOrField, 71 String sTrTable, String sTrField, 72 String sRfTable, String sRfField, 73 String sIfNull) { 74 Values = new HashMap (); 75 76 if (Operations.NEXTVAL==iOpCode || Operations.REFER==iOpCode) { 77 NextVals = new HashMap (); 78 NextVals.put(sTrTable + "." + sTrField, new Integer (0)); 79 } 80 81 OperationCode = iOpCode; 82 OriginTable = sOrTable; 83 OriginField = sOrField; 84 TargetTable = sTrTable; 85 TargetField = sTrField; 86 ReferedTable= sRfTable; 87 ReferedField= sRfField; 88 IfNullValue = sIfNull; 89 } 90 91 93 private void setOperation(String sOpDesc) { 94 104 int iLeft; 105 int iRight; 106 int iDot; 107 108 if (sOpDesc.equalsIgnoreCase("NEWGUID")) 109 OperationCode = Operations.NEWGUID; 110 else if (sOpDesc.equalsIgnoreCase("NEXTVAL")) { 111 OperationCode = Operations.NEXTVAL; 112 } 113 else if (sOpDesc.equalsIgnoreCase("REFERENCED")) { 114 OperationCode = Operations.REFERENCED; 115 } 116 else if (sOpDesc.startsWith("IFNULL")) { 117 OperationCode = Operations.IFNULL; 118 iLeft = sOpDesc.indexOf("(") + 1; 119 iRight = sOpDesc.lastIndexOf(")"); 120 IfNullValue = sOpDesc.substring(iLeft, iRight).trim(); 121 } 122 else if (sOpDesc.startsWith("REFER")) { 123 OperationCode = Operations.REFER; 124 iLeft = sOpDesc.indexOf("(") + 1; 125 iRight = sOpDesc.lastIndexOf(")"); 126 iDot = sOpDesc.indexOf("."); 127 ReferedTable = sOpDesc.substring(iLeft , iDot); 128 ReferedField = sOpDesc.substring(iDot+1, iRight); 129 } 130 } 132 134 public void setReferedValues(DataTransformation oDataTransf) { 135 ReferedValues = oDataTransf.Values; 136 } 137 138 140 private String IncOffset(String sTrTable, String sTrField) { 141 String sKey = sTrTable + "." + sTrField; 142 Integer iOldOffset = (Integer ) NextVals.get(sKey); 143 Integer iNewOffset = new Integer (iOldOffset.intValue()+1); 144 145 NextVals.remove(sKey); 146 NextVals.put(sKey, iNewOffset); 147 148 return iNewOffset.toString(); 149 } 150 151 153 private Integer getNextVal(Connection oTrConn) throws SQLException { 154 Integer oRetVal; 155 Object oMax; 156 Statement oStmt; 157 ResultSet oRSet; 158 Iterator oIter; 159 160 oStmt = oTrConn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); 161 162 oRSet = oStmt.executeQuery("SELECT MAX(" + TargetField + ")+" + IncOffset(TargetTable,TargetField) + " FROM " + TargetTable); 163 164 if (oRSet.next()) { 165 oMax = oRSet.getObject(1); 166 if (oRSet.wasNull()) 167 oRetVal = new Integer (1); 168 else 169 oRetVal = new Integer (oMax.toString()); 170 } 171 else { 172 oRetVal = new Integer (1); 173 } 174 oRSet.close(); 175 oStmt.close(); 176 177 if (Operations.REFER==OperationCode) { 180 oIter = ReferedValues.values().iterator(); 181 while (oIter.hasNext()) 182 if (((Integer ) oIter.next()).intValue()==oRetVal.intValue()) { 183 if (DebugFile.trace) DebugFile.writeln("Remapping " + TargetTable + "." + TargetField); 184 oRetVal = getNextVal(oTrConn); 185 break; 186 } 187 oIter = null; 189 } 190 191 return oRetVal; 192 } 194 196 public Object transform(Connection oOrConn, Connection oTrConn, Object oInput) throws SQLException { 197 Object oNexVal; 198 Object oRetVal; 199 Iterator oIter; 200 PreparedStatement oStmt; 201 ResultSet oRSet; 202 203 switch(OperationCode) { 204 case Operations.NEWGUID: 205 oRetVal = Gadgets.generateUUID(); 206 break; 207 case Operations.NEXTVAL: 208 oRetVal = getNextVal(oTrConn); 209 break; 210 case Operations.IFNULL: 211 if (null==oInput) { 212 if (IfNullValue.equalsIgnoreCase("SYSDATE") || 213 IfNullValue.equalsIgnoreCase("GETDATE()") ) 214 oRetVal = new java.sql.Date (new java.util.Date ().getTime()); 215 else 216 oRetVal = IfNullValue; 217 } 218 else if (oInput.getClass().getName().equals("java.lang.String")) 219 oRetVal = oInput.toString().length()>0 ? oInput : IfNullValue; 220 else 221 oRetVal = oInput; 222 break; 223 case Operations.REFER: 224 if (ReferedValues!=null) { 225 if (ReferedValues.containsKey(oInput)) 228 oRetVal = ReferedValues.get(oInput); 229 else if (oInput!=null) { 230 oStmt = oTrConn.prepareStatement("SELECT NULL FROM " + TargetTable + " WHERE " + TargetField + "=?"); 234 oStmt.setObject(1,oInput); 235 oRSet = oStmt.executeQuery(); 236 if (oRSet.next()) 237 oRetVal = oInput; 238 else 239 oRetVal = null; 240 oRSet.close(); 241 oStmt.close(); 242 243 if (null==oRetVal) { 244 oIter = ReferedValues.values().iterator(); 245 if (oIter.hasNext()) { 246 oNexVal = oIter.next(); 247 if (oNexVal.getClass().getName().equals("java.lang.String")) 248 oRetVal = Gadgets.generateUUID(); 249 else 250 oRetVal = getNextVal(oTrConn); 251 } 252 else 253 oRetVal = Gadgets.generateUUID(); 254 oIter = null; 255 } 256 } else 258 oRetVal = null; 259 } 260 else { 261 throw new SQLException (this.OriginTable + " could not reference " + this.ReferedTable, "23000"); 262 } break; 264 case Operations.REFERENCED: 265 oRetVal = oInput; 266 break; 267 default: 268 oRetVal = oInput; 269 } 270 271 if (!Values.containsKey(oInput)) Values.put(oInput, oRetVal); 272 273 return oRetVal; 274 } 276 278 public int OperationCode; public String IfNullValue; public String OriginField; public String TargetField; public String OriginTable; public String TargetTable; public String ReferedTable; 285 public String ReferedField; 286 public HashMap ReferedValues; 287 public HashMap Values; 288 public HashMap NextVals; 289 290 public class Operations { 291 public static final int NEWGUID = 1; 292 public static final int NEXTVAL = 2; 293 public static final int IFNULL = 4; 294 public static final int REFERENCED = 8; 295 public static final int REFER = 16; 296 } 297 }
| Popular Tags
|