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 import com.sun.star.uno.UnoRuntime; 26*b1cdbd2cSJim Jagielski import com.sun.star.uno.Any; 27*b1cdbd2cSJim Jagielski 28*b1cdbd2cSJim Jagielski import java.lang.String; 29*b1cdbd2cSJim Jagielski 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielski // __________ Implementation __________ 32*b1cdbd2cSJim Jagielski 33*b1cdbd2cSJim Jagielski /** 34*b1cdbd2cSJim Jagielski * support ONE singleton uno connection to an running office installation! 35*b1cdbd2cSJim Jagielski * Can be used to open/use/close connection to uno environment of an office. If 36*b1cdbd2cSJim Jagielski * necessary a new office instance is started. 37*b1cdbd2cSJim Jagielski * ctor isn't available from outside. You should call static function 38*b1cdbd2cSJim Jagielski * "getConnection()" to open or use internal set connection which is created one 39*b1cdbd2cSJim Jagielski * times only. 40*b1cdbd2cSJim Jagielski * 41*b1cdbd2cSJim Jagielski * @author Andreas Schlüns 42*b1cdbd2cSJim Jagielski * @created 7. Februar 2002 43*b1cdbd2cSJim Jagielski * @modified 05.02.2002 12:10 44*b1cdbd2cSJim Jagielski */ 45*b1cdbd2cSJim Jagielski public class OfficeConnect 46*b1cdbd2cSJim Jagielski { 47*b1cdbd2cSJim Jagielski // ____________________ 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski /** 50*b1cdbd2cSJim Jagielski * At first call we create static connection object and open connection to an 51*b1cdbd2cSJim Jagielski * office - anew offic einstance is started if necessary 52*b1cdbd2cSJim Jagielski * Then - and for all further requests we return these static connection member. 53*b1cdbd2cSJim Jagielski */ createConnection()54*b1cdbd2cSJim Jagielski public static synchronized void createConnection() 55*b1cdbd2cSJim Jagielski { 56*b1cdbd2cSJim Jagielski if (maConnection == null) 57*b1cdbd2cSJim Jagielski maConnection = new OfficeConnect(); 58*b1cdbd2cSJim Jagielski } 59*b1cdbd2cSJim Jagielski 60*b1cdbd2cSJim Jagielski // ____________________ 61*b1cdbd2cSJim Jagielski 62*b1cdbd2cSJim Jagielski /** 63*b1cdbd2cSJim Jagielski * close connection to remote office if it exist 64*b1cdbd2cSJim Jagielski */ disconnect()65*b1cdbd2cSJim Jagielski public static synchronized void disconnect() 66*b1cdbd2cSJim Jagielski { 67*b1cdbd2cSJim Jagielski if(maConnection!=null) 68*b1cdbd2cSJim Jagielski { 69*b1cdbd2cSJim Jagielski mxServiceManager=null; 70*b1cdbd2cSJim Jagielski mxOfficeContext=null; 71*b1cdbd2cSJim Jagielski maConnection=null; 72*b1cdbd2cSJim Jagielski } 73*b1cdbd2cSJim Jagielski } 74*b1cdbd2cSJim Jagielski 75*b1cdbd2cSJim Jagielski // ____________________ 76*b1cdbd2cSJim Jagielski 77*b1cdbd2cSJim Jagielski /** 78*b1cdbd2cSJim Jagielski * ctor 79*b1cdbd2cSJim Jagielski * We try to open the connection in our ctor ... transparently for user. 80*b1cdbd2cSJim Jagielski * After it was successfully you will find an internal set member 81*b1cdbd2cSJim Jagielski * m_xRemoteContext wich means remote component context of the connected office. 82*b1cdbd2cSJim Jagielski * The context can be used to get the remote service manager from the office. 83*b1cdbd2cSJim Jagielski * We made it private to support singleton pattern of these implementation. 84*b1cdbd2cSJim Jagielski * see getConnection() for further informations 85*b1cdbd2cSJim Jagielski */ OfficeConnect()86*b1cdbd2cSJim Jagielski private OfficeConnect() 87*b1cdbd2cSJim Jagielski { 88*b1cdbd2cSJim Jagielski try 89*b1cdbd2cSJim Jagielski { 90*b1cdbd2cSJim Jagielski // get the remote office context. If necessary a new office 91*b1cdbd2cSJim Jagielski // process is started 92*b1cdbd2cSJim Jagielski mxOfficeContext = com.sun.star.comp.helper.Bootstrap.bootstrap(); 93*b1cdbd2cSJim Jagielski System.out.println("Connected to a running office ..."); 94*b1cdbd2cSJim Jagielski mxServiceManager = mxOfficeContext.getServiceManager(); 95*b1cdbd2cSJim Jagielski } 96*b1cdbd2cSJim Jagielski catch (java.lang.Exception ex) 97*b1cdbd2cSJim Jagielski { 98*b1cdbd2cSJim Jagielski System.err.println("connection failed" + ex); 99*b1cdbd2cSJim Jagielski ex.printStackTrace(System.out); 100*b1cdbd2cSJim Jagielski System.exit(1); 101*b1cdbd2cSJim Jagielski 102*b1cdbd2cSJim Jagielski } 103*b1cdbd2cSJim Jagielski } 104*b1cdbd2cSJim Jagielski 105*b1cdbd2cSJim Jagielski // ____________________ 106*b1cdbd2cSJim Jagielski 107*b1cdbd2cSJim Jagielski /** 108*b1cdbd2cSJim Jagielski * create uno components inside remote office process 109*b1cdbd2cSJim Jagielski * After connection of these proccess to a running office we have access to 110*b1cdbd2cSJim Jagielski * remote service manager of it. 111*b1cdbd2cSJim Jagielski * So we can use it to create all existing services. Use this method to create 112*b1cdbd2cSJim Jagielski * components by name and get her interface. Casting of it to right target 113*b1cdbd2cSJim Jagielski * interface is part of your implementation. 114*b1cdbd2cSJim Jagielski * 115*b1cdbd2cSJim Jagielski * @param aType describe class type of created service 116*b1cdbd2cSJim Jagielski * Returned object can be casted directly to this one. 117*b1cdbd2cSJim Jagielski * Uno query was done by this method automaticly. 118*b1cdbd2cSJim Jagielski * @param sServiceSpecifier name of service which should be created 119*b1cdbd2cSJim Jagielski * @return the new created service object 120*b1cdbd2cSJim Jagielski */ createRemoteInstance( Class aType, String sServiceSpecifier)121*b1cdbd2cSJim Jagielski public static synchronized Object createRemoteInstance( 122*b1cdbd2cSJim Jagielski Class aType, String sServiceSpecifier) 123*b1cdbd2cSJim Jagielski { 124*b1cdbd2cSJim Jagielski Object aResult = null; 125*b1cdbd2cSJim Jagielski try 126*b1cdbd2cSJim Jagielski { 127*b1cdbd2cSJim Jagielski aResult = UnoRuntime.queryInterface(aType, 128*b1cdbd2cSJim Jagielski mxServiceManager.createInstanceWithContext( 129*b1cdbd2cSJim Jagielski sServiceSpecifier, mxOfficeContext)); 130*b1cdbd2cSJim Jagielski } 131*b1cdbd2cSJim Jagielski catch (com.sun.star.uno.Exception ex) 132*b1cdbd2cSJim Jagielski { 133*b1cdbd2cSJim Jagielski System.err.println("Couldn't create Service of type " 134*b1cdbd2cSJim Jagielski + sServiceSpecifier + ": " + ex); 135*b1cdbd2cSJim Jagielski System.exit(0); 136*b1cdbd2cSJim Jagielski } 137*b1cdbd2cSJim Jagielski return aResult; 138*b1cdbd2cSJim Jagielski } 139*b1cdbd2cSJim Jagielski 140*b1cdbd2cSJim Jagielski // ____________________ 141*b1cdbd2cSJim Jagielski 142*b1cdbd2cSJim Jagielski /** 143*b1cdbd2cSJim Jagielski * same as "createRemoteInstance()" but supports additional parameter for 144*b1cdbd2cSJim Jagielski * initializing created object 145*b1cdbd2cSJim Jagielski * 146*b1cdbd2cSJim Jagielski * @param lArguments optional arguments 147*b1cdbd2cSJim Jagielski * They are used to initialize new created service. 148*b1cdbd2cSJim Jagielski * @param aType Description of Parameter 149*b1cdbd2cSJim Jagielski * @param sServiceSpecifier Description of Parameter 150*b1cdbd2cSJim Jagielski * @return the new create service object 151*b1cdbd2cSJim Jagielski */ createRemoteInstanceWithArguments( Class aType, String sServiceSpecifier, Any[] lArguments)152*b1cdbd2cSJim Jagielski public static synchronized Object createRemoteInstanceWithArguments( 153*b1cdbd2cSJim Jagielski Class aType, String sServiceSpecifier, Any[] lArguments) 154*b1cdbd2cSJim Jagielski { 155*b1cdbd2cSJim Jagielski Object aResult = null; 156*b1cdbd2cSJim Jagielski try 157*b1cdbd2cSJim Jagielski { 158*b1cdbd2cSJim Jagielski aResult = UnoRuntime.queryInterface(aType, 159*b1cdbd2cSJim Jagielski mxServiceManager.createInstanceWithArgumentsAndContext( 160*b1cdbd2cSJim Jagielski sServiceSpecifier, lArguments, mxOfficeContext)); 161*b1cdbd2cSJim Jagielski } 162*b1cdbd2cSJim Jagielski catch (com.sun.star.uno.Exception ex) 163*b1cdbd2cSJim Jagielski { 164*b1cdbd2cSJim Jagielski System.err.println("Couldn't create Service of type " 165*b1cdbd2cSJim Jagielski + sServiceSpecifier + ": " + ex); 166*b1cdbd2cSJim Jagielski System.exit(0); 167*b1cdbd2cSJim Jagielski } 168*b1cdbd2cSJim Jagielski return aResult; 169*b1cdbd2cSJim Jagielski } 170*b1cdbd2cSJim Jagielski 171*b1cdbd2cSJim Jagielski // ____________________ 172*b1cdbd2cSJim Jagielski 173*b1cdbd2cSJim Jagielski /** 174*b1cdbd2cSJim Jagielski * returns remote component context of the connected office 175*b1cdbd2cSJim Jagielski */ getOfficeContext()176*b1cdbd2cSJim Jagielski public static synchronized com.sun.star.uno.XComponentContext getOfficeContext() 177*b1cdbd2cSJim Jagielski { 178*b1cdbd2cSJim Jagielski return mxOfficeContext; 179*b1cdbd2cSJim Jagielski } 180*b1cdbd2cSJim Jagielski 181*b1cdbd2cSJim Jagielski // ____________________ 182*b1cdbd2cSJim Jagielski 183*b1cdbd2cSJim Jagielski /** 184*b1cdbd2cSJim Jagielski * member 185*b1cdbd2cSJim Jagielski */ 186*b1cdbd2cSJim Jagielski // singleton connection instance 187*b1cdbd2cSJim Jagielski private static OfficeConnect maConnection; 188*b1cdbd2cSJim Jagielski 189*b1cdbd2cSJim Jagielski // reference to the office component context 190*b1cdbd2cSJim Jagielski private static com.sun.star.uno.XComponentContext mxOfficeContext; 191*b1cdbd2cSJim Jagielski // reference to remote service manager of singleton connection object 192*b1cdbd2cSJim Jagielski private static com.sun.star.lang.XMultiComponentFactory mxServiceManager; 193*b1cdbd2cSJim Jagielski } 194*b1cdbd2cSJim Jagielski 195