/************************************************************** | |
* | |
* 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 pvt.uno; | |
import static org.openoffice.test.common.Testspace.*; | |
import java.io.File; | |
import org.junit.After; | |
import org.junit.AfterClass; | |
import org.junit.Before; | |
import org.junit.BeforeClass; | |
import org.junit.Rule; | |
import org.junit.Test; | |
import org.junit.runner.RunWith; | |
import org.openoffice.test.OpenOffice; | |
import org.openoffice.test.common.DataSheet; | |
import org.openoffice.test.common.FileProvider; | |
import org.openoffice.test.common.FileProvider.FileFilter; | |
import org.openoffice.test.common.FileProvider.FileRepeat; | |
import org.openoffice.test.common.FileProvider.FileRepos; | |
import org.openoffice.test.common.FileUtil; | |
import org.openoffice.test.common.Logger; | |
import org.openoffice.test.common.Testspace; | |
import org.openoffice.test.uno.UnoApp; | |
import com.sun.star.beans.PropertyValue; | |
import com.sun.star.document.MacroExecMode; | |
import com.sun.star.lang.XComponent; | |
import com.sun.star.uno.UnoRuntime; | |
import com.sun.star.util.XCloseable; | |
@RunWith(FileProvider.class) | |
public class Conversion { | |
@Rule | |
public Logger log = Logger.getLogger(this); | |
@FileRepos | |
public static String repos = System.getProperty("conversion.repos", getDataPath("uno")); | |
@FileFilter | |
public static String filter = System.getProperty("conversion.filter", | |
"-f .*(doc|dot|odt|ott)$ writer_pdf_Export pdf " | |
+ "-f .*(xls|xlt|ods|ots)$ calc_pdf_Export pdf " | |
+ "-f .*(ppt|ppt|odp|otp)$ impress_pdf_Export pdf " | |
+ "-f .*(doc|dot|docx|docm|dotx|dotm)$ writer8 odt " | |
+ "-f .*(xls|xlt|xlsx|xltx|xlsm|xltm)$ calc8 ods " | |
+ "-f .*(ppt|pot|pptx|pptm|potm|potx)$ impress8 odp " | |
+ "-f .*(odt|ott)$ 'MS Word 97' doc " | |
+ "-f .*(ods|ots)$ 'MS Excel 97' xls " | |
+ "-f .*(odp|otp)$ 'MS PowerPoint 97' ppt"); | |
@FileRepeat | |
public static int repeat = Integer.parseInt(System.getProperty("conversion.repeat", "8")); | |
public static String clean = System.getProperty("conversion.clean", "file"); | |
public static int nLevelInfo = Integer.parseInt(System.getProperty("conversion.limitationcheck", "0")); // Level info: starts from 1, 0 means no need for limitation check | |
public static long nSleep = Long.parseLong(System.getProperty("conversion.sleep", "0")); // Sleep before loadComponentFromURL and storeToURL, millisecond | |
private static OpenOffice aoo = new OpenOffice(); | |
private static UnoApp app = null; | |
private static DataSheet result; | |
private static int counter = -1; | |
@BeforeClass | |
public static void beforeClass() throws Exception { | |
aoo.setUnoUrl(OpenOffice.DEFAULT_UNO_URL); | |
aoo.addArgs("-invisible", "-conversionmode", "-hidemenu", "-nofirststartwizard", "-headless", "-enableautomation"); | |
app = new UnoApp(aoo); | |
Testspace.prepareDataFile("limit_cfg.ini", aoo.getHome().toString()+"/program"); // Move limitation check file to installation dir | |
result = new DataSheet(getFile("output/" + Conversion.class.getName()+ ".xml")); | |
result.addRow("data", "File","Scenario", "No", "Time Consumed After Closing","Time Consumed After Saving","Time Consumed After Loading", "File Size", "Exported File Size"); | |
} | |
@AfterClass | |
public static void afterClass() throws Exception { | |
app.close(); | |
} | |
private String sourcePath = null; | |
private String targetFilterName = null; | |
private String targetExtName = null; | |
private File sourceFile = null; | |
private File targetFile = null; | |
private String sourceFileUrl = null; | |
private String targetFileUrl = null; | |
private String scenario = null; | |
private String sourceFileId = null; | |
private long loadTime = -1; | |
private long saveTime = -1; | |
private long closeTime = -1; | |
public Conversion(String sourcePath, String targetFilterName, String targetExtName) { | |
super(); | |
this.sourcePath = sourcePath; | |
this.targetFilterName = targetFilterName; | |
this.targetExtName = targetExtName; | |
counter++; | |
} | |
@Before | |
public void before() throws Exception { | |
sourceFile = new File(sourcePath); | |
sourceFileUrl = FileUtil.getUrl(this.sourceFile); | |
targetFile = getFile("classtemp/" + sourceFile.getName()+ "." + targetExtName); | |
targetFileUrl = FileUtil.getUrl(this.targetFile); | |
scenario = FileUtil.getFileExtName(sourceFile.getName()).toLowerCase() + " to " + FileUtil.getFileExtName(targetFile.getName()).toLowerCase(); | |
String pathSource = sourceFile.getCanonicalPath().replace("\\", "/"); | |
String pathRepos = new File(repos).getCanonicalPath().replace("\\", "/") + "/"; | |
sourceFileId = pathSource.replace(pathRepos, ""); | |
log.info("Start [File: " + sourceFileId + "] [Size: " + (sourceFile.length() / 1024) + "KB] [Scenario: " + scenario + "]"); | |
app.start(); | |
} | |
@After | |
public void after() throws Exception{ | |
result.addRow("data", sourceFileId, scenario, counter % repeat , closeTime, saveTime, loadTime, sourceFile.length(), targetFile.length()); | |
log.info("Result [After Closing: " + closeTime + "] [After Saving: " + saveTime + "] [After Loading: " + loadTime + "]"); | |
if (closeTime < 0) { | |
app.close(); | |
} else if ("file".equalsIgnoreCase(clean) && counter % repeat == 0) { | |
app.close(); | |
} | |
} | |
private PropertyValue propertyValue(String name, Object value) { | |
PropertyValue p = new PropertyValue(); | |
p.Name = name; | |
p.Value= value; | |
return p; | |
} | |
@Test(timeout=10 * 60000) | |
public void testConversion() throws Exception { | |
try { | |
if (nSleep > 0) | |
Thread.sleep(nSleep); | |
long start = System.currentTimeMillis(); | |
XComponent doc = app.loadDocumentFromURL(sourceFileUrl, | |
propertyValue("Hidden", true), | |
propertyValue("ReadOnly", true), | |
propertyValue("AsyncMode", false), | |
propertyValue("MacroExecutionMode", MacroExecMode.NEVER_EXECUTE), | |
propertyValue("LimitationCheckLevel", nLevelInfo)); | |
loadTime = System.currentTimeMillis() - start; | |
if (nSleep > 0) | |
Thread.sleep(nSleep); | |
app.saveDocumentToURL(doc, targetFileUrl, | |
propertyValue( "FilterName", targetFilterName), | |
propertyValue( "Overwrite", true)); | |
saveTime = System.currentTimeMillis() - start - nSleep; | |
XCloseable xCloseable = (XCloseable) UnoRuntime.queryInterface(XCloseable.class, doc); | |
xCloseable.close(true); | |
closeTime = System.currentTimeMillis() - start - nSleep; | |
} catch (com.sun.star.task.ErrorCodeIOException e){ | |
int errCode = e.ErrCode; | |
if( 296 == errCode ) { // limitation check file | |
loadTime = -2; | |
saveTime = -2; | |
closeTime = -2; | |
} | |
if( 3878 == errCode ) { // file is corrupt | |
loadTime = -3; | |
saveTime = -3; | |
closeTime = -3; | |
} | |
throw e; | |
} | |
} | |
} |