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 package mod._remotebridge; 25 26 import java.io.PrintWriter; 27 28 import lib.StatusException; 29 import lib.TestCase; 30 import lib.TestEnvironment; 31 import lib.TestParameters; 32 33 import com.sun.star.bridge.XBridgeFactory; 34 import com.sun.star.bridge.XInstanceProvider; 35 import com.sun.star.connection.XAcceptor; 36 import com.sun.star.connection.XConnection; 37 import com.sun.star.connection.XConnector; 38 import com.sun.star.lang.XComponent; 39 import com.sun.star.lang.XMultiServiceFactory; 40 import com.sun.star.uno.Exception; 41 import com.sun.star.uno.UnoRuntime; 42 import com.sun.star.uno.XInterface; 43 44 /** 45 * Test for object which is represented by service 46 * <code>com.sun.star.bridge.Bridge</code>. <p> 47 * Object implements the following interfaces : 48 * <ul> 49 * <li> <code>com::sun::star::lang::XInitialization</code></li> 50 * <li> <code>com::sun::star::lang::XComponent</code></li> 51 * <li> <code>com::sun::star::bridge::XBridge</code></li> 52 * </ul> 53 * This object test <b> is NOT </b> designed to be run in several 54 * threads concurently. 55 * @see com.sun.star.lang.XInitialization 56 * @see com.sun.star.lang.XComponent 57 * @see com.sun.star.bridge.XBridge 58 * @see com.sun.star.bridge.Bridge 59 * @see ifc.lang._XInitialization 60 * @see ifc.lang._XComponent 61 * @see ifc.bridge._XBridge 62 */ 63 public class various extends TestCase { 64 65 /** 66 * String for establishing a connection 67 */ 68 protected String connectString = null ; 69 70 /** 71 * Choose the first port after <code>basePort</code> 72 * which is free. 73 */ 74 protected static final int basePort = 50000; 75 private int curPort = 50000; 76 77 private XAcceptor xAcctr; 78 private XConnector xCntr; 79 private XBridgeFactory xBrdgFctr; 80 private AcceptorThread accThread; 81 82 public XInterface bridge = null; 83 84 /** 85 * Implementation of interface XInstanceProvider 86 * 87 * @see com.sun.star.bridge.XInstanceProvider 88 */ 89 protected class MyInstanceProvider implements XInstanceProvider { 90 /** 91 * a MultiServiceFactory for creating instances 92 * 93 * @see com.sun.star.lang.MultiServiceFactory 94 */ 95 private XMultiServiceFactory xMSF = null; 96 97 /** 98 * Construct object with a MultiServiceFactory 99 * 100 * @see com.sun.star.lang.MultiServiceFactory 101 */ MyInstanceProvider(XMultiServiceFactory xMSF)102 public MyInstanceProvider(XMultiServiceFactory xMSF) { 103 this.xMSF = xMSF; 104 } 105 106 /** 107 * get an instance by name 108 */ getInstance(String aInstanceName)109 public Object getInstance(String aInstanceName) 110 throws com.sun.star.container.NoSuchElementException 111 { 112 System.out.println("######## Try to get "+aInstanceName); 113 try { 114 return xMSF.createInstance(aInstanceName); 115 } 116 catch(com.sun.star.uno.Exception e) { 117 throw new StatusException("Unexpected exception", e); 118 } 119 } 120 } 121 122 /** 123 * Calls <code>accept()</code> method in a separate thread. 124 * Then stores exception thrown by call if it occured, or 125 * return value. 126 */ 127 protected class AcceptorThread extends Thread { 128 /** 129 * If exception occured during method call it is 130 * stored in this field. 131 */ 132 public Exception ex = null ; 133 private XAcceptor acc = null ; 134 private XInstanceProvider xInstProv = null ; 135 private XBridgeFactory xBrdgFctr = null; 136 /** 137 * If method call returns some value it stores in this field. 138 */ 139 public XConnection acceptedCall = null ; 140 141 /** 142 * Creates object which can call <code>accept</code> method 143 * of the Acceptor object specified. 144 */ AcceptorThread(XAcceptor acc, XInstanceProvider xInstProv, XBridgeFactory xBrdgFctr)145 public AcceptorThread(XAcceptor acc, XInstanceProvider xInstProv, 146 XBridgeFactory xBrdgFctr) { 147 this.acc = acc ; 148 this.xInstProv = xInstProv; 149 this.xBrdgFctr = xBrdgFctr; 150 } 151 152 /** 153 * Call <code>accept()</code> method and establish a bridge with an 154 * instance provider 155 */ run()156 public void run() { 157 try { 158 acceptedCall = acc.accept(connectString) ; 159 } catch (com.sun.star.lang.IllegalArgumentException e) { 160 ex = e ; 161 } catch (com.sun.star.connection.ConnectionSetupException e) { 162 ex = e ; 163 } catch (com.sun.star.connection.AlreadyAcceptingException e) { 164 ex = e ; 165 } 166 } 167 } 168 169 private final boolean[] bridgeDisposed = new boolean[1] ; 170 171 /** 172 * Creating a Testenvironment for the interfaces to be tested. 173 * Creates an instance of the service 174 * <code>com.sun.star.bridge.Bridge</code>. 175 * Object relations created : 176 * <ul> 177 * <li> <code>'XInitialization.args'</code> for 178 * {@link ifc.lang._XInitialization} and 179 * {@link ifc.bridge._XBridge} : contains arguments 180 * for <code>initialize()</code> method test.</li> 181 * </ul> 182 */ createTestEnvironment(TestParameters tParam, PrintWriter log)183 protected TestEnvironment createTestEnvironment(TestParameters tParam, 184 PrintWriter log) { 185 XMultiServiceFactory xMSF = (XMultiServiceFactory) tParam.getMSF(); 186 187 try { 188 XInterface xInt = (XInterface)xMSF.createInstance( 189 "com.sun.star.bridge.Bridge"); 190 191 TestEnvironment tEnv = new TestEnvironment(xInt); 192 // creating arguments for XInitialization 193 // first, creating a connection 194 // connection string 195 String cncstr = (String) tParam.get("CNCSTR") ; 196 int idx = cncstr.indexOf("host=") + 5 ; 197 198 // select the port 199 // curPort; //utils.getNextFreePort(basePort); 200 log.println("Choose Port nr: " + curPort); 201 202 connectString = "socket,host=" + 203 cncstr.substring(idx, cncstr.indexOf(",", idx)) + 204 ",port=" + curPort; 205 206 // create acceptor 207 XInterface oAcctr = (XInterface)xMSF.createInstance( 208 "com.sun.star.connection.Acceptor") ; 209 210 xAcctr = (XAcceptor)UnoRuntime.queryInterface( 211 XAcceptor.class, oAcctr); 212 // create connector 213 XInterface oCntr = (XInterface)xMSF.createInstance( 214 "com.sun.star.connection.Connector") ; 215 xCntr = (XConnector)UnoRuntime.queryInterface( 216 XConnector.class, oCntr); 217 218 // create bridge factory 219 XInterface oBrdg = (XInterface)xMSF.createInstance( 220 "com.sun.star.bridge.BridgeFactory") ; 221 xBrdgFctr = (XBridgeFactory) 222 UnoRuntime.queryInterface(XBridgeFactory.class, oBrdg); 223 224 // create own implementation of XInstanceProvider 225 XInstanceProvider xInstProv = new MyInstanceProvider(xMSF); 226 // create waiting acceptor thread 227 accThread = new AcceptorThread(xAcctr, xInstProv, xBrdgFctr); 228 accThread.start(); 229 // let the thread sleep 230 try { 231 Thread.sleep(500); 232 } 233 catch (java.lang.InterruptedException e) {} 234 235 // establish the connection 236 XConnection xConnection = xCntr.connect(connectString); 237 238 String protocol = "urp"; 239 String bridgeName = protocol + ":" + connectString; 240 241 /* bridgeDisposed[0] = false ; 242 XComponent xComp = (XComponent)UnoRuntime.queryInterface( 243 XComponent.class, xInt); 244 final PrintWriter logF = log; 245 xComp.addEventListener(new XEventListener() { 246 public void disposing(EventObject ev) { 247 bridgeDisposed[0] = true ; 248 logF.println("The bridge Disposed."); 249 } 250 }); 251 */ 252 tEnv.addObjRelation("XInitialization.args", new Object[] { 253 bridgeName, protocol, xConnection, null}); 254 255 bridge = tEnv.getTestObject(); 256 257 return tEnv; 258 } catch (com.sun.star.uno.Exception e) { 259 e.printStackTrace(log); 260 throw new StatusException("Unexpected exception", e); 261 } 262 } 263 264 /** 265 * Stop the acceptor thread and dispose the bridge 266 */ cleanup(TestParameters Param, PrintWriter log)267 protected void cleanup(TestParameters Param, PrintWriter log) { 268 269 System.out.println("++++++++ cleanup"); 270 xAcctr.stopAccepting(); 271 if (accThread.isAlive()) { 272 accThread.interrupt(); 273 } 274 XComponent xComp = (XComponent)UnoRuntime.queryInterface( 275 XComponent.class, xAcctr); 276 if (xComp != null) 277 xComp.dispose(); 278 xComp = (XComponent)UnoRuntime.queryInterface( 279 XComponent.class, xCntr); 280 if (xComp != null) 281 xComp.dispose(); 282 xComp = (XComponent)UnoRuntime.queryInterface( 283 XComponent.class, xBrdgFctr); 284 if (xComp != null) 285 xComp.dispose(); 286 287 xComp = (XComponent)UnoRuntime.queryInterface( 288 XComponent.class, bridge); 289 if (xComp != null) { 290 System.out.println("######## Dispose bridge"); 291 bridgeDisposed[0] = true; 292 xComp.dispose(); 293 // wait for dispose 294 try { 295 Thread.sleep(5000); 296 } 297 catch(java.lang.InterruptedException e) { 298 } 299 } 300 } 301 } 302