KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > derbyTesting > functionTests > harness > FileCompare


1 /*
2
3    Derby - Class org.apache.derbyTesting.functionTests.harness.FileCompare
4
5    Licensed to the Apache Software Foundation (ASF) under one or more
6    contributor license agreements. See the NOTICE file distributed with
7    this work for additional information regarding copyright ownership.
8    The ASF licenses this file to You under the Apache License, Version 2.0
9    (the "License"); you may not use this file except in compliance with
10    the License. You may obtain a copy of the License at
11
12       http://www.apache.org/licenses/LICENSE-2.0
13
14    Unless required by applicable law or agreed to in writing, software
15    distributed under the License is distributed on an "AS IS" BASIS,
16    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17    See the License for the specific language governing permissions and
18    limitations under the License.
19
20  */

21
22 package org.apache.derbyTesting.functionTests.harness;
23
24 /***
25  * FileCompare.java
26  *
27  * Compare two files using SimpleDiff
28  * Purpose: simulate diff
29  * Note: if usesysdiff=true, we execute the system's diff
30  ***/

31
32 import java.io.*;
33 import java.lang.reflect.*;
34 import java.util.StringTokenizer JavaDoc;
35 import java.util.Properties JavaDoc;
36
37 public class FileCompare
38 {
39
40     private String JavaDoc testBase;
41     private String JavaDoc framework;
42     private String JavaDoc jvmName;
43     private String JavaDoc jvmString;
44     private String JavaDoc 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     // The arguments should be the names of the input and output files
62
public boolean exec(String JavaDoc outfile, File outDir, PrintWriter pwDiff,
63         String JavaDoc testBaseOrig, String JavaDoc framework, String JavaDoc jvmName,
64         int iminor, boolean useprocess, boolean usesysdiff,
65         String JavaDoc canondir, String JavaDoc canonpath, String JavaDoc serverJvm)
66         throws IOException, ClassNotFoundException JavaDoc
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 JavaDoc sb = new StringBuffer JavaDoc();
78  
79         // If framework is DerbyNet, we may need to check subdirs of the master canon dir
80
// for specific masters by client we're running against. So, get version
81
// for later use if that is the case.
82
if (framework.startsWith("DerbyNet"))
83         {
84       Class JavaDoc c = null;
85       Method m = null;
86       Object JavaDoc o = null;
87       Integer JavaDoc 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 JavaDoc)m.invoke(o, null);
94         driverVersionMajor = i.intValue();
95         m = c.getMethod("getMinorVersion", null);
96         i = (Integer JavaDoc)m.invoke(o, null);
97         driverVersionMinor = i.intValue();
98             if (framework.startsWith("DerbyNet")) searchDriverVersion = true;
99       } catch ( Exception JavaDoc e )
100       {
101         //if anything goes wrong, make sure the driver version values are set to zero
102
//forget about it.
103

104           System.out.println("Cannot determine driver version:" + e);
105           driverVersionMinor = 0;
106           driverVersionMajor = 0;
107           searchDriverVersion = false;
108       }
109         }
110         
111
112         // The outfile name is known -- outfile
113
// But the master canon needs to be located
114
// The user can set canondir (or it defaults to "master")
115
String JavaDoc topdir = "";
116         if ( (canondir != null) && (canondir.length()>0) )
117             topdir = canondir;
118         else {
119             // if this is using product jars, use product_master first
120
Class JavaDoc c = FileCompare.class; // get our class loader
121
InputStream is = c.getResourceAsStream("/org/apache/derby/info/DBMS.properties");
122             Properties JavaDoc dbprop = new Properties JavaDoc();
123             dbprop.load(is);
124             is.close();
125
126             String JavaDoc filename=dbprop.getProperty("derby.product.file");
127             if (filename != null) {
128                 //looks like it might be one of our jars?
129
if (filename.startsWith("derby") && filename.endsWith(".jar")) {
130                     canondir = "product_master"; // remember redirection
131
topdir = "product_master";
132                 }
133                 else
134                     topdir = "master";
135             }
136             else
137                 topdir = "master";
138         }
139
140         // There can be subdirs under the master for framework, jvm
141
String JavaDoc subdir = "";
142         boolean searchDefault = true; // if no framework or special jvm
143
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 ) // jdk12 or higher may use jdk12 masters
157
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 JavaDoc masterfilename = sb.toString();
172     
173     InputStream is = null;
174         
175         // Now try to locate the master file
176

