| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| package basicrunner.basichelper; |
| |
| import com.sun.star.lang.XInitialization; |
| import com.sun.star.lang.XServiceInfo; |
| import com.sun.star.lang.XTypeProvider; |
| import com.sun.star.uno.Type; |
| import com.sun.star.connection.XConnector; |
| import com.sun.star.connection.XConnection; |
| import com.sun.star.connection.ConnectionSetupException; |
| import com.sun.star.connection.NoConnectException; |
| import com.sun.star.container.XNameAccess; |
| import com.sun.star.container.NoSuchElementException; |
| import com.sun.star.uno.UnoRuntime; |
| import com.sun.star.lang.XSingleServiceFactory; |
| |
| /** |
| * This is a special service that is used in testing Acceptor |
| * component in BASIC. This componennt creates a separate thread |
| * that tries to connect to BASIC's acceptor. After successfull |
| * connection it writes a connectionString to XConnection. |
| */ |
| public class Connector implements XServiceInfo, XSingleServiceFactory { |
| /** The service name of this class **/ |
| static final String __serviceName = "basichelper.Connector"; |
| /** The Connector implementation **/ |
| static ConnectorImpl oConnector = null; |
| |
| /** Create a connector. |
| */ |
| public Connector() { |
| oConnector = new ConnectorImpl(); |
| } |
| |
| /** |
| * Returns an instance of the connector. |
| * Arguments are not supported here and will be ignored. |
| * @param args The arguments. |
| * @return The connector. |
| */ |
| public Object createInstanceWithArguments(Object[] args) { |
| return oConnector; |
| } |
| |
| /** |
| * Returns an instance of the connector. |
| * @return The connector. |
| */ |
| public Object createInstance() { |
| return createInstanceWithArguments(null); |
| } |
| |
| /** |
| * Get a unique id for this implementation. |
| * @return The id. |
| */ |
| public byte[] getImplementationId() { |
| return toString().getBytes(); |
| } |
| |
| /** |
| * Return all implemented types of this class. |
| * @return The implemented UNO types. |
| */ |
| public Type[] getTypes() { |
| Class interfaces[] = getClass().getInterfaces(); |
| |
| Type types[] = new Type[interfaces.length]; |
| for(int i = 0; i < interfaces.length; ++ i) |
| types[i] = new Type(interfaces[i]); |
| |
| return types; |
| } |
| |
| /** Is this servioce supported? |
| * @param name The service name. |
| * @return True, if the service is supported. |
| */ |
| public boolean supportsService(String name) { |
| return __serviceName.equals(name); |
| } |
| |
| /** |
| * Get all supported service names. |
| * @return All supported servcices. |
| */ |
| public String[] getSupportedServiceNames() { |
| return new String[] {__serviceName}; |
| } |
| |
| /** |
| * Get the implementation name of this class. |
| * @return The implementation name. |
| */ |
| public String getImplementationName() { |
| return getClass().getName(); |
| } |
| } |
| |
| /** |
| * The actual implementation of the connector |
| * @see com.sun.star.lang.XInitialization |
| * @see com.sun.star.lang.XTypeProvider |
| * @see com.sun.star.container.XNameAccess |
| */ |
| class ConnectorImpl implements XInitialization, XTypeProvider, XNameAccess { |
| static String aState; |
| static Integer iTimeout; |
| |
| /** |
| * Construct a new connector. |
| */ |
| public ConnectorImpl() { |
| aState = "just created"; |
| iTimeout = new Integer(3000); |
| } |
| |
| /** |
| * Method initialize() creates a new thread that will try to connect to |
| * Acceptor for a few seconds. One should pass as parameters an array, |
| * where element 0 is an instance of Connector and element 1 is a |
| * connection string (the same as in Acceptor) |
| * @param parm1 An instance of XConnector. |
| * @see com.sun.star.connection.XConnector |
| * @throws Exception Is thrown, when initialize fails. |
| */ |
| public void initialize(Object[] parm1) throws com.sun.star.uno.Exception { |
| aState = "just initialized"; |
| XConnector cntr = (XConnector)UnoRuntime.queryInterface( |
| XConnector.class, parm1[0]); |
| ConnThread aThread = new ConnThread(cntr, (String)parm1[1]); |
| aThread.start(); |
| } |
| |
| /** |
| * Get the element names |
| * @return All element names. |
| */ |
| public String[] getElementNames() { |
| return new String[]{"State", "Timeout"}; |
| } |
| |
| /** |
| * Does this element exist? |
| * @param name The element name. |
| * @return True, if the name exists. |
| */ |
| public boolean hasByName(String name) { |
| return (name.equals("State") || name.equals("Timeout")); |
| } |
| |
| /** |
| * Get an element by its name. |
| * @param name The name of the element. |
| * @return The value of the element. |
| * @throws NoSuchElementException The element does not exist. |
| */ |
| public Object getByName(String name) throws NoSuchElementException{ |
| if (name.equals("State")) |
| return aState; |
| else if (name.equals("Timeout")) |
| return iTimeout; |
| else |
| throw new NoSuchElementException(); |
| } |
| |
| /** |
| * Are there elements |
| * @return Always true. |
| */ |
| public boolean hasElements() { |
| return true; |
| } |
| |
| /** |
| * Get element type. |
| * @return null. |
| */ |
| public Type getElementType() { |
| return null; |
| } |
| |
| /** |
| * Get a unique id for this implementation. |
| * @return The id. |
| */ |
| public byte[] getImplementationId() { |
| return toString().getBytes(); |
| } |
| |
| /** |
| * Return all implemented types of this class. |
| * @return The implemented UNO types. |
| */ |
| public Type[] getTypes() { |
| Class interfaces[] = getClass().getInterfaces(); |
| |
| Type types[] = new Type[interfaces.length]; |
| for(int i = 0; i < interfaces.length; ++ i) |
| types[i] = new Type(interfaces[i]); |
| |
| return types; |
| } |
| } |
| |
| /** |
| * A connector thread |
| */ |
| class ConnThread extends Thread { |
| String connStr; |
| XConnector oConnector; |
| |
| /**Construct the thread. |
| * @param oCntr A connector. |
| * @param cStr The conection string. |
| */ |
| public ConnThread(XConnector oCntr, String cStr){ |
| connStr = cStr; |
| oConnector = oCntr; |
| } |
| |
| /** |
| * Run the thread. |
| */ |
| public void run(){ |
| try { |
| Thread.sleep(ConnectorImpl.iTimeout.intValue()); |
| ConnectorImpl.aState = "before connection"; |
| XConnection oConnection = oConnector.connect(connStr); |
| if (oConnection != null) { |
| ConnectorImpl.aState = "connected"; |
| oConnection.write(connStr.getBytes()); |
| oConnection.write(new byte[]{0}); |
| } else |
| ConnectorImpl.aState = "XConnection is null"; |
| } catch (ConnectionSetupException e) { |
| ConnectorImpl.aState = "ConnectionSetupException"; |
| throw new RuntimeException(e.toString()); |
| } catch (NoConnectException e) { |
| ConnectorImpl.aState = "NoConnectException"; |
| throw new RuntimeException(e.toString()); |
| } catch (Exception e) { |
| ConnectorImpl.aState = "error"; |
| throw new RuntimeException("Can't sleep exception"); |
| } |
| } |
| } |