1 21 22 package org.apache.derbyTesting.functionTests.harness; 23 24 31 32 import java.io.*; 33 import java.lang.reflect.*; 34 import java.util.StringTokenizer ; 35 import java.util.Properties ; 36 37 public class FileCompare 38 { 39 40 private String testBase; 41 private String framework; 42 private String jvmName; 43 private String jvmString; 44 private String serverJvm; 45 private int iminor; 46 private boolean searchJdk12 = false; 47 private boolean searchJdk13 = false; 48 private boolean searchJdk14 = false; 49 private int driverVersionMajor = 0; 50 private int driverVersionMinor = 0; 51 private boolean searchFrame; 52 private boolean searchDriverVersion; 53 private InputStream master = null; 54 private boolean verbose; 55 56 public FileCompare() 57 { 58 verbose = Boolean.getBoolean("verbose"); 59 } 60 61 public boolean exec(String outfile, File outDir, PrintWriter pwDiff, 63 String testBaseOrig, String framework, String jvmName, 64 int iminor, boolean useprocess, boolean usesysdiff, 65 String canondir, String canonpath, String serverJvm) 66 throws IOException, ClassNotFoundException 67 { 68 testBase = testBaseOrig; 69 this.framework = framework; 70 this.jvmName = jvmName; 71 this.iminor = iminor; 72 this.jvmString = jvmName; 73 this.serverJvm = serverJvm; 74 75 BufferedReader outFile; 76 BufferedReader masterFile; 77 StringBuffer sb = new StringBuffer (); 78 79 if (framework.startsWith("DerbyNet")) 83 { 84 Class c = null; 85 Method m = null; 86 Object o = null; 87 Integer i = null; 88 try 89 { 90 c = Class.forName(NetServer.getDriverName(framework)); 91 o = c.newInstance(); 92 m = c.getMethod("getMajorVersion", null); 93 i = (Integer )m.invoke(o, null); 94 driverVersionMajor = i.intValue(); 95 m = c.getMethod("getMinorVersion", null); 96 i = (Integer )m.invoke(o, null); 97 driverVersionMinor = i.intValue(); 98 if (framework.startsWith("DerbyNet")) searchDriverVersion = true; 99 } catch ( Exception e ) 100 { 101 104 System.out.println("Cannot determine driver version:" + e); 105 driverVersionMinor = 0; 106 driverVersionMajor = 0; 107 searchDriverVersion = false; 108 } 109 } 110 111 112 String topdir = ""; 116 if ( (canondir != null) && (canondir.length()>0) ) 117 topdir = canondir; 118 else { 119 Class c = FileCompare.class; InputStream is = c.getResourceAsStream("/org/apache/derby/info/DBMS.properties"); 122 Properties dbprop = new Properties (); 123 dbprop.load(is); 124 is.close(); 125 126 String filename=dbprop.getProperty("derby.product.file"); 127 if (filename != null) { 128 if (filename.startsWith("derby") && filename.endsWith(".jar")) { 130 canondir = "product_master"; topdir = "product_master"; 132 } 133 else 134 topdir = "master"; 135 } 136 else 137 topdir = "master"; 138 } 139 140 String subdir = ""; 142 boolean searchDefault = true; boolean searchBoth = false; 144 boolean searchJvm = false; 145 if ( (framework != null) && (framework.length()>0) ) 146 { 147 searchFrame = true; 148 subdir = framework; 149 } 150 if ( (jvmName != null) && (jvmName.length()>0) 151 & (!jvmName.equals("currentjvm")) ) 152 { 153 searchJvm = true; 154 if (searchFrame) 155 searchBoth = true; 156 if ( iminor >= 2 ) jvmString = "jdk12"; 158 if ( iminor >= 2 ) searchJdk12 = true; 159 if ( iminor >= 3 ) searchJdk13 = true; 160 if ( iminor >= 4 ) searchJdk14 = true; 161 subdir += jvmName; 162 } 163 164 if ( searchFrame || searchJvm || searchBoth ) 165 searchDefault = false; 166 167 sb.append(topdir); 168 if (subdir.length()>0) 169 sb.append(subdir + '/'); 170 sb.append(testBase + ".out"); 171 String masterfilename = sb.toString(); 172 173 InputStream is = null; 174 175 177 if (is == null) 178 { 179 searchCanondir(topdir); 180 is = master; 181 } 182 183 if ( is == null ) 185 { 186 is = new ByteArrayInputStream( new byte[] {} ); 187 } 188 if (NetServer.isClientConnection(framework)) 191 { 192 try 193 { 194 Sed sed = new Sed(); 195 File JCCOutFile = new File(outDir, testBase + ".tmpmstr"); 196 sed.execJCC(is, JCCOutFile); 197 is = new FileInputStream(JCCOutFile); 198 } 199 catch (ClassFormatError cfe) 200 { 201 System.out.println("SED Error: " + cfe.getMessage()); 202 } 203 } 204 else 205 { 206 File EncodedOutFile = new File(outDir, testBase + ".tmpmstr"); 208 BufferedReader inFile = new BufferedReader(new InputStreamReader(is, "UTF-8")); 209 210 PrintWriter pw = new PrintWriter 211 ( new BufferedWriter(new FileWriter(EncodedOutFile), 10000), true ); 212 int c; 213 while ((c = inFile.read()) != -1) 214 pw.write(c); 215 pw.flush(); 216 pw.close(); 217 is = new FileInputStream(EncodedOutFile); 218 } 219 220 outFile = new BufferedReader(new FileReader(outfile)); 222 masterFile = new BufferedReader(new InputStreamReader(is)); 223 224 if (usesysdiff == true) 226 return doSysDiff(is, testBase, outfile, outDir, pwDiff); 227 else 228 { 229 return doDiff2(outFile,masterFile, pwDiff); 230 } 231 } 232 233 public boolean doDiff2(BufferedReader outFile, BufferedReader masterFile, PrintWriter pwDiff) throws IOException { 234 return ((new SimpleDiff()).doWork(masterFile,outFile,pwDiff)); 235 } 236 237 public boolean doSysDiff(InputStream masterIS, String testBase, String outfile, 238 File outDir, PrintWriter pwDiff) 239 throws IOException 240 { 241 BufferedReader in = 243 new BufferedReader(new InputStreamReader(masterIS)); 244 File tempMaster = 245 new File((new File(outDir,testBase + ".master")).getCanonicalPath()); 246 247 PrintWriter pwMaster = new PrintWriter( new BufferedWriter 249 (new FileWriter(tempMaster.getPath()), 10000), true ); 250 String str = ""; 251 while ( (str = in.readLine()) != null ) 252 { 253 pwMaster.println(str); 254 } 255 pwMaster.close(); 256 pwMaster = null; 257 in = null; 258 259 String diffs = "0"; 260 Process pr = null; 262 try 263 { 264 StringBuffer sb = new StringBuffer (); 265 sb.append("diff "); 266 sb.append(tempMaster.getCanonicalPath()); 267 sb.append(" "); 268 sb.append(outfile); 269 String diffCmd = sb.toString(); 270 271 273 pr = Runtime.getRuntime().exec(diffCmd); 274 275 BackgroundStreamDrainer stdout = 278 new BackgroundStreamDrainer(pr.getInputStream(), null); 279 BackgroundStreamDrainer stderr = 280 new BackgroundStreamDrainer(pr.getErrorStream(), null); 281 282 pr.waitFor(); 283 String result = HandleResult.handleResult(pr.exitValue(), 284 stdout.getData(), stderr.getData(), pwDiff); 285 diffs = result.substring( result.lastIndexOf(',')+1 ); 286 pr.destroy(); 288 pr = null; 289 } 290 catch(Throwable t) 291 { 292 System.out.println("Process exception: " + t); 293 if (pr != null) 294 { 295 pr.destroy(); 296 pr = null; 297 } 298 } 299 tempMaster.delete(); 300 if ( diffs.equals("0") ) 301 return false; 302 else 303 return true; 304 } 305 306 public boolean doDiff(BufferedReader outFile, BufferedReader masterFile, PrintWriter pwDiff) throws IOException { 307 String str1; 308 String str2; 309 boolean diff = false; 310 311 int line = 0; 312 int diffnum = 0; 313 int diffline = 0; 314 while ( (str1 = outFile.readLine()) != null ) 315 { 316 line++; 317 str1 = str1.trim(); 318 if ( (str2 = masterFile.readLine()) != null ) 321 { 322 str2 = str2.trim(); 323 if (!str1.equals(str2)) 324 { 325 StringBuffer sb1 = new StringBuffer (); 327 StringBuffer sb2 = new StringBuffer (); 328 StringTokenizer st1 = new StringTokenizer (str1); 329 while (st1.hasMoreTokens()) 330 { 331 sb1.append(st1.nextToken()); 332 } 333 335 StringTokenizer st2 = new StringTokenizer (str2); 336 while (st2.hasMoreTokens()) 337 { 338 sb2.append(st2.nextToken()); 339 } 340 342 if ( sb1.toString().equals(sb2.toString()) ) 343 diff = false; 344 else if ( (str1.startsWith("-----")) && (str1.endsWith("-----")) ) 346 { 347 if ( (str2.startsWith("-----")) && (str2.endsWith("-----")) ) 348 diff = false; 349 } 350 else 351 { 352 diff = true; 353 diffnum++; 354 System.out.println("Diff occurred at line: " + line); 355 pwDiff.println("Diff occurred at line: " + line); 356 pwDiff.flush(); 357 break; 358 } 359 } 360 else 361 { 362 diff = false; 363 } 364 } 365 } outFile.close(); 367 masterFile.close(); 368 return diff; 369 } 371 private void searchCanondir(String canondir) 372 { 373 String prefix = canondir + '/'; 374 if (master == null && searchFrame) searchFramework(prefix); 375 if (master == null) searchJvm(prefix); 376 if (master == null && searchDriverVersion) searchDriverVersion(prefix); 377 if (master == null) getmaster(prefix); 378 if (master == null && canondir != "master") searchCanondir("master"); 379 } 380 381 private void searchJvm(String prefix) 382 { 383 390 String newprefix; 391 if (jvmName.startsWith("j9") || (serverJvm != null && serverJvm.startsWith("j9"))) 392 { 393 if (jvmName.startsWith("j9_foundation")) 394 { 395 newprefix = prefix + "j9_foundation" + '/'; 396 if (master == null && searchDriverVersion) searchDriverVersion(newprefix); 397 if (master == null) getmaster(newprefix); 398 } 399 else 400 { 401 newprefix = prefix + jvmName + '/'; 402 if ((!jvmName.equals("j9_13")) && (iminor > 1)) 403 { 404 for (int i = iminor; i > 1; i--) 405 { 406 if (master == null) 407 { 408 newprefix = prefix + "j9_2" + i + '/'; 409 getmaster(newprefix); 410 } 411 } 412 } 413 if (master == null) newprefix = prefix + "j9_13" + '/'; 414 } 415 if (master == null && searchDriverVersion) searchDriverVersion(newprefix); 416 if (master == null) getmaster(newprefix); 417 418 } 419 for (int i = iminor; i >= 2; i--) 420 { 421 if (jvmName.startsWith("ibm")) 422 { 423 newprefix = prefix + "ibm1" + i + '/'; 424 if (master == null && searchDriverVersion) searchDriverVersion(newprefix); 425 if (master == null) getmaster(newprefix); 426 } 427 newprefix = prefix + "jdk1" + i + '/'; 428 if (master == null && searchDriverVersion) searchDriverVersion(newprefix); 429 if (master == null) getmaster(newprefix); 430 } 431 } 432 433 private void searchFramework(String prefix) 434 { 435 String newprefix; 436 newprefix = prefix + framework + '/'; 437 if (master == null) searchJvm(newprefix); 438 if (master == null && searchDriverVersion) searchDriverVersion(newprefix); 439 if (master == null) getmaster(newprefix); 440 } 441 442 private void searchDriverVersion(String prefix) 443 { 444 447 String newprefix; 448 449 for (int j = ((driverVersionMajor * 10) + driverVersionMinor); j >= 10; j--) 450 { 451 newprefix = prefix + "ver" + j / 10 + "." + j % 10 + '/'; 452 if (master == null) getmaster(newprefix); 453 } 454 } 455 456 private void getmaster(String prefix) 457 { 458 String fullname = prefix + testBase + ".out"; 459 master = RunTest.loadTestResource(fullname); 460 if (master != null) 461 if (verbose) System.out.println("MasterFileName = "+fullname); 462 } 463 } 464 | Popular Tags |