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 package ifc.bridge; 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielski import lib.MultiMethodTest; 27*b1cdbd2cSJim Jagielski import lib.StatusException; 28*b1cdbd2cSJim Jagielski import util.utils; 29*b1cdbd2cSJim Jagielski 30*b1cdbd2cSJim Jagielski import com.sun.star.bridge.XBridge; 31*b1cdbd2cSJim Jagielski import com.sun.star.bridge.XBridgeFactory; 32*b1cdbd2cSJim Jagielski import com.sun.star.bridge.XInstanceProvider; 33*b1cdbd2cSJim Jagielski import com.sun.star.bridge.XUnoUrlResolver; 34*b1cdbd2cSJim Jagielski import com.sun.star.connection.ConnectionSetupException; 35*b1cdbd2cSJim Jagielski import com.sun.star.connection.NoConnectException; 36*b1cdbd2cSJim Jagielski import com.sun.star.connection.XAcceptor; 37*b1cdbd2cSJim Jagielski import com.sun.star.connection.XConnection; 38*b1cdbd2cSJim Jagielski import com.sun.star.lang.IllegalArgumentException; 39*b1cdbd2cSJim Jagielski import com.sun.star.lang.XMultiServiceFactory; 40*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime; 41*b1cdbd2cSJim Jagielski 42*b1cdbd2cSJim Jagielski /** 43*b1cdbd2cSJim Jagielski * Testing <code>com.sun.star.bridge.XUnoUrlResolver</code> 44*b1cdbd2cSJim Jagielski * interface methods : 45*b1cdbd2cSJim Jagielski * <ul> 46*b1cdbd2cSJim Jagielski * <li><code> resolve()</code></li> 47*b1cdbd2cSJim Jagielski * </ul> <p> 48*b1cdbd2cSJim Jagielski * @see com.sun.star.bridge.XUnoUrlResolver 49*b1cdbd2cSJim Jagielski */ 50*b1cdbd2cSJim Jagielski public class _XUnoUrlResolver extends MultiMethodTest { 51*b1cdbd2cSJim Jagielski 52*b1cdbd2cSJim Jagielski // starting port and current port to choose 53*b1cdbd2cSJim Jagielski static int basePort = 0; 54*b1cdbd2cSJim Jagielski int curPort = 0; 55*b1cdbd2cSJim Jagielski 56*b1cdbd2cSJim Jagielski public XUnoUrlResolver oObj; 57*b1cdbd2cSJim Jagielski 58*b1cdbd2cSJim Jagielski /** 59*b1cdbd2cSJim Jagielski * Implementation for providing an instance 60*b1cdbd2cSJim Jagielski * 61*b1cdbd2cSJim Jagielski * @see com.sun.star.bridge.XInstanceProvider 62*b1cdbd2cSJim Jagielski */ 63*b1cdbd2cSJim Jagielski class MyInstanceProvider implements XInstanceProvider { 64*b1cdbd2cSJim Jagielski /** 65*b1cdbd2cSJim Jagielski * a MultiServiceFactory for creating instances 66*b1cdbd2cSJim Jagielski * 67*b1cdbd2cSJim Jagielski * @see com.sun.star.lang.MultiServiceFactory 68*b1cdbd2cSJim Jagielski */ 69*b1cdbd2cSJim Jagielski private XMultiServiceFactory xMSF = null; 70*b1cdbd2cSJim Jagielski 71*b1cdbd2cSJim Jagielski /** 72*b1cdbd2cSJim Jagielski * Construct object with a MultiServiceFactory 73*b1cdbd2cSJim Jagielski * 74*b1cdbd2cSJim Jagielski * @see com.sun.star.lang.MultiServiceFactory 75*b1cdbd2cSJim Jagielski */ MyInstanceProvider(XMultiServiceFactory xMSF)76*b1cdbd2cSJim Jagielski public MyInstanceProvider(XMultiServiceFactory xMSF) { 77*b1cdbd2cSJim Jagielski this.xMSF = xMSF; 78*b1cdbd2cSJim Jagielski } 79*b1cdbd2cSJim Jagielski 80*b1cdbd2cSJim Jagielski /** 81*b1cdbd2cSJim Jagielski * get an instance by name 82*b1cdbd2cSJim Jagielski */ getInstance(String aInstanceName)83*b1cdbd2cSJim Jagielski public Object getInstance(String aInstanceName) 84*b1cdbd2cSJim Jagielski throws com.sun.star.container.NoSuchElementException 85*b1cdbd2cSJim Jagielski { 86*b1cdbd2cSJim Jagielski try { 87*b1cdbd2cSJim Jagielski return xMSF.createInstance(aInstanceName); 88*b1cdbd2cSJim Jagielski } 89*b1cdbd2cSJim Jagielski catch(com.sun.star.uno.Exception e) { 90*b1cdbd2cSJim Jagielski throw new StatusException("Unexpected exception", e); 91*b1cdbd2cSJim Jagielski } 92*b1cdbd2cSJim Jagielski } 93*b1cdbd2cSJim Jagielski } 94*b1cdbd2cSJim Jagielski 95*b1cdbd2cSJim Jagielski /** 96*b1cdbd2cSJim Jagielski * Thread for creating a bridge so the resolver can access it 97*b1cdbd2cSJim Jagielski */ 98*b1cdbd2cSJim Jagielski class BridgeThread extends Thread { 99*b1cdbd2cSJim Jagielski private XBridgeFactory xBrdgFctr = null; 100*b1cdbd2cSJim Jagielski private XInstanceProvider xInstProv = null; 101*b1cdbd2cSJim Jagielski private XAcceptor xAcc = null; 102*b1cdbd2cSJim Jagielski private String connectString = null; 103*b1cdbd2cSJim Jagielski 104*b1cdbd2cSJim Jagielski public XBridge xBridge = null; 105*b1cdbd2cSJim Jagielski BridgeThread(XAcceptor xAcc, XBridgeFactory xBrdgFctr, XInstanceProvider xInstProv, String connectString )106*b1cdbd2cSJim Jagielski public BridgeThread(XAcceptor xAcc, XBridgeFactory xBrdgFctr, 107*b1cdbd2cSJim Jagielski XInstanceProvider xInstProv, String connectString 108*b1cdbd2cSJim Jagielski ) { 109*b1cdbd2cSJim Jagielski this.xInstProv = xInstProv; 110*b1cdbd2cSJim Jagielski this.xBrdgFctr = xBrdgFctr; 111*b1cdbd2cSJim Jagielski this.xAcc = xAcc; 112*b1cdbd2cSJim Jagielski this.connectString = connectString; 113*b1cdbd2cSJim Jagielski } 114*b1cdbd2cSJim Jagielski run()115*b1cdbd2cSJim Jagielski public void run() { 116*b1cdbd2cSJim Jagielski try { 117*b1cdbd2cSJim Jagielski // create a connection 118*b1cdbd2cSJim Jagielski XConnection xCon = xAcc.accept(connectString); 119*b1cdbd2cSJim Jagielski // create a bridge over that conmnection 120*b1cdbd2cSJim Jagielski xBridge = xBrdgFctr.createBridge( 121*b1cdbd2cSJim Jagielski "MyBridge", "urp", xCon, xInstProv); 122*b1cdbd2cSJim Jagielski } catch (com.sun.star.lang.IllegalArgumentException e) { 123*b1cdbd2cSJim Jagielski e.printStackTrace(log); 124*b1cdbd2cSJim Jagielski } catch (com.sun.star.connection.ConnectionSetupException e) { 125*b1cdbd2cSJim Jagielski e.printStackTrace(log); 126*b1cdbd2cSJim Jagielski } catch (com.sun.star.connection.AlreadyAcceptingException e) { 127*b1cdbd2cSJim Jagielski e.printStackTrace(log); 128*b1cdbd2cSJim Jagielski } catch (com.sun.star.bridge.BridgeExistsException e) { 129*b1cdbd2cSJim Jagielski e.printStackTrace(log); 130*b1cdbd2cSJim Jagielski } 131*b1cdbd2cSJim Jagielski } 132*b1cdbd2cSJim Jagielski 133*b1cdbd2cSJim Jagielski } 134*b1cdbd2cSJim Jagielski /** 135*b1cdbd2cSJim Jagielski * Test calls the method using environment property 136*b1cdbd2cSJim Jagielski * <code>'CNCSTR'</code>. <p> 137*b1cdbd2cSJim Jagielski * Has <b> OK </b> status if the method successfully returns 138*b1cdbd2cSJim Jagielski * object that support interface <code>XMultiServiceFactory</code> and 139*b1cdbd2cSJim Jagielski * no exceptions were thrown. <p> 140*b1cdbd2cSJim Jagielski * @see com.sun.star.lang.XMultiServiceFactory 141*b1cdbd2cSJim Jagielski */ _resolve()142*b1cdbd2cSJim Jagielski public void _resolve() { 143*b1cdbd2cSJim Jagielski String connectStr = (String)tParam.get("CNCSTR"); 144*b1cdbd2cSJim Jagielski int pIndex = connectStr.indexOf("port=") + 5; 145*b1cdbd2cSJim Jagielski connectStr = connectStr.substring(0, pIndex); 146*b1cdbd2cSJim Jagielski System.out.println("ConnectString: " + connectStr); 147*b1cdbd2cSJim Jagielski 148*b1cdbd2cSJim Jagielski // select the port 149*b1cdbd2cSJim Jagielski basePort = ((Integer)tEnv.getObjRelation("PORT")).intValue(); 150*b1cdbd2cSJim Jagielski curPort = utils.getNextFreePort(basePort); 151*b1cdbd2cSJim Jagielski log.println("Choose Port nr: " + curPort); 152*b1cdbd2cSJim Jagielski 153*b1cdbd2cSJim Jagielski connectStr += curPort; 154*b1cdbd2cSJim Jagielski 155*b1cdbd2cSJim Jagielski try { 156*b1cdbd2cSJim Jagielski XMultiServiceFactory xMSF = (XMultiServiceFactory)tParam.getMSF(); 157*b1cdbd2cSJim Jagielski 158*b1cdbd2cSJim Jagielski // get the bridge factory 159*b1cdbd2cSJim Jagielski XBridgeFactory xBrdgFctr = (XBridgeFactory) 160*b1cdbd2cSJim Jagielski UnoRuntime.queryInterface(XBridgeFactory.class, 161*b1cdbd2cSJim Jagielski tEnv.getObjRelation("BRIDGEFACTORY")); 162*b1cdbd2cSJim Jagielski 163*b1cdbd2cSJim Jagielski // get the acceptor 164*b1cdbd2cSJim Jagielski XAcceptor xAcc = (XAcceptor)UnoRuntime.queryInterface( 165*b1cdbd2cSJim Jagielski XAcceptor.class, tEnv.getObjRelation("ACCEPTOR")); 166*b1cdbd2cSJim Jagielski 167*b1cdbd2cSJim Jagielski // instance provider 168*b1cdbd2cSJim Jagielski XInstanceProvider xInstProv = new MyInstanceProvider(xMSF); 169*b1cdbd2cSJim Jagielski // thread for providing a bridge 170*b1cdbd2cSJim Jagielski BridgeThread brThread = new BridgeThread(xAcc, xBrdgFctr, 171*b1cdbd2cSJim Jagielski xInstProv, connectStr); 172*b1cdbd2cSJim Jagielski brThread.start(); 173*b1cdbd2cSJim Jagielski 174*b1cdbd2cSJim Jagielski try { 175*b1cdbd2cSJim Jagielski Thread.sleep(500); 176*b1cdbd2cSJim Jagielski } 177*b1cdbd2cSJim Jagielski catch(java.lang.InterruptedException e) {} 178*b1cdbd2cSJim Jagielski // get an instance from the remote 179*b1cdbd2cSJim Jagielski Object obj = oObj.resolve( 180*b1cdbd2cSJim Jagielski "uno:" + connectStr + ";urp;com.sun.star.lang.ServiceManager"); 181*b1cdbd2cSJim Jagielski // got the instance? 182*b1cdbd2cSJim Jagielski XMultiServiceFactory oMSF = (XMultiServiceFactory) 183*b1cdbd2cSJim Jagielski UnoRuntime.queryInterface(XMultiServiceFactory.class, obj); 184*b1cdbd2cSJim Jagielski 185*b1cdbd2cSJim Jagielski if (brThread.isAlive()) 186*b1cdbd2cSJim Jagielski brThread.interrupt(); 187*b1cdbd2cSJim Jagielski 188*b1cdbd2cSJim Jagielski tRes.tested("resolve()", oMSF != null); 189*b1cdbd2cSJim Jagielski } catch (NoConnectException e) { 190*b1cdbd2cSJim Jagielski log.println("Unexpected exception thrown " + e.getMessage()); 191*b1cdbd2cSJim Jagielski e.printStackTrace(log); 192*b1cdbd2cSJim Jagielski throw new StatusException("Unexpected exception", e); 193*b1cdbd2cSJim Jagielski } catch (ConnectionSetupException e) { 194*b1cdbd2cSJim Jagielski log.println("Unexpected exception thrown " + e.getMessage()); 195*b1cdbd2cSJim Jagielski e.printStackTrace(log); 196*b1cdbd2cSJim Jagielski throw new StatusException("Unexpected exception", e); 197*b1cdbd2cSJim Jagielski } catch (IllegalArgumentException e) { 198*b1cdbd2cSJim Jagielski log.println("Unexpected exception thrown " + e.getMessage()); 199*b1cdbd2cSJim Jagielski e.printStackTrace(log); 200*b1cdbd2cSJim Jagielski throw new StatusException("Unexpected exception", e); 201*b1cdbd2cSJim Jagielski } 202*b1cdbd2cSJim Jagielski } 203*b1cdbd2cSJim Jagielski } 204