/*************************************************************************
*
* $RCSfile: Factory.java,v $
*
* $Revision: 1.2 $
*
* last change: $Author: dbo $ $Date: 2002/09/03 07:46:51 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library 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 for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (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.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2002 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
package com.sun.star.lib.uno.helper;
import com.sun.star.uno.XComponentContext;
import com.sun.star.lang.XSingleComponentFactory;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.lang.XInitialization;
import com.sun.star.registry.XRegistryKey;
import com.sun.star.uno.UnoRuntime;
/** Factory helper class supporting com.sun.star.lang.XServiceInfo and
com.sun.star.lang.XSingleComponentFactory.
@attention
This factory implementation does not support lang.XSingleServiceFactory.
*/
public class Factory
extends ComponentBase
implements XSingleComponentFactory, XServiceInfo
{
private static final boolean DEBUG = false;
/** Creates an object factory supporting interfaces
com.sun.star.lang.XSingleComponentFactory and
com.sun.star.lang.XServiceInfo
@param impl_class
implementation class
@param supported_services
services implemented
@return
object factory
*/
public static XSingleComponentFactory createComponentFactory(
Class impl_class, String supported_services [] )
throws com.sun.star.uno.RuntimeException
{
return new Factory( impl_class, supported_services );
}
/** Writes component's implementation info to given registry key.
@param impl_name
name of implementation
@param supported_services
supported services of implementation
@param xKey
registry key to write to
@return
success
*/
public static boolean writeRegistryServiceInfo(
String impl_name, String supported_services [], XRegistryKey xKey )
{
try
{
XRegistryKey xNewKey = xKey.createKey( "/" + impl_name + "/UNO/SERVICES" );
for ( int nPos = 0; nPos < supported_services.length; ++nPos )
{
xNewKey.createKey( supported_services[ nPos ] );
}
return true;
}
catch (com.sun.star.registry.InvalidRegistryException exc)
{
if (DEBUG)
{
System.err.println(
"##### " + Factory.class.getName() + ".writeRegistryServiceInfo -- exc: " +
exc.toString() );
}
}
return false;
}
//==============================================================================================
private String m_impl_name;
private String [] m_supported_services;
private Class m_impl_class;
private java.lang.reflect.Method m_method;
private java.lang.reflect.Constructor m_ctor;
// ctor
private Factory( Class impl_class, String supported_services [] )
throws com.sun.star.uno.RuntimeException
{
m_impl_name = impl_class.getName();
m_supported_services = supported_services;
m_impl_class = impl_class;
m_method = null;
m_ctor = null;
Class params [] = new Class [] { XComponentContext.class };
try
{
// seeking for "public static Object __create( XComponentContext )"
m_method = m_impl_class.getMethod( "__create", params );
int mod = m_method.getModifiers();
if (!m_method.getReturnType().equals( Object.class ) ||
!java.lang.reflect.Modifier.isStatic( mod ) ||
!java.lang.reflect.Modifier.isPublic( mod ))
{
m_method = null;
}
}
catch (Exception exc)
{
}
if (null == m_method)
{
try
{
// ctor with context
m_ctor = m_impl_class.getConstructor( params );
}
catch (Exception exc)
{
// else take default ctor
}
}
}
//______________________________________________________________________________________________
private final Object instantiate( XComponentContext xContext )
throws com.sun.star.uno.Exception
{
try
{
if (DEBUG)
System.out.print( "instantiating " + m_impl_class.toString() + " using " );
if (null != m_method)
{
if (DEBUG)
System.out.println( "__create( XComponentContext )..." );
return m_method.invoke( null, new Object [] { xContext } );
}
if (null != m_ctor)
{
if (DEBUG)
System.out.println( "ctor( XComponentContext )..." );
return m_ctor.newInstance( new Object [] { xContext } );
}
if (DEBUG)
System.out.println( "default ctor..." );
return m_impl_class.newInstance(); // default ctor
}
catch (java.lang.reflect.InvocationTargetException exc)
{
Throwable targetException = exc.getTargetException();
if (targetException instanceof java.lang.RuntimeException)
throw (java.lang.RuntimeException)targetException;
else if (targetException instanceof com.sun.star.uno.RuntimeException)
throw (com.sun.star.uno.RuntimeException)targetException;
else if (targetException instanceof com.sun.star.uno.Exception)
throw (com.sun.star.uno.Exception)targetException;
else
throw new com.sun.star.uno.Exception( targetException.toString(), this );
}
catch (IllegalAccessException exc)
{
throw new com.sun.star.uno.RuntimeException( exc.toString(), this );
}
catch (InstantiationException exc)
{
throw new com.sun.star.uno.RuntimeException( exc.toString(), this );
}
}
// XSingleComponentFactory impl
//______________________________________________________________________________________________
public final Object createInstanceWithContext(
XComponentContext xContext )
throws com.sun.star.uno.Exception
{
return instantiate( xContext );
}
//______________________________________________________________________________________________
public final Object createInstanceWithArgumentsAndContext(
Object arguments [], XComponentContext xContext )
throws com.sun.star.uno.Exception
{
Object inst = instantiate( xContext );
XInitialization xInit = (XInitialization)UnoRuntime.queryInterface(
XInitialization.class, inst );
if (null == xInit)
{
throw new com.sun.star.lang.IllegalArgumentException(
"cannot pass arguments to component; no XInitialization implemented!", this,
(short)0 );
}
xInit.initialize( arguments );
return inst;
}
// XServiceInfo impl
//______________________________________________________________________________________________
public final String getImplementationName()
{
return m_impl_name;
}
//______________________________________________________________________________________________
public final boolean supportsService( String service_name )
{
for ( int nPos = 0; nPos < m_supported_services.length; ++nPos )
{
if (m_supported_services[ nPos ].equals( service_name ))
return true;
}
return false;
}
//______________________________________________________________________________________________
public final String [] getSupportedServiceNames()
{
return m_supported_services;
}
}