Clean up Java ServiceManager bootstrapping

...and remove the unused feature of initializing it with an obsolete
XSimpleRegistry.

Change-Id: I333dae51f67c16da3e6822ba81e4b8ca125188a5
This commit is contained in:
Stephan Bergmann 2013-04-25 13:58:29 +02:00
parent 4fa553e407
commit 57a14ea0be
2 changed files with 8 additions and 289 deletions

View file

@ -23,11 +23,11 @@ package com.sun.star.comp.helper;
import com.sun.star.bridge.UnoUrlResolver;
import com.sun.star.bridge.XUnoUrlResolver;
import com.sun.star.comp.loader.JavaLoader;
import com.sun.star.comp.servicemanager.ServiceManager;
import com.sun.star.container.XSet;
import com.sun.star.lang.XInitialization;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.lang.XSingleComponentFactory;
import com.sun.star.lib.util.NativeLibraryLoader;
import com.sun.star.loader.XImplementationLoader;
import com.sun.star.uno.UnoRuntime;
@ -98,19 +98,10 @@ public class Bootstrap {
static public XComponentContext createInitialComponentContext( Hashtable<String, Object> context_entries )
throws Exception
{
ServiceManager xSMgr = new ServiceManager();
XImplementationLoader xImpLoader = UnoRuntime.queryInterface(
XImplementationLoader.class, new JavaLoader() );
// Get the factory of the ServiceManager
XSingleComponentFactory smgr_fac = UnoRuntime.queryInterface(
XSingleComponentFactory.class, xImpLoader.activate(
"com.sun.star.comp.servicemanager.ServiceManager", null, null, null ) );
// Create an instance of the ServiceManager
XMultiComponentFactory xSMgr = UnoRuntime.queryInterface(
XMultiComponentFactory.class, smgr_fac.createInstanceWithContext( null ) );
// post init loader
XInitialization xInit = UnoRuntime.queryInterface(
XInitialization.class, xImpLoader );
Object[] args = new Object [] { xSMgr };
@ -126,16 +117,10 @@ public class Bootstrap {
// ... xxx todo: add standard entries
XComponentContext xContext = new ComponentContext( context_entries, null );
// post init smgr
xInit = UnoRuntime.queryInterface(
XInitialization.class, xSMgr );
args = new Object [] { null, xContext }; // no registry, default context
xInit.initialize( args );
xSMgr.setDefaultContext(xContext);
XSet xSet = UnoRuntime.queryInterface( XSet.class, xSMgr );
// insert the service manager
xSet.insert( smgr_fac );
// and basic jurt factories
// insert basic jurt factories
insertBasicFactories( xSet, xImpLoader );
return xContext;

View file

@ -18,7 +18,6 @@
package com.sun.star.comp.servicemanager;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collections;
@ -27,15 +26,11 @@ import com.sun.star.container.XEnumeration;
import com.sun.star.container.XSet;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XEventListener;
import com.sun.star.lang.XInitialization;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.lang.XSingleComponentFactory;
import com.sun.star.lang.XSingleServiceFactory;
import com.sun.star.loader.XImplementationLoader;
import com.sun.star.registry.XRegistryKey;
import com.sun.star.registry.XSimpleRegistry;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
@ -52,7 +47,6 @@ import com.sun.star.uno.XComponentContext;
* @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,
@ -60,8 +54,7 @@ public class ServiceManager implements XMultiServiceFactory,
XSet,
XContentEnumerationAccess,
XComponent,
XServiceInfo,
XInitialization
XServiceInfo
{
private static final boolean DEBUG = false;
@ -71,8 +64,6 @@ public class ServiceManager implements XMultiServiceFactory,
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"
@ -93,159 +84,9 @@ public class ServiceManager implements XMultiServiceFactory,
factoriesByServiceNames = new java.util.HashMap<String, ArrayList<Object>>();
m_xDefaultContext = null;
}
/**
* Creates a new instance of the <code>ServiceManager</code>.
*/
public ServiceManager( XComponentContext xContext ) {
eventListener = new ArrayList<XEventListener>();
factoriesByImplNames = new java.util.HashMap<String, Object>();
factoriesByServiceNames = new java.util.HashMap<String, ArrayList<Object>>();
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 occurred 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 ;
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.registry.XSimpleRegistry
*/
public void initialize( Object args[] )
throws com.sun.star.uno.Exception,
com.sun.star.uno.RuntimeException {
XSimpleRegistry xSimpleRegistry ;
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.");
}
public void setDefaultContext(XComponentContext context) {
m_xDefaultContext = context;
}
/**
@ -803,110 +644,3 @@ public class ServiceManager implements XMultiServiceFactory,
}
}
}
/**
* 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>
* @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 whether 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;
return getImplementationName().equals(serviceName);
}
/**
* 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 - always 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!" );
}
}