blob: a6f2c25f5c56d393744a13a05fde6828f787701e [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 complex.framework.recovery;
import com.sun.star.accessibility.XAccessible;
import com.sun.star.accessibility.XAccessibleContext;
import com.sun.star.awt.Rectangle;
import com.sun.star.awt.Size;
import com.sun.star.awt.XDialog;
import com.sun.star.awt.XExtendedToolkit;
import com.sun.star.awt.XWindow;
import com.sun.star.beans.XPropertySet;
import com.sun.star.container.XEnumeration;
import com.sun.star.container.XIndexAccess;
import com.sun.star.container.XNameContainer;
import com.sun.star.drawing.XDrawPage;
import com.sun.star.drawing.XDrawPages;
import com.sun.star.drawing.XDrawPagesSupplier;
import com.sun.star.drawing.XShape;
import com.sun.star.drawing.XShapes;
import com.sun.star.frame.XController;
import com.sun.star.frame.XDesktop;
import com.sun.star.frame.XDispatch;
import com.sun.star.frame.XDispatchProvider;
import com.sun.star.frame.XFrame;
import com.sun.star.frame.XModel;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XSingleServiceFactory;
import com.sun.star.presentation.XCustomPresentationSupplier;
import com.sun.star.presentation.XPresentationSupplier;
import com.sun.star.sheet.XSheetCellRange;
import com.sun.star.sheet.XSpreadsheet;
import com.sun.star.sheet.XSpreadsheetDocument;
import com.sun.star.sheet.XSpreadsheets;
import com.sun.star.style.XStyle;
import com.sun.star.table.XCellRange;
import com.sun.star.text.ControlCharacter;
import com.sun.star.text.XText;
import com.sun.star.text.XTextCursor;
import com.sun.star.text.XTextDocument;
import com.sun.star.uno.AnyConverter;
import com.sun.star.uno.Type;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XInterface;
import com.sun.star.view.XSelectionSupplier;
import complexlib.ComplexTestCase;
import helper.OfficeProvider;
import helper.OfficeWatcher;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;
import java.io.PrintWriter;
import java.util.Hashtable;
import java.util.Random;
import util.DesktopTools;
import util.PropertyName;
import util.SOfficeFactory;
import util.UITools;
import util.utils;
// ---------- junit imports -----------------
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openoffice.test.OfficeConnection;
import static org.junit.Assert.*;
// ------------------------------------------
public class RecoveryTest extends ComplexTestCase {
static XMultiServiceFactory xMSF;
static SOfficeFactory SOF;
static RecoveryTools rt;
/**
* If you devid the screen in four parts in the first of them the office
* windows should be placed. The range of the first quarter is stored in the variable.
*/
static Point windowMaxPosition;
/**
* The office windows starts in the first quarter of the screen. In this variable
* the maximum size for the windows was stored so the windows can be placed
* visible on the screen.
*/
static Size windowMaxSize;
/**
* All office windows will be placed by this test on randomized positions.
* This positions was stored in this Hashmap. The keys are the frame names
* and the values are com sun.star.awt.Rectangle.
* @see com.sun.star.awt.Rectangle
*/
private Hashtable windowsPosSize = new Hashtable();
/**
* A function to tell the framework, which test functions are available.
* @return All test methods.
*
* @todo: hidden documents
* @todo: running presentation
* @todo: modular dialogs like Hpyerlink-Dialog
* @todo: sceond view of a document
* @todo: remove recovery data before start test
* @todo: after a second start after the crash there should no documents recovered anymore
* @todo: enable remove of recovery files
* @todo: makefile anpassen auf Parameter überprüfen
*/
public String[] getTestMethodNames() {
return new String[]{"testCrash"};
}
/** Create the environment for following tests.
* Use either a component loader from desktop or
* from frame
* @throws Exception Exception
*/
public void normalCrash(){
cleanRecoveryData();
startOffice();
generateDesktop();
makeCrash();
int expectedDocumentCount = windowsPosSize.size() + 1;
handleRecoveryDialogAfterCrash(expectedDocumentCount);
startOffice();
handleRecoveryDialog_QuickExit(expectedDocumentCount);
handleCrashReporterDialog(true, true);
checkDocumentCount(expectedDocumentCount);
}
public void testCrash(){
cleanRecoveryData();
restoreBackupRecoveryData();
startOffice();
int expectedDocumentCount = 3;
// handleRecoveryDialog_QuickExit(expectedDocumentCount);
handleRecoveryDialog_QuickExitAndSave(expectedDocumentCount);
//handleCrashReporterDialog(true, true);
//checkDocumentCount(expectedDocumentCount);
}
public void before() throws Exception {
String msg ="\n\n\tPATH TO OFFICE BINARY MISSING!\n";
msg +="\tPlease run your command with the following parameter:\n\n";
msg +="\t-AppExecutionCommand=OFFICEBINARY CONNECTIONSTRING\n\n";
msg +="Example Windows:\n";
msg +="-AppExecutionCommand=C:\\office\\soffice.exe -accept=socket,host=localhost,port=8101;urp;\n\n";
msg +="Example UNIX:\n";
msg +="-AppExecutionCommand=/office/soffice \"-accept=socket,host=localhost,port=8101;urp;\"\n\n";
msg+="NOTE: on UNIX be shure to have the connection string inside quotation mark!\n";
assure(msg, param.get("AppExecutionCommand") != null && ! param.get("AppExecutionCommand").equals(""));
System.out.println("HALLO" + param.get("AppExecutionCommand"));
msg = "\n\nONE PARAMETER IS MISSING!\n";
msg += "Please append to your command the following parameter:\n\n";
msg += "\t-NoOffice=true";
assure(msg, param.getBool("NoOffice"));
rt = new RecoveryTools(param ,log);
rt.removeParametersFromAppExecutionCommand();
log.println("start the office to test recovery feature...");
// make window ranges
makeWindowPositionRage();
//makeRecoveryData();
}
private void makeRecoveryData(){
cleanRecoveryData();
startOffice();
generateDesktop();
makeCrash();
int expectedDocumentCount = windowsPosSize.size() + 1;
handleRecoveryDialogAfterCrash(expectedDocumentCount);
backupRecoveryData();
cleanRecoveryData();
}
private void startOffice(){
assure("Could not connect to office", connect());
log.setWatcher(param.get("Watcher"));
}
private void checkDocumentCount(int expectedDocumentCount){
XEnumeration allComp = DesktopTools.getAllComponents(xMSF);
int documentCount = 0;
try{
while (allComp.hasMoreElements()){
allComp.nextElement();
documentCount ++;
}
}
catch ( com.sun.star.container.NoSuchElementException e){}
catch ( com.sun.star.lang.WrappedTargetException e){}
String msg ="The amount of documents to recover is different form the expected amount:\n";
msg += "\texpected:\t" + expectedDocumentCount + "\n";
msg += "\tto recover:\t" + documentCount;
assure(msg, expectedDocumentCount == documentCount);
}
/**
* This function starts an office instance. It uses the AppExecutionCommad parameter.
* @return TRUE if office is connected otherwise FALSE
*/
private boolean connect(){
try {
OfficeProvider oProvider = new OfficeProvider();
xMSF = (XMultiServiceFactory)oProvider.getManager(param);
SOF = SOfficeFactory.getFactory(xMSF);
}
catch (java.lang.Exception e) {
log.println(e.getClass().getName());
log.println("Message: " + e.getMessage());
failed("Cannot connect the Office.");
return false;
}
return true;
}
/**
* While creating the test environment the positions and sizes of the frames
* was saved. After the Office has recovered the documents, this functions
* compares the saved positions and sizes with the current frame.
*/
private void compareWindowPositions(){
System.out.println("all frames:########");
System.out.println(windowsPosSize.entrySet().toString());
XEnumeration allComp = DesktopTools.getAllComponents(xMSF);
String msg=null;
while (allComp.hasMoreElements()){
try{
// get all components from the desktop
XComponent xComponent = (XComponent) UnoRuntime.queryInterface(
XComponent.class, allComp.nextElement());
XModel xModel = (XModel) UnoRuntime.queryInterface(XModel.class, xComponent);
String frameName = xModel.getCurrentController().getFrame().getName();
// check if this frame was used in creation of test environment
if (windowsPosSize.containsKey(frameName)){
Rectangle oldRect = (Rectangle) windowsPosSize.get(frameName);
XWindow xWindow = xModel.getCurrentController().getFrame().getContainerWindow();
Rectangle newRect = xWindow.getPosSize();
boolean ok = oldRect.Height == newRect.Height;
ok &= oldRect.Width == newRect.Width;
ok &= oldRect.X == newRect.X;
ok &= oldRect.Y == newRect.Y;
if (!ok){
msg = "The frame '" + frameName + "' has a different position/size:\n";
msg += "original value -> restored value:\n";
msg += "X : " + oldRect.X + " -> " + newRect.X + "\n";
msg += "Y : " + oldRect.Y + " -> " + newRect.Y + "\n";
msg += "Height: " + oldRect.Height + " -> " + newRect.Height + "\n";
msg += "Width : " + oldRect.Width + " -> " + newRect.Width + "\n";
}
assure(msg, ok, CONTINUE);
}
} catch (com.sun.star.container.NoSuchElementException e) {
} catch ( com.sun.star.lang.WrappedTargetException e) {}
}
}
/**
* This function crashes the office
*/
private void makeCrash(){
// get all documents
Object[] allDocs = DesktopTools.getAllOpenDocuments(xMSF);
// get one of them for dispatching
XComponent xDoc = (XComponent) allDocs[0];
log.println("make the crash in second thread");
CrashThread crash = new CrashThread(xDoc, xMSF);
crash.start();
rt.pause();
rt.pause();
}
/**
* This function uses accessibility to handle the dialog which appears while the
* office is crashed. It click the button "OK" to continue.
*/
private void handleRecoveryDialogAfterCrash(int expectedDocumentCount){
try{
// if the office crashes, the recovery feature needs some time
// to save all docs. Therefore the recovery dialog could need some
// time to pop up.
log.println("wating for recovery dialog...");
int counter = 0;
int maximum = param.getInt(PropertyName.THREAD_TIME_OUT) / param.getInt(PropertyName.SHORT_WAIT);
XDialog oDialog = rt.getActiveDialog(xMSF);
while ( oDialog == null && (counter < maximum))
{
rt.pause();
oDialog = rt.getActiveDialog(xMSF);
counter ++;
}
assure("could not get Recovery Window",(oDialog != null));
XWindow xWindow = (XWindow) UnoRuntime.queryInterface(XWindow.class, oDialog);
UITools oUITools = new UITools(xMSF, xWindow);
oUITools.printAccessibleTree((PrintWriter) log, param.getBool(PropertyName.DEBUG_IS_ACTIVE));
String[] documents = oUITools.getListBoxItems("The following files will be recovered");
log.println("there are " + documents.length + " documents to save");
String msg ="The amount of documents to recover is different form the expected amount:\n";
msg += "\texpected:\t" + expectedDocumentCount + "\n";
msg += "\tto recover:\t" + documents.length;
assure(msg, expectedDocumentCount == documents.length);
log.println("disable automatically launch of Office");
oUITools.setCheckBoxValue("Launch StarOffice automatically", new Integer(0));
log.println("start saving...");
oUITools.clickButton("OK");
rt.waitForClosedOffice();
} catch (Exception e){
e.printStackTrace();
failed("Could not handle crash-dialog: " + e.toString());
}
}
private void handleCrashReporterDialog(boolean cancel, boolean YesNo){
try{
log.println("try to get Crash Reporter Dialog...");
XDialog oDialog = rt.getActiveDialog(xMSF);
assure("could not get CrashReporter Dialog", oDialog != null);
XWindow xWindow = (XWindow) UnoRuntime.queryInterface(XWindow.class, oDialog);
log.println(oDialog.getTitle());
UITools oUITools = new UITools(xMSF, xWindow);
if (cancel) {
log.println("clicking 'Cancel' button...");
try{
rt.clickThreadButton(xMSF, xWindow, "Cancel");
} catch (com.sun.star.accessibility.IllegalAccessibleComponentStateException e){
failed("Could not click 'Cancel' at CrashReporter Dialog");
}
}
else {
log.println("clicking 'Next' button...");
oUITools.clickButton("Next>>");
}
} catch (Exception e){
failed("Could not handle CrashReporter Dialog: " + e.toString());
}
}
private void handleRecoveryDialog_QuickExit(int expectedDocumentCount){
log.println("handle Recovery Dialog at restart: quick exit");
handleRecoveryDialogAtRestart(expectedDocumentCount, false, true);
handleAreYouSureDialog(true);
handleSaveDocumentsDialog(false);
}
private void handleRecoveryDialog_QuickExitAndSave(int expectedDocumentCount){
log.println("handle Recovery Dialog at restart: quick exit");
handleRecoveryDialogAtRestart(expectedDocumentCount, false, true);
handleAreYouSureDialog(true);
handleSaveDocumentsDialog(true);
}
private void handleRecoveryDialog_Recover(int expectedDocumentCount){
}
private void handleRecoveryDialog_RecoverAndCrashreporter(int expectedDocumentCount){
}
/**
* This function uses accessibility to handle the dialog which appears while the
* office is started after a crash. It waits until the "next>>" button is enabled
* and click it then to continue.
* @param expectedDocumentCount the amount of documents which must be displayed in the recovery dialog
* @param recover If the documenst should be recoverd this variable must be true. If it is fasle
* the recovery process was stoped and the button cancel was klicked.
* @param cancel If the recovery is fifnished, this parameter desicdes to klick the "Next" button
* or the click cancel. If the value is true, the cancel button was clicked.
*/
private void handleRecoveryDialogAtRestart(int expectedDocumentCount, boolean recover, boolean cancel){
try{
log.println("try to get Recovery Dialog...");
XDialog oDialog = null;
oDialog = rt.getActiveDialogAfterStartup(xMSF);
assure("could not get Recovery Dialog at start of office", (oDialog != null), CONTINUE);
XWindow xWindow = (XWindow) UnoRuntime.queryInterface(XWindow.class, oDialog);
log.println("got the following dialog: '" +oDialog.getTitle() + "'");
UITools oUITools = new UITools(xMSF, xWindow);
String listBoxName = "Status of recovered documents";
String[] documents = oUITools.getListBoxItems(listBoxName);
log.println("there are " + documents.length + " documents to recover");
log.println("The following files will be recovered:");
for (int i=0;i<documents.length;i++){
log.println(documents[i]);
}
String msg ="The amount of documents to recover is different form the expected amount:\n";
msg += "\texpected:\t" + expectedDocumentCount + "\n";
msg += "\tto recover:\t" + documents.length;
assure(msg, expectedDocumentCount ==documents.length);
if (recover){
log.println("clicking 'Start Recovery' button...");
oUITools.clickButton("Start Recovery >");
rt.pause();
//XAccessibleContext oButton = oUITools.getButton("Start Recovery >");
int counter = 0;
int maximum = param.getInt(PropertyName.THREAD_TIME_OUT) / param.getInt(PropertyName.SHORT_WAIT);
//boolean enabeld = oButton.getAccessibleStateSet().contains(com.sun.star.accessibility.AccessibleStateType.ENABLED);
XAccessibleContext oButton = null;
while ((oButton == null) && (counter < maximum)){
log.println("recovering...");
try{
oButton = oUITools.getButton("Next >");
} catch (java.lang.NullPointerException e){
// no fault: The title "Start Recovery" switches to "Next"
// while all documents are recoverd
}
rt.pause();
counter++;
}
if (cancel) {
log.println("clicking 'Cancel' button...");
try{
rt.clickThreadButton(xMSF, xWindow, "Cancel");
} catch (com.sun.star.accessibility.IllegalAccessibleComponentStateException e){
failed("Could not click 'Cancel' at recovery-dialog.");
}
}
else {
log.println("clicking 'Next' button...");
oUITools.clickButton("Next >");
}
rt.pause();
} else {
log.println("do not recover: clicking 'Cancel' button...");
try{
rt.clickThreadButton(xMSF, xWindow, "Cancel");
} catch (com.sun.star.accessibility.IllegalAccessibleComponentStateException e){
failed("Could not click 'Cancel' at recovery-dialog");
}
}
} catch (Exception e){
failed("Could not handle recovery-dialog at restart: " + e.toString());
}
}
/**
* This function uses accessibility to handle the dialog "Are you sure".
* It click "Yes" or "No", dependend on the value of the parameter <CODE>Yes</CODE>
* @param yes If value is <CODE>TRUE</CODE> the button "Yes" was clicked, otherwise the button
* "No".
*/
private void handleAreYouSureDialog(boolean yes)
{
try{
if (yes){
rt.handleModalDialog(xMSF, "Yes");
} else{
rt.handleModalDialog(xMSF, "Cancel");
}
} catch (com.sun.star.accessibility.IllegalAccessibleComponentStateException e){
failed("Could not handle 'Are you sure' dialog.");
}
}
/**
* This function uses accessibility to handle the dialog "Are you sure".
* It click "Yes" or "No", depending on the value of the parameter <CODE>Yes</CODE>
* @param saveDocuments If value is <CODE>TRUE</CODE> the button "Yes" was clicked, otherwise the button
* "No".
*/
private void handleSaveDocumentsDialog(boolean saveDocuments)
{
try{
if (!saveDocuments){
rt.handleModalDialog(xMSF, "Cancel");
} else{
XWindow oDialog = null;
oDialog = rt.getActiveWindow(xMSF);
assure("could not get 'Save Documents' Dialog: ", (oDialog != null), CONTINUE);
UITools oUITools = new UITools(xMSF, oDialog);
oUITools.printAccessibleTree((PrintWriter) log, param.getBool(PropertyName.DEBUG_IS_ACTIVE));
String listBoxName = "Documents";
String[] documents = null;
try{
documents = oUITools.getListBoxItems(listBoxName);
} catch (java.lang.Exception e){
failed("could not get the document names from the 'Save Documents' dialog", CONTINUE);
}
log.println("there are " + documents.length + " documents to save");
log.println("The following documents will be saved:");
for (int i=0;i<documents.length;i++){
log.println(documents[i]);
}
String tempURL = utils.getOfficeTempDir(xMSF);
log.println("the destination for saveing is: " + tempURL);
try{
oUITools.setTextEditFiledText("Save to", tempURL);
} catch (java.lang.Exception e){
failed("could not set target directory for saving documents at 'Save Documents' dialog", CONTINUE);
}
try{
oUITools.clickButton("OK");
} catch (java.lang.Exception e){
failed("could not click 'OK' at 'Save Documents' dialog", CONTINUE);
}
}
} catch (com.sun.star.accessibility.IllegalAccessibleComponentStateException e){
failed("Could not handle 'Are you sure' dialog.");
}
}
/**
* This function gets the current screen size and calculate the first
* quarter of it. This qaurter was used to postion to Office windows.
* Further this function calculates the maximum window size so the window
* is visible if it placed on extreme position.
*/
private void makeWindowPositionRage(){
Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize();
Point pos = new Point();
Size size = new Size();
// get the max position of the first quarter of the screen
pos.x = screenDim.width / 2;
pos.y = screenDim.height / 2;
windowMaxPosition = pos;
// get the max size of the windows while they placed in windowMaxPosition
// range and not outside the visibility
size.Height = screenDim.height;
size.Width = screenDim.width;
windowMaxSize = size;
}
private void generateDesktop(){
// create some documents with content
makeWriterDoc("WriterDoc1", true);
// makeCalcDoc("CalcDoc1", true);
// makeDrawDoc("DrawDoc1", true);
// makeImpressDoc("ImpressDoc1", true);
// makeMathDoc("MathDoc1", true);
// create some documents without content
// makeMathDoc("_blank_math", false);
// makeDrawDoc("_blank_draw", false);
// makeCalcDoc("_blank_calc", false);
// makeWriterDoc("_blank_writer", false);
// makeImpressDoc("_blank_impress", false);
// makeMathDoc("MathDocEmpty", false);
// makeDrawDoc("DrawDocEmpty", false);
// makeCalcDoc("CalcDocEmpty", false);
makeWriterDoc("WriterDocEmpty", false);
// makeImpressDoc("ImpressDocEmpty", false);
log.println("Test object successfully created.");
}
private void makeImpressDoc(String frameName, boolean withContent){
log.println("creating Impress document '" + frameName + "'");
XComponent xImpressDoc = createNewImpressDoc(frameName);
if (withContent) fillImpressDocWithContent(xImpressDoc);
positioningDocument((XModel) UnoRuntime.queryInterface(XModel.class,
xImpressDoc));
}
private void makeDrawDoc(String frameName, boolean withContent){
log.println("creating Draw document '" + frameName + "'");
XComponent xDrawDoc = createNewDrawDoc(frameName);
if (withContent) fillDrawDocWithContent(xDrawDoc);
positioningDocument((XModel) UnoRuntime.queryInterface(XModel.class,
xDrawDoc));
}
private void makeCalcDoc(String frameName, boolean withContent){
log.println("creating Calc document '" + frameName + "'");
XSpreadsheetDocument xSpreadsheetDoc = createNewCalcDoc(frameName);
if (withContent) fillCalcDocWithContent(xSpreadsheetDoc);
positioningDocument((XModel) UnoRuntime.queryInterface(XModel.class,
xSpreadsheetDoc));
}
private void positioningDocument(XModel model){
XWindow xWindow = model.getCurrentController().getFrame().getContainerWindow();
String frameName = model.getCurrentController().getFrame().getName();
// get randomized position and size
Rectangle posSize = makePosZize();
// save position and size
windowsPosSize.put(frameName, posSize);
xWindow.setPosSize(posSize.X, posSize.Y, posSize.Width, posSize.Height,
com.sun.star.awt.PosSize.POSSIZE);
Rectangle test = xWindow.getPosSize();
log.println("x: "+test.X+" y:"+test.Y+" width:"+test.Width+" height:"+test.Height);
}
private Rectangle makePosZize(){
Rectangle posSize = new Rectangle();
Random rand = new Random();
// Random integers that range from from 0 to n
posSize.X = rand.nextInt(windowMaxPosition.x + 1);
posSize.Y = rand.nextInt(windowMaxPosition.y + 1);
int maxHeight = windowMaxSize.Height-posSize.X;
int maxWidth = windowMaxSize.Width-posSize.Y;
int height = rand.nextInt(maxHeight + 1);
int width = rand.nextInt((windowMaxSize.Width-posSize.Y) + 1);
// be shure that the new size his greater then the half of windowMaxSize
posSize.Height = (height < (maxHeight / 2)) ? height + (maxHeight / 2) : height;
posSize.Width = (width < (maxWidth / 2)) ? width + (maxWidth / 2) : width;
return posSize;
}
private void makeMathDoc(String frameName, boolean withContent){
log.println("creating Math document '" + frameName + "'");
XComponent xMathDoc = createNewMathDoc(frameName);
if (withContent) fillMathDocWithContent(xMathDoc);
positioningDocument((XModel) UnoRuntime.queryInterface(XModel.class,
xMathDoc));
}
private XComponent createNewMathDoc(String frameName){
XComponent xMathDoc = null;
try{
xMathDoc = SOF.createMathDoc(frameName);
} catch (com.sun.star.uno.Exception e) {
log.println("Exception occured while creating math document '"+frameName+"':");
failed("Couldn't create test environment");
}
return xMathDoc;
}
private void fillMathDocWithContent(XComponent xMathDoc){
// setting a formula in document
final String expFormula = "sum a cdot b";
final XPropertySet xPS = (XPropertySet) UnoRuntime.queryInterface
(XPropertySet.class, xMathDoc);
try {
xPS.setPropertyValue("Formula", expFormula);
} catch(com.sun.star.lang.WrappedTargetException e) {
log.println("Exception occured while filling math document with content.");
failed("Couldn't create test environment");
} catch(com.sun.star.lang.IllegalArgumentException e) {
log.println("Exception occured while filling math document with content.");
failed("Couldn't create test environment");
} catch(com.sun.star.beans.PropertyVetoException e) {
log.println("Exception occured while filling math document with content.");
failed("Couldn't create test environment");
} catch(com.sun.star.beans.UnknownPropertyException e) {
log.println("Exception occured while filling math document with content.");
failed("Couldn't create test environment");
}
}
private XComponent createNewImpressDoc(String frameName){
XComponent xImpressDoc = null;
try{
xImpressDoc = SOF.createImpressDoc(frameName);
} catch (com.sun.star.uno.Exception e) {
log.println("Exception occured while creating impress document '"+frameName+"':");
failed("Couldn't create test environment");
}
return xImpressDoc;
}
private void fillImpressDocWithContent(XComponent xImpressDoc){
log.println( "get presentation" );
XPresentationSupplier oPS = (XPresentationSupplier)
UnoRuntime.queryInterface(XPresentationSupplier.class, xImpressDoc);
XInterface oObj = oPS.getPresentation();
log.println( "get custom presentation" );
XCustomPresentationSupplier oCPS = (XCustomPresentationSupplier)
UnoRuntime.queryInterface(
XCustomPresentationSupplier.class, xImpressDoc);
XNameContainer xCP = oCPS.getCustomPresentations();
XInterface oInstance = null;
XSingleServiceFactory oSingleMSF = (XSingleServiceFactory)
UnoRuntime.queryInterface(XSingleServiceFactory.class, xCP);
try{
oInstance = (XInterface) oSingleMSF.createInstance();
} catch (com.sun.star.uno.Exception e) {
log.println("Could not create custom presentation while filling impress document with content.");
failed("Couldn't create test environment");
}
try {
xCP.insertByName("FirstPresentation",oInstance);
} catch (com.sun.star.lang.WrappedTargetException e) {
log.println("Could not instert custom presentation while filling impress document with content.");
failed("Couldn't create test environment");
} catch (com.sun.star.container.ElementExistException e) {
log.println("Could not instert custom presentation while filling impress document with content.");
failed("Couldn't create test environment");
} catch (com.sun.star.lang.IllegalArgumentException e) {
log.println("Could not instert custom presentation while filling impress document with content.");
failed("Couldn't create test environment");
}
}
private XComponent createNewDrawDoc(String frameName){
XComponent xDrawDoc = null;
try{
xDrawDoc = SOF.createDrawDoc(frameName);
} catch (com.sun.star.uno.Exception e) {
log.println("Exception occured while creating draw document '"+frameName+"':");
failed("Couldn't create test environment");
}
return xDrawDoc;
}
private void fillDrawDocWithContent(XComponent xDrawDoc){
XDrawPagesSupplier oDPS = (XDrawPagesSupplier)
UnoRuntime.queryInterface(XDrawPagesSupplier.class, xDrawDoc);
XDrawPages oDPn = oDPS.getDrawPages();
XIndexAccess oDPi = (XIndexAccess)
UnoRuntime.queryInterface(XIndexAccess.class, oDPn);
XDrawPage oDP = null;
try {
oDP = (XDrawPage) AnyConverter.toObject(
new Type(XDrawPage.class),oDPi.getByIndex(0));
} catch (com.sun.star.lang.WrappedTargetException e) {
log.println("Could not get draw pages while filling draw document with content.");
failed("Couldn't create test environment");
} catch (com.sun.star.lang.IndexOutOfBoundsException e) {
log.println("Could not get draw pages while filling draw document with content.");
failed("Couldn't create test environment");
} catch (com.sun.star.lang.IllegalArgumentException e) {
log.println("Could not get draw pages while filling draw document with content.");
failed("Couldn't create test environment");
}
//get a Shape
log.println( "getting Shape" );
XShapes oShapes = (XShapes) UnoRuntime.queryInterface
(XShapes.class, oDP);
XInterface oObj = SOF.createShape
(xDrawDoc, 5000, 3500, 7500, 5000, "Rectangle");
for (int i=0; i < 10; i++) {
oShapes.add(
SOF.createShape(xDrawDoc,
5000, 3500, 7510 + 10 * i, 5010 + 10 * i, "Rectangle"));
}
XShape oShape = SOF.createShape
(xDrawDoc, 3000, 4500, 15000, 1000, "Ellipse");
oShapes.add((XShape) oObj);
oShapes.add((XShape) oShape);
XPropertySet oShapeProps = (XPropertySet)
UnoRuntime.queryInterface(XPropertySet.class, oObj);
XStyle aStyle = null;
try {
aStyle = (XStyle) AnyConverter.toObject(
new Type(XStyle.class),oShapeProps.getPropertyValue("Style"));
oShapeProps.setPropertyValue("ZOrder", new Integer(1));
} catch (com.sun.star.lang.WrappedTargetException e) {
log.println("Exception occured while setting or getting property value while filling draw document with content.");
failed("Couldn't create test environment");
} catch (com.sun.star.beans.UnknownPropertyException e) {
log.println("Exception occured while setting or getting property value while filling draw document with content.");
failed("Couldn't create test environment");
} catch (com.sun.star.lang.IllegalArgumentException e) {
log.println("Exception occured while setting or getting property value while filling draw document with content.");
failed("Couldn't create test environment");
} catch (com.sun.star.beans.PropertyVetoException e) {
log.println("Exception occured while setting or getting property value while filling draw document with content.");
failed("Couldn't create test environment");
}
}
private void makeWriterDoc(String frameName, boolean withContent){
log.println("creating Writer document '" + frameName + "'");
XTextDocument xTextDoc = createNewWriterDoc(frameName);
if (withContent) fillWriterDocWithContent(xTextDoc);
positioningDocument((XModel) UnoRuntime.queryInterface(XModel.class,
xTextDoc));
}
private XTextDocument createNewWriterDoc(String frameName){
XTextDocument xTextDoc = null;
try {
xTextDoc = SOF.createTextDoc(frameName);
} catch (com.sun.star.uno.Exception e) {
log.println("Exception occured while creating text document '"+frameName+"':");
failed("Couldn't create test environment");
}
return xTextDoc;
}
private void fillWriterDocWithContent(XTextDocument xTextDoc){
try{
log.println( "inserting some lines" );
XText oText = xTextDoc.getText();
XTextCursor oCursor = oText.createTextCursor();
for (int i=0; i<5; i++){
oText.insertString( oCursor,"Paragraph Number: " + i, false);
oText.insertString( oCursor,
" The quick brown fox jumps over the lazy Dog: SwXParagraph",
false);
oText.insertControlCharacter(
oCursor, ControlCharacter.PARAGRAPH_BREAK, false );
oText.insertString( oCursor,
"THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG: SwXParagraph",
false);
oText.insertControlCharacter(oCursor,
ControlCharacter.PARAGRAPH_BREAK, false );
oText.insertControlCharacter(
oCursor, ControlCharacter.LINE_BREAK, false );
}
} catch ( com.sun.star.lang.IllegalArgumentException e ){
log.println("Exception occured while filling text document with content.");
failed("Couldn't create test environment");
} catch (com.sun.star.uno.Exception e) {
log.println("Exception occured while filling text document with content.");
failed("Couldn't create test environment");
}
}
private XSpreadsheetDocument createNewCalcDoc(String frameName){
XSpreadsheetDocument xSheetDoc = null;
try {
xSheetDoc = SOF.createCalcDoc(frameName);
} catch (com.sun.star.uno.Exception e) {
log.println("Exception occured while creating calc document '"+frameName+"':");
failed("Couldn't create test environment");
}
return xSheetDoc;
}
private void fillCalcDocWithContent(XSpreadsheetDocument xSpreadsheetDoc){
try{
XSpreadsheets oSpreadsheets = xSpreadsheetDoc.getSheets();
XSpreadsheet oSheet = (XSpreadsheet) AnyConverter.toObject(
new Type(XSpreadsheet.class),
oSpreadsheets.getByName(
oSpreadsheets.getElementNames()[0]));
XCellRange testRange = oSheet.getCellRangeByName("$A$1:$D$4");
XSheetCellRange testSheetRange = (XSheetCellRange) UnoRuntime.queryInterface(
XSheetCellRange.class,
testRange);
oSheet.getCellByPosition(1, 1).setValue(1);
oSheet.getCellByPosition(4, 5).setValue(1);
oSheet.getCellByPosition(3, 2).setFormula("xTextDoc");
oSheet.getCellByPosition(3, 3).setFormula("xTextDoc");
} catch (com.sun.star.lang.WrappedTargetException e) {
log.println("Exception occured while filling calc document with content.");
failed("Couldn't create test environment");
} catch (com.sun.star.container.NoSuchElementException e) {
log.println("Exception occured while filling calc document with content.");
failed("Couldn't create test environment");
} catch (com.sun.star.lang.IndexOutOfBoundsException e) {
log.println("Exception occured while filling calc document with content.");
failed("Couldn't create test environment");
} catch (com.sun.star.lang.IllegalArgumentException e) {
log.println("Exception occured while filling calc document with content.");
failed("Couldn't create test environment");
} catch (com.sun.star.uno.Exception e) {
log.println("Exception occured while filling calc document with content.");
failed("Couldn't create test environment");
}
}
/**
* copies all files from the backup folder into a folder called backup.recoveryTest
* and copies the Recovery.xcu to recovery.xcu.recoeryTest
*/
private void backupRecoveryData()
{
log.println("backup recovery data...");
try{
rt.copyRecoveryData(true);
}catch (com.sun.star.io.IOException e){
failed("could not copy recovery data: " + e.toString());
}catch (java.io.IOException e){
failed("could not copy recovery data: " + e.toString());
}
}
/**
* copies all files from the backup.recoveryTest folder into the backup folder
* and copies the Recovery.xcu.recoveryTest to recovery.xcu
*/
private void restoreBackupRecoveryData()
{
log.println("restore backup recovery data...");
try{
rt.copyRecoveryData(false);
}catch (com.sun.star.io.IOException e){
failed("could not copy recovery data: " + e.toString());
}catch (java.io.IOException e){
failed("could not copy recovery data: " + e.toString());
}
}
private void cleanRecoveryData(){
try{
log.println("bootstrapping the office to get user path to remove old recovery data...");
rt.cleanRecoveryData();
} catch (com.sun.star.io.IOException e){
failed("could not clean recovery data: " + e.toString());
}
}
}