1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 package convwatch;
25 
26 import convwatch.ConvWatchException;
27 import convwatch.ConvWatchCancelException;
28 import convwatch.FileHelper;
29 import convwatch.OfficePrint;
30 import convwatch.PRNCompare;
31 import convwatch.StatusHelper;
32 import helper.URLHelper;
33 import java.io.File;
34 
35 public class ConvWatch
36 {
37 
getBuildID_FromFile(String _sInfoFile)38     String getBuildID_FromFile(String _sInfoFile)
39     {
40         String sBuildID = "";
41         IniFile aIniFile = new IniFile(_sInfoFile);
42         if (aIniFile.is())
43         {
44             sBuildID = aIniFile.getValue("", "buildid");
45         }
46         return sBuildID;
47     }
48     /**
49      * Check if given document (_sAbsoluteInputFile) and it's postscript representation (_sAbsoluteReferenceFile) produce
50      * the same output like the StarOffice / OpenOffice.org which is accessable with XMultiServiceFactory.
51      * Here a simple graphically difference check is run through.
52      *
53      * Hint: In the OutputPath all needed files will create, there must
54      * be very much space. It's not possible to say how much.
55      * One page need up to 800kb as jpeg.
56      * Sample: If a document contains 2 pages, we need 2*800kb for prn
57      * output and 2*800kb for ps output and 2*800kb for it's difference
58      * output. So up to 4800kb or 4.8mb.
59      *
60      * RAM is need least 300mb. Will say, it's tested on a pc with 128mb RAM and 256mb swap.
61      *
62      * It's also absolutlly impossible to say, how much time this functions consume.
63      */
64 
createPostscriptStartCheck(GraphicalTestArguments _aGTA, String _sOutputPath, String _sAbsoluteInputFile, String _sAbsoluteReferenceFile)65     StatusHelper[] createPostscriptStartCheck(GraphicalTestArguments _aGTA,
66                                               String _sOutputPath, String _sAbsoluteInputFile, String _sAbsoluteReferenceFile)
67         throws ConvWatchCancelException
68         {
69 //  TODO: some more checks
70 
71             if (! FileHelper.exists(_sAbsoluteInputFile))
72             {
73                 throw new ConvWatchCancelException("createPostscriptStartCheck: Input file: " + _sAbsoluteInputFile + " does not exist.");
74             }
75 
76             if (_sAbsoluteReferenceFile == null)
77             {
78                 // we assume, that the prn file is near the document
79                 String sAbsoluteInputFileNoSuffix = FileHelper.getNameNoSuffix(_sAbsoluteInputFile);
80                 _sAbsoluteReferenceFile = sAbsoluteInputFileNoSuffix + ".prn";
81             }
82 
83             String fs = System.getProperty("file.separator");
84             File aAbsoluteReferenceFile = new File(_sAbsoluteReferenceFile);
85 
86             if (aAbsoluteReferenceFile.isDirectory())
87             {
88                 String sBasename = FileHelper.getBasename(_sAbsoluteInputFile);
89                 String sNameNoSuffix = FileHelper.getNameNoSuffix(sBasename);
90                 String sAbsoluteReferenceFileInfo = _sAbsoluteReferenceFile + fs + sNameNoSuffix + ".info";
91                 _sAbsoluteReferenceFile = _sAbsoluteReferenceFile + fs + sNameNoSuffix + ".prn";
92 
93                 // Read the reference from the info file
94                 String sRefBuildID = "";
95                 if (FileHelper.exists(sAbsoluteReferenceFileInfo))
96                 {
97                     sRefBuildID = getBuildID_FromFile(sAbsoluteReferenceFileInfo);
98                 }
99                 _aGTA.setRefBuildID(sRefBuildID);
100 
101             }
102             else
103             {
104                 // java file has problems to check for directories, if the given directory doesn't exist.
105                 String sName = FileHelper.getBasename(_sAbsoluteReferenceFile);
106                 // thanks to Mircosoft, every document has a suffix, so if a name doesn't have a suffix, it must be a directory name
107                 int nIdx = sName.indexOf('.');
108                 if (nIdx == -1)
109                 {
110                     // must be a directory
111                     throw new ConvWatchCancelException("createPostscriptStartCheck: Given reference directory: '" + _sAbsoluteReferenceFile + "' does not exist.");
112                 }
113             }
114 
115 
116             boolean bAbsoluteReferenceFile = true;
117             if (! FileHelper.exists(_sAbsoluteReferenceFile))
118             {
119                 if (_aGTA.createDefaultReference())
120                 {
121                     GlobalLogWriter.get().println("Reference File doesn't exist, will create a default");
122                     bAbsoluteReferenceFile = false;
123                 }
124                 else
125                 {
126                     throw new ConvWatchCancelException("createPostscriptStartCheck: Given reference file: " + _sAbsoluteReferenceFile + " does not exist.");
127                 }
128             }
129 
130             FileHelper.makeDirectories("", _sOutputPath);
131 
132             // runner.convwatch.compare();
133 
134             String sAbsoluteInputFileURL = URLHelper.getFileURLFromSystemPath(_sAbsoluteInputFile);
135 
136             String sInputFile = FileHelper.getBasename(_sAbsoluteInputFile);
137             // System.out.println("InputFile: " + sInputFile);
138 
139             String sInputFileNoSuffix = FileHelper.getNameNoSuffix(sInputFile);
140             // System.out.println("BasenameNoSuffix: " + sInputFileNoSuffix);
141 
142 
143             String sAbsoluteOutputFile = _sOutputPath + fs + sInputFile;
144             String sAbsoluteOutputFileURL = URLHelper.getFileURLFromSystemPath(sAbsoluteOutputFile);
145 
146             String sReferenceFile = FileHelper.getBasename(_sAbsoluteReferenceFile);
147             String sReferenceFileNoSuffix = FileHelper.getNameNoSuffix(sReferenceFile);
148             String sPostScriptFile = sReferenceFileNoSuffix + ".ps";
149             // System.out.println("PostscriptFile: " + sPostScriptFile);
150 
151             String sAbsolutePrintFile = _sOutputPath + fs + sPostScriptFile;
152             String sAbsolutePrintFileURL = URLHelper.getFileURLFromSystemPath(sAbsolutePrintFile);
153 
154             // System.out.println("AbsoluteInputFileURL: " + sAbsoluteInputFileURL);
155             // System.out.println("AbsoluteOutputFileURL: " + sAbsoluteOutputFileURL);
156             // System.out.println("AbsolutePrintFileURL: " + sAbsolutePrintFileURL);
157 
158             // store and print the sAbsoluteInputFileURL file with StarOffice / OpenOffice.org
159             OfficePrint.printToFile(_aGTA, sAbsoluteInputFileURL, sAbsoluteOutputFileURL, sAbsolutePrintFileURL);
160 
161             // wait(2);
162 
163             if (! FileHelper.exists(sAbsolutePrintFile))
164             {
165                 throw new ConvWatchCancelException("createPostscriptStartCheck: Printed file " + sAbsolutePrintFile + " does not exist.");
166             }
167 
168             if (bAbsoluteReferenceFile == false)
169             {
170                 // copy AbsolutePrintFile to AbsoluteReferenceFile
171                 String sDestinationFile = sAbsolutePrintFile; // URLHelper.getSystemPathFromFileURL(...)
172                 String sSourceFile = _sAbsoluteReferenceFile;
173                 FileHelper.copy(sDestinationFile, sSourceFile);
174                 // now the fix reference of the AbsoluteReferenceFile should exist.
175                 if (! FileHelper.exists(_sAbsoluteReferenceFile))
176                 {
177                     throw new ConvWatchCancelException("createPostscriptStartCheck: Given reference file: " + _sAbsoluteReferenceFile + " does not exist, after try to copy.");
178                 }
179             }
180 
181             PRNCompare a = new PRNCompare();
182             String sInputPath = FileHelper.getPath(_sAbsoluteInputFile);
183             String sReferencePath = FileHelper.getPath(_sAbsoluteReferenceFile);
184             // String sReferenceFile = FileHelper.getBasename(sAbsoluteReferenceFile);
185 
186             // System.out.println("InputPath: " + sInputPath);
187             // System.out.println("sReferencePath: " + sReferencePath);
188             // System.out.println("sReferenceFile: " + sReferenceFile);
189 
190             a.setInputPath(     sInputPath );
191             a.setReferencePath( sReferencePath );
192             a.setOutputPath(    _sOutputPath );
193             // a.setDocFile(       "1_Gov.ppt");
194             a.setReferenceFile( sReferenceFile );
195             a.setPostScriptFile(sPostScriptFile );
196             if (_aGTA.printAllPages() == true)
197             {
198                 a.setMaxPages(9999);
199             }
200             else
201             {
202                 if (_aGTA.getMaxPages() > 0)
203                 {
204                     a.setMaxPages(_aGTA.getMaxPages());
205                 }
206                 if (_aGTA.getOnlyPages().length() != 0)
207                 {
208                     // we can't interpret the string of getOnlyPages() right without much logic, so print all pages here!
209                     a.setMaxPages(9999);
210                 }
211             }
212 
213             a.setResolutionInDPI(_aGTA.getResolutionInDPI());
214             a.setBorderMove(_aGTA.getBorderMove());
215             a.setDocumentType(_aGTA.getDocumentType());
216 
217             StatusHelper[] aList = a.compare();
218 
219             _aGTA.setBorderMove(a.getBorderMove());
220             return aList;
221         }
222 
223     // -----------------------------------------------------------------------------
224     // This creates a status for exact on document
createINIStatus(StatusHelper[] aList, String _sFilenamePrefix, String _sOutputPath, String _sAbsoluteInputFile, String _sBuildID, String _sRefBuildID)225     static boolean createINIStatus(StatusHelper[] aList, String _sFilenamePrefix, String _sOutputPath, String _sAbsoluteInputFile, String _sBuildID, String _sRefBuildID)
226         {
227             // Status
228             String fs = System.getProperty("file.separator");
229             String sBasename = FileHelper.getBasename(_sAbsoluteInputFile);
230             String sNameNoSuffix = FileHelper.getNameNoSuffix(sBasename);
231 //            String sHTMLFile = _sFilenamePrefix + sNameNoSuffix + ".html";
232 //            HTMLOutputter HTMLoutput = HTMLOutputter.create(_sOutputPath, sHTMLFile, "", "");
233 //            HTMLoutput.header(sNameNoSuffix);
234 //  TODO: version info was fine
235 //            HTMLoutput.checkSection(sBasename);
236             // Status end
237 
238             String sINIFile = _sFilenamePrefix + sNameNoSuffix + ".ini";
239             INIOutputter INIoutput = INIOutputter.create(_sOutputPath, sINIFile, "", "");
240             INIoutput.createHeader();
241 //  TODO: version info was fine
242 
243             INIoutput.writeSection("global");
244             INIoutput.writeValue("pages", String.valueOf(aList.length));
245             INIoutput.writeValue("buildid", _sBuildID);
246             INIoutput.writeValue("refbuildid", _sRefBuildID);
247             INIoutput.writeValue("diffdiff", "no");
248             INIoutput.writeValue("basename", sBasename);
249 
250             boolean bResultIsOk = true;          // result over all pages
251             for (int i=0;i<aList.length; i++)
252             {
253                 INIoutput.writeSection("page" + String.valueOf(i + 1));   // list start at point 0, but this is page 1 and so on... current_page = (i + 1)
254                 aList[i].printStatus();
255 
256                 boolean bCurrentResult = true;   // result over exact one page
257 
258                 int nCurrentDiffStatus = aList[i].nDiffStatus;
259 
260                 // check if the status is in a defined range
261                 if (nCurrentDiffStatus == StatusHelper.DIFF_NO_DIFFERENCES)
262                 {
263                     // ok.
264                 }
265                 else if (nCurrentDiffStatus == StatusHelper.DIFF_DIFFERENCES_FOUND && aList[i].nPercent < 5)
266                 {
267                     // ok.
268                 }
269                 else if (nCurrentDiffStatus == StatusHelper.DIFF_AFTER_MOVE_DONE_NO_PROBLEMS)
270                 {
271                     // ok.
272                 }
273                 else if (nCurrentDiffStatus == StatusHelper.DIFF_AFTER_MOVE_DONE_DIFFERENCES_FOUND && aList[i].nPercent2 < 5)
274                 {
275                     // ok.
276                 }
277                 else
278                 {
279                     // failed.
280                     bCurrentResult = false; // logic: nDiff==0 = true if there is no difference
281                 }
282 
283                 // Status
284 //                HTMLoutput.checkLine(aList[i], bCurrentResult);
285                 INIoutput.checkLine(aList[i], bCurrentResult);
286                 bResultIsOk &= bCurrentResult;
287             }
288             // Status
289 //            HTMLoutput.close();
290             INIoutput.close();
291             return bResultIsOk;
292         }
293 
294     // -----------------------------------------------------------------------------
295 
createINIStatus_DiffDiff(StatusHelper[] aDiffDiffList, String _sFilenamePrefix, String _sOutputPath, String _sAbsoluteInputFile, String _sBuildID)296     static void createINIStatus_DiffDiff(StatusHelper[] aDiffDiffList, String _sFilenamePrefix, String _sOutputPath, String _sAbsoluteInputFile, String _sBuildID)
297         {
298             // Status
299             String fs = System.getProperty("file.separator");
300             String sBasename = FileHelper.getBasename(_sAbsoluteInputFile);
301             String sNameNoSuffix = FileHelper.getNameNoSuffix(sBasename);
302             String sINIFile = _sFilenamePrefix + sNameNoSuffix + ".ini";
303 
304 //            HTMLOutputter HTMLoutput = HTMLOutputter.create(_sOutputPath, sHTMLFile, _sFilenamePrefix, "");
305 //            HTMLoutput.header(sNameNoSuffix);
306 //            HTMLoutput.checkDiffDiffSection(sBasename);
307 
308             INIOutputter INIoutput = INIOutputter.create(_sOutputPath, sINIFile, _sFilenamePrefix, "");
309             INIoutput.createHeader();
310             // LLA? what if the are no values in the list? true or false;
311             INIoutput.writeSection("global");
312             INIoutput.writeValue("pages", String.valueOf(aDiffDiffList.length));
313             INIoutput.writeValue("buildid", _sBuildID);
314             INIoutput.writeValue("diffdiff", "yes");
315             INIoutput.writeValue("basename", sBasename);
316 
317             for (int i=0;i<aDiffDiffList.length; i++)
318             {
319                 INIoutput.writeSection("page" + String.valueOf(i + 1));   // list start at point 0, but this is page 1 and so on... current_page = (i + 1)
320                 boolean bCurrentResult = (aDiffDiffList[i].nDiffStatus == StatusHelper.DIFF_NO_DIFFERENCES); // logic: nDiff==0 = true if there is no difference
321 
322 //                HTMLoutput.checkDiffDiffLine(aDiffDiffList[i], bCurrentResult);
323                 INIoutput.checkDiffDiffLine(aDiffDiffList[i], bCurrentResult);
324             }
325             // Status
326 //            HTMLoutput.close();
327             INIoutput.close();
328         }
329 
330 
331     // -----------------------------------------------------------------------------
332 
check(GraphicalTestArguments _aGTA, String _sOutputPath, String _sAbsoluteInputFile, String _sAbsoluteReferenceFile)333     public static boolean check(GraphicalTestArguments _aGTA,
334                              String _sOutputPath, String _sAbsoluteInputFile, String _sAbsoluteReferenceFile)
335         throws ConvWatchCancelException, ConvWatchException
336         {
337             ConvWatch a = new ConvWatch();
338             StatusHelper[] aList = a.createPostscriptStartCheck(_aGTA, _sOutputPath, _sAbsoluteInputFile, _sAbsoluteReferenceFile);
339             DB.writeNumberOfPages(aList.length);
340 
341             boolean bResultIsOk = createINIStatus(aList, "", _sOutputPath, _sAbsoluteInputFile, _aGTA.getBuildID(), _aGTA.getRefBuildID());
342 
343             if (! bResultIsOk)
344             {
345                 // it could be that this will store in a DB, there are problems with '\'
346                 String sErrorMessage = "Graphical compare failed with file ";
347                 String sErrorFile = _sAbsoluteInputFile.replace('\\', '/');
348                 sErrorMessage = sErrorMessage + "'" + sErrorFile + "'";
349                 DB.writeErrorFile(sErrorFile);
350                 throw new ConvWatchException(sErrorMessage);
351             }
352             return bResultIsOk;
353         }
354 
355     // -----------------------------------------------------------------------------
checkDiffDiff(GraphicalTestArguments _aGTA, String _sOutputPath, String _sAbsoluteInputFile, String _sAbsoluteReferenceFile, String _sAbsoluteDiffPath)356     public static boolean checkDiffDiff(GraphicalTestArguments _aGTA,
357                                      String _sOutputPath, String _sAbsoluteInputFile, String _sAbsoluteReferenceFile,
358                                      String _sAbsoluteDiffPath)
359         throws ConvWatchCancelException, ConvWatchException
360         {
361             ConvWatch a = new ConvWatch();
362             _aGTA.setBorderMove(TriState.FALSE);
363             StatusHelper[] aList = a.createPostscriptStartCheck(_aGTA, _sOutputPath, _sAbsoluteInputFile, _sAbsoluteReferenceFile);
364 
365             // Status
366             boolean bResultIsOk = createINIStatus(aList, "", _sOutputPath, _sAbsoluteInputFile, _aGTA.getBuildID(), _aGTA.getRefBuildID());
367 
368             StatusHelper[] aDiffDiffList = new StatusHelper[aList.length];
369 
370             String fs = System.getProperty("file.separator");
371 
372             boolean bDiffIsOk = true;
373             boolean bFoundAOldDiff = false;
374 
375             PRNCompare aCompare = new PRNCompare();
376             // LLA? what if the are no values in the list? true or false;
377             for (int i=0;i<aList.length; i++)
378             {
379                 String sOrigDiffName = aList[i].m_sDiffGfx;
380                 String sDiffBasename = FileHelper.getBasename(sOrigDiffName);
381 
382                 String sNewDiffName = _sAbsoluteDiffPath + fs + sDiffBasename;
383                 if (! FileHelper.exists(sNewDiffName))
384                 {
385                     GlobalLogWriter.get().println("checkDiffDiff: Old diff file: '" + sNewDiffName + "' does not exist." );
386                     continue;
387                 }
388                 // String sNewDiffName = _sAbsoluteDiffPath + fs + sDiffBasename;
389 
390                 // make a simple difference between these both diff files.
391                 String sSourcePath1 = FileHelper.getPath(sOrigDiffName);
392                 String sSourceFile1 = sDiffBasename;
393                 String sSourcePath2 = _sAbsoluteDiffPath;
394                 String sSourceFile2 = sDiffBasename;
395 
396                 StatusHelper aCurrentStatus = aCompare.checkDiffDiff(_sOutputPath, sSourcePath1, sSourceFile1, sSourcePath2, sSourceFile2);
397                 boolean bCurrentResult = (aCurrentStatus.nDiffStatus == StatusHelper.DIFF_NO_DIFFERENCES); // logic: nDiff==0 = true if there is no difference
398                 bDiffIsOk &= bCurrentResult;
399                 bFoundAOldDiff = true;
400 
401                 aDiffDiffList[i] = aCurrentStatus;
402             }
403 
404             createINIStatus_DiffDiff(aDiffDiffList, "DiffDiff_", _sOutputPath, _sAbsoluteInputFile, _aGTA.getBuildID());
405 
406             if (bFoundAOldDiff == false)
407             {
408                 throw new ConvWatchCancelException("No old difference file found." );
409             }
410             if (! bDiffIsOk)
411             {
412                 throw new ConvWatchException("Graphical difference compare failed with file '" + _sAbsoluteInputFile + "'");
413             }
414             return bDiffIsOk;
415         }
416 
417     // public static void main( String[] argv )
418     //     {
419     //         PRNCompare a = new PRNCompare();
420     //         a.setInputPath(     "/cws/so-cwsserv06/qadev18/SRC680/src.m47/convwatch.keep/input/msoffice/xp/PowerPoint");
421     //         a.setDocFile(       "1_Gov.ppt");
422     //         a.setReferencePath( "/cws/so-cwsserv06/qadev18/SRC680/src.m47/convwatch.keep/input/msoffice/xp/PowerPoint");
423     //         a.setReferenceFile( "1_Gov.prn" );
424     //
425     //         a.setOutputPath(    "/tmp/convwatch_java");
426     //         a.setPostScriptFile("1_Gov.ps" );
427     //     }
428 }
429