blob: 8ca9e5a6e40d9795e05f42ccab526e2c47415ae1 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
package convwatch;
import convwatch.ConvWatchException;
import convwatch.ConvWatchCancelException;
import convwatch.FileHelper;
import convwatch.OfficePrint;
import convwatch.PRNCompare;
import convwatch.StatusHelper;
import helper.URLHelper;
import java.io.File;
public class ConvWatch
{
String getBuildID_FromFile(String _sInfoFile)
{
String sBuildID = "";
IniFile aIniFile = new IniFile(_sInfoFile);
if (aIniFile.is())
{
sBuildID = aIniFile.getValue("", "buildid");
}
return sBuildID;
}
/**
* Check if given document (_sAbsoluteInputFile) and it's postscript representation (_sAbsoluteReferenceFile) produce
* the same output like the StarOffice / OpenOffice.org which is accessable with XMultiServiceFactory.
* Here a simple graphically difference check is run through.
*
* Hint: In the OutputPath all needed files will create, there must
* be very much space. It's not possible to say how much.
* One page need up to 800kb as jpeg.
* Sample: If a document contains 2 pages, we need 2*800kb for prn
* output and 2*800kb for ps output and 2*800kb for it's difference
* output. So up to 4800kb or 4.8mb.
*
* RAM is need least 300mb. Will say, it's tested on a pc with 128mb RAM and 256mb swap.
*
* It's also absolutlly impossible to say, how much time this functions consume.
*/
StatusHelper[] createPostscriptStartCheck(GraphicalTestArguments _aGTA,
String _sOutputPath, String _sAbsoluteInputFile, String _sAbsoluteReferenceFile)
throws ConvWatchCancelException
{
// TODO: some more checks
if (! FileHelper.exists(_sAbsoluteInputFile))
{
throw new ConvWatchCancelException("createPostscriptStartCheck: Input file: " + _sAbsoluteInputFile + " does not exist.");
}
if (_sAbsoluteReferenceFile == null)
{
// we assume, that the prn file is near the document
String sAbsoluteInputFileNoSuffix = FileHelper.getNameNoSuffix(_sAbsoluteInputFile);
_sAbsoluteReferenceFile = sAbsoluteInputFileNoSuffix + ".prn";
}
String fs = System.getProperty("file.separator");
File aAbsoluteReferenceFile = new File(_sAbsoluteReferenceFile);
if (aAbsoluteReferenceFile.isDirectory())
{
String sBasename = FileHelper.getBasename(_sAbsoluteInputFile);
String sNameNoSuffix = FileHelper.getNameNoSuffix(sBasename);
String sAbsoluteReferenceFileInfo = _sAbsoluteReferenceFile + fs + sNameNoSuffix + ".info";
_sAbsoluteReferenceFile = _sAbsoluteReferenceFile + fs + sNameNoSuffix + ".prn";
// Read the reference from the info file
String sRefBuildID = "";
if (FileHelper.exists(sAbsoluteReferenceFileInfo))
{
sRefBuildID = getBuildID_FromFile(sAbsoluteReferenceFileInfo);
}
_aGTA.setRefBuildID(sRefBuildID);
}
else
{
// java file has problems to check for directories, if the given directory doesn't exist.
String sName = FileHelper.getBasename(_sAbsoluteReferenceFile);
// thanks to Mircosoft, every document has a suffix, so if a name doesn't have a suffix, it must be a directory name
int nIdx = sName.indexOf('.');
if (nIdx == -1)
{
// must be a directory
throw new ConvWatchCancelException("createPostscriptStartCheck: Given reference directory: '" + _sAbsoluteReferenceFile + "' does not exist.");
}
}
boolean bAbsoluteReferenceFile = true;
if (! FileHelper.exists(_sAbsoluteReferenceFile))
{
if (_aGTA.createDefaultReference())
{
GlobalLogWriter.get().println("Reference File doesn't exist, will create a default");
bAbsoluteReferenceFile = false;
}
else
{
throw new ConvWatchCancelException("createPostscriptStartCheck: Given reference file: " + _sAbsoluteReferenceFile + " does not exist.");
}
}
FileHelper.makeDirectories("", _sOutputPath);
// runner.convwatch.compare();
String sAbsoluteInputFileURL = URLHelper.getFileURLFromSystemPath(_sAbsoluteInputFile);
String sInputFile = FileHelper.getBasename(_sAbsoluteInputFile);
// System.out.println("InputFile: " + sInputFile);
String sInputFileNoSuffix = FileHelper.getNameNoSuffix(sInputFile);
// System.out.println("BasenameNoSuffix: " + sInputFileNoSuffix);
String sAbsoluteOutputFile = _sOutputPath + fs + sInputFile;
String sAbsoluteOutputFileURL = URLHelper.getFileURLFromSystemPath(sAbsoluteOutputFile);
String sReferenceFile = FileHelper.getBasename(_sAbsoluteReferenceFile);
String sReferenceFileNoSuffix = FileHelper.getNameNoSuffix(sReferenceFile);
String sPostScriptFile = sReferenceFileNoSuffix + ".ps";
// System.out.println("PostscriptFile: " + sPostScriptFile);
String sAbsolutePrintFile = _sOutputPath + fs + sPostScriptFile;
String sAbsolutePrintFileURL = URLHelper.getFileURLFromSystemPath(sAbsolutePrintFile);
// System.out.println("AbsoluteInputFileURL: " + sAbsoluteInputFileURL);
// System.out.println("AbsoluteOutputFileURL: " + sAbsoluteOutputFileURL);
// System.out.println("AbsolutePrintFileURL: " + sAbsolutePrintFileURL);
// store and print the sAbsoluteInputFileURL file with StarOffice / OpenOffice.org
OfficePrint.printToFile(_aGTA, sAbsoluteInputFileURL, sAbsoluteOutputFileURL, sAbsolutePrintFileURL);
// wait(2);
if (! FileHelper.exists(sAbsolutePrintFile))
{
throw new ConvWatchCancelException("createPostscriptStartCheck: Printed file " + sAbsolutePrintFile + " does not exist.");
}
if (bAbsoluteReferenceFile == false)
{
// copy AbsolutePrintFile to AbsoluteReferenceFile
String sDestinationFile = sAbsolutePrintFile; // URLHelper.getSystemPathFromFileURL(...)
String sSourceFile = _sAbsoluteReferenceFile;
FileHelper.copy(sDestinationFile, sSourceFile);
// now the fix reference of the AbsoluteReferenceFile should exist.
if (! FileHelper.exists(_sAbsoluteReferenceFile))
{
throw new ConvWatchCancelException("createPostscriptStartCheck: Given reference file: " + _sAbsoluteReferenceFile + " does not exist, after try to copy.");
}
}
PRNCompare a = new PRNCompare();
String sInputPath = FileHelper.getPath(_sAbsoluteInputFile);
String sReferencePath = FileHelper.getPath(_sAbsoluteReferenceFile);
// String sReferenceFile = FileHelper.getBasename(sAbsoluteReferenceFile);
// System.out.println("InputPath: " + sInputPath);
// System.out.println("sReferencePath: " + sReferencePath);
// System.out.println("sReferenceFile: " + sReferenceFile);
a.setInputPath( sInputPath );
a.setReferencePath( sReferencePath );
a.setOutputPath( _sOutputPath );
// a.setDocFile( "1_Gov.ppt");
a.setReferenceFile( sReferenceFile );
a.setPostScriptFile(sPostScriptFile );
if (_aGTA.printAllPages() == true)
{
a.setMaxPages(9999);
}
else
{
if (_aGTA.getMaxPages() > 0)
{
a.setMaxPages(_aGTA.getMaxPages());
}
if (_aGTA.getOnlyPages().length() != 0)
{
// we can't interpret the string of getOnlyPages() right without much logic, so print all pages here!
a.setMaxPages(9999);
}
}
a.setResolutionInDPI(_aGTA.getResolutionInDPI());
a.setBorderMove(_aGTA.getBorderMove());
a.setDocumentType(_aGTA.getDocumentType());
StatusHelper[] aList = a.compare();
_aGTA.setBorderMove(a.getBorderMove());
return aList;
}
// -----------------------------------------------------------------------------
// This creates a status for exact on document
static boolean createINIStatus(StatusHelper[] aList, String _sFilenamePrefix, String _sOutputPath, String _sAbsoluteInputFile, String _sBuildID, String _sRefBuildID)
{
// Status
String fs = System.getProperty("file.separator");
String sBasename = FileHelper.getBasename(_sAbsoluteInputFile);
String sNameNoSuffix = FileHelper.getNameNoSuffix(sBasename);
// String sHTMLFile = _sFilenamePrefix + sNameNoSuffix + ".html";
// HTMLOutputter HTMLoutput = HTMLOutputter.create(_sOutputPath, sHTMLFile, "", "");
// HTMLoutput.header(sNameNoSuffix);
// TODO: version info was fine
// HTMLoutput.checkSection(sBasename);
// Status end
String sINIFile = _sFilenamePrefix + sNameNoSuffix + ".ini";
INIOutputter INIoutput = INIOutputter.create(_sOutputPath, sINIFile, "", "");
INIoutput.createHeader();
// TODO: version info was fine
INIoutput.writeSection("global");
INIoutput.writeValue("pages", String.valueOf(aList.length));
INIoutput.writeValue("buildid", _sBuildID);
INIoutput.writeValue("refbuildid", _sRefBuildID);
INIoutput.writeValue("diffdiff", "no");
INIoutput.writeValue("basename", sBasename);
boolean bResultIsOk = true; // result over all pages
for (int i=0;i<aList.length; i++)
{
INIoutput.writeSection("page" + String.valueOf(i + 1)); // list start at point 0, but this is page 1 and so on... current_page = (i + 1)
aList[i].printStatus();
boolean bCurrentResult = true; // result over exact one page
int nCurrentDiffStatus = aList[i].nDiffStatus;
// check if the status is in a defined range
if (nCurrentDiffStatus == StatusHelper.DIFF_NO_DIFFERENCES)
{
// ok.
}
else if (nCurrentDiffStatus == StatusHelper.DIFF_DIFFERENCES_FOUND && aList[i].nPercent < 5)
{
// ok.
}
else if (nCurrentDiffStatus == StatusHelper.DIFF_AFTER_MOVE_DONE_NO_PROBLEMS)
{
// ok.
}
else if (nCurrentDiffStatus == StatusHelper.DIFF_AFTER_MOVE_DONE_DIFFERENCES_FOUND && aList[i].nPercent2 < 5)
{
// ok.
}
else
{
// failed.
bCurrentResult = false; // logic: nDiff==0 = true if there is no difference
}
// Status
// HTMLoutput.checkLine(aList[i], bCurrentResult);
INIoutput.checkLine(aList[i], bCurrentResult);
bResultIsOk &= bCurrentResult;
}
// Status
// HTMLoutput.close();
INIoutput.close();
return bResultIsOk;
}
// -----------------------------------------------------------------------------
static void createINIStatus_DiffDiff(StatusHelper[] aDiffDiffList, String _sFilenamePrefix, String _sOutputPath, String _sAbsoluteInputFile, String _sBuildID)
{
// Status
String fs = System.getProperty("file.separator");
String sBasename = FileHelper.getBasename(_sAbsoluteInputFile);
String sNameNoSuffix = FileHelper.getNameNoSuffix(sBasename);
String sINIFile = _sFilenamePrefix + sNameNoSuffix + ".ini";
// HTMLOutputter HTMLoutput = HTMLOutputter.create(_sOutputPath, sHTMLFile, _sFilenamePrefix, "");
// HTMLoutput.header(sNameNoSuffix);
// HTMLoutput.checkDiffDiffSection(sBasename);
INIOutputter INIoutput = INIOutputter.create(_sOutputPath, sINIFile, _sFilenamePrefix, "");
INIoutput.createHeader();
// LLA? what if the are no values in the list? true or false;
INIoutput.writeSection("global");
INIoutput.writeValue("pages", String.valueOf(aDiffDiffList.length));
INIoutput.writeValue("buildid", _sBuildID);
INIoutput.writeValue("diffdiff", "yes");
INIoutput.writeValue("basename", sBasename);
for (int i=0;i<aDiffDiffList.length; i++)
{
INIoutput.writeSection("page" + String.valueOf(i + 1)); // list start at point 0, but this is page 1 and so on... current_page = (i + 1)
boolean bCurrentResult = (aDiffDiffList[i].nDiffStatus == StatusHelper.DIFF_NO_DIFFERENCES); // logic: nDiff==0 = true if there is no difference
// HTMLoutput.checkDiffDiffLine(aDiffDiffList[i], bCurrentResult);
INIoutput.checkDiffDiffLine(aDiffDiffList[i], bCurrentResult);
}
// Status
// HTMLoutput.close();
INIoutput.close();
}
// -----------------------------------------------------------------------------
public static boolean check(GraphicalTestArguments _aGTA,
String _sOutputPath, String _sAbsoluteInputFile, String _sAbsoluteReferenceFile)
throws ConvWatchCancelException, ConvWatchException
{
ConvWatch a = new ConvWatch();
StatusHelper[] aList = a.createPostscriptStartCheck(_aGTA, _sOutputPath, _sAbsoluteInputFile, _sAbsoluteReferenceFile);
DB.writeNumberOfPages(aList.length);
boolean bResultIsOk = createINIStatus(aList, "", _sOutputPath, _sAbsoluteInputFile, _aGTA.getBuildID(), _aGTA.getRefBuildID());
if (! bResultIsOk)
{
// it could be that this will store in a DB, there are problems with '\'
String sErrorMessage = "Graphical compare failed with file ";
String sErrorFile = _sAbsoluteInputFile.replace('\\', '/');
sErrorMessage = sErrorMessage + "'" + sErrorFile + "'";
DB.writeErrorFile(sErrorFile);
throw new ConvWatchException(sErrorMessage);
}
return bResultIsOk;
}
// -----------------------------------------------------------------------------
public static boolean checkDiffDiff(GraphicalTestArguments _aGTA,
String _sOutputPath, String _sAbsoluteInputFile, String _sAbsoluteReferenceFile,
String _sAbsoluteDiffPath)
throws ConvWatchCancelException, ConvWatchException
{
ConvWatch a = new ConvWatch();
_aGTA.setBorderMove(TriState.FALSE);
StatusHelper[] aList = a.createPostscriptStartCheck(_aGTA, _sOutputPath, _sAbsoluteInputFile, _sAbsoluteReferenceFile);
// Status
boolean bResultIsOk = createINIStatus(aList, "", _sOutputPath, _sAbsoluteInputFile, _aGTA.getBuildID(), _aGTA.getRefBuildID());
StatusHelper[] aDiffDiffList = new StatusHelper[aList.length];
String fs = System.getProperty("file.separator");
boolean bDiffIsOk = true;
boolean bFoundAOldDiff = false;
PRNCompare aCompare = new PRNCompare();
// LLA? what if the are no values in the list? true or false;
for (int i=0;i<aList.length; i++)
{
String sOrigDiffName = aList[i].m_sDiffGfx;
String sDiffBasename = FileHelper.getBasename(sOrigDiffName);
String sNewDiffName = _sAbsoluteDiffPath + fs + sDiffBasename;
if (! FileHelper.exists(sNewDiffName))
{
GlobalLogWriter.get().println("checkDiffDiff: Old diff file: '" + sNewDiffName + "' does not exist." );
continue;
}
// String sNewDiffName = _sAbsoluteDiffPath + fs + sDiffBasename;
// make a simple difference between these both diff files.
String sSourcePath1 = FileHelper.getPath(sOrigDiffName);
String sSourceFile1 = sDiffBasename;
String sSourcePath2 = _sAbsoluteDiffPath;
String sSourceFile2 = sDiffBasename;
StatusHelper aCurrentStatus = aCompare.checkDiffDiff(_sOutputPath, sSourcePath1, sSourceFile1, sSourcePath2, sSourceFile2);
boolean bCurrentResult = (aCurrentStatus.nDiffStatus == StatusHelper.DIFF_NO_DIFFERENCES); // logic: nDiff==0 = true if there is no difference
bDiffIsOk &= bCurrentResult;
bFoundAOldDiff = true;
aDiffDiffList[i] = aCurrentStatus;
}
createINIStatus_DiffDiff(aDiffDiffList, "DiffDiff_", _sOutputPath, _sAbsoluteInputFile, _aGTA.getBuildID());
if (bFoundAOldDiff == false)
{
throw new ConvWatchCancelException("No old difference file found." );
}
if (! bDiffIsOk)
{
throw new ConvWatchException("Graphical difference compare failed with file '" + _sAbsoluteInputFile + "'");
}
return bDiffIsOk;
}
// public static void main( String[] argv )
// {
// PRNCompare a = new PRNCompare();
// a.setInputPath( "/cws/so-cwsserv06/qadev18/SRC680/src.m47/convwatch.keep/input/msoffice/xp/PowerPoint");
// a.setDocFile( "1_Gov.ppt");
// a.setReferencePath( "/cws/so-cwsserv06/qadev18/SRC680/src.m47/convwatch.keep/input/msoffice/xp/PowerPoint");
// a.setReferenceFile( "1_Gov.prn" );
//
// a.setOutputPath( "/tmp/convwatch_java");
// a.setPostScriptFile("1_Gov.ps" );
// }
}