diff options
Diffstat (limited to 'qadevOOo/runner/convwatch/ConvWatch.java')
-rw-r--r-- | qadevOOo/runner/convwatch/ConvWatch.java | 432 |
1 files changed, 432 insertions, 0 deletions
diff --git a/qadevOOo/runner/convwatch/ConvWatch.java b/qadevOOo/runner/convwatch/ConvWatch.java new file mode 100644 index 000000000000..76dc3522d2e0 --- /dev/null +++ b/qadevOOo/runner/convwatch/ConvWatch.java @@ -0,0 +1,432 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 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" ); + // } +} |