177         if (is == null)
178     {
179       searchCanondir(topdir);
180       is = master;
181     }
182                 
183         // If the master is still not found, create an empty master
184
if ( is == null )
185         {
186             is = new ByteArrayInputStream( new byte[] {} );
187         }
188         // compress blanks in output columns to make up for column width differences
189
// for JCC output
190
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 JavaDoc cfe)
200             {
201                 System.out.println("SED Error: " + cfe.getMessage());
202             }
203         }
204         else
205         {
206             // read in in fixed format, but write out relying on default encoding
207
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         // Define the input and output files
221
outFile = new BufferedReader(new FileReader(outfile));
222         masterFile = new BufferedReader(new InputStreamReader(is));
223         
224         // Do the comparison (diff)
225
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 JavaDoc testBase, String JavaDoc outfile,
238         File outDir, PrintWriter pwDiff)
239         throws IOException
240     {
241         // Create a temp file to copy the master (located as an InputStream)
242
BufferedReader in =
243             new BufferedReader(new InputStreamReader(masterIS));
244         File tempMaster =
245             new File((new File(outDir,testBase + ".master")).getCanonicalPath());
246
247         // Create a PrintWriter for copying the master temporarily for the diff
248
PrintWriter pwMaster = new PrintWriter( new BufferedWriter
249             (new FileWriter(tempMaster.getPath()), 10000), true );
250         String JavaDoc 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 JavaDoc diffs = "0";
260         // Now create a process and do the system diff, capture to .out
261
Process JavaDoc pr = null;
262         try
263         {
264             StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
265             sb.append("diff ");
266             sb.append(tempMaster.getCanonicalPath());
267             sb.append(" ");
268             sb.append(outfile);
269             String JavaDoc diffCmd = sb.toString();
270
271             //System.out.println("diffCmd = " + diffCmd);
272

273             pr = Runtime.getRuntime().exec(diffCmd);
274
275             // We need the process inputstream to capture into the diff file
276
//System.out.println("Capture the process InputStream...");
277
BackgroundStreamDrainer stdout =
278                 new BackgroundStreamDrainer(pr.getInputStream(), null);
279             BackgroundStreamDrainer stderr =
280                 new BackgroundStreamDrainer(pr.getErrorStream(), null);
281
282             pr.waitFor();
283             String JavaDoc result = HandleResult.handleResult(pr.exitValue(),
284                 stdout.getData(), stderr.getData(), pwDiff);
285             diffs = result.substring( result.lastIndexOf(',')+1 );
286             //System.out.println("diffs: " + diffs);
287
pr.destroy();
288             pr = null;
289         }
290         catch(Throwable JavaDoc 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 JavaDoc str1;
308         String JavaDoc 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             //System.out.println("Reading line: " + line);
319
// Read the line from the master file and compare
320
if ( (str2 = masterFile.readLine()) != null )
321             {
322                 str2 = str2.trim();
323                 if (!str1.equals(str2))
324                 {
325                     // Some lines diff because of too many spaces
326
StringBuffer JavaDoc sb1 = new StringBuffer JavaDoc();
327                     StringBuffer JavaDoc sb2 = new StringBuffer JavaDoc();
328                     StringTokenizer JavaDoc st1 = new StringTokenizer JavaDoc(str1);
329                     while (st1.hasMoreTokens())
330                     {
331                         sb1.append(st1.nextToken());
332                     }
333                     //System.out.println("Out line: " + sb1.toString());
334

335                     StringTokenizer JavaDoc st2 = new StringTokenizer JavaDoc(str2);
336                     while (st2.hasMoreTokens())
337                     {
338                         sb2.append(st2.nextToken());
339                     }
340                     //System.out.println("Master line: " + sb2.toString());
341

342                     if ( sb1.toString().equals(sb2.toString()) )
343                         diff = false;
344                     // If the two lines are dashes, but wrong #, just ignore
345
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         } // end while
366
outFile.close();
367         masterFile.close();
368         return diff;
369     }// end exec
370

371     private void searchCanondir(String JavaDoc canondir)
372     {
373     String JavaDoc 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 JavaDoc prefix)
382     {
383     // The JVM search follows the following pattern, with one exception:
384
// first search jvmName (to support unnamed/non-IBM or Sun JVMs)
385
// if vendor == IBM, search ibm+rev then jdk+rev, decrementing rev by one until rev=13,
386
// in each dir, search framework and driver version if applicable.
387
// BUT, if it's j9, first j9_foundation, then search j9_22 for 22, otherwise, j9_13 then
388
// the normal ibm13 search pattern: ibm13 then jdk13.
389

390     String JavaDoc 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 JavaDoc prefix)
434     {
435         String JavaDoc 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 JavaDoc prefix)
443     {
444     // It is not sufficient to simply search the current driver version.
445
// We must search down through the versions to find the newest applicable master.
446

447     String JavaDoc 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 JavaDoc prefix)
457     {
458         String JavaDoc 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