blob: eb46e0178726fbd9b1039f2483c07cb1b2f1b894 [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 graphical;
import com.sun.star.frame.FrameSearchFlag;
import com.sun.star.util.XCloseable;
import helper.OfficeProvider;
import helper.OfficeWatcher;
import java.util.ArrayList;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.document.XTypeDetection;
import com.sun.star.container.XNameAccess;
import com.sun.star.frame.XDesktop;
import com.sun.star.beans.XPropertySet;
import com.sun.star.beans.PropertyValue;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.lang.XComponent;
import com.sun.star.frame.XStorable;
import com.sun.star.view.XPrintable;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.frame.XModel;
import com.sun.star.uno.AnyConverter;
import helper.URLHelper;
import helper.PropertyHelper;
import helper.OSHelper;
// import helper.Parameter;
import java.io.File;
/**
* This Object is to print a given document with OpenOffice.org / StarOffice
* over the normal printer driver
* or over it's pdf exporter
*/
public class OpenOfficePostscriptCreator implements IOffice
{
private ParameterHelper m_aParameterHelper;
private String m_sOutputURL;
private String m_sBasename;
private String m_sDocumentName;
private XComponent m_aDocument;
public OpenOfficePostscriptCreator(ParameterHelper _aParam, String _sResult)
{
m_aParameterHelper = _aParam;
String sOutputURL = _sResult;
if (! sOutputURL.startsWith("file:"))
{
sOutputURL = URLHelper.getFileURLFromSystemPath(_sResult);
}
m_sOutputURL = sOutputURL;
m_aDocument = null;
}
public void load(String _sDocumentName) throws OfficeException
{
m_sDocumentName = _sDocumentName;
String sInputFileURL = URLHelper.getFileURLFromSystemPath(m_sDocumentName);
m_aDocument = loadFromURL(m_aParameterHelper, sInputFileURL);
if (m_aDocument == null)
{
GlobalLogWriter.println("loadDocumentFromURL() failed with document: " + sInputFileURL);
throw new OfficeException("load(): failed with document" + sInputFileURL);
}
m_sBasename = FileHelper.getBasename(m_sDocumentName);
}
public void storeAsPostscript() throws OfficeException
{
if (m_aDocument != null)
{
String sDocumentName = FileHelper.appendPath(m_sOutputURL, m_sBasename);
if (m_aParameterHelper.getReferenceType().toLowerCase().equals("ooo") ||
m_aParameterHelper.getReferenceType().toLowerCase().equals("o3") ||
m_aParameterHelper.getReferenceType().toLowerCase().equals("ps") )
{
String sPrintURL = sDocumentName + ".ps";
impl_printToFileWithOOo(m_aParameterHelper, m_aDocument, sDocumentName, sPrintURL /*_sPrintFileURL*/);
String sBasename = FileHelper.getBasename(sPrintURL);
FileHelper.addBasenameToIndex(m_sOutputURL, sBasename, "OOo", "postscript", m_sDocumentName);
}
else if (m_aParameterHelper.getReferenceType().toLowerCase().equals("pdf"))
{
String sPDFURL = sDocumentName + ".pdf";
storeAsPDF(m_aParameterHelper, m_aDocument, sPDFURL);
String sBasename = FileHelper.getBasename(sPDFURL);
FileHelper.addBasenameToIndex(m_sOutputURL, sBasename, "pdf", "pdf-export", m_sDocumentName);
}
else
{
throw new OfficeException("unknown reference type");
}
GlobalLogWriter.println("Close document.");
m_aDocument.dispose();
}
}
public void start() throws OfficeException
{
startOffice();
}
public void close() throws OfficeException
{
stopOffice();
}
private void showProperty(PropertyValue _aValue)
{
String sName = _aValue.Name;
String sValue;
try
{
sValue = AnyConverter.toString(_aValue.Value);
GlobalLogWriter.println("Property " + sName + ":=" + sValue);
}
catch (com.sun.star.lang.IllegalArgumentException e)
{
GlobalLogWriter.println("showProperty: can't convert a object to string. " + e.getMessage());
}
}
/**
* shows the FilterName and MediaType from the given XComponent
*/
private String getDocumentType( XComponent _aDoc )
{
XModel xModel = UnoRuntime.queryInterface( XModel.class, _aDoc);
PropertyValue[] aArgs = xModel.getArgs();
for (int i=0;i<aArgs.length;i++)
{
PropertyValue aValue = aArgs[i];
// System.out.print("Property: '" + aValue.Name);
// System.out.println("' := '" + aValue.Value + "'");
if (aValue.Name.equals("FilterName") ||
aValue.Name.equals("MediaType"))
{
String sNameValue = "'" + aValue.Name + "' := '" + aValue.Value + "'";
return sNameValue;
}
}
return "";
}
private void showDocumentType( XComponent _aDoc )
{
String sNameValue = getDocumentType(_aDoc);
GlobalLogWriter.println(" Property: '" + sNameValue);
}
/**
* load a OpenOffice.org document from a given URL (_sInputURL)
* the ParameterHelper must contain a living MultiServiceFactory object
* or we crash here.
* Be aware, the ownership of the document gets to you, you have to close it.
*/
private XComponent loadFromURL(ParameterHelper _aGTA,
String _sInputURL)
{
XComponent aDoc = null;
try
{
if (_aGTA.getMultiServiceFactory() == null)
{
GlobalLogWriter.println("MultiServiceFactory in GraphicalTestArgument not set.");
return null;
}
Object oDsk = _aGTA.getMultiServiceFactory().createInstance("com.sun.star.frame.Desktop");
XDesktop aDesktop = UnoRuntime.queryInterface(XDesktop.class, oDsk);
if (aDesktop != null)
{
GlobalLogWriter.println("com.sun.star.frame.Desktop created.");
// String sInputURL = aCurrentParameter.sInputURL;
// String sOutputURL = aCurrentParameter.sOutputURL;
// String sPrintFileURL = aCurrentParameter.sPrintToFileURL;
// System.out.println(_sInputURL);
// set here the loadComponentFromURL() properties
// at the moment only 'Hidden' is set, so no window is opened at work
ArrayList<PropertyValue> aPropertyList = new ArrayList<PropertyValue>();
// check which properties should set and count it.
// if (_aGTA.isHidden())
// {
// nPropertyCount ++;
// }
// if (_aGTA.getImportFilterName() != null && _aGTA.getImportFilterName().length() > 0)
// {
// nPropertyCount ++;
// }
// initialize the propertyvalue
// int nPropertyIndex = 0;
// aProps = new PropertyValue[ nPropertyCount ];
// set all property values
if (_aGTA.isHidden())
{
PropertyValue Arg = new PropertyValue();
Arg.Name = "Hidden";
Arg.Value = Boolean.TRUE;
aPropertyList.add(Arg);
showProperty(Arg);
}
if (_aGTA.getImportFilterName() != null && _aGTA.getImportFilterName().length() > 0)
{
PropertyValue Arg = new PropertyValue();
Arg.Name = "FilterName";
Arg.Value = _aGTA.getImportFilterName();
aPropertyList.add(Arg);
showProperty(Arg);
}
PropertyValue ReadOnly = new PropertyValue();
ReadOnly.Name = "ReadOnly";
ReadOnly.Value = Boolean.TRUE;
aPropertyList.add(ReadOnly);
showProperty(ReadOnly);
GlobalLogWriter.println(DateHelper.getDateTimeForHumanreadableLog() + " Load document");
// GlobalLogWriter.flush();
XComponentLoader aCompLoader = UnoRuntime.queryInterface( XComponentLoader.class, aDesktop);
// XComponent aDoc = null;
_aGTA.getPerformance().startTime(PerformanceContainer.Load);
aDoc = aCompLoader.loadComponentFromURL(_sInputURL, "_blank", FrameSearchFlag.ALL, PropertyHelper.createPropertyValueArrayFormArrayList(aPropertyList) );
_aGTA.getPerformance().stopTime(PerformanceContainer.Load);
if (aDoc != null)
{
GlobalLogWriter.println(DateHelper.getDateTimeForHumanreadableLog() + " Load document done.");
showDocumentType(aDoc);
_aGTA.setDocumentType(getDocumentType(aDoc));
// TODO: TimeHelper.waitInSeconds(20, "Wait after load document. Maybe helps due to layouting problems.");
}
else
{
GlobalLogWriter.println(" Load document failed.");
if (_aGTA.getImportFilterName() != null && _aGTA.getImportFilterName().length() > 0)
{
GlobalLogWriter.println(" Please check FilterName := '" + _aGTA.getImportFilterName() + "'");
}
GlobalLogWriter.println("");
}
}
else
{
GlobalLogWriter.println("com.sun.star.frame.Desktop failed.");
}
}
catch ( com.sun.star.uno.Exception e )
{
// Some exception occures.FAILED
GlobalLogWriter.println("UNO Exception caught.");
GlobalLogWriter.println("Message: " + e.getMessage());
e.printStackTrace();
aDoc = null;
}
return aDoc;
}
private boolean exportToPDF(XComponent _xComponent, String _sDestinationName)
{
XServiceInfo xServiceInfo =
UnoRuntime.queryInterface(
XServiceInfo.class, _xComponent
);
ArrayList<PropertyValue> aPropertyList = new ArrayList<PropertyValue>();
PropertyValue aFiltername = new PropertyValue();
aFiltername.Name = "FilterName";
aFiltername.Value = getFilterName_forPDF(xServiceInfo);
aPropertyList.add(aFiltername);
showProperty(aFiltername);
boolean bWorked = true;
// TODO: TimeHelper.waitInSeconds(20, "Wait before storeToURL. Maybe helps due to layouting problems.");
try
{
XStorable store =
UnoRuntime.queryInterface(
XStorable.class, _xComponent
);
store.storeToURL(_sDestinationName, PropertyHelper.createPropertyValueArrayFormArrayList(aPropertyList));
}
catch (com.sun.star.io.IOException e)
{
GlobalLogWriter.println("IO Exception caught.");
GlobalLogWriter.println("Message: " + e.getMessage());
bWorked = false;
}
return bWorked;
}
private String getFilterName_forPDF(XServiceInfo xServiceInfo)
{
String filterName = "";
if (xServiceInfo.supportsService("com.sun.star.text.TextDocument"))
{
//writer
filterName = "writer_pdf_Export";
}
else if ( xServiceInfo.supportsService( "com.sun.star.sheet.SpreadsheetDocument" ) )
{
//calc
filterName = "calc_pdf_Export";
}
else if ( xServiceInfo.supportsService( "com.sun.star.drawing.DrawingDocument" ) )
{
//draw
filterName = "draw_pdf_Export";
}
else if ( xServiceInfo.supportsService( "com.sun.star.presentation.PresentationDocument" ) )
{
//impress
filterName = "impress_pdf_Export";
}
else if (xServiceInfo.supportsService("com.sun.star.text.WebDocument"))
{
//html document
filterName = "writer_web_pdf_Export";
}
else if ( xServiceInfo.supportsService("com.sun.star.text.GlobalDocument") )
{
//master document
filterName = "writer_globaldocument_pdf_Export";
}
else if ( xServiceInfo.supportsService( "com.sun.star.formulaFormulaProperties" ) )
{
//math document
filterName = "math_pdf_Export";
}
return filterName;
}
// -----------------------------------------------------------------------------
// public boolean storeAsPDF(ParameterHelper _aGTA,
// String _sInputURL,
// String _sOutputURL)
// {
// boolean bBack = false;
// XComponent aDoc = loadFromURL(_aGTA, _sInputURL);
//
// if (aDoc == null)
// {
// GlobalLogWriter.println("Can't load document.");
// return bBack;
// }
// bBack = storeAsPDF(_aGTA, aDoc, _sOutputURL);
// FileHelper.createInfoFile(_sOutputURL, _aGTA, "as pdf");
//
// GlobalLogWriter.println("Close document.");
// aDoc.dispose();
// return bBack;
// }
public boolean storeAsPDF(ParameterHelper _aGTA,
XComponent _aDoc,
String _sOutputURL) throws OfficeException
{
// try {
boolean bBack = true;
_aGTA.getPerformance().startTime(PerformanceContainer.StoreAsPDF);
bBack = exportToPDF(_aDoc, _sOutputURL);
_aGTA.getPerformance().stopTime(PerformanceContainer.StoreAsPDF);
if (!bBack)
{
GlobalLogWriter.println("Can't store document as PDF.");
// bBack = false;
throw new OfficeException("Can't store document as PDF");
}
else
{
FileHelper.createInfoFile(_sOutputURL, _aGTA, "as pdf");
}
return bBack;
}
// -----------------------------------------------------------------------------
/**
* print the document found in file (_sInputURL) to as postscript to file (_sPrintFileURL)
* Due to the fact we use a printer to convert the file to postscript, the default printer
* to create such postscript format must be installed, this is not tested here.
*
* @return true, if print has been done.
* Be careful, true means only print returns with no errors, to be sure print is really done
* check existance of _sPrintFileURL
*/
// public boolean printToFileWithOOo(ParameterHelper _aGTA,
// String _sInputURL,
// String _sOutputURL,
// String _sPrintFileURL)
// {
// // waitInSeconds(1);
// boolean bBack = false;
//
// XComponent aDoc = loadFromURL(_aGTA, _sInputURL);
// if (aDoc != null)
// {
// if ( _sInputURL.equals(_sOutputURL) )
// {
// // don't store document
// // input and output are equal OR
// GlobalLogWriter.println("Warning: Inputpath and Outputpath are equal. Document will not stored again.");
// disallowStore();
// }
// bBack = impl_printToFileWithOOo(_aGTA, aDoc, _sOutputURL, _sPrintFileURL);
//
// GlobalLogWriter.println("Close document.");
// aDoc.dispose();
// }
// else
// {
// GlobalLogWriter.println("loadDocumentFromURL() failed with document: " + _sInputURL);
// }
// return bBack;
// }
// -----------------------------------------------------------------------------
private boolean impl_printToFileWithOOo(ParameterHelper _aGTA,
XComponent _aDoc,
String _sOutputURL,
String _sPrintFileURL)
{
boolean bBack = false;
boolean bFailed = true; // always be a pessimist,
if (_aDoc == null)
{
GlobalLogWriter.println("No document is given.");
return bBack;
}
try
{
if (_sOutputURL != null)
{
if (isStoreAllowed())
{
// store the document in an other directory
XStorable aStorable = UnoRuntime.queryInterface( XStorable.class, _aDoc);
if (aStorable != null)
{
PropertyValue [] szEmptyArgs = new PropertyValue [0];
GlobalLogWriter.println(DateHelper.getDateTimeForHumanreadableLog() + " Store document.");
_aGTA.getPerformance().startTime(PerformanceContainer.Store);
aStorable.storeAsURL(_sOutputURL, szEmptyArgs);
_aGTA.getPerformance().stopTime(PerformanceContainer.Store);
GlobalLogWriter.println(DateHelper.getDateTimeForHumanreadableLog() + " Store document done.");
// TimeHelper.waitInSeconds(1, "After store as URL to:" + _sOutputURL);
GlobalLogWriter.println("Reload stored file test.");
XComponent aDoc = loadFromURL(_aGTA, _sOutputURL);
if (aDoc == null)
{
GlobalLogWriter.println("Reload stored file test failed, can't reload file: " + _sOutputURL);
}
else
{
XCloseable xClose = UnoRuntime.queryInterface(XCloseable.class, aDoc);
if (xClose != null)
{
xClose.close(true);
}
else
{
aDoc.dispose();
}
// TimeHelper.waitInSeconds(1, "after close temp document");
}
}
}
else
{
// make sure to create the directory in
String sOutputFilename = FileHelper.getSystemPathFromFileURL(_sOutputURL);
String sOutputPath = FileHelper.getPath(sOutputFilename);
File aFile = new File(sOutputPath);
aFile.mkdirs();
}
}
}
catch ( com.sun.star.uno.Exception e )
{
// Some exception occures.FAILED
GlobalLogWriter.println("UNO Exception caught.");
GlobalLogWriter.println("Message: " + e.getMessage());
e.printStackTrace();
bBack = false;
}
try
{
// System.out.println("Document loaded.");
// Change Pagesettings to DIN A4
GlobalLogWriter.println(DateHelper.getDateTimeForHumanreadableLog() + " Print document.");
XPrintable aPrintable = UnoRuntime.queryInterface( XPrintable.class, _aDoc);
if (aPrintable != null)
{
// System.out.println(" Set PaperFormat to DIN A4");
// {
// PropertyValue[] aPrinterProps = aPrintable.getPrinter();
// System.out.println("PrinterProps size: " + String.valueOf(aPrinterProps.length));
// int nPropIndex = 0;
// while (!"PaperFormat".equals(aPrinterProps[nPropIndex].Name))
// {
// // System.out.println(aPrinterProps[nPropIndex].Name);
// nPropIndex++;
// }
// aPrinterProps[nPropIndex].Value = com.sun.star.view.PaperFormat.A4;
// aPrintable.setPrinter(aPrinterProps);
// }
// configure Office to allow to execute macos
// TODO: We need a possiblity to set the printer name also for StarOffice/OpenOffice
if (OSHelper.isWindows())
{
if (_aGTA.getPrinterName() != null)
{
ArrayList<PropertyValue> aPropertyList = new ArrayList<PropertyValue>();
// PropertyValue [] aPrintProps = new PropertyValue[1];
PropertyValue Arg = new PropertyValue();
Arg.Name = "Name";
Arg.Value = _aGTA.getPrinterName();
aPropertyList.add(Arg);
showProperty(Arg);
// GlobalLogWriter.println("Printername is not null, so set to " + _aGTA.getPrinterName());
aPrintable.setPrinter(PropertyHelper.createPropertyValueArrayFormArrayList(aPropertyList));
}
}
// set property values for XPrintable.print()
// more can be found at "http://api.openoffice.org/docs/common/ref/com/sun/star/view/PrintOptions.html"
// int nProperties = 1; // default for 'FileName' property
// if (_aGTA.printAllPages() == false)
// {
// // we don't want to print all pages, build Pages string by ourself
// nProperties ++;
// }
// int nPropsCount = 0;
// If we are a SpreadSheet (calc), we need to set PrintAllSheets property to 'true'
XServiceInfo xServiceInfo = UnoRuntime.queryInterface( XServiceInfo.class, _aDoc );
if ( xServiceInfo.supportsService( "com.sun.star.sheet.SpreadsheetDocument" ) )
{
XMultiServiceFactory xMSF = _aGTA.getMultiServiceFactory();
Object aSettings = xMSF.createInstance( "com.sun.star.sheet.GlobalSheetSettings" );
if (aSettings != null)
{
XPropertySet xPropSet = UnoRuntime.queryInterface( XPropertySet.class, aSettings );
xPropSet.setPropertyValue( "PrintAllSheets", new Boolean( true ) );
GlobalLogWriter.println("PrintAllSheets := true");
}
}
ArrayList<PropertyValue> aPrintProps = new ArrayList<PropertyValue>();
// GlobalLogWriter.println("Property FileName:=" + _sPrintFileURL);
// PropertyValue [] aPrintProps = new PropertyValue[nProperties];
PropertyValue Arg = new PropertyValue();
Arg.Name = "FileName";
Arg.Value = _sPrintFileURL;
// aPrintProps[nPropsCount ++] = Arg;
aPrintProps.add(Arg);
showProperty(Arg);
// generate pages string
if (_aGTA.printAllPages() == false)
{
String sPages = "";
if (_aGTA.getMaxPages() > 0)
{
sPages = "1-" + String.valueOf(_aGTA.getMaxPages());
}
if (_aGTA.getOnlyPages().length() != 0)
{
if (sPages.length() != 0)
{
sPages += ";";
}
sPages += String.valueOf(_aGTA.getOnlyPages());
}
Arg = new PropertyValue();
Arg.Name = "Pages";
Arg.Value = sPages;
aPrintProps.add(Arg);
showProperty(Arg);
}
// GlobalLogWriter.println("Start printing.");
_aGTA.getPerformance().startTime(PerformanceContainer.Print);
aPrintable.print(PropertyHelper.createPropertyValueArrayFormArrayList(aPrintProps));
TimeHelper.waitInSeconds(1, "Start waiting for print ready.");
GlobalLogWriter.println("Wait until document is printed.");
boolean isBusy = true;
int nPrintCount = 0;
while (isBusy)
{
PropertyValue[] aPrinterProps = aPrintable.getPrinter();
int nPropIndex = 0;
while (!"IsBusy".equals(aPrinterProps[nPropIndex].Name))
{
// System.out.println(aPrinterProps[nPropIndex].Name);
nPropIndex++;
}
isBusy = (aPrinterProps[nPropIndex].Value == Boolean.TRUE) ? true : false;
TimeHelper.waitInSeconds(1, "is print ready?");
nPrintCount++;
if (nPrintCount > 3600)
{
// we will never wait >1h until print is ready!
GlobalLogWriter.println("ERROR: Cancel print due to too long wait.");
throw new com.sun.star.uno.Exception("Convwatch exception, wait too long for printing.");
}
}
// TODO:
// TimeHelper.waitInSeconds(40, "Start waiting after print ready.");
_aGTA.getPerformance().stopTime(PerformanceContainer.Print);
GlobalLogWriter.println(DateHelper.getDateTimeForHumanreadableLog() + " Print document done.");
// Create a .info file near the printed '.ps' or '.prn' file.
FileHelper.createInfoFile(_sPrintFileURL, _aGTA);
}
else
{
GlobalLogWriter.println("Can't get XPrintable interface.");
}
bFailed = false;
bBack = true;
}
catch ( com.sun.star.uno.Exception e )
{
// Some exception occures.FAILED
GlobalLogWriter.println("UNO Exception caught.");
GlobalLogWriter.println("Message: " + e.getMessage());
e.printStackTrace();
bBack = false;
}
if (bFailed == true)
{
GlobalLogWriter.println("convwatch.OfficePrint: FAILED");
}
else
{
GlobalLogWriter.println("convwatch.OfficePrint: OK");
}
return bBack;
}
/**
* @param _aGTA
* @param _sAbsoluteOutputPath
* @param _sAbsoluteInputFile
* @return true, if the reference (*.prrn file) based on given output path and given input path exist.
* If OVERWRITE_REFERENCE is set, always return false.
*/
public boolean isReferenceExists(ParameterHelper _aGTA,
String _sAbsoluteOutputPath,
String _sAbsoluteInputFile)
{
if (! FileHelper.exists(_sAbsoluteInputFile))
{
// throw new ConvWatchCancelException("Input file: " + _sAbsoluteInputFile + " does not exist.");
return false;
}
// String fs = System.getProperty("file.separator");
// String sInputFileURL = URLHelper.getFileURLFromSystemPath(_sAbsoluteInputFile);
String sInputFileBasename = FileHelper.getBasename(_sAbsoluteInputFile);
// String sOutputFileURL = null;
String sOutputPath;
if (_sAbsoluteOutputPath != null)
{
sOutputPath = _sAbsoluteOutputPath;
// FileHelper.makeDirectories("", sOutputPath);
}
else
{
String sInputPath = FileHelper.getPath(_sAbsoluteInputFile);
sOutputPath = sInputPath;
}
// sOutputFileURL = URLHelper.getFileURLFromSystemPath(sOutputPath + fs + sInputFileBasename);
// sOutputFileURL = null;
String sPrintFilename = FileHelper.getNameNoSuffix(sInputFileBasename);
// String sPrintFileURL;
String sAbsolutePrintFilename = FileHelper.appendPath(sOutputPath, sPrintFilename + ".prn");
if (FileHelper.exists(sAbsolutePrintFilename) && _aGTA.getOverwrite() == false)
{
GlobalLogWriter.println("Reference already exist, don't overwrite. Set " + PropertyName.DOC_COMPARATOR_OVERWRITE_REFERENCE + "=true to force overwrite.");
return true;
}
return false;
}
// -----------------------------------------------------------------------------
/**
* create a reference file
* _sAbsoluteInputPath contains the source file, if not exists, return with failure.
* _sAbsoluteOutputPath contains the destination, where the file will store after load with StarOffice/OpenOffice.org
* if is null, print only near the Input file path
* _sPrintType ".prn" Print input file with StarOffice/OpenOffice.org and the default printer as PostScript
*
* @param _aGTA
* @return
*/
// public static boolean buildReference(ParameterHelper _aGTA,
// String _sAbsoluteOutputPath,
// String _sAbsoluteInputFile)
// throws OfficeException
// {
// if (! FileHelper.exists(_sAbsoluteInputFile))
// {
// throw new OfficeException("buildReference(): Input file: " + _sAbsoluteInputFile + " does not exist.");
// }
//
// String fs = System.getProperty("file.separator");
//
// String sInputFileURL = URLHelper.getFileURLFromSystemPath(_sAbsoluteInputFile);
//
// String sInputFileBasename = FileHelper.getBasename(_sAbsoluteInputFile);
// String sOutputFileURL = null;
// String sOutputPath;
// if (_sAbsoluteOutputPath != null)
// {
// sOutputPath = _sAbsoluteOutputPath;
// FileHelper.makeDirectories("", sOutputPath);
// }
// else
// {
// String sInputPath = FileHelper.getPath(_sAbsoluteInputFile);
// sOutputPath = sInputPath;
// }
// // sOutputFileURL = URLHelper.getFileURLFromSystemPath(sOutputPath + fs + sInputFileBasename);
// sOutputFileURL = null;
//
// String sPrintFilename = FileHelper.getNameNoSuffix(sInputFileBasename);
// String sPrintFileURL;
//
// String sAbsolutePrintFilename = sOutputPath + fs + sPrintFilename + ".prn";
// if (FileHelper.exists(sAbsolutePrintFilename) && _aGTA.getOverwrite() == false)
// {
// GlobalLogWriter.println("Reference already exist, don't overwrite. Set " + PropertyName.DOC_COMPARATOR_OVERWRITE_REFERENCE + "=true to force overwrite.");
// return true;
// }
//
// if (_aGTA.getReferenceType().toLowerCase().equals("msoffice"))
// {
// sPrintFileURL = URLHelper.getFileURLFromSystemPath(sAbsolutePrintFilename);
// }
// else if (_aGTA.getReferenceType().toLowerCase().equals("pdf"))
// {
//// TODO: If we rename the stored file to *.pdf, we have to be sure that we use *.pdf also as a available reference
// sPrintFileURL = URLHelper.getFileURLFromSystemPath(sAbsolutePrintFilename );
// }
// else if (_aGTA.getReferenceType().toLowerCase().equals("ooo"))
// {
// sPrintFileURL = URLHelper.getFileURLFromSystemPath(sAbsolutePrintFilename );
// }
// else
// {
// GlobalLogWriter.println("OfficePrint.buildreference(): Unknown print type.");
// return false;
// }
// return printToFile(_aGTA, sInputFileURL, sOutputFileURL, sPrintFileURL);
// }
// TODO: Das Teil muss hier raus!
// public static boolean printToFile(ParameterHelper _aGTA,
// String _sInputFileURL,
// String _sOutputFileURL,
// String _sPrintFileURL) throws OfficeException
// {
// boolean bBack = false;
// String sPrintFileURL = null;
//
//
// // remember the current timer, to know how long a print process need.
// // startTimer();
//
// if (_aGTA.getReferenceType().toLowerCase().equals("ooo"))
// {
// bBack = printToFileWithOOo(_aGTA, _sInputFileURL, _sOutputFileURL, _sPrintFileURL);
// }
// else if (_aGTA.getReferenceType().toLowerCase().equals("pdf"))
// {
// GlobalLogWriter.println("USE PDF AS EXPORT FORMAT.");
// bBack = storeAsPDF(_aGTA, _sInputFileURL, _sPrintFileURL);
// }
// else if (_aGTA.getReferenceType().toLowerCase().equals("msoffice"))
// {
// if (MSOfficePostscriptCreator.isMSOfficeDocumentFormat(_sInputFileURL))
// {
// GlobalLogWriter.println("USE MSOFFICE AS EXPORT FORMAT.");
// MSOfficePostscriptCreator a = new MSOfficePostscriptCreator();
// try
// {
// a.printToFileWithMSOffice(_aGTA, FileHelper.getSystemPathFromFileURL(_sInputFileURL),
// FileHelper.getSystemPathFromFileURL(_sPrintFileURL));
// }
// catch(OfficeException e)
// {
// e.printStackTrace();
// GlobalLogWriter.println(e.getMessage());
// throw new OfficeException("Exception caught. Problem with MSOffice printer methods.");
// }
// catch(java.io.IOException e)
// {
// GlobalLogWriter.println(e.getMessage());
// throw new OfficeException("IOException caught. Problem with MSOffice printer methods.");
// }
// bBack = true;
// }
// else
// {
// GlobalLogWriter.println("This document type is not recognized as MSOffice format, as default fallback StarOffice/OpenOffice.org instead is used.");
// bBack = printToFileWithOOo(_aGTA, _sInputFileURL, _sOutputFileURL, _sPrintFileURL);
// }
// }
// else
// {
// // System.out.println("");
// throw new OfficeException("OfficePrint.printToFile(): Unknown print type.");
// }
// return bBack;
// }
// -----------------------------------------------------------------------------
// TODO: move this away!
// -----------------------------------------------------------------------------
void showType(String _sInputURL, XMultiServiceFactory _xMSF)
{
if (_sInputURL.length() == 0)
{
return;
}
if (_xMSF == null)
{
GlobalLogWriter.println("MultiServiceFactory not set.");
return;
}
XTypeDetection aTypeDetection = null;
try
{
Object oObj = _xMSF.createInstance("com.sun.star.document.TypeDetection");
aTypeDetection = UnoRuntime.queryInterface(XTypeDetection.class, oObj);
}
catch(com.sun.star.uno.Exception e)
{
GlobalLogWriter.println("Can't get com.sun.star.document.TypeDetection.");
return;
}
if (aTypeDetection != null)
{
String sType = aTypeDetection.queryTypeByURL(_sInputURL);
GlobalLogWriter.println("Type is: " + sType);
}
}
// -----------------------------------------------------------------------------
public String getInternalFilterName(String _sFilterName, XMultiServiceFactory _xMSF)
{
if (_sFilterName.length() == 0)
{
// System.out.println("No FilterName set.");
return null;
}
if (_xMSF == null)
{
GlobalLogWriter.println("MultiServiceFactory not set.");
return null;
}
// XFilterFactory aFilterFactory = null;
Object aObj = null;
try
{
aObj = _xMSF.createInstance("com.sun.star.document.FilterFactory");
}
catch(com.sun.star.uno.Exception e)
{
GlobalLogWriter.println("Can't get com.sun.star.document.FilterFactory.");
return null;
}
if (aObj != null)
{
XNameAccess aNameAccess = UnoRuntime.queryInterface(XNameAccess.class, aObj);
if (aNameAccess != null)
{
// if (_sFilterName.toLowerCase().equals("help"))
// {
// System.out.println("Show all possible ElementNames from current version." );
// String[] aElementNames = aNameAccess.getElementNames();
// for (int i = 0; i<aElementNames.length; i++)
// {
// System.out.println(aElementNames[i]);
// }
// System.out.println("Must quit.");
// System.out.exit(1);
// }
if (! aNameAccess.hasByName(_sFilterName))
{
GlobalLogWriter.println("FilterFactory.hasByName() says there exist no '" + _sFilterName + "'" );
return null;
}
Object[] aElements = null;
String[] aExtensions;
try
{
aElements = (Object[]) aNameAccess.getByName(_sFilterName);
if (aElements != null)
{
String sInternalFilterName = null;
// System.out.println("getByName().length: " + String.valueOf(aElements.length));
for (int i=0;i<aElements.length; i++)
{
PropertyValue aPropertyValue = (PropertyValue)aElements[i];
// System.out.println("PropertyValue.Name: " + aPropertyValue.Name);
if (aPropertyValue.Name.equals("Type"))
{
String sValue = (String)aPropertyValue.Value;
// System.out.println("Type: " + sValue);
sInternalFilterName = sValue;
}
}
return sInternalFilterName;
}
else
{
GlobalLogWriter.println("There are no elements for FilterName '" + _sFilterName + "'");
return null;
}
}
catch (com.sun.star.container.NoSuchElementException e)
{
GlobalLogWriter.println("NoSuchElementException caught. " + e.getMessage());
}
catch (com.sun.star.lang.WrappedTargetException e)
{
GlobalLogWriter.println("WrappedTargetException caught. " + e.getMessage());
}
}
}
return null;
}
// -----------------------------------------------------------------------------
String getServiceNameFromFilterName(String _sFilterName, XMultiServiceFactory _xMSF)
{
if (_sFilterName.length() == 0)
{
// System.out.println("No FilterName set.");
return null;
}
if (_xMSF == null)
{
GlobalLogWriter.println("MultiServiceFactory not set.");
return null;
}
// XFilterFactory aFilterFactory = null;
Object aObj = null;
try
{
aObj = _xMSF.createInstance("com.sun.star.document.FilterFactory");
}
catch(com.sun.star.uno.Exception e)
{
GlobalLogWriter.println("Can't get com.sun.star.document.FilterFactory.");
return null;
}
if (aObj != null)
{
XNameAccess aNameAccess = UnoRuntime.queryInterface(XNameAccess.class, aObj);
if (aNameAccess != null)
{
if (! aNameAccess.hasByName(_sFilterName))
{
GlobalLogWriter.println("FilterFactory.hasByName() says there exist no '" + _sFilterName + "'" );
return null;
}
Object[] aElements = null;
String[] aExtensions;
try
{
aElements = (Object[]) aNameAccess.getByName(_sFilterName);
if (aElements != null)
{
String sServiceName = null;
// System.out.println("getByName().length: " + String.valueOf(aElements.length));
for (int i=0;i<aElements.length; i++)
{
PropertyValue aPropertyValue = (PropertyValue)aElements[i];
if (aPropertyValue.Name.equals("DocumentService"))
{
String sValue = (String)aPropertyValue.Value;
// System.out.println("DocumentService: " + sValue);
sServiceName = sValue;
break;
}
}
return sServiceName;
}
else
{
GlobalLogWriter.println("There are no elements for FilterName '" + _sFilterName + "'");
return null;
}
}
catch (com.sun.star.container.NoSuchElementException e)
{
GlobalLogWriter.println("NoSuchElementException caught. " + e.getMessage());
}
catch (com.sun.star.lang.WrappedTargetException e)
{
GlobalLogWriter.println("WrappedTargetException caught. " + e.getMessage());
}
}
}
return null;
}
// -----------------------------------------------------------------------------
public static String getFileExtension(String _sInternalFilterName, XMultiServiceFactory _xMSF)
{
if (_sInternalFilterName.length() == 0)
{
// System.out.println("No FilterName set.");
return null;
}
if (_xMSF == null)
{
GlobalLogWriter.println("MultiServiceFactory not set.");
return null;
}
XTypeDetection aTypeDetection = null;
try
{
Object oObj = _xMSF.createInstance("com.sun.star.document.TypeDetection");
aTypeDetection = UnoRuntime.queryInterface(XTypeDetection.class, oObj);
}
catch(com.sun.star.uno.Exception e)
{
GlobalLogWriter.println("Can't get com.sun.star.document.TypeDetection.");
return null;
}
if (aTypeDetection != null)
{
XNameAccess aNameAccess = UnoRuntime.queryInterface(XNameAccess.class, aTypeDetection);
if (aNameAccess != null)
{
// System.out.println("Show ElementNames" );
// String[] aElementNames = aNameAccess.getElementNames();
// for (int i = 0; i<aElementNames.length; i++)
// {
// System.out.println(aElementNames[i]);
// }
if (! aNameAccess.hasByName(_sInternalFilterName))
{
GlobalLogWriter.println("TypeDetection.hasByName() says there exist no '" + _sInternalFilterName + "'" );
return null;
}
Object[] aElements = null;
String[] aExtensions;
try
{
aElements = (Object[]) aNameAccess.getByName(_sInternalFilterName);
if (aElements != null)
{
String sExtension = null;
// System.out.println("getByName().length: " + String.valueOf(aElements.length));
for (int i=0;i<aElements.length; i++)
{
PropertyValue aPropertyValue = (PropertyValue)aElements[i];
// System.out.println("PropertyValue.Name: " + aPropertyValue.Name);
if (aPropertyValue.Name.equals("Extensions"))
{
aExtensions = (String[])aPropertyValue.Value;
GlobalLogWriter.println(" Possible extensions are: " + String.valueOf(aExtensions.length));
if (aExtensions.length > 0)
{
for (int j=0;j<aExtensions.length;j++)
{
GlobalLogWriter.println(" " + aExtensions[j]);
}
sExtension = aExtensions[0];
GlobalLogWriter.println("");
}
}
}
return sExtension;
}
else
{
GlobalLogWriter.println("There are no elements for FilterName '" + _sInternalFilterName + "'");
return null;
}
}
catch (com.sun.star.container.NoSuchElementException e)
{
GlobalLogWriter.println("NoSuchElementException caught. " + e.getMessage());
}
catch (com.sun.star.lang.WrappedTargetException e)
{
GlobalLogWriter.println("WrappedTargetException caught. " + e.getMessage());
}
}
}
return null;
}
// -----------------------------------------------------------------------------
public void convertDocument(String _sInputFile, String _sOutputPath, ParameterHelper _aGTA) throws OfficeException
{
XMultiServiceFactory xMSF = _aGTA.getMultiServiceFactory();
if (xMSF == null)
{
GlobalLogWriter.println("MultiServiceFactory in GraphicalTestArgument not set.");
return;
}
String sInputURL = URLHelper.getFileURLFromSystemPath(_sInputFile);
// showType(sInputURL, xMSF);
XComponent aDoc = loadFromURL( _aGTA, sInputURL);
if (aDoc == null)
{
GlobalLogWriter.println("Can't load document '"+ sInputURL + "'");
return;
}
if (_sOutputPath == null)
{
GlobalLogWriter.println("Outputpath not set.");
return;
}
if (! isStoreAllowed())
{
GlobalLogWriter.println("It's not allowed to store, check Input/Output path.");
return;
}
// TODO: Do we need to wait?
// TimeHelper.waitInSeconds(1, "wait after loadFromURL.");
XServiceInfo xServiceInfo = UnoRuntime.queryInterface( XServiceInfo.class, aDoc );
// String sFilter = getFilterName_forExcel(xServiceInfo);
// System.out.println("Filter is " + sFilter);
// store the document in an other directory
XStorable xStorable = UnoRuntime.queryInterface( XStorable.class, aDoc);
if (xStorable == null)
{
GlobalLogWriter.println("com.sun.star.frame.XStorable is null");
return;
}
String sFilterName = _aGTA.getExportFilterName();
// check how many Properties should initialize
int nPropertyCount = 0;
// if (sFilterName != null && sFilterName.length() > 0)
// {
// nPropertyCount ++;
// }
// initialize PropertyArray
// PropertyValue [] aStoreProps = new PropertyValue[ nPropertyCount ];
// int nPropertyIndex = 0;
ArrayList<PropertyValue> aPropertyList = new ArrayList<PropertyValue>();
String sExtension = "";
if (sFilterName != null && sFilterName.length() > 0)
{
String sInternalFilterName = getInternalFilterName(sFilterName, xMSF);
String sServiceName = getServiceNameFromFilterName(sFilterName, xMSF);
GlobalLogWriter.println("Filter detection:");
// check if service name from file filter is the same as from the loaded document
boolean bServiceFailed = false;
if (sServiceName == null || sInternalFilterName == null)
{
GlobalLogWriter.println("Given FilterName '" + sFilterName + "' seems to be unknown.");
bServiceFailed = true;
}
if (! xServiceInfo.supportsService(sServiceName))
{
GlobalLogWriter.println("Service from FilterName '" + sServiceName + "' is not supported by loaded document.");
bServiceFailed = true;
}
if (bServiceFailed == true)
{
GlobalLogWriter.println("Please check '" + PropertyName.DOC_CONVERTER_EXPORT_FILTER_NAME + "' in the property file.");
return;
}
if (sInternalFilterName != null && sInternalFilterName.length() > 0)
{
// get the FileExtension, by the filter name, if we don't get a file extension
// we assume the is also no right filter name.
sExtension = getFileExtension(sInternalFilterName, xMSF);
if (sExtension == null)
{
GlobalLogWriter.println("Can't found an extension for filtername, take it from the source.");
}
}
PropertyValue Arg = new PropertyValue();
Arg.Name = "FilterName";
Arg.Value = sFilterName;
// aStoreProps[nPropertyIndex ++] = Arg;
aPropertyList.add(Arg);
showProperty(Arg);
GlobalLogWriter.println("FilterName is set to: " + sFilterName);
}
String sOutputURL = "";
try
{
// create the new filename with the extension, which is ok to the file format
String sInputFileBasename = FileHelper.getBasename(_sInputFile);
// System.out.println("InputFileBasename " + sInputFileBasename);
String sInputFileNameNoSuffix = FileHelper.getNameNoSuffix(sInputFileBasename);
// System.out.println("InputFilename no suffix " + sInputFileNameNoSuffix);
String fs = System.getProperty("file.separator");
String sOutputFile = _sOutputPath;
if (! sOutputFile.endsWith(fs))
{
sOutputFile += fs;
}
if (sExtension != null && sExtension.length() > 0)
{
sOutputFile += sInputFileNameNoSuffix + "." + sExtension;
}
else
{
sOutputFile += sInputFileBasename;
}
if (FileHelper.exists(sOutputFile) && _aGTA.getOverwrite() == false)
{
GlobalLogWriter.println("File already exist, don't overwrite. Set " + PropertyName.DOC_COMPARATOR_OVERWRITE_REFERENCE + "=true to force overwrite.");
return;
}
sOutputURL = URLHelper.getFileURLFromSystemPath(sOutputFile);
GlobalLogWriter.println("Store document as '" + sOutputURL + "'");
xStorable.storeAsURL(sOutputURL, PropertyHelper.createPropertyValueArrayFormArrayList(aPropertyList));
GlobalLogWriter.println("Document stored.");
}
catch (com.sun.star.io.IOException e)
{
GlobalLogWriter.println("Can't store document '" + sOutputURL + "'. Message is :'" + e.getMessage() + "'");
}
// TODO: Do we need to wait?
// TimeHelper.waitInSeconds(1, "unknown in OfficePrint.convertDocument()");
}
/**
*
* @return false, if 'NoOffice=yes' is given
*/
// private boolean shouldOfficeStart()
// {
// String sNoOffice = (String)m_aParameterHelper.getTestParameters().get( "NoOffice" );
// if (sNoOffice != null)
// {
// if (sNoOffice.toLowerCase().startsWith("t") || sNoOffice.toLowerCase().startsWith("y"))
// {
// return false;
// }
// }
// return true;
// }
OfficeProvider m_aProvider = null;
private void startOffice()
{
// SimpleFileSemaphore aSemaphore = new SimpleFileSemaphore();
// if (shouldOfficeStart())
// {
// if (OSHelper.isWindows())
// {
// aSemaphore.P(aSemaphore.getSemaphoreFile());
// }
m_aParameterHelper.getTestParameters().put(util.PropertyName.DONT_BACKUP_USERLAYER, Boolean.TRUE);
m_aParameterHelper.getPerformance().startTime(PerformanceContainer.OfficeStart);
m_aProvider = new OfficeProvider();
XMultiServiceFactory xMSF = (XMultiServiceFactory) m_aProvider.getManager(m_aParameterHelper.getTestParameters());
m_aParameterHelper.getTestParameters().put("ServiceFactory", xMSF);
m_aParameterHelper.getPerformance().stopTime(PerformanceContainer.OfficeStart);
long nStartTime = m_aParameterHelper.getPerformance().getTime(PerformanceContainer.OfficeStart);
// aGTA = getParameterHelper(); // get new TestArguments
m_aParameterHelper.getPerformance().setTime(PerformanceContainer.OfficeStart, nStartTime);
// }
// Watcher Object is need in log object to give a simple way to say if a running office is alive.
// As long as a log comes, it pings the Watcher and says the office is alive, if not an
// internal counter increase and at a given point (300 seconds) the office is killed.
if (GlobalLogWriter.get().getWatcher() == null)
{
GlobalLogWriter.println("Set office watcher");
OfficeWatcher aWatcher = (OfficeWatcher)m_aParameterHelper.getTestParameters().get("Watcher");
GlobalLogWriter.get().setWatcher(aWatcher);
}
}
private void stopOffice()
{
// Office shutdown
if (m_aProvider != null)
{
String sAppExecCmd = (String)m_aParameterHelper.getTestParameters().get("AppExecutionCommand");
if (sAppExecCmd != null && sAppExecCmd.length() > 0)
{
m_aProvider.closeExistingOffice(m_aParameterHelper.getTestParameters(), true);
}
// if (OSHelper.isWindows())
// {
// aSemaphore.V(aSemaphore.getSemaphoreFile());
// aSemaphore.sleep(2);
// // wait some time maybe an other process will take the semaphore
// // I know, this is absolutly dirty, but the whole convwatch is dirty and need a big cleanup.
// }
}
}
private boolean m_bStoreFile;
public void disallowStore()
{
m_bStoreFile = false;
}
public void allowStore()
{
m_bStoreFile = true;
}
public boolean isStoreAllowed()
{
return false;
// return m_bStoreFile;
}
}