blob: 8c785937d5aae23c304110799cca20b0a12647a9 [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 org.openoffice.test.uno;
import java.io.File;
import java.util.Timer;
import java.util.TimerTask;
import org.openoffice.test.OpenOffice;
import org.openoffice.test.common.FileUtil;
import org.openoffice.test.common.SystemUtil;
import com.sun.star.beans.PropertyValue;
import com.sun.star.bridge.UnoUrlResolver;
import com.sun.star.bridge.XUnoUrlResolver;
import com.sun.star.comp.helper.Bootstrap;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.frame.XDesktop;
import com.sun.star.frame.XStorable;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.util.XCloseable;
import com.sun.star.util.XModifiable;
public class UnoApp {
private OpenOffice openOffice = null;
private String unoUrl = null;
private XComponentContext componentContext = null;
private XMultiComponentFactory componentFactory = null;
private XMultiServiceFactory serviceFactory = null;
private XDesktop desktop = null;
private double reconnectInterval = 2;
private int reconnectCount = 10;
private static OpenOffice defaultOpenOffice = null;
static {
defaultOpenOffice = new OpenOffice();
defaultOpenOffice.addArgs("-nofirststartwizard", "-norestore", "-quickstart=no");
defaultOpenOffice.setUnoUrl(OpenOffice.DEFAULT_UNO_URL);
}
public UnoApp() {
this.openOffice = defaultOpenOffice;
}
public UnoApp(OpenOffice openOffice) {
this.openOffice = openOffice;
}
public UnoApp(String unoUrl) {
this.unoUrl = unoUrl;
}
/**
* Start OpenOffice and connect to it
*/
public void start() {
if (componentContext != null) {
try {
componentContext.getServiceManager();
return;
} catch (Exception e) {
}
}
if (openOffice != null) {
openOffice.start();
unoUrl = openOffice.getUnoUrl();
}
for (int i = 0; i < reconnectCount; i++) {
try {
XUnoUrlResolver resolver = UnoUrlResolver.create(Bootstrap.createInitialComponentContext(null));
componentContext = (XComponentContext) UnoRuntime.queryInterface(XComponentContext.class, resolver.resolve("uno:" + unoUrl + ";StarOffice.ComponentContext"));
componentFactory = componentContext.getServiceManager();
serviceFactory = (XMultiServiceFactory) UnoRuntime.queryInterface(XMultiServiceFactory.class, componentFactory);
desktop = (XDesktop) UnoRuntime.queryInterface(XDesktop.class, serviceFactory.createInstance("com.sun.star.comp.framework.Desktop"));
return;
} catch (Exception e) {
// e.printStackTrace(); // for debugging
}
SystemUtil.sleep(reconnectInterval);
}
throw new RuntimeException("Failed to connect to uno url: " + unoUrl);
}
private Timer timer = new Timer(true);
private TimerTask timerTask = null;
/**
* Shut down the connection and close OpenOffice
*/
public void close() {
try {
timerTask = new TimerTask() {
public void run() {
if (openOffice != null)
openOffice.kill();
}
};
timer.schedule(timerTask, 1000 * 2);
desktop.terminate();
} catch (Exception e) {
// e.printStackTrace(); // for debugging
} finally {
if (openOffice != null)
openOffice.kill();
timerTask.cancel();
timerTask = null;
componentContext = null;
componentFactory = null;
serviceFactory = null;
desktop = null;
}
}
/**
* Get the XComponentContext of the connected OpenOffice instance
*
* @return
*/
public XComponentContext getComponentContext() {
return componentContext;
}
public XMultiComponentFactory getComponentFactory() {
return componentFactory;
}
public XMultiServiceFactory getServiceFactory() {
return serviceFactory;
}
public XDesktop getDesktop() {
return desktop;
}
// public XComponent loadDocument(String file) throws Exception {
// XComponentLoader componentLoader = (XComponentLoader) UnoRuntime.queryInterface(XComponentLoader.class, desktop);
// return componentLoader.loadComponentFromURL(FileUtil.getUrl(file), "_blank", 0, new PropertyValue[0]);
// }
public XComponent loadDocument(String file, PropertyValue... propertyValue) throws Exception {
XComponentLoader componentLoader = (XComponentLoader) UnoRuntime.queryInterface(XComponentLoader.class, desktop);
return componentLoader.loadComponentFromURL(FileUtil.getUrl(file), "_blank", 0, propertyValue);
}
// public XComponent loadDocumentFromURL(String url) throws Exception {
// XComponentLoader componentLoader = (XComponentLoader) UnoRuntime.queryInterface(XComponentLoader.class, desktop);
// return componentLoader.loadComponentFromURL(url, "_blank", 0, new PropertyValue[0]);
// }
public XComponent loadDocumentFromURL(String url, PropertyValue... propertyValue) throws Exception {
XComponentLoader componentLoader = (XComponentLoader) UnoRuntime.queryInterface(XComponentLoader.class, desktop);
return componentLoader.loadComponentFromURL(url, "_blank", 0, propertyValue);
}
public XComponent newDocument(String type) throws Exception {
XComponentLoader componentLoader = (XComponentLoader) UnoRuntime.queryInterface(XComponentLoader.class, desktop);
return componentLoader.loadComponentFromURL("private:factory/" + type, "_blank", 0, new PropertyValue[0]);
}
// public void saveDocument(XComponent doc, String toPath) throws Exception {
// XStorable m_xstorable = (XStorable)UnoRuntime.queryInterface(XStorable.class, doc);
// String fileUrl = FileUtil.getUrl(new File(toPath));
// m_xstorable.storeAsURL(fileUrl, new PropertyValue[0]);
// }
public void saveDocument(XComponent doc, String toPath, PropertyValue... propertyValue) throws Exception {
XStorable m_xstorable = (XStorable)UnoRuntime.queryInterface(XStorable.class, doc);
String fileUrl = FileUtil.getUrl(new File(toPath));
m_xstorable.storeToURL(fileUrl, propertyValue);
}
public void saveDocumentToURL(XComponent doc, String toURL, PropertyValue... propertyValue) throws Exception {
XStorable m_xstorable = (XStorable)UnoRuntime.queryInterface(XStorable.class, doc);
m_xstorable.storeToURL(toURL, propertyValue);
}
public void closeDocument(XComponent doc) {
try {
XModifiable modified = (XModifiable) UnoRuntime.queryInterface(XModifiable.class, doc);
XCloseable closer = (XCloseable) UnoRuntime.queryInterface(XCloseable.class, doc);
if (modified != null)
modified.setModified(false);
closer.close(true);
} catch (Exception e) {
// ignore
}
}
}