Package com.sun.star.comp.bridgefactory

Source Code of com.sun.star.comp.bridgefactory.BridgeFactory$UniqueToken

/**************************************************************
*
* 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 com.sun.star.comp.bridgefactory;

import java.math.BigInteger;
import java.util.Vector;


import com.sun.star.bridge.BridgeExistsException;
import com.sun.star.bridge.XBridge;
import com.sun.star.bridge.XBridgeFactory;
import com.sun.star.bridge.XInstanceProvider;

import com.sun.star.comp.loader.FactoryHelper;

import com.sun.star.connection.XConnection;

import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XSingleServiceFactory;

import com.sun.star.registry.XRegistryKey;

import com.sun.star.uno.IBridge;
import com.sun.star.uno.UnoRuntime;


/**
* The BridgeFactory class implements the <code>XBridgeFactory</code> Interface.
* It wrapps the <code>UnoRuntime#getBridgeByName</code>method and delivers a
* XBridge component.
* <p>
* This component is only usable for remote bridges.
* <p>
* @version   $Revision: 1.11 $ $ $Date: 2008-04-11 11:07:51 $
* @author       Kay Ramme
* @see         com.sun.star.uno.UnoRuntime
* @since       UDK1.0
*/
public class BridgeFactory implements XBridgeFactory/*, XEventListener*/ {
  static private final boolean DEBUG = false;

  /**
   * The name of the service, the <code>JavaLoader</code> acceses this through reflection.
   */
  public final static String __serviceName = "com.sun.star.bridge.BridgeFactory";

  /**
   * Gives a factory for creating the service.
   * This method is called by the <code>JavaLoader</code>
   * <p>
   * @return  returns a <code>XSingleServiceFactory</code> for creating the component
   * @param   implName     the name of the implementation for which a service is desired
   * @param   multiFactory the service manager to be uses if needed
   * @param   regKey       the registryKey
   * @see                  com.sun.star.comp.loader.JavaLoader
   */
  public static XSingleServiceFactory __getServiceFactory(String implName,
                              XMultiServiceFactory multiFactory,
                              XRegistryKey regKey)
  {
    XSingleServiceFactory xSingleServiceFactory = null;

      if (implName.equals(BridgeFactory.class.getName()) )
          xSingleServiceFactory = FactoryHelper.getServiceFactory(BridgeFactory.class,
                                  multiFactory,
                                  regKey);
     
      return xSingleServiceFactory;
  }

  /**
   * Creates a remote bridge and memorizes it under <code>sName</code>.
   * <p>
   * @return   the bridge
   * @param    sName                the name to memorize the bridge
   * @param    sProtocol            the protocol the bridge should use
   * @param    anInstanceProvider   the instance provider
   * @see                           com.sun.star.bridge.XBridgeFactory
   */
    public XBridge createBridge(String sName, String sProtocol, XConnection aConnection, XInstanceProvider anInstanceProvider) throws
    BridgeExistsException,
    com.sun.star.lang.IllegalArgumentException,
    com.sun.star.uno.RuntimeException
    {
        boolean hasName = sName.length() != 0;
        Object context = hasName ? sName : new UniqueToken();
            // UnoRuntime.getBridgeByName internally uses context.toString() to
            // distinguish bridges, so the result of
            // new UniqueToken().toString() might clash with an explicit
            // sName.toString(), but the UnoRuntime bridge management is
            // obsolete anyway and should be removed

    // do not create a new bridge, if one already exists
        if (hasName) {
            IBridge iBridges[] = UnoRuntime.getBridges();
            for(int i = 0; i < iBridges.length; ++ i) {
                XBridge xBridge = UnoRuntime.queryInterface(XBridge.class, iBridges[i]);

                if(xBridge != null) {
                    if(xBridge.getName().equals(sName))
                        throw new BridgeExistsException(sName + " already exists");
                }
            }
        }

    XBridge xBridge;

    try {
      IBridge iBridge = UnoRuntime.getBridgeByName("java", context, "remote", context, hasName ? new Object[]{sProtocol, aConnection, anInstanceProvider, sName} : new Object[]{sProtocol, aConnection, anInstanceProvider});

      xBridge = UnoRuntime.queryInterface(XBridge.class, iBridge);
    }
    catch(Exception exception) {
      throw new com.sun.star.lang.IllegalArgumentException(exception.getMessage());
    }

    if(DEBUG) System.err.println("##### " + getClass().getName() + ".createBridge:" + sName + " " + sProtocol + " " + aConnection + " "  + anInstanceProvider + " " + xBridge);

    return xBridge;
  }

  /**
   * Gets a remote bridge which must already exist.
   * <p>
   * @return   the bridge
   * @param    sName                the name of the bridge
   * @see                           com.sun.star.bridge.XBridgeFactory
   */
    public XBridge getBridge(String sName) throws com.sun.star.uno.RuntimeException {
    XBridge xBridge = null;

    IBridge iBridges[] = UnoRuntime.getBridges();
    for(int i = 0; i < iBridges.length; ++ i) {
      xBridge = UnoRuntime.queryInterface(XBridge.class, iBridges[i]);

      if(xBridge != null) {
        if(xBridge.getName().equals(sName))
          break;
         
        else
          xBridge = null;
      }
    }

   
    if(DEBUG) System.err.println("##### " + getClass().getName() + ".getBridge:" + sName + " " + xBridge);

    return xBridge;
  }

  /**
   * Gives all created bridges
   * <p>
   * @return   the bridges
   * @see                           com.sun.star.bridge.XBridgeFactory
   */
    public synchronized XBridge[] getExistingBridges() throws com.sun.star.uno.RuntimeException {
    Vector vector = new Vector();

    IBridge iBridges[] = UnoRuntime.getBridges();
    for(int i = 0; i < iBridges.length; ++ i) {
      XBridge xBridge = UnoRuntime.queryInterface(XBridge.class, iBridges[i]);

      if(xBridge != null)
        vector.addElement(xBridge);
    }

    XBridge xBridges[]= new XBridge[vector.size()];
    for(int i = 0; i < vector.size(); ++ i)
      xBridges[i] = (XBridge)vector.elementAt(i);

    return xBridges;
  }

    private static final class UniqueToken {
        public UniqueToken() {
            synchronized (UniqueToken.class) {
                token = counter.toString();
                counter = counter.add(BigInteger.ONE);
            }
        }

        public String toString() {
            return token;
        }

        private final String token;
        private static BigInteger counter = BigInteger.ZERO;
    }
}
TOP

Related Classes of com.sun.star.comp.bridgefactory.BridgeFactory$UniqueToken

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.