summaryrefslogtreecommitdiff
path: root/jurt/com/sun/star/comp/servicemanager/ServiceManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'jurt/com/sun/star/comp/servicemanager/ServiceManager.java')
-rw-r--r--jurt/com/sun/star/comp/servicemanager/ServiceManager.java926
1 files changed, 926 insertions, 0 deletions
diff --git a/jurt/com/sun/star/comp/servicemanager/ServiceManager.java b/jurt/com/sun/star/comp/servicemanager/ServiceManager.java
new file mode 100644
index 000000000000..3d672c6dfddf
--- /dev/null
+++ b/jurt/com/sun/star/comp/servicemanager/ServiceManager.java
@@ -0,0 +1,926 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package com.sun.star.comp.servicemanager;
+
+import com.sun.star.uno.UnoRuntime;
+import com.sun.star.uno.XComponentContext;
+
+import com.sun.star.container.XSet;
+import com.sun.star.container.XContentEnumerationAccess;
+import com.sun.star.container.XEnumeration;
+
+import com.sun.star.lang.XComponent;
+import com.sun.star.lang.XEventListener;
+import com.sun.star.lang.XInitialization;
+import com.sun.star.lang.XMultiServiceFactory;
+import com.sun.star.lang.XServiceInfo;
+import com.sun.star.lang.XSingleServiceFactory;
+import com.sun.star.lang.XSingleComponentFactory;
+import com.sun.star.lang.XMultiComponentFactory;
+
+import com.sun.star.registry.XRegistryKey;
+import com.sun.star.registry.XSimpleRegistry;
+
+import com.sun.star.loader.XImplementationLoader;
+
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * The <code>ServiceManager</code> class is an implmentation of the <code>ServiceManager</code>the central class needed for
+ * implementing or using UNO components in Java.
+ * <p>
+ * The Methods <code>queryInterface</code> and <code>isSame</code> delegate
+ * calls to the implementing objects and are used instead of casts
+ * and identity comparisons.
+ * <p>
+ * @version $Revision: 1.10 $ $ $Date: 2008-04-11 11:11:46 $
+ * @author Markus Herzog
+ * @see com.sun.star.lang.XMultiServiceFactory
+ * @see com.sun.star.container.XSet
+ * @see com.sun.star.container.XContentEnumerationAccess
+ * @see com.sun.star.lang.XComponent
+ * @see com.sun.star.lang.XServiceInfo
+ * @see com.sun.star.lang.XInitialization
+ * @since UDK1.0
+ */
+public class ServiceManager implements XMultiServiceFactory,
+ XMultiComponentFactory,
+ XSet,
+ XContentEnumerationAccess,
+ XComponent,
+ XServiceInfo,
+ XInitialization
+{
+ private static final boolean DEBUG = false;
+
+ private static final void DEBUG (String dbg) {
+ if (DEBUG) System.err.println( dbg );
+ }
+
+ private static com.sun.star.uno.Type UNO_TYPE = null;
+
+ XImplementationLoader loader = null;
+
+ static String[] supportedServiceNames = {
+ "com.sun.star.lang.MultiServiceFactory",
+ "com.sun.star.lang.ServiceManager"
+ };
+
+ java.util.Vector eventListener;
+ java.util.Hashtable factoriesByImplNames;
+ java.util.Hashtable factoriesByServiceNames; // keys:
+
+ private com.sun.star.uno.XComponentContext m_xDefaultContext;
+
+ /**
+ * Creates a new instance of the <code>ServiceManager</code>.
+ */
+ public ServiceManager() {
+ eventListener = new java.util.Vector();
+ factoriesByImplNames = new java.util.Hashtable();
+ factoriesByServiceNames = new java.util.Hashtable();
+ m_xDefaultContext = null;
+ }
+ /**
+ * Creates a new instance of the <code>ServiceManager</code>.
+ */
+ public ServiceManager( XComponentContext xContext ) {
+ eventListener = new java.util.Vector();
+ factoriesByImplNames = new java.util.Hashtable();
+ factoriesByServiceNames = new java.util.Hashtable();
+ m_xDefaultContext = xContext;
+ }
+
+ /**
+ * Returns the service factory for the <code>ServiceManager</code>. If the given implementation name
+ * does not equal to the <code>ServiceManagers</code> class name null will be returned.
+ * <p>
+ * @return the factory for the <code>ServiceManager</code>.
+ * @param implName the implementation name of the of the service.
+ * Must be equal to <code>com.sun.star.comp.servicemanager.ServicManager</code>
+ * @param multiFactory refernce of the <code>MultiServiceFactory</code>. This parameter will be ignored.
+ * @param regKey the root key of the registry. This parameter will be ignored.
+ */
+ public static XSingleServiceFactory getServiceFactory( String implName,
+ XMultiServiceFactory multiFactory,
+ XRegistryKey regKey)
+ {
+ if ( implName.equals(ServiceManager.class.getName()) )
+ return new ServiceManagerFactory();
+
+ return null;
+ }
+
+
+ /**
+ * Supplies a Java component loader. The loader component must be enlisted at the <code>ServiceManager</code> before.
+ * <p>
+ * @return a new instance of the Java component loader
+ * @see com.sun.star.loader.Java
+ */
+ private XImplementationLoader getLoader()
+ throws com.sun.star.uno.Exception,
+ com.sun.star.uno.RuntimeException
+ {
+ Object[] param = { this };
+ DEBUG("make loader");
+ Object loaderObj = createInstanceWithArgumentsAndContext(
+ "com.sun.star.loader.Java", param, m_xDefaultContext );
+
+ if (loaderObj == null)
+ throw new com.sun.star.uno.Exception("Can get an instance of com.sun.star.loader.Java");
+
+ return UnoRuntime.queryInterface( XImplementationLoader.class, loaderObj );
+ }
+
+ /**
+ * Registers a list of components given by their class names.
+ * <p>
+ * @param newImpls list of the components that should be registered, given by their class names.
+ * If any exception occured during the registration, the process will be canceled.
+ * @see com.sun.star.container.XSet
+ */
+ private void xaddFactories( String[] newImpls )
+ throws com.sun.star.uno.Exception
+ {
+ for (int i=0; i<newImpls.length; i++) {
+ DEBUG ("try to add " + newImpls[i] );
+ Object newFactory = null;
+
+ try {
+ if (loader == null)
+ loader = getLoader();
+
+ newFactory = loader.activate( newImpls[i], null, null, null );
+ }
+ catch (com.sun.star.uno.Exception e) {
+
+//****************************** BEGIN DEPRECATED ******************************************
+
+ try {
+ // try to get the class of the implementation
+ Class clazz = Class.forName( newImpls[i] );
+
+ Class[] methodClassParam = { String.class, XMultiServiceFactory.class, XRegistryKey.class };
+ java.lang.reflect.Method getFactoryMeth = null;
+ try {
+ getFactoryMeth = clazz.getMethod("__getServiceFactory", methodClassParam);
+ }
+ catch (NoSuchMethodException noSuchMethodEx) {
+ getFactoryMeth = null;
+ }
+ catch (SecurityException securityExc) {
+ getFactoryMeth = null;
+ }
+
+ if (getFactoryMeth == null)
+ getFactoryMeth = clazz.getMethod("getServiceFactory", methodClassParam);
+
+ Object[] methodParams = { newImpls[i], this, null };
+ newFactory = getFactoryMeth.invoke( clazz, methodParams );
+ }
+ catch (NoSuchMethodException ex) {}
+ catch (SecurityException ex) {}
+ catch (ClassNotFoundException ex) {}
+ catch (IllegalAccessException ex) {}
+ catch (IllegalArgumentException ex) {}
+ catch (InvocationTargetException ex) {}
+
+//****************************** END DEPRECATED ******************************************
+ }
+
+ if ( newFactory == null )
+ throw new com.sun.star.loader.CannotActivateFactoryException("Can not get factory for " + newImpls[i]);
+
+ insert( newFactory );
+ } // end of for ...
+ }
+
+ /**
+ * The method is used to add components to the <code>ServiceManager</code>. The first argument indicates a <code>SimpleRegistry</code>.
+ * The components which should be added will be searched under the <i>Implementations</i> key in the registry.
+ * <p>
+ * @param args the first argument ( args[0] ) specifices the SimpleRegistry object
+ * @see com.sun.star.lang.XInitialization
+ * @see com.sun.star.lang.RegistryServiceManager
+ * @see com.sun.star.lang.XSimpleRegistry
+ */
+ public void initialize( Object args[] )
+ throws com.sun.star.uno.Exception,
+ com.sun.star.uno.RuntimeException {
+ XSimpleRegistry xSimpleRegistry = null;
+ try {
+ xSimpleRegistry = (XSimpleRegistry) args[0];
+ if (xSimpleRegistry != null)
+ {
+ XRegistryKey rootkey = xSimpleRegistry.getRootKey();
+
+ XRegistryKey implkey_xRegistryKey = rootkey.openKey("Implementations");
+ if(implkey_xRegistryKey != null) {
+ XRegistryKey xRegistryKeys[] = implkey_xRegistryKey.openKeys();
+
+ for(int i = 0; i < xRegistryKeys.length; ++ i) {
+ xaddFactories(new String[]{xRegistryKeys[i].getStringValue()});
+ }
+ }
+ }
+
+ if (args.length > 1)
+ {
+ m_xDefaultContext = (XComponentContext)args[ 1 ];
+ }
+ }
+ catch (ArrayIndexOutOfBoundsException e)
+ {
+ throw new com.sun.star.lang.IllegalArgumentException("Argument must not be null.");
+ }
+ }
+
+ /**
+ * Creates a new instance of a specified service. Therefor the associated factory of the service is
+ * looked up and used to instanciate a new component.
+ * <p>
+ * @return newly created component
+ * @param serviceSpecifier indicates the service or component name
+ * @see com.sun.star.lang.XMultiServiceFactory
+ */
+ public java.lang.Object createInstance( String serviceSpecifier )
+ throws com.sun.star.uno.Exception,
+ com.sun.star.uno.RuntimeException
+ {
+ return createInstanceWithContext( serviceSpecifier, m_xDefaultContext );
+ }
+
+ /**
+ * Creates a new instance of a specified service with the given parameters.
+ * Therefor the associated factory of the service is looked up and used to instanciate a new component.
+ * <p>
+ * @return newly created component
+ * @param serviceSpecifier indicates the service or component name
+ * @see com.sun.star.lang.XMultiServiceFactory
+ */
+ public java.lang.Object createInstanceWithArguments(
+ String serviceSpecifier, Object[] args )
+ throws com.sun.star.uno.Exception, com.sun.star.uno.RuntimeException
+ {
+ if (DEBUG) {
+ System.err.println("createInstanceWithArguments:" );
+
+ for (int i=0; i<args.length; i++)
+ System.err.print(" "+ args[i]);
+
+ System.err.println();
+ }
+
+ return createInstanceWithArgumentsAndContext( serviceSpecifier, args, m_xDefaultContext );
+ }
+
+ /**
+ * Look up the factory for a given service or implementation name.
+ * First the requested service name is search in the list of avaible services. If it can not be found
+ * the name is looked up in the the implementation list.
+ * <p>
+ * @return the factory of the service / implementation
+ * @param serviceSpecifier indicates the service or implementation name
+ * @see com.sun.star.lang.XMultiServiceFactory
+ */
+ private Object queryServiceFactory(String serviceName)
+ throws com.sun.star.uno.Exception,
+ com.sun.star.uno.RuntimeException
+ {
+ DEBUG("queryServiceFactory for name " + serviceName );
+ Object factory = null;
+
+ if ( factoriesByServiceNames.containsKey( serviceName ) ) {
+ java.util.Vector aviableFact = (java.util.Vector) factoriesByServiceNames.get( serviceName );
+
+ DEBUG("");
+ DEBUG("aviable factories for " + serviceName +" "+ aviableFact);
+ DEBUG("");
+
+ if ( !aviableFact.isEmpty() )
+ factory = aviableFact.lastElement();
+
+ } else // not found in list of services - now try the implementations
+ factory = factoriesByImplNames.get( serviceName ); // return null if none is aviable
+
+ if (DEBUG) {
+ if (factory == null) System.err.println("service not registered");
+ else
+ System.err.println("service found:" + factory + " " + UnoRuntime.queryInterface(XSingleServiceFactory.class, factory));
+ }
+
+ if (factory == null)
+ throw new com.sun.star.uno.Exception("Query for service factory for " + serviceName + " failed.");
+
+ return factory;
+ }
+
+ /**
+ * Supplies a list of all avialable services names.
+ * <p>
+ * @return list of Strings of all service names
+ * @see com.sun.star.container.XContentEnumerationAccess
+ */
+ public String[] getAvailableServiceNames()
+ throws com.sun.star.uno.RuntimeException
+ {
+ int i = 0;
+ String[] availableServiceNames = new String[factoriesByServiceNames.size()];
+
+ java.util.Enumeration keys = factoriesByServiceNames.keys();
+
+ while (keys.hasMoreElements())
+ availableServiceNames[i++] = (String) keys.nextElement();
+
+ return availableServiceNames;
+ }
+
+ // XMultiComponentFactory implementation
+
+ /** Create a service instance with given context.
+
+ @param rServiceSpecifier service name
+ @param xContext context
+ @return service instance
+ */
+ public java.lang.Object createInstanceWithContext(
+ String rServiceSpecifier,
+ com.sun.star.uno.XComponentContext xContext )
+ throws com.sun.star.uno.Exception
+ {
+ Object fac = queryServiceFactory( rServiceSpecifier );
+ if (fac != null)
+ {
+ XSingleComponentFactory xCompFac = UnoRuntime.queryInterface(
+ XSingleComponentFactory.class, fac );
+ if (xCompFac != null)
+ {
+ return xCompFac.createInstanceWithContext( xContext );
+ }
+ else
+ {
+ XSingleServiceFactory xServiceFac = UnoRuntime.queryInterface(
+ XSingleServiceFactory.class, fac );
+ if (xServiceFac != null)
+ {
+ if (DEBUG)
+ System.err.println( "### ignoring context raising service \"" + rServiceSpecifier + "\"!" );
+ return xServiceFac.createInstance();
+ }
+ else
+ {
+ throw new com.sun.star.uno.Exception(
+ "retrieved service factory object for \"" + rServiceSpecifier +
+ "\" does not export XSingleComponentFactory nor XSingleServiceFactory!" );
+ }
+ }
+ }
+ return null;
+ }
+ /** Create a service instance with given context and arguments.
+
+ @param rServiceSpecifier service name
+ @param rArguments arguments
+ @param xContext context
+ @return service instance
+ */
+ public java.lang.Object createInstanceWithArgumentsAndContext(
+ String rServiceSpecifier,
+ java.lang.Object[] rArguments,
+ com.sun.star.uno.XComponentContext xContext )
+ throws com.sun.star.uno.Exception
+ {
+ Object fac = queryServiceFactory( rServiceSpecifier );
+ if (fac != null)
+ {
+ XSingleComponentFactory xCompFac = UnoRuntime.queryInterface(
+ XSingleComponentFactory.class, fac );
+ if (xCompFac != null)
+ {
+ return xCompFac.createInstanceWithArgumentsAndContext( rArguments, xContext );
+ }
+ else
+ {
+ XSingleServiceFactory xServiceFac = UnoRuntime.queryInterface(
+ XSingleServiceFactory.class, fac );
+ if (xServiceFac != null)
+ {
+ if (DEBUG)
+ System.err.println( "### ignoring context raising service \"" + rServiceSpecifier + "\"!" );
+ return xServiceFac.createInstanceWithArguments( rArguments );
+ }
+ else
+ {
+ throw new com.sun.star.uno.Exception(
+ "retrieved service factory object for \"" + rServiceSpecifier +
+ "\" does not export XSingleComponentFactory nor XSingleServiceFactory!" );
+ }
+ }
+ }
+ return null;
+ }
+// public String[] getAvailableServiceNames();
+
+ /**
+ * Removes all listeners from the <code>ServiceManager</code> and clears the list of the services.
+ * <p>
+ * @see com.sun.star.lang.XComponent
+ */
+ public void dispose()
+ throws com.sun.star.uno.RuntimeException
+ {
+ if (eventListener != null) {
+ java.util.Enumeration enumer = eventListener.elements();
+
+ while (enumer.hasMoreElements()) {
+ XEventListener listener = (XEventListener) enumer.nextElement();
+ listener.disposing(new com.sun.star.lang.EventObject(this));
+ }
+ }
+
+ eventListener.removeAllElements();
+ factoriesByServiceNames.clear();
+ factoriesByImplNames.clear();
+ }
+
+ /**
+ * Adds a new <code>EventListener</code>. The listener is notified when a
+ * service is added (removed) to (from) the <code>ServiceManager</code>.
+ * If the listener is already registred a
+ * <code>com.sun.star.uno.RuntimeException</code> will be thrown.
+ * <p>
+ * @param xListener the new listener which should been added.
+ * @see com.sun.star.lang.XComponent
+ */
+ public void addEventListener( XEventListener xListener )
+ throws com.sun.star.uno.RuntimeException
+ {
+ if (xListener == null)
+ throw new com.sun.star.uno.RuntimeException("Listener must not be null");
+
+ if ( eventListener.contains(xListener) )
+ throw new com.sun.star.uno.RuntimeException("Listener already registred.");
+
+ eventListener.addElement(xListener);
+ }
+
+ /**
+ * Removes a <code>EventListener</code> from the <code>ServiceManager</code>.
+ * If the listener is not registered a <code>com.sun.star.uno.RuntimeException</code>
+ * will be thrown.
+ * <p>
+ * @param xListener the new listener which should been removed.
+ * @see com.sun.star.lang.XComponent
+ */
+ public void removeEventListener( XEventListener xListener )
+ throws com.sun.star.uno.RuntimeException
+ {
+ if (xListener == null)
+ throw new com.sun.star.uno.RuntimeException("Listener must not be null");
+
+ if ( !eventListener.contains(xListener) )
+ throw new com.sun.star.uno.RuntimeException("Listener is not registered.");
+
+ eventListener.removeElement(xListener);
+ }
+
+ /**
+ * Checks if a component is registered at the <code>ServiceManager</code>. The given object argument must
+ * provide a <code>XServiceInfo</code> interface.
+ * <p>
+ * @return true if the component is registred otherwise false.
+ * @param object object which provides a <code>XServiceInfo</code> interface.
+ * @see com.sun.star.container.XSet
+ * @see com.sun.star.lang.XServiceInfo
+ */
+ public boolean has( Object object )
+ throws com.sun.star.uno.RuntimeException
+ {
+ if (object == null)
+ throw new com.sun.star.uno.RuntimeException("The parameter must not been null");
+
+ XServiceInfo xServiceInfo = UnoRuntime.queryInterface(XServiceInfo.class, object);
+
+ if (xServiceInfo != null) {
+ return UnoRuntime.areSame(factoriesByImplNames.get(xServiceInfo.getImplementationName()), object);
+ }
+
+ return false;
+ }
+
+ /**
+ * Adds a <code>SingleServiceFactory</code> to the <code>ServiceManager</code>.
+ * <p>
+ * @param object factory which should be added.
+ * @see com.sun.star.container.XSet
+ * @see com.sun.star.lang.XSingleServiceFactory
+ */
+ public void insert( Object object )
+ throws com.sun.star.lang.IllegalArgumentException,
+ com.sun.star.container.ElementExistException,
+ com.sun.star.uno.RuntimeException
+ {
+ if (object == null) throw new com.sun.star.lang.IllegalArgumentException();
+
+ XServiceInfo xServiceInfo =
+ UnoRuntime.queryInterface(XServiceInfo.class, object);
+
+ if (xServiceInfo == null)
+ throw new com.sun.star.lang.IllegalArgumentException(
+ "The given object does not implement the XServiceInfo interface."
+ );
+
+ if ( factoriesByImplNames.containsKey( xServiceInfo.getImplementationName() ) ) {
+ throw new com.sun.star.container.ElementExistException(
+ xServiceInfo.getImplementationName() + " already registred"
+ );
+ }
+
+ DEBUG("add factory " + object.toString() + " for " + xServiceInfo.getImplementationName());
+ factoriesByImplNames.put( xServiceInfo.getImplementationName(), object );
+
+
+ String[] serviceNames = xServiceInfo.getSupportedServiceNames();
+ java.util.Vector vec = null;
+
+ for (int i=0; i<serviceNames.length; i++) {
+ if ( !factoriesByServiceNames.containsKey( serviceNames[i] ) ) {
+ DEBUG("> no registered services found under " + serviceNames[i] + ": adding..." );
+ factoriesByServiceNames.put(serviceNames[i], new java.util.Vector());
+ }
+
+ vec = (java.util.Vector) factoriesByServiceNames.get( serviceNames[i] );
+
+ if ( vec.contains( object ) )
+ System.err.println("The implementation " + xServiceInfo.getImplementationName() +
+ " already registered for the service " + serviceNames[i] + " - ignoring!");
+ else
+ vec.addElement(object);
+ }
+ }
+
+ /**
+ * Removes a <code>SingleServiceFactory</code> from the <code>ServiceManager</code>.
+ * <p>
+ * @param object factory which should be removed.
+ * @see com.sun.star.container.XSet
+ * @see com.sun.star.lang.XSingleServiceFactory
+ */
+ public void remove( Object object )
+ throws com.sun.star.lang.IllegalArgumentException,
+ com.sun.star.container.NoSuchElementException,
+ com.sun.star.uno.RuntimeException
+ {
+ if (object == null)
+ throw new com.sun.star.lang.IllegalArgumentException(
+ "The given object must not be null."
+ );
+
+ XServiceInfo xServiceInfo =
+ UnoRuntime.queryInterface(XServiceInfo.class, object);
+
+ if (xServiceInfo == null)
+ throw new com.sun.star.lang.IllegalArgumentException(
+ "The given object does not implement the XServiceInfo interface."
+ );
+
+ XSingleServiceFactory xSingleServiceFactory =
+ UnoRuntime.queryInterface(XSingleServiceFactory.class, object);
+
+ if (xSingleServiceFactory == null)
+ throw new com.sun.star.lang.IllegalArgumentException(
+ "The given object does not implement the XSingleServiceFactory interface."
+ );
+
+ if ( factoriesByImplNames.remove( xServiceInfo.getImplementationName() ) == null )
+ throw new com.sun.star.container.NoSuchElementException(
+ xServiceInfo.getImplementationName() +
+ " is not registered as an implementation."
+ );
+
+ String[] serviceNames = xServiceInfo.getSupportedServiceNames();
+
+ for ( int i=0; i<serviceNames.length; i++ ) {
+ if ( factoriesByServiceNames.containsKey( serviceNames[i] ) ) {
+ java.util.Vector vec = (java.util.Vector) factoriesByServiceNames.get(serviceNames[i]);
+
+ if ( !vec.removeElement(object) )
+ System.err.println("The implementation " + xServiceInfo.getImplementationName() +
+ " is not registered for the service " + serviceNames[i] + " - ignoring!");
+
+ if ( vec.isEmpty() ) // remove the vector if no implementations aviable for the service
+ factoriesByServiceNames.remove( serviceNames[i] );
+ }
+ }
+ }
+
+ /**
+ * Provides an enumeration of all registred services.
+ * <p>
+ * @return an enumeration of all avialable services.
+ * @see com.sun.star.conatiner.XEnumerationAccess
+ */
+ public XEnumeration createEnumeration()
+ throws com.sun.star.uno.RuntimeException
+ {
+ return new ServiceEnumerationImpl( factoriesByImplNames.elements() );
+ }
+
+ /**
+ * Provides the UNO type of the <code>ServiceManager</code>
+ * <p>
+ * @return the UNO type of the <code>ServiceManager</code>.
+ * @see com.sun.star.container.XElementAccess
+ * @see com.sun.star.uno.TypeClass
+ */
+ public com.sun.star.uno.Type getElementType()
+ throws com.sun.star.uno.RuntimeException
+ {
+ if ( UNO_TYPE == null )
+ UNO_TYPE = new com.sun.star.uno.Type(ServiceManager.class);
+
+ return UNO_TYPE;
+ }
+
+ /**
+ * Checks if the any componets are registered.
+ * <p>
+ * @return true - if the list of the registred components is not empty - otherwise false.
+ * @see com.sun.star.container.XElementAccess
+ */
+ public boolean hasElements() {
+ return ! factoriesByImplNames.isEmpty();
+ }
+
+ /**
+ * Provides an enumeration of of all factorys for a specified service.
+ * <p>
+ * @return an enumeration for service name.
+ * @param serviceName name of the requested service
+ * @see com.sun.star.container.XContentEnumerationAccess
+ */
+ public XEnumeration createContentEnumeration( String serviceName )
+ throws com.sun.star.uno.RuntimeException
+ {
+ XEnumeration enumer = null;
+
+ java.util.Vector serviceList = (java.util.Vector) factoriesByServiceNames.get(serviceName);
+
+ if (serviceList != null)
+ enumer = new ServiceEnumerationImpl( serviceList.elements() );
+ else
+ enumer = new ServiceEnumerationImpl();
+
+ return enumer;
+ }
+
+ /**
+ * Returns the implementation name of the <code>ServiceManager</code> component.
+ * <p>
+ * @return the class name of the <code>ServiceManager</code>.
+ * @see com.sun.star.lang.XServiceInfo
+ */
+ public String getImplementationName()
+ throws com.sun.star.uno.RuntimeException
+ {
+ return getClass().getName();
+ }
+
+ /**
+ * Checks if the <code>ServiceManager</code> supports a service.
+ * <p>
+ * @return true if the service is supported - otherwise false.
+ * @param serviceName service name which should be checked.
+ * @see com.sun.star.lang.XServiceInfo
+ */
+ public boolean supportsService( String serviceName )
+ throws com.sun.star.uno.RuntimeException
+ {
+ for (int i=0; i<supportedServiceNames.length; i++)
+ if (supportedServiceNames[i].equals( serviceName )) return true;
+
+ if (getImplementationName().equals( serviceName )) return true;
+
+ return false;
+ }
+
+ /**
+ * Supplies list of all supported services.
+ * <p>
+ * @return a list of all supported service names.
+ * @see com.sun.star.lang.XServiceInfo
+ */
+ public String[] getSupportedServiceNames()
+ throws com.sun.star.uno.RuntimeException
+ {
+ return supportedServiceNames;
+ }
+
+ /**
+ * The <code>ServiceEnumerationImpl</code> class provides an
+ * implementation of the @see com.sun.star.container.XEnumeration interface.
+ * It is a inner wrapper for a java.util.Enumeration object.
+ * <p>
+ * @version $Revision: 1.10 $ $ $Date: 2008-04-11 11:11:46 $
+ * @author Markus Herzog
+ * @see com.sun.star.lang.XSingleServiceFactory
+ * @see com.sun.star.lang.XServiceInfo
+ * @since UDK1.0
+ */
+ class ServiceEnumerationImpl implements XEnumeration {
+ java.util.Enumeration enumeration = null;
+
+ /**
+ * Constructs a new empty instance.
+ */
+ public ServiceEnumerationImpl() {
+ }
+
+ /**
+ * Constructs a new instance with a given enumeration.
+ * <p>
+ * @param enumer is the enumeration which should been wrapped.
+ * @see com.sun.star.container.XEnumeration
+ */
+ public ServiceEnumerationImpl(java.util.Enumeration enumer) {
+ enumeration = enumer;
+ }
+
+ /**
+ * Checks if the enumeration contains more elements.
+ * <p>
+ * @return true if more elements are available - otherwise false.
+ * @see com.sun.star.container.XEnumeration
+ */
+ public boolean hasMoreElements()
+ throws com.sun.star.uno.RuntimeException
+ {
+ if (enumeration != null)
+ return enumeration.hasMoreElements();
+
+ return false;
+ }
+
+ /**
+ * Returns the next element of the enumeration. If no further elements
+ * available a com.sun.star.container.NoSuchElementException exception will be thrown.
+ * <p>
+ * @return the next element.
+ * @see com.sun.star.container.XEnumeration
+ */
+ public Object nextElement()
+ throws com.sun.star.container.NoSuchElementException,
+ com.sun.star.lang.WrappedTargetException,
+ com.sun.star.uno.RuntimeException
+ {
+ if (enumeration == null)
+ throw new com.sun.star.container.NoSuchElementException();
+
+ try {
+ return enumeration.nextElement();
+ } catch (java.util.NoSuchElementException e) {
+ com.sun.star.container.NoSuchElementException ex =
+ new com.sun.star.container.NoSuchElementException();
+ ex.fillInStackTrace();
+
+ throw ex;
+ }
+ }
+ }
+}
+/**
+ * The <code>ServiceManagerFactory</code> is the factory class for the
+ * <code>ServiceManager</code>. As all factories it implments the
+ * com.sun.star.lang.XSingleServiceFactory and the com.sun.star.lang.XServiceInfo
+ * interfaces.
+ * <p>
+ * @version $Revision: 1.10 $ $ $Date: 2008-04-11 11:11:46 $
+ * @author Markus Herzog
+ * @see com.sun.star.lang.XSingleServiceFactory
+ * @see com.sun.star.lang.XServiceInfo
+ * @since UDK1.0
+*/
+class ServiceManagerFactory implements XServiceInfo, XSingleComponentFactory, XSingleServiceFactory
+{
+ /**
+ * Creates a new instance of the <code>ServiceManagerFactory</code>.
+ */
+ public ServiceManagerFactory() {
+ }
+
+ /**
+ * Supplies the implementation name of the <code>ServiceManager</code>.
+ * <p>
+ * @return <code>ServiceManager</code> class name.
+ * @see com.sun.star.lang.XServiceInfo
+ */
+ public String getImplementationName()
+ throws com.sun.star.uno.RuntimeException
+ {
+ return ServiceManager.class.getName();
+ }
+
+ /**
+ * Checks wether or not a service is supported.
+ * <p>
+ * @return true - if the service is supported, otherwise false.
+ * @param serviceName the name of the service that should be checked.
+ * @see com.sun.star.lang.XServiceInfo
+ */
+ public boolean supportsService( String serviceName )
+ throws com.sun.star.uno.RuntimeException
+ {
+ for ( int i=0; i<ServiceManager.supportedServiceNames.length; i++ )
+ if ( ServiceManager.supportedServiceNames[i].equals(serviceName) ) return true;
+
+ if ( getImplementationName().equals(serviceName) ) return true;
+
+ return false;
+ }
+
+ /**
+ * Returns all service names which are supported by <code>ServiceManager</code>.
+ * <p>
+ * @return a list aof all supported service names.
+ * @see com.sun.star.lang.XServiceInfo
+ */
+ public String[] getSupportedServiceNames()
+ throws com.sun.star.uno.RuntimeException
+ {
+ return ServiceManager.supportedServiceNames;
+ }
+
+ /**
+ * Creates a new instance of the <code>ServiceManager</code>.
+ * <p>
+ * @return newly created <code>ServiceManager</code> object.
+ * @see com.sun.star.lang.XSingleServiceFactory
+ */
+ public java.lang.Object createInstance()
+ throws com.sun.star.uno.Exception,
+ com.sun.star.uno.RuntimeException
+ {
+ return new ServiceManager();
+ }
+
+ /**
+ * Creates a new instance of the <code>ServiceManager</code> with arguments.
+ * At this time it always throws a com.sun.star.lang.NoSuchMethodException
+ * because there is no the <code>ServiceManager</code> has no constructor with
+ * arguments.
+ * <p>
+ * @return null - allways throws an exception
+ * @param aArguments arguments for new instance.
+ * @see com.sun.star.lang.XSingleServiceFactory
+ */
+ public java.lang.Object createInstanceWithArguments( java.lang.Object[] aArguments )
+ throws com.sun.star.uno.Exception,
+ com.sun.star.uno.RuntimeException
+ {
+ throw new com.sun.star.lang.NoSuchMethodException("Constructor with arguments is not supported.");
+ }
+
+ // XSingleComponentFactory impl
+ //______________________________________________________________________________________________
+ public Object createInstanceWithContext( XComponentContext xContext )
+ throws com.sun.star.uno.Exception, com.sun.star.uno.RuntimeException
+ {
+ return new ServiceManager( xContext );
+ }
+ //______________________________________________________________________________________________
+ public Object createInstanceWithArgumentsAndContext(
+ Object aArguments [], XComponentContext xContext )
+ throws com.sun.star.uno.Exception, com.sun.star.uno.RuntimeException
+ {
+ throw new com.sun.star.lang.NoSuchMethodException(
+ "ServiceManagerFactory.createInstanceWithArgumentsAndContext() not impl!" );
+ }
+}
+
+