/************************************************************** * * 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.GraphicalTestArguments; import convwatch.OfficePrint; import convwatch.ConvWatchCancelException; import convwatch.FileHelper; import java.io.File; import helper.URLHelper; import com.sun.star.lang.XComponent; import com.sun.star.frame.XStorable; import com.sun.star.beans.PropertyValue; import com.sun.star.lang.XServiceInfo; import com.sun.star.uno.UnoRuntime; public class GraphicalDifferenceCheck { private static void showVersion() { // DEBUG only if (FileHelper.isDebugEnabled()) { GlobalLogWriter.get().println(""); GlobalLogWriter.get().println("+##############################+"); GlobalLogWriter.get().println("##### THIS IS CONVWATCH #####"); GlobalLogWriter.get().println("##### Debug Version 1.0015 #####"); GlobalLogWriter.get().println("+##############################+"); GlobalLogWriter.get().println(""); } } /** * Creates references form documents used by the graphical difference check * * @param _sInputPath the original document path * @param _sReferencePath the directory where the document will print as file or export as pdf. * * @throws ConvWatchException if there are problems, see message * * Stops rest, if one creation of reference fails. */ public static void createReferences(String _sInputPath, String _sReferencePath, GraphicalTestArguments _aGTA) throws ConvWatchException { //! // System.out.println("createReferences() InputPath: " + _sInputPath + " refpath: " + _sReferencePath); showVersion(); File aInputPath = new File(_sInputPath); // System.out.println("Inputpath in file: " + aInputPath.getAbsolutePath()); //! // if (aInputPath.exists()) // { // System.out.println("Inputpath exists"); // } // else // { // System.out.println("Inputpath doesn't exists"); // return; // } if (aInputPath.isDirectory()) { String fs = System.getProperty("file.separator"); String sRemovePath = aInputPath.getAbsolutePath(); // a whole directory Object[] aList = DirectoryHelper.traverse(_sInputPath, FileHelper.getFileFilter(), _aGTA.includeSubDirectories()); for (int i=0;i 0) { if (sNewReferencePath != null) { sNewReferencePath = sNewReferencePath + fs + sNewSubDir; } sNewOutputPath = sNewOutputPath + fs + sNewSubDir; if (sNewDiffPath != null) { sNewDiffPath = sNewDiffPath + fs + sNewSubDir; } } bOk &= checkOneFile(sEntry, sNewOutputPath, sNewReferencePath, sNewDiffPath, _aGTA); } } } else { bOk = /* GraphicalDifferenceCheck.*/ checkOneFile(_sInputPath, _sOutputPath, _sReferencePath, _sDiffPath, _aGTA); } return bOk; } /** * Used for the comparance of graphical differences. * Method compares one document (_sInputFile) with an older document of the same name in the provided directory (_sReferencePath). * * The path _sOutputPath must be writeable */ public static boolean checkOneFile(String _sInputFile, String _sOutputPath, String _sReferencePath, GraphicalTestArguments _aGTA) throws ConvWatchException { return checkOneFile( _sInputFile, _sOutputPath, _sReferencePath, null, _aGTA); } /** * Used for the comparance of graphical differences. * Method compares one document (_sInputFile) with an older document of the same name in the provided directory (_sReferencePath). * * For scenarios, where a difference is known and further changes are of interest, differences itself can be compared. * This functionality is provided by the difference path parameter (_sDiffPath). If set, the difference of the current comparance (between input and reference), * will be compared with the (same named) difference document from a earlier comparance. * * The path _sOutputPath must be writeable */ public static boolean checkOneFile(String _sInputFile, String _sOutputPath, String _sReferencePath, String _sDiffPath, GraphicalTestArguments _aGTA ) throws ConvWatchException { showVersion(); if (_aGTA != null) { _aGTA.setInputFile(_sInputFile); } boolean bOk = false; if (_sDiffPath != null) { // check with an old diff bOk = convwatch.ConvWatch.checkDiffDiff(_aGTA, _sOutputPath, _sInputFile, _sReferencePath, _sDiffPath); } else { // one file bOk = convwatch.ConvWatch.check(_aGTA, _sOutputPath, _sInputFile, _sReferencePath); } return bOk; } /** * Instead of providing a saved document for graphical comparance a StarOffice xComponent * will be saved and afterwards compared. * * @param xComponent the test document to be compared as StarOffice component * @param _sOutputPath Path where test results are supposed to been saved. The path _sOutputPath must be writeable. * These documents need sufficient disk space (up to 10MB per page). * A directory structure will be created, which is a mirrored from input path. * * @param resultDocName Name by which the xComponent shall be saved as OpenOffice.org XML document. * If provided without suffix, the suffix will be derived from the export filter. * @param _sReferencePath the directory where the document will print as file or export as pdf. * @param _GTA Helper class for lot of parameter to control the office. */ public static boolean checkOneFile(XComponent xComponent, String _sOutputPath, String _resultDocName, String _sReferencePath, GraphicalTestArguments _aGTA ) throws ConvWatchException { showVersion(); // one file String sInputFile; sInputFile = createInputFile(xComponent, _sOutputPath, _resultDocName); sInputFile = FileHelper.getSystemPathFromFileURL(sInputFile); return convwatch.ConvWatch.check(_aGTA, _sOutputPath, sInputFile, _sReferencePath); } // LLA: old! /** // LLA: old! * Returns 'true' if a reference document on the specific output path exists. // LLA: old! * The name of the document is corresponding to the input document, which can be // LLA: old! * provided by a single name or path. // LLA: old! * // LLA: old! * @param inputPath the original document name (possibly including path) // LLA: old! * @param referencePath the directory where the reference document will be stored // LLA: old! // LLA: old! */ // LLA: old! public static boolean isReferencExistent(String inputDocumentPath, String referencePath) // LLA: old! { // LLA: old! // isolate the document name // LLA: old! if(inputDocumentPath.indexOf(File.separator) != -1) // LLA: old! inputDocumentPath = inputDocumentPath.substring(inputDocumentPath.lastIndexOf(File.separator) + 1, inputDocumentPath.length()); // LLA: old! // LLA: old! // exchange any arbitray suffix against the refence suffix (.prn) // LLA: old! if(inputDocumentPath.indexOf('.') != -1) // LLA: old! inputDocumentPath = inputDocumentPath.substring(0, inputDocumentPath.lastIndexOf('.')); // LLA: old! inputDocumentPath = inputDocumentPath + ".prn"; // LLA: old! System.out.println("GraphicalDifference CheckReferenceDocument: " + inputDocumentPath); // LLA: old! // LLA: old! File refFile = new File(referencePath + inputDocumentPath); // LLA: old! if(refFile.exists()){ // LLA: old! return true; // LLA: old! }else // LLA: old! return false; // LLA: old! } private static String createInputFile(XComponent xComponent, String _sOutputPath, String resultDocName) throws ConvWatchCancelException { // find the adequate XML StarOffice output filter to save the document and adequate suffix StringBuffer suffix = new StringBuffer(); String exportFilter = getXMLOutputFilterforXComponent(xComponent, suffix); if(resultDocName == null) resultDocName = "OOoTestDocument"; if(resultDocName.indexOf('.') == -1) resultDocName = suffix.insert(0, resultDocName).toString(); // create a result URL for storing the office document String resultURL = URLHelper.getFileURLFromSystemPath(ensureEndingFileSep(_sOutputPath) + resultDocName); XStorable xStorable = null; xStorable = (com.sun.star.frame.XStorable)UnoRuntime.queryInterface(com.sun.star.frame.XStorable.class, xComponent); if(xStorable == null) { throw new ConvWatchCancelException("com.sun.star.frame.XStorable could not be instantiated from the office."); } PropertyValue pvFilterName = new PropertyValue("FilterName", -1, exportFilter, com.sun.star.beans.PropertyState.getDefault()); PropertyValue pvOverwrite = new PropertyValue("Overwrite", -1, new Boolean(true), com.sun.star.beans.PropertyState.getDefault()); try { xStorable.storeAsURL(resultURL, new PropertyValue[]{pvFilterName, pvOverwrite}); } catch (com.sun.star.io.IOException e) { // wrap IOException throw new ConvWatchCancelException("Wrap IOException caught, " + e.getMessage()); } GlobalLogWriter.get().println("Saving XComponent as " + resultURL); return resultURL; } private static String getXMLOutputFilterforXComponent(XComponent xComponent, StringBuffer suffix){ XServiceInfo xSI = (XServiceInfo) UnoRuntime.queryInterface(XServiceInfo.class, xComponent); if (xSI.supportsService("com.sun.star.text.TextDocument")){ resetBuffer(suffix, ".sxw"); return "swriter: StarOffice XML (Writer)"; }else if (xSI.supportsService("com.sun.star.sheet.SpreadsheetDocument")){ resetBuffer(suffix, ".sxc"); return "scalc: StarOffice XML (Calc)"; }else if (xSI.supportsService("com.sun.star.presentation.PresentationDocument")){ resetBuffer(suffix, ".sxi"); return "simpress: StarOffice XML (Impress)"; }else if(xSI.supportsService("com.sun.star.drawing.DrawingDocument")){ resetBuffer(suffix, ".sxd"); return "sdraw: StarOffice XML (Draw)"; }else if (xSI.supportsService("com.sun.star.formula.FormulaProperties")){ resetBuffer(suffix, ".sxm"); return "smath: StarOffice XML (Math)"; } return null; } private static StringBuffer resetBuffer(StringBuffer sb, String suffix) { if(sb != null) { sb.replace(0, sb.length(), suffix); } return sb; } private static String ensureEndingFileSep(String s) { if(s != null && !s.equals("") && !s.endsWith(File.separator)) { s = s.trim() + File.separator; } else { if(s == null) { s = ""; } } return s; } }