1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // __________ Imports __________ 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielski // structs, const, ... 27*b1cdbd2cSJim Jagielski import com.sun.star.beans.PropertyValue; 28*b1cdbd2cSJim Jagielski import com.sun.star.bridge.XUnoUrlResolver; 29*b1cdbd2cSJim Jagielski 30*b1cdbd2cSJim Jagielski // exceptions 31*b1cdbd2cSJim Jagielski import com.sun.star.container.NoSuchElementException; 32*b1cdbd2cSJim Jagielski 33*b1cdbd2cSJim Jagielski // interfaces 34*b1cdbd2cSJim Jagielski import com.sun.star.lang.XMultiServiceFactory; 35*b1cdbd2cSJim Jagielski import com.sun.star.uno.Any; 36*b1cdbd2cSJim Jagielski import com.sun.star.uno.Exception; 37*b1cdbd2cSJim Jagielski 38*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime; 39*b1cdbd2cSJim Jagielski 40*b1cdbd2cSJim Jagielski // others 41*b1cdbd2cSJim Jagielski import java.lang.String; 42*b1cdbd2cSJim Jagielski 43*b1cdbd2cSJim Jagielski // __________ Implementation __________ 44*b1cdbd2cSJim Jagielski 45*b1cdbd2cSJim Jagielski /** 46*b1cdbd2cSJim Jagielski * support ONE singleton uno connection to an running office installation! 47*b1cdbd2cSJim Jagielski * Can be used to open/use/close connection to uno environment of an already running office. 48*b1cdbd2cSJim Jagielski * ctor isn't available from outside. You should call static function "getConnection()" 49*b1cdbd2cSJim Jagielski * to open or use internal set connection which is created one times only. 50*b1cdbd2cSJim Jagielski * 51*b1cdbd2cSJim Jagielski * @author Andreas Schlüns 52*b1cdbd2cSJim Jagielski * @created 7. Februar 2002 53*b1cdbd2cSJim Jagielski * @modified 05.02.2002 12:10 54*b1cdbd2cSJim Jagielski */ 55*b1cdbd2cSJim Jagielski public class OfficeConnect 56*b1cdbd2cSJim Jagielski { 57*b1cdbd2cSJim Jagielski // ____________________ 58*b1cdbd2cSJim Jagielski 59*b1cdbd2cSJim Jagielski /** 60*b1cdbd2cSJim Jagielski * At first call we create static connection object and get the remote office 61*b1cdbd2cSJim Jagielski * context and the remote office service manager. A new office process is 62*b1cdbd2cSJim Jagielski * started if necessary. 63*b1cdbd2cSJim Jagielski * Then - and for all further requests we return these static connection member. 64*b1cdbd2cSJim Jagielski */ createConnection()65*b1cdbd2cSJim Jagielski public static synchronized OfficeConnect createConnection() 66*b1cdbd2cSJim Jagielski throws java.lang.Exception 67*b1cdbd2cSJim Jagielski { 68*b1cdbd2cSJim Jagielski if (maConnection == null) 69*b1cdbd2cSJim Jagielski { 70*b1cdbd2cSJim Jagielski maConnection = new OfficeConnect(); 71*b1cdbd2cSJim Jagielski } 72*b1cdbd2cSJim Jagielski return maConnection; 73*b1cdbd2cSJim Jagielski } 74*b1cdbd2cSJim Jagielski 75*b1cdbd2cSJim Jagielski // ____________________ 76*b1cdbd2cSJim Jagielski getConnection()77*b1cdbd2cSJim Jagielski public static synchronized OfficeConnect getConnection() 78*b1cdbd2cSJim Jagielski { 79*b1cdbd2cSJim Jagielski return maConnection; 80*b1cdbd2cSJim Jagielski } 81*b1cdbd2cSJim Jagielski 82*b1cdbd2cSJim Jagielski // ____________________ 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski /** 85*b1cdbd2cSJim Jagielski * ctor 86*b1cdbd2cSJim Jagielski * We try to open the connection in our ctor ... transparently for the user. 87*b1cdbd2cSJim Jagielski * We made it private to support singleton pattern of these implementation. 88*b1cdbd2cSJim Jagielski * see getConnection() for further informations 89*b1cdbd2cSJim Jagielski */ OfficeConnect()90*b1cdbd2cSJim Jagielski private OfficeConnect() throws java.lang.Exception 91*b1cdbd2cSJim Jagielski { 92*b1cdbd2cSJim Jagielski // get the remote office context. If necessary a new office 93*b1cdbd2cSJim Jagielski // process is started 94*b1cdbd2cSJim Jagielski mxOfficeContext = com.sun.star.comp.helper.Bootstrap.bootstrap(); 95*b1cdbd2cSJim Jagielski System.out.println("Connected to a running office ..."); 96*b1cdbd2cSJim Jagielski mxServiceManager = mxOfficeContext.getServiceManager(); 97*b1cdbd2cSJim Jagielski } 98*b1cdbd2cSJim Jagielski 99*b1cdbd2cSJim Jagielski // ____________________ 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski /** 102*b1cdbd2cSJim Jagielski * create uno components inside remote office process 103*b1cdbd2cSJim Jagielski * After connection of these proccess to a running office we have access to remote service manager of it. 104*b1cdbd2cSJim Jagielski * So we can use it to create all existing services. Use this method to create components by name and 105*b1cdbd2cSJim Jagielski * get her interface. Casting of it to right target interface is part of your implementation. 106*b1cdbd2cSJim Jagielski * 107*b1cdbd2cSJim Jagielski * @param aType describe class type of created service 108*b1cdbd2cSJim Jagielski * Returned object can be casted directly to this one. 109*b1cdbd2cSJim Jagielski * Uno query was done by this method automaticly. 110*b1cdbd2cSJim Jagielski * @param sServiceSpecifier name of service which should be created 111*b1cdbd2cSJim Jagielski * @return Description of the Returned Value 112*b1cdbd2cSJim Jagielski */ createRemoteInstance(Class aType, String sServiceSpecifier)113*b1cdbd2cSJim Jagielski public Object createRemoteInstance(Class aType, String sServiceSpecifier) 114*b1cdbd2cSJim Jagielski { 115*b1cdbd2cSJim Jagielski Object aResult = null; 116*b1cdbd2cSJim Jagielski try 117*b1cdbd2cSJim Jagielski { 118*b1cdbd2cSJim Jagielski aResult = UnoRuntime.queryInterface( 119*b1cdbd2cSJim Jagielski aType, mxServiceManager.createInstanceWithContext( 120*b1cdbd2cSJim Jagielski sServiceSpecifier, mxOfficeContext)); 121*b1cdbd2cSJim Jagielski } 122*b1cdbd2cSJim Jagielski catch (com.sun.star.uno.Exception ex) 123*b1cdbd2cSJim Jagielski { 124*b1cdbd2cSJim Jagielski System.err.println("Couldn't create Service of type " + sServiceSpecifier + ": " + ex); 125*b1cdbd2cSJim Jagielski ex.printStackTrace(); 126*b1cdbd2cSJim Jagielski System.exit(0); 127*b1cdbd2cSJim Jagielski } 128*b1cdbd2cSJim Jagielski return aResult; 129*b1cdbd2cSJim Jagielski } 130*b1cdbd2cSJim Jagielski 131*b1cdbd2cSJim Jagielski // ____________________ 132*b1cdbd2cSJim Jagielski 133*b1cdbd2cSJim Jagielski /** 134*b1cdbd2cSJim Jagielski * same as "createRemoteInstance()" but supports additional parameter for initializing created object 135*b1cdbd2cSJim Jagielski * 136*b1cdbd2cSJim Jagielski * @param lArguments optional arguments 137*b1cdbd2cSJim Jagielski * They are used to initialize new created service. 138*b1cdbd2cSJim Jagielski * @param aType Description of Parameter 139*b1cdbd2cSJim Jagielski * @param sServiceSpecifier Description of Parameter 140*b1cdbd2cSJim Jagielski * @return Description of the Returned Value 141*b1cdbd2cSJim Jagielski */ createRemoteInstanceWithArguments(Class aType, String sServiceSpecifier, Any[] lArguments)142*b1cdbd2cSJim Jagielski public Object createRemoteInstanceWithArguments(Class aType, String sServiceSpecifier, Any[] lArguments) 143*b1cdbd2cSJim Jagielski { 144*b1cdbd2cSJim Jagielski Object aResult = null; 145*b1cdbd2cSJim Jagielski try 146*b1cdbd2cSJim Jagielski { 147*b1cdbd2cSJim Jagielski aResult = UnoRuntime.queryInterface( 148*b1cdbd2cSJim Jagielski aType, mxServiceManager.createInstanceWithArgumentsAndContext( 149*b1cdbd2cSJim Jagielski sServiceSpecifier, lArguments, mxOfficeContext)); 150*b1cdbd2cSJim Jagielski } 151*b1cdbd2cSJim Jagielski catch (com.sun.star.uno.Exception ex) 152*b1cdbd2cSJim Jagielski { 153*b1cdbd2cSJim Jagielski System.err.println("Couldn't create Service of type " + sServiceSpecifier + ": " + ex); 154*b1cdbd2cSJim Jagielski ex.printStackTrace(); 155*b1cdbd2cSJim Jagielski System.exit(0); 156*b1cdbd2cSJim Jagielski } 157*b1cdbd2cSJim Jagielski return aResult; 158*b1cdbd2cSJim Jagielski } 159*b1cdbd2cSJim Jagielski 160*b1cdbd2cSJim Jagielski // ____________________ 161*b1cdbd2cSJim Jagielski 162*b1cdbd2cSJim Jagielski /** 163*b1cdbd2cSJim Jagielski * member 164*b1cdbd2cSJim Jagielski */ 165*b1cdbd2cSJim Jagielski // singleton connection instance 166*b1cdbd2cSJim Jagielski private static OfficeConnect maConnection; 167*b1cdbd2cSJim Jagielski 168*b1cdbd2cSJim Jagielski // reference to remote office context 169*b1cdbd2cSJim Jagielski private com.sun.star.uno.XComponentContext mxOfficeContext; 170*b1cdbd2cSJim Jagielski // reference to remote service manager 171*b1cdbd2cSJim Jagielski private com.sun.star.lang.XMultiComponentFactory mxServiceManager; 172*b1cdbd2cSJim Jagielski } 173*b1cdbd2cSJim Jagielski 174