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