diff options
Diffstat (limited to 'javaunohelper')
60 files changed, 13014 insertions, 0 deletions
diff --git a/javaunohelper/com/sun/star/comp/JavaUNOHelperServices.java b/javaunohelper/com/sun/star/comp/JavaUNOHelperServices.java new file mode 100644 index 000000000000..8628927adb69 --- /dev/null +++ b/javaunohelper/com/sun/star/comp/JavaUNOHelperServices.java @@ -0,0 +1,84 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: JavaUNOHelperServices.java,v $ + * $Revision: 1.4 $ + * + * 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; + +import com.sun.star.lib.uno.helper.Factory; +import com.sun.star.lang.XSingleComponentFactory; +import com.sun.star.registry.XRegistryKey; +import com.sun.star.comp.juhtest.SmoketestCommandEnvironment; + + +/** This class is the registration class for all services in this module. + * + * Note that not all files which can be used as service need to be registered + * by this class. + */ +public class JavaUNOHelperServices { + + static private final String __service_smoketestCommandEnv = + "com.sun.star.deployment.test.SmoketestCommandEnvironment"; + + /** + * Gives a factory for creating the service. + * This method is called by the <code>JavaLoader</code> + * <p> + * @return returns a <code>XSingleComponentFactory</code> for creating + * the component + * @param sImplName the name of the implementation for which a + * service is desired + * @see com.sun.star.comp.loader.JavaLoader + */ + public static XSingleComponentFactory __getComponentFactory(String sImplName) + { + XSingleComponentFactory xFactory = null; + + if ( sImplName.equals( SmoketestCommandEnvironment.class.getName() ) ) + xFactory = Factory.createComponentFactory(SmoketestCommandEnvironment.class, + SmoketestCommandEnvironment.getServiceNames()); + + return xFactory; + } + + /** + * Writes the service information into the given registry key. + * This method is called by the <code>JavaLoader</code> + * <p> + * @return returns true if the operation succeeded + * @param regKey the registryKey + * @see com.sun.star.comp.loader.JavaLoader + */ + public static boolean __writeRegistryServiceInfo(XRegistryKey regKey) { + return Factory.writeRegistryServiceInfo(SmoketestCommandEnvironment.class.getName(), + SmoketestCommandEnvironment.getServiceNames(), + regKey); + } +} + + diff --git a/javaunohelper/com/sun/star/comp/helper/Bootstrap.java b/javaunohelper/com/sun/star/comp/helper/Bootstrap.java new file mode 100644 index 000000000000..d80b8a6b9df0 --- /dev/null +++ b/javaunohelper/com/sun/star/comp/helper/Bootstrap.java @@ -0,0 +1,332 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: Bootstrap.java,v $ + * $Revision: 1.17 $ + * + * 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.helper; + +import com.sun.star.bridge.UnoUrlResolver; +import com.sun.star.bridge.XUnoUrlResolver; +import com.sun.star.comp.loader.JavaLoader; +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; +import com.sun.star.uno.XComponentContext; + +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintStream; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Random; + +/** Bootstrap offers functionality to obtain a context or simply + a service manager. + The service manager can create a few basic services, whose implementations are: + <ul> + <li>com.sun.star.comp.loader.JavaLoader</li> + <li>com.sun.star.comp.urlresolver.UrlResolver</li> + <li>com.sun.star.comp.bridgefactory.BridgeFactory</li> + <li>com.sun.star.comp.connections.Connector</li> + <li>com.sun.star.comp.connections.Acceptor</li> + <li>com.sun.star.comp.servicemanager.ServiceManager</li> + </ul> + + Other services can be inserted into the service manager by + using its XSet interface: + <pre> + XSet xSet = UnoRuntime.queryInterface( XSet.class, aMultiComponentFactory ); + // insert the service manager + xSet.insert( aSingleComponentFactory ); + </pre> +*/ +public class Bootstrap { + + private static void insertBasicFactories( + XSet xSet, XImplementationLoader xImpLoader ) + throws Exception + { + // insert the factory of the loader + xSet.insert( xImpLoader.activate( + "com.sun.star.comp.loader.JavaLoader", null, null, null ) ); + + // insert the factory of the URLResolver + xSet.insert( xImpLoader.activate( + "com.sun.star.comp.urlresolver.UrlResolver", null, null, null ) ); + + // insert the bridgefactory + xSet.insert( xImpLoader.activate( + "com.sun.star.comp.bridgefactory.BridgeFactory", null, null, null ) ); + + // insert the connector + xSet.insert( xImpLoader.activate( + "com.sun.star.comp.connections.Connector", null, null, null ) ); + + // insert the acceptor + xSet.insert( xImpLoader.activate( + "com.sun.star.comp.connections.Acceptor", null, null, null ) ); + } + + /** Bootstraps an initial component context with service manager and basic + jurt components inserted. + @param context_entries the hash table contains mappings of entry names (type string) to + context entries (type class ComponentContextEntry). + @return a new context. + */ + static public XComponentContext createInitialComponentContext( Hashtable context_entries ) + throws Exception + { + 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 }; + xInit.initialize( args ); + + // initial component context + if (context_entries == null) + context_entries = new Hashtable( 1 ); + // add smgr + context_entries.put( + "/singletons/com.sun.star.lang.theServiceManager", + new ComponentContextEntry( null, xSMgr ) ); + // ... 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 ); + + XSet xSet = UnoRuntime.queryInterface( XSet.class, xSMgr ); + // insert the service manager + xSet.insert( smgr_fac ); + // and basic jurt factories + insertBasicFactories( xSet, xImpLoader ); + + return xContext; + } + + /** + * Bootstraps a servicemanager with the jurt base components registered. + * <p> + * @return a freshly boostrapped service manager + * @see com.sun.star.lang.ServiceManager + */ + static public XMultiServiceFactory createSimpleServiceManager() throws Exception + { + return UnoRuntime.queryInterface( + XMultiServiceFactory.class, createInitialComponentContext( null ).getServiceManager() ); + } + + + /** Bootstraps the initial component context from a native UNO installation. + + @see cppuhelper/defaultBootstrap_InitialComponentContext() + */ + static public final XComponentContext defaultBootstrap_InitialComponentContext() + throws Exception + { + return defaultBootstrap_InitialComponentContext( null, null ); + } + /** Bootstraps the initial component context from a native UNO installation. + + @param ini_file + ini_file (may be null: uno.rc besides cppuhelper lib) + @param bootstrap_parameters + bootstrap parameters (maybe null) + + @see cppuhelper/defaultBootstrap_InitialComponentContext() + */ + static public final XComponentContext defaultBootstrap_InitialComponentContext( + String ini_file, Hashtable bootstrap_parameters ) + throws Exception + { + // jni convenience: easier to iterate over array than calling Hashtable + String pairs [] = null; + if (null != bootstrap_parameters) + { + pairs = new String [ 2 * bootstrap_parameters.size() ]; + Enumeration keys = bootstrap_parameters.keys(); + int n = 0; + while (keys.hasMoreElements()) + { + String name = (String)keys.nextElement(); + pairs[ n++ ] = name; + pairs[ n++ ] = (String)bootstrap_parameters.get( name ); + } + } + + if (! m_loaded_juh) + { + NativeLibraryLoader.loadLibrary( Bootstrap.class.getClassLoader(), "juh" ); + m_loaded_juh = true; + } + return UnoRuntime.queryInterface( + XComponentContext.class, + cppuhelper_bootstrap( + ini_file, pairs, Bootstrap.class.getClassLoader() ) ); + } + + static private boolean m_loaded_juh = false; + static private native Object cppuhelper_bootstrap( + String ini_file, String bootstrap_parameters [], ClassLoader loader ) + throws Exception; + + /** + * Bootstraps the component context from a UNO installation. + * + * @return a bootstrapped component context. + * + * @since UDK 3.1.0 + */ + public static final XComponentContext bootstrap() + throws BootstrapException { + + XComponentContext xContext = null; + + try { + // create default local component context + XComponentContext xLocalContext = + createInitialComponentContext( null ); + if ( xLocalContext == null ) + throw new BootstrapException( "no local component context!" ); + + // find office executable relative to this class's class loader + String sOffice = + System.getProperty( "os.name" ).startsWith( "Windows" ) ? + "soffice.exe" : "soffice"; + File fOffice = NativeLibraryLoader.getResource( + Bootstrap.class.getClassLoader(), sOffice ); + if ( fOffice == null ) + throw new BootstrapException( "no office executable found!" ); + + // create random pipe name + String sPipeName = "uno" + + Long.toString( (new Random()).nextLong() & 0x7fffffffffffffffL ); + + // create call with arguments + String[] cmdArray = new String[7]; + cmdArray[0] = fOffice.getPath(); + cmdArray[1] = "-nologo"; + cmdArray[2] = "-nodefault"; + cmdArray[3] = "-norestore"; + cmdArray[4] = "-nocrashreport"; + cmdArray[5] = "-nolockcheck"; + cmdArray[6] = "-accept=pipe,name=" + sPipeName + ";urp;"; + + // start office process + Process p = Runtime.getRuntime().exec( cmdArray ); + pipe( p.getInputStream(), System.out, "CO> " ); + pipe( p.getErrorStream(), System.err, "CE> " ); + + // initial service manager + XMultiComponentFactory xLocalServiceManager = + xLocalContext.getServiceManager(); + if ( xLocalServiceManager == null ) + throw new BootstrapException( "no initial service manager!" ); + + // create a URL resolver + XUnoUrlResolver xUrlResolver = + UnoUrlResolver.create( xLocalContext ); + + // connection string + String sConnect = "uno:pipe,name=" + sPipeName + + ";urp;StarOffice.ComponentContext"; + + // wait until office is started + for (int i = 0;; ++i) { + try { + // try to connect to office + Object context = xUrlResolver.resolve( sConnect ); + xContext = UnoRuntime.queryInterface( + XComponentContext.class, context); + if ( xContext == null ) + throw new BootstrapException( "no component context!" ); + break; + } catch ( com.sun.star.connection.NoConnectException ex ) { + // Wait 500 ms, then try to connect again, but do not wait + // longer than 5 min (= 600 * 500 ms) total: + if (i == 600) { + throw new BootstrapException(ex.toString()); + } + Thread.currentThread().sleep( 500 ); + } + } + } catch ( BootstrapException e ) { + throw e; + } catch ( java.lang.RuntimeException e ) { + throw e; + } catch ( java.lang.Exception e ) { + throw new BootstrapException( e ); + } + + return xContext; + } + + private static void pipe( + final InputStream in, final PrintStream out, final String prefix ) { + + new Thread( "Pipe: " + prefix) { + public void run() { + BufferedReader r = new BufferedReader( + new InputStreamReader( in ) ); + try { + for ( ; ; ) { + String s = r.readLine(); + if ( s == null ) { + break; + } + out.println( prefix + s ); + } + } catch ( java.io.IOException e ) { + e.printStackTrace( System.err ); + } + } + }.start(); + } +} diff --git a/javaunohelper/com/sun/star/comp/helper/BootstrapException.java b/javaunohelper/com/sun/star/comp/helper/BootstrapException.java new file mode 100644 index 000000000000..b639373646b2 --- /dev/null +++ b/javaunohelper/com/sun/star/comp/helper/BootstrapException.java @@ -0,0 +1,94 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: BootstrapException.java,v $ + * $Revision: 1.5 $ + * + * 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.helper; + +/** + * BootstrapException is a checked exception that wraps an exception + * thrown by the original target. + * + * @since UDK 3.1.0 + */ +public class BootstrapException extends java.lang.Exception { + + /** + * This field holds the target exception. + */ + private Exception m_target = null; + + /** + * Constructs a <code>BootstrapException</code> with <code>null</code> as + * the target exception. + */ + public BootstrapException() { + super(); + } + + /** + * Constructs a <code>BootstrapException</code> with the specified + * detail message. + * + * @param message the detail message + */ + public BootstrapException( String message ) { + super( message ); + } + + /** + * Constructs a <code>BootstrapException</code> with the specified + * detail message and a target exception. + * + * @param message the detail message + * @param target the target exception + */ + public BootstrapException( String message, Exception target ) { + super( message ); + m_target = target; + } + + /** + * Constructs a <code>BootstrapException</code> with a target exception. + * + * @param target the target exception + */ + public BootstrapException( Exception target ) { + super(); + m_target = target; + } + + /** + * Get the thrown target exception. + * + * @return the target exception + */ + public Exception getTargetException() { + return m_target; + } +} diff --git a/javaunohelper/com/sun/star/comp/helper/ComponentContext.java b/javaunohelper/com/sun/star/comp/helper/ComponentContext.java new file mode 100644 index 000000000000..1c3df0d4844b --- /dev/null +++ b/javaunohelper/com/sun/star/comp/helper/ComponentContext.java @@ -0,0 +1,313 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ComponentContext.java,v $ + * $Revision: 1.8 $ + * + * 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.helper; + +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.Any; + +import com.sun.star.uno.XComponentContext; +import com.sun.star.lang.XMultiComponentFactory; +import com.sun.star.lang.XSingleComponentFactory; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XEventListener; +import com.sun.star.lang.EventObject; + +import java.util.Hashtable; +import java.util.Enumeration; +import java.util.Vector; + + +//================================================================================================== +class Disposer implements XEventListener +{ + private XComponent m_xComp; + + //---------------------------------------------------------------------------------------------- + Disposer( XComponent xComp ) + { + m_xComp = xComp; + } + //______________________________________________________________________________________________ + public void disposing( EventObject Source ) + { + m_xComp.dispose(); + } +} + +/** Component context implementation. +*/ +public class ComponentContext implements XComponentContext, XComponent +{ + private static final boolean DEBUG = false; + private static final String SMGR_NAME = "/singletons/com.sun.star.lang.theServiceManager"; + private static final String TDMGR_NAME = "/singletons/com.sun.star.reflection.theTypeDescriptionManager"; + + private Hashtable m_table; + private XComponentContext m_xDelegate; + + private XMultiComponentFactory m_xSMgr; + private boolean m_bDisposeSMgr; + + private Vector m_eventListener; + + /** Ctor to create a component context passing a hashtable for values and a delegator + reference. Entries of the passed hashtable are either direct values or + ComponentContextEntry objects. + + @param table + entries + @param xDelegate + if values are not found, request is delegated to this object + */ + public ComponentContext( Hashtable table, XComponentContext xDelegate ) + { + m_eventListener = new Vector(); + m_table = table; + m_xDelegate = xDelegate; + m_xSMgr = null; + m_bDisposeSMgr = false; + + Object o = table.get( SMGR_NAME ); + if (o != null) + { + if (o instanceof ComponentContextEntry) + { + o = ((ComponentContextEntry)o).m_value; + } + m_xSMgr = UnoRuntime.queryInterface( + XMultiComponentFactory.class, o ); + } + if (m_xSMgr != null) + { + m_bDisposeSMgr = true; + } + else if (m_xDelegate != null) + { + m_xSMgr = m_xDelegate.getServiceManager(); + } + + // listen for delegate + XComponent xComp = UnoRuntime.queryInterface( + XComponent.class, m_xDelegate ); + if (xComp != null) + { + xComp.addEventListener( new Disposer( this ) ); + } + } + + // XComponentContext impl + //______________________________________________________________________________________________ + public Object getValueByName( String rName ) + { + Object o = m_table.get( rName ); + if (o != null) + { + if (o instanceof ComponentContextEntry) + { + ComponentContextEntry entry = (ComponentContextEntry)o; + if (entry.m_lateInit != null) + { + Object xInstance = null; + + try + { + String serviceName = (String)entry.m_lateInit; + if (serviceName != null) + { + if (m_xSMgr != null) + { + xInstance = m_xSMgr.createInstanceWithContext( serviceName, this ); + } + else + { + if (DEBUG) + System.err.println( "### no service manager instance for late init of singleton instance \"" + rName + "\"!" ); + } + } + else + { + XSingleComponentFactory xCompFac = + UnoRuntime.queryInterface( + XSingleComponentFactory.class, entry.m_lateInit ); + if (xCompFac != null) + { + xInstance = xCompFac.createInstanceWithContext( this ); + } + else + { + if (DEBUG) + System.err.println( "### neither service name nor service factory given for late init of singleton instance \"" + rName + "\"!" ); + } + } + } + catch (com.sun.star.uno.Exception exc) + { + if (DEBUG) + System.err.println( "### exception occured on late init of singleton instance \"" + rName + "\": " + exc.getMessage() ); + } + + if (xInstance != null) + { + synchronized (entry) + { + if (entry.m_lateInit != null) + { + entry.m_value = xInstance; + entry.m_lateInit = null; + } + else // inited in the meantime + { + // dispose fresh service instance + XComponent xComp = UnoRuntime.queryInterface( + XComponent.class, xInstance ); + if (xComp != null) + { + xComp.dispose(); + } + } + } + } + else + { + if (DEBUG) + System.err.println( "### failed late init of singleton instance \"" + rName + "\"!" ); + } + } + return entry.m_value; + } + else // direct value in map + { + return o; + } + } + else if (m_xDelegate != null) + { + return m_xDelegate.getValueByName( rName ); + } + else + { + return Any.VOID; + } + } + //______________________________________________________________________________________________ + public XMultiComponentFactory getServiceManager() + { + return m_xSMgr; + } + + // XComponent impl + //______________________________________________________________________________________________ + public void dispose() + { + if (DEBUG) + System.err.print( "> disposing context " + this ); + + // fire events + EventObject evt = new EventObject( this ); + Enumeration eventListener = m_eventListener.elements(); + while (eventListener.hasMoreElements()) + { + XEventListener listener = (XEventListener)eventListener.nextElement(); + listener.disposing( evt ); + } + m_eventListener.removeAllElements(); + + XComponent tdmgr = null; + // dispose values, then service manager, then typdescription manager + Enumeration keys = m_table.keys(); + while (keys.hasMoreElements()) + { + String name = (String)keys.nextElement(); + if (! name.equals( SMGR_NAME )) + { + Object o = m_table.get( name ); + if (o instanceof ComponentContextEntry) + { + o = ((ComponentContextEntry)o).m_value; + } + + XComponent xComp = UnoRuntime.queryInterface( XComponent.class, o ); + if (xComp != null) + { + if (name.equals( TDMGR_NAME )) + { + tdmgr = xComp; + } + else + { + xComp.dispose(); + } + } + } + } + m_table.clear(); + + // smgr + if (m_bDisposeSMgr) + { + XComponent xComp = UnoRuntime.queryInterface( + XComponent.class, m_xSMgr ); + if (xComp != null) + { + xComp.dispose(); + } + } + m_xSMgr = null; + + // tdmgr + if (tdmgr != null) + { + tdmgr.dispose(); + } + + if (DEBUG) + System.err.println( "... finished" ); + } + //______________________________________________________________________________________________ + public void addEventListener( XEventListener xListener ) + { + if (xListener == null) + throw new com.sun.star.uno.RuntimeException( "Listener must not be null" ); + if (m_eventListener.contains( xListener )) + throw new com.sun.star.uno.RuntimeException( "Listener already registred." ); + + m_eventListener.addElement( xListener ); + } + //______________________________________________________________________________________________ + public void removeEventListener( XEventListener xListener ) + { + if (xListener == null) + throw new com.sun.star.uno.RuntimeException( "Listener must not be null" ); + if (! m_eventListener.contains( xListener )) + throw new com.sun.star.uno.RuntimeException( "Listener is not registered." ); + + m_eventListener.removeElement( xListener ); + } +} diff --git a/javaunohelper/com/sun/star/comp/helper/ComponentContextEntry.java b/javaunohelper/com/sun/star/comp/helper/ComponentContextEntry.java new file mode 100644 index 000000000000..8dc6d12b292b --- /dev/null +++ b/javaunohelper/com/sun/star/comp/helper/ComponentContextEntry.java @@ -0,0 +1,76 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ComponentContextEntry.java,v $ + * $Revision: 1.4 $ + * + * 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.helper; + +/** Component context entry for constructing ComponentContext objects. + <p> + A ComponentContextEntry is separated into a late-init and direct-value + purpose. + The first one is commonly used for singleton objects of the component + context, that are raised on first-time retrieval of the key. + You have to pass a com.sun.star.lang.XSingleComponentFactory + or string (=> service name) object for this. + </p> +*/ +public class ComponentContextEntry +{ + /** if late init of service instance, set service name (String) or + component factory (XSingleComponentFactory), null otherwise + */ + public Object m_lateInit; + /** set entry value + */ + public Object m_value; + + /** Creating a late-init singleton entry component context entry. + The second parameter will be ignored and overwritten during + instanciation of the singleton instance. + + @param lateInit + object factory or service string + @param value + pass null (dummy separating from second ctor signature) + */ + public ComponentContextEntry( Object lateInit, Object value ) + { + this.m_lateInit = lateInit; + this.m_value = value; + } + /** Creating a direct value component context entry. + + @param value + pass null + */ + public ComponentContextEntry( Object value ) + { + this.m_lateInit = null; + this.m_value = value; + } +} diff --git a/javaunohelper/com/sun/star/comp/helper/RegistryServiceFactory.java b/javaunohelper/com/sun/star/comp/helper/RegistryServiceFactory.java new file mode 100644 index 000000000000..9523fbba7716 --- /dev/null +++ b/javaunohelper/com/sun/star/comp/helper/RegistryServiceFactory.java @@ -0,0 +1,171 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: RegistryServiceFactory.java,v $ + * $Revision: 1.9 $ + * + * 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.helper; + + +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.RuntimeException; + +/** The class provides a set of methods which create instances of the + com.sun.star.lang.RegistryServiceManager service. + + @deprecated use class Bootstrap instead +*/ +public class RegistryServiceFactory { + static { + System.loadLibrary("juh"); + } + + private static native Object createRegistryServiceFactory( + String writeRegistryFile, + String readRegistryFile, + boolean readOnly, + ClassLoader loader); + + /** + * This bootstraps an initial service factory working on a registry. If the first or both + * parameters contain a value then the service factory is initialized with a simple registry + * or a nested registry. Otherwise the service factory must be initialized later with a valid + * registry. + *<BR> + * @param writeRegistryFile file name of the simple registry or the first registry file of + * the nested registry which will be opened with read/write rights. This + * file will be created if necessary. + * @param readRegistryFile file name of the second registry file of the nested registry + * which will be opened with readonly rights. + * @return a new RegistryServiceFactory. + */ + public static XMultiServiceFactory create(String writeRegistryFile, String readRegistryFile) + throws com.sun.star.uno.Exception + { + return create(writeRegistryFile, readRegistryFile, false); + } + + /** + * This bootstraps an initial service factory working on a registry. If the first or both + * parameters contain a value then the service factory is initialized with a simple registry + * or a nested registry. Otherwise the service factory must be initialized later with a valid + * registry. + *<BR> + * @param writeRegistryFile file name of the simple registry or the first registry file of + * the nested registry which will be opened with read/write rights. This + * file will be created if necessary. + * @param readRegistryFile file name of the second registry file of the nested registry + * which will be opened with readonly rights. + * @param readOnly flag which specify that the first registry file will be opened with + * readonly rights. Default is FALSE. If this flag is used the registry + * will not be created if not exist. + * + * @return a new RegistryServiceFactory + */ + public static XMultiServiceFactory create(String writeRegistryFile, String readRegistryFile, boolean readOnly) + throws com.sun.star.uno.Exception + { + // Ensure that we are on a native threads vm + // (binary UNO does use native threads). + String vm_info = System.getProperty("java.vm.info"); + if(vm_info != null && vm_info.indexOf("green") != -1) + throw new RuntimeException(RegistryServiceFactory.class.toString() + ".create - can't use binary UNO with green threads"); + + + if (writeRegistryFile == null && readRegistryFile == null) + throw new com.sun.star.uno.Exception("No registry is specified!"); + +// if (writeRegistryFile != null) { +// java.io.File file = new java.io.File(writeRegistryFile); + +// if (file.exists()) { +// if (!file.isFile()) +// throw new com.sun.star.uno.Exception(writeRegistryFile + " is not a file!"); +// } else +// throw new com.sun.star.uno.Exception(writeRegistryFile + " doese not exist!"); +// } + +// if (readRegistryFile != null) { +// java.io.File file = new java.io.File(readRegistryFile); + +// if (file.exists()) { +// if (!file.isFile()) +// throw new com.sun.star.uno.Exception(readRegistryFile + " is not a file!"); +// } else +// throw new com.sun.star.uno.Exception(readRegistryFile + " doese not exist!"); +// } + + Object obj = createRegistryServiceFactory( + writeRegistryFile, readRegistryFile, readOnly, + RegistryServiceFactory.class.getClassLoader() ); + return UnoRuntime.queryInterface( + XMultiServiceFactory.class, obj ); + } + + /** + * This bootstraps an initial service factory working on a registry file. + *<BR> + * @param registryFile file name of the registry to use/ create; if this is an empty + * string, the default registry is used instead + * + * @return a new RegistryServiceFactory. + */ + public static XMultiServiceFactory create(String registryFile) + throws com.sun.star.uno.Exception + { + return create(registryFile, null, false); + } + + /** + * This bootstraps an initial service factory working on a registry file. + *<BR> + * @param registryFile file name of the registry to use/ create; if this is an empty + * string, the default registry is used instead + * @param readOnly flag which specify that the registry file will be opened with + * readonly rights. Default is FALSE. If this flag is used the registry + * will not be created if not exist. + * + * @return a new RegistryServiceFactory. + */ + public static XMultiServiceFactory create(String registryFile, boolean readOnly) + throws com.sun.star.uno.Exception + { + return create(registryFile, null, readOnly); + } + + /** + * This bootstraps a service factory without initialize a registry. + *<BR> + * @return a new RegistryServiceFactory. + */ + public static XMultiServiceFactory create() throws com.sun.star.uno.Exception { + return create( null, null, false ); + } +} + diff --git a/javaunohelper/com/sun/star/comp/helper/SharedLibraryLoader.java b/javaunohelper/com/sun/star/comp/helper/SharedLibraryLoader.java new file mode 100644 index 000000000000..a1bf4d3a168c --- /dev/null +++ b/javaunohelper/com/sun/star/comp/helper/SharedLibraryLoader.java @@ -0,0 +1,162 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: SharedLibraryLoader.java,v $ + * $Revision: 1.8 $ + * + * 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.helper; + +import com.sun.star.uno.UnoRuntime; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XSingleServiceFactory; +import com.sun.star.registry.XRegistryKey; + +/** + * @deprecated use class Bootstrap bootstrapping a native UNO installation + * and use the shared library loader service. + * + * The <code>SharedLibraryLoader</code> class provides the functionality of the <code>com.sun.star.loader.SharedLibrary</code> + * service. + * <p> + * @see com.sun.star.loader.SharedLibrary + * @see com.sun.star.comp.servicemanager.ServiceManager + * @see com.sun.star.lang.ServiceManager + */ +public class SharedLibraryLoader { + /** + * The default library which contains the SharedLibraryLoader component + */ + public static final String DEFAULT_LIBRARY = "shlibloader.uno"; + + /** + * The default implementation name + */ + public static final String DEFAULT_IMPLEMENTATION = "com.sun.star.comp.stoc.DLLComponentLoader"; + + static { + System.loadLibrary("juh"); + } + + private static native boolean component_writeInfo( + String libName, XMultiServiceFactory smgr, XRegistryKey regKey, + ClassLoader loader ); + + private static native Object component_getFactory( + String libName, String implName, XMultiServiceFactory smgr, + XRegistryKey regKey, ClassLoader loader ); + + /** + * Supplies the ServiceFactory of the default SharedLibraryLoader. + * The defaults are "shlibloader.uno" + * for the library and "com.sun.star.comp.stoc.DLLComponentLoader" + * for the component name. + * <p> + * @return the factory for the "com.sun.star.comp.stoc.DLLComponentLoader" component. + * @param smgr the ServiceManager + * @param regKey the root registry key + * @see com.sun.star.loader.SharedLibrary + * @see com.sun.star.lang.ServiceManager + * @see com.sun.star.registry.RegistryKey + */ + public static XSingleServiceFactory getServiceFactory( + XMultiServiceFactory smgr, + XRegistryKey regKey ) + { + return UnoRuntime.queryInterface( + XSingleServiceFactory.class, + component_getFactory( + DEFAULT_LIBRARY, DEFAULT_IMPLEMENTATION, smgr, regKey, + SharedLibraryLoader.class.getClassLoader() ) ); + } + + /** + * Loads and returns a specific factory for a given library and implementation name. + * <p> + * @return the factory of the component + * @param libName the name of the shared library + * @param impName the implementation name of the component + * @param smgr the ServiceManager + * @param regKey the root registry key + * @see com.sun.star.loader.SharedLibrary + * @see com.sun.star.lang.ServiceManager + * @see com.sun.star.registry.RegistryKey + */ + public static XSingleServiceFactory getServiceFactory( + String libName, + String impName, + XMultiServiceFactory smgr, + XRegistryKey regKey ) + { + return UnoRuntime.queryInterface( + XSingleServiceFactory.class, + component_getFactory( + libName, impName, smgr, regKey, + SharedLibraryLoader.class.getClassLoader() ) ); + } + + /** + * Registers the SharedLibraryLoader under a RegistryKey. + * <p> + * @return true if the registration was successfull - otherwise false + * @param smgr the ServiceManager + * @param regKey the root key under that the component should be registered + * @see com.sun.star.loader.SharedLibrary + * @see com.sun.star.lang.ServiceManager + * @see com.sun.star.registry.RegistryKey + */ + public static boolean writeRegistryServiceInfo( + com.sun.star.lang.XMultiServiceFactory smgr, + com.sun.star.registry.XRegistryKey regKey ) + { + return component_writeInfo( + DEFAULT_LIBRARY, smgr, regKey, + SharedLibraryLoader.class.getClassLoader() ); + } + + /** + * Registers the SharedLibraryLoader under a RegistryKey. + * <p> + * @return true if the registration was successfull - otherwise false + * @param libName name of the shared library + * @param smgr the ServiceManager + * @param regKey the root key under that the component should be registered + * @see com.sun.star.loader.SharedLibrary + * @see com.sun.star.lang.ServiceManager + * @see com.sun.star.registry.RegistryKey + */ + public static boolean writeRegistryServiceInfo( + String libName, + com.sun.star.lang.XMultiServiceFactory smgr, + com.sun.star.registry.XRegistryKey regKey ) + + throws com.sun.star.registry.InvalidRegistryException, + com.sun.star.uno.RuntimeException + { + return component_writeInfo( + libName, smgr, regKey, SharedLibraryLoader.class.getClassLoader() ); + } +} + diff --git a/javaunohelper/com/sun/star/comp/helper/UnoInfo.java b/javaunohelper/com/sun/star/comp/helper/UnoInfo.java new file mode 100644 index 000000000000..a24229ec6538 --- /dev/null +++ b/javaunohelper/com/sun/star/comp/helper/UnoInfo.java @@ -0,0 +1,118 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: UnoInfo.java,v $ + * $Revision: 1.8 $ + * + * 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.helper; + +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; + +/** + * UnoInfo offers functionality to obtain the UNO jar files. + */ +public final class UnoInfo { + + /** + * do not instantiate + */ + private UnoInfo() {} + + /** + * Gets the URL base. + * + * @return the URL base + */ + private static String getBase() { + + final String JUHJAR = "/juh.jar"; + + String base = null; + + URLClassLoader cl = (URLClassLoader) UnoInfo.class.getClassLoader(); + URL[] urls = cl.getURLs(); + for ( int i = 0; i < urls.length; i++ ) { + String url = urls[i].toString(); + if ( url.endsWith( JUHJAR ) ) + { + int index = url.lastIndexOf( JUHJAR ); + if ( index >= 0 ) { + base = url.substring( 0, index + 1 ); + break; + } + } + } + + return base; + } + + /** + * Gets a list of URLs for the given jar files. + * + * @return the list of URLs + */ + private static URL[] getURLs( String[] jarFileNames ) { + + URL[] jars = new URL[jarFileNames.length]; + String base = getBase(); + for ( int i = 0; i < jarFileNames.length; i++ ) { + try { + jars[i] = new URL( base + jarFileNames[i] ); + } catch ( MalformedURLException e ) { + return null; + } + } + + return jars; + } + + /** + * Gets the UNO jar files. + * + * @return the UNO jar files + */ + public static URL[] getJars() { + + String[] jarFileNames = new String[] { + "jurt.jar", + "ridl.jar", + "juh.jar" }; + + return getURLs( jarFileNames ); + } + + /** + * Gets the extra UNO types. + * + * @return the extra UNO types + */ + public static URL[] getExtraTypes() { + return new URL[0]; + } +} diff --git a/javaunohelper/com/sun/star/comp/helper/makefile.mk b/javaunohelper/com/sun/star/comp/helper/makefile.mk new file mode 100644 index 000000000000..b4d5dd9d485b --- /dev/null +++ b/javaunohelper/com/sun/star/comp/helper/makefile.mk @@ -0,0 +1,58 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.9 $ +# +# 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. +# +#************************************************************************* + +PRJ=..$/..$/..$/..$/.. + +PRJNAME = juhelper +PACKAGE = com$/sun$/star$/comp$/helper +TARGET = com_sun_star_comp_helper + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk +.INCLUDE: $(PRJ)$/util$/settings.pmk + +# --- Files -------------------------------------------------------- + +JAVAFILES= \ + ComponentContextEntry.java \ + ComponentContext.java \ + Bootstrap.java \ + SharedLibraryLoader.java \ + RegistryServiceFactory.java \ + BootstrapException.java \ + UnoInfo.java + +JAVACLASSFILES= $(foreach,i,$(JAVAFILES) $(CLASSDIR)$/$(PACKAGE)$/$(i:b).class) + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk diff --git a/javaunohelper/com/sun/star/comp/juhtest/SmoketestCommandEnvironment.java b/javaunohelper/com/sun/star/comp/juhtest/SmoketestCommandEnvironment.java new file mode 100644 index 000000000000..a508a209ad2c --- /dev/null +++ b/javaunohelper/com/sun/star/comp/juhtest/SmoketestCommandEnvironment.java @@ -0,0 +1,154 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: SmoketestCommandEnvironment.java,v $ + * $Revision: 1.4 $ + * + * 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.juhtest; + +import com.sun.star.lang.XMultiComponentFactory; +import com.sun.star.lib.uno.helper.WeakBase; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XComponentContext; +import com.sun.star.lang.XServiceInfo; +import com.sun.star.ucb.XCommandEnvironment; + +/** This service is for use by the smoketest which checks the installation of + * extensions. The service provides the XCommandEnvironment interface, which + * is needed for adding extensions. + */ +public class SmoketestCommandEnvironment extends WeakBase + implements XServiceInfo, XCommandEnvironment { + + static private final String __serviceName = + "com.sun.star.deployment.test.SmoketestCommandEnvironment"; + + private XComponentContext m_cmpCtx; + private XMultiComponentFactory m_xMCF; + + + public SmoketestCommandEnvironment(XComponentContext xCompContext) { + try { + m_cmpCtx = xCompContext; + m_xMCF = m_cmpCtx.getServiceManager(); + } + catch( Exception e ) { + e.printStackTrace(); + } + } + + public static String[] getServiceNames() { + String[] sSupportedServiceNames = { __serviceName}; + return sSupportedServiceNames; + } + + //XServiceInfo ------------------------------------------------------------- + public String[] getSupportedServiceNames() { + return getServiceNames(); + } + + + public boolean supportsService( String sServiceName ) { + boolean bSupported = false; + if (sServiceName.equals(__serviceName)) + bSupported = true; + return bSupported; + } + + public String getImplementationName() { + return SmoketestCommandEnvironment.class.getName(); + } + + //XCommandEnvironment ================================================ + public com.sun.star.task.XInteractionHandler getInteractionHandler() + { + return new InteractionImpl(); + } + + public com.sun.star.ucb.XProgressHandler getProgressHandler() + { + return new ProgressImpl(); + } +} + + + + +class InteractionImpl implements com.sun.star.task.XInteractionHandler +{ + public void handle( com.sun.star.task.XInteractionRequest xRequest ) + { + Object request = xRequest.getRequest(); + + boolean approve = true; + boolean abort = false; +// Object install_Exception = +// AnyConverter.toObject( +// com.sun.star.deployment.InstallException.class, request); +// if (install_Exception != null) +// { +// approve = true; +// } + + com.sun.star.task.XInteractionContinuation[] conts = xRequest.getContinuations(); + for (int i = 0; i < conts.length; i++) + { + if (approve) + { + com.sun.star.task.XInteractionApprove xApprove = + UnoRuntime.queryInterface(com.sun.star.task.XInteractionApprove.class, conts[i]); + if (xApprove != null) + xApprove.select(); + //don't query again for ongoing extensions + approve = false; + } + else if (abort) + { + com.sun.star.task.XInteractionAbort xAbort = + UnoRuntime.queryInterface(com.sun.star.task.XInteractionAbort.class, conts[i]); + if (xAbort != null) + xAbort.select(); + //don't query again for ongoing extensions + abort = false; + } + } + } +} + +class ProgressImpl implements com.sun.star.ucb.XProgressHandler +{ + public void push(Object status) + { + } + + public void update(Object status) + { + } + + public void pop() + { + } +} diff --git a/javaunohelper/com/sun/star/comp/juhtest/makefile.mk b/javaunohelper/com/sun/star/comp/juhtest/makefile.mk new file mode 100644 index 000000000000..89b6f50201dd --- /dev/null +++ b/javaunohelper/com/sun/star/comp/juhtest/makefile.mk @@ -0,0 +1,54 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.3 $ +# +# 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. +# +#************************************************************************* + +PRJ=..$/..$/..$/..$/.. + +PRJNAME = juhelper +PACKAGE = com$/sun$/star$/comp$/juhtest +TARGET = com_sun_star_comp_juhtest + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk +.INCLUDE: $(PRJ)$/util$/settings.pmk + +# --- Files -------------------------------------------------------- +#todo: we do not want include juh.jar here but use the output tree. +JARFILES = unoil.jar ridl.jar jurt.jar + +JAVAFILES= \ + SmoketestCommandEnvironment.java + +JAVACLASSFILES= $(foreach,i,$(JAVAFILES) $(CLASSDIR)$/$(PACKAGE)$/$(i:b).class) + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk diff --git a/javaunohelper/com/sun/star/comp/makefile.mk b/javaunohelper/com/sun/star/comp/makefile.mk new file mode 100644 index 000000000000..2f799f94f66b --- /dev/null +++ b/javaunohelper/com/sun/star/comp/makefile.mk @@ -0,0 +1,53 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.4 $ +# +# 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. +# +#************************************************************************* + +PRJ=..$/..$/..$/.. + +PRJNAME = juhelper +PACKAGE = com$/sun$/star$/comp +TARGET = com_sun_star_comp + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk +.INCLUDE: $(PRJ)$/util$/settings.pmk + +# --- Files -------------------------------------------------------- +JARFILES = ridl.jar jurt.jar unoil.jar +JAVAFILES= \ + JavaUNOHelperServices.java + + +JAVACLASSFILES= $(foreach,i,$(JAVAFILES) $(CLASSDIR)$/$(PACKAGE)$/$(i:b).class) + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk diff --git a/javaunohelper/com/sun/star/lib/uno/adapter/ByteArrayToXInputStreamAdapter.java b/javaunohelper/com/sun/star/lib/uno/adapter/ByteArrayToXInputStreamAdapter.java new file mode 100755 index 000000000000..ccd886f937c9 --- /dev/null +++ b/javaunohelper/com/sun/star/lib/uno/adapter/ByteArrayToXInputStreamAdapter.java @@ -0,0 +1,164 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ByteArrayToXInputStreamAdapter.java,v $ + * $Revision: 1.4 $ + * + * 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. + * + ************************************************************************/ + +/* + * ByteArrayXInputStram.java + * + * Created on 10. April 2003, 15:45 + */ + +package com.sun.star.lib.uno.adapter; + +/** + * + * @author lo119109 + */ + +import com.sun.star.io.XInputStream; +import com.sun.star.io.XSeekable; +import com.sun.star.lib.uno.helper.ComponentBase; + +public class ByteArrayToXInputStreamAdapter + extends ComponentBase + implements XInputStream, XSeekable +{ + + byte[] m_bytes; + int m_length; + int m_pos; + + boolean m_open; + + /** Creates a new instance of ByteArrayXInputStram */ + public ByteArrayToXInputStreamAdapter(byte[] bytes) { + init(bytes); + } + + public void init(byte[] bytes) { + // System.err.println("ByteArrayXInputStream"); + m_bytes = bytes; + m_length = bytes.length; + m_pos = 0; + m_open = true; + } + + private void _check() throws com.sun.star.io.NotConnectedException, com.sun.star.io.IOException { + if (m_bytes == null) { + // System.err.println("check failed no bytes!"); + throw new com.sun.star.io.NotConnectedException("no bytes"); + } + if(!m_open) { + // System.err.println("check failed: closed"); + throw new com.sun.star.io.IOException("input closed"); + } + } + + public int available() throws com.sun.star.io.NotConnectedException, com.sun.star.io.IOException { + _check(); + long a = m_length - m_pos; + if (a != (int)a) + throw new com.sun.star.io.IOException("integer overflow"); + else { + // System.err.println("available() -> "+a); + return (int)a; + } + } + + public void closeInput() throws com.sun.star.io.NotConnectedException, com.sun.star.io.IOException { + // System.err.println("closeInput()"); + _check(); + m_open = false; + } + + public int readBytes(byte[][] values, int param) throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException { + // System.err.println("readbytes(..., "+param+")"); + _check(); + try { + int remain = (int)(m_length - m_pos); + if (param > remain) param = remain; + /* ARGH!!! */ + if (values[0] == null){ + values[0] = new byte[param]; + // System.err.println("allocated new buffer of "+param+" bytes"); + } + System.arraycopy(m_bytes, m_pos, values[0], 0, param); + // System.err.println("readbytes() -> "+param); + m_pos += param; + return param; + } catch (ArrayIndexOutOfBoundsException ae) { + // System.err.println("readbytes() -> ArrayIndexOutOfBounds"); + ae.printStackTrace(); + throw new com.sun.star.io.BufferSizeExceededException("buffer overflow"); + } catch (Exception e) { + // System.err.println("readbytes() -> Exception: "+e.getMessage()); + e.printStackTrace(); + throw new com.sun.star.io.IOException("error accessing buffer"); + } + } + + public int readSomeBytes(byte[][] values, int param) throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException { + // System.err.println("readSomebytes()"); + return readBytes(values, param); + } + + public void skipBytes(int param) throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException { + // System.err.println("skipBytes("+param+")"); + _check(); + if (param > (m_length - m_pos)) + throw new com.sun.star.io.BufferSizeExceededException("buffer overflow"); + m_pos += param; + } + + public long getLength() throws com.sun.star.io.IOException { + // System.err.println("getLength() -> "+m_length); + if (m_bytes != null) return m_length; + else throw new com.sun.star.io.IOException("no bytes"); + } + + public long getPosition() throws com.sun.star.io.IOException { + // System.err.println("getPosition() -> "+m_pos); + if (m_bytes != null) return m_pos; + else throw new com.sun.star.io.IOException("no bytes"); + } + + public void seek(long param) throws com.sun.star.lang.IllegalArgumentException, com.sun.star.io.IOException { + // System.err.println("seek("+param+")"); + if (m_bytes != null){ + if (param < 0 || param > m_length) throw new com.sun.star.lang.IllegalArgumentException("invalid seek position"); + else m_pos = (int)param; + }else throw new com.sun.star.io.IOException("no bytes"); + } + + public void finalize() throws Throwable{ + // System.err.println("finalizer called for ByteArrayXInputStream!"); + super.finalize(); + } + +} diff --git a/javaunohelper/com/sun/star/lib/uno/adapter/InputStreamToXInputStreamAdapter.java b/javaunohelper/com/sun/star/lib/uno/adapter/InputStreamToXInputStreamAdapter.java new file mode 100644 index 000000000000..28c7eb7a4203 --- /dev/null +++ b/javaunohelper/com/sun/star/lib/uno/adapter/InputStreamToXInputStreamAdapter.java @@ -0,0 +1,169 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: InputStreamToXInputStreamAdapter.java,v $ + * $Revision: 1.5 $ + * + * 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.lib.uno.adapter; + +import java.io.IOException; +import com.sun.star.io.XInputStream; +import java.io.InputStream; + +/** The <code>InputStreamToInputXStreamAdapter</code> wraps the + Java <code>InputStream</code> object into a + UNO <code>XInputStream</code> object. + This allows users to access an <code>InputStream</code> + as if it were an <code>XInputStream</code>. + */ +public class InputStreamToXInputStreamAdapter implements XInputStream { + + /** + * Internal store to the InputStream + */ + private InputStream iIn; + + /** + * Constructor. + * + * @param in The <code>XInputStream</code> to be + * accessed as an <code>InputStream</code>. + */ + public InputStreamToXInputStreamAdapter (InputStream in) + { + iIn = in; + } + + public int available() throws + com.sun.star.io.IOException + { + + int bytesAvail; + + try { + bytesAvail = iIn.available(); + } catch (IOException e) { + throw new com.sun.star.io.IOException(e.toString()); + } + + return(bytesAvail); + } + + public void closeInput() throws + com.sun.star.io.IOException + { + try { + iIn.close(); + } catch (IOException e) { + throw new com.sun.star.io.IOException(e.toString()); + } + } + + public int readBytes(byte[][] b, int len) throws + com.sun.star.io.IOException + { + int count = 0; + try { + long bytesRead=0; + if (len >iIn.available()) { + bytesRead = iIn.read(b[0], 0, iIn.available()); + } + else{ + bytesRead = iIn.read(b[0], 0, len); + } + // Casting bytesRead to an int is okay, since the user can + // only pass in an integer length to read, so the bytesRead + // must <= len. + // + if (bytesRead <= 0) { + return(0); + } + return ((int)bytesRead); + + + } catch (IOException e) { + throw new com.sun.star.io.IOException("reader error: "+e.toString()); + } + } + + public int readSomeBytes(byte[][] b, int len) throws + com.sun.star.io.IOException + { + int count = 0; + try { + long bytesRead=0; + if (len >iIn.available()) { + bytesRead = iIn.read(b[0], 0, iIn.available()); + } + else{ + bytesRead = iIn.read(b[0], 0, len); + } + // Casting bytesRead to an int is okay, since the user can + // only pass in an integer length to read, so the bytesRead + // must <= len. + // + if (bytesRead <= 0) { + return(0); + } + return ((int)bytesRead); + + + } catch (IOException e) { + throw new com.sun.star.io.IOException("reader error: "+e.toString()); + } + } + + public void skipBytes(int n) throws + com.sun.star.io.IOException + { + int avail; + int tmpLongVal = n; + int tmpIntVal; + + try { + avail = iIn.available(); + } catch (IOException e) { + throw new com.sun.star.io.IOException(e.toString()); + } + + do { + if (tmpLongVal >= Integer.MAX_VALUE) { + tmpIntVal = Integer.MAX_VALUE; + } else { + // Casting is safe here. + tmpIntVal = (int)tmpLongVal; + } + tmpLongVal -= tmpIntVal; + + try { + iIn.skip(tmpIntVal); + } catch (IOException e) { + throw new com.sun.star.io.IOException(e.toString()); + } + } while (tmpLongVal > 0); + } +} + diff --git a/javaunohelper/com/sun/star/lib/uno/adapter/OutputStreamToXOutputStreamAdapter.java b/javaunohelper/com/sun/star/lib/uno/adapter/OutputStreamToXOutputStreamAdapter.java new file mode 100644 index 000000000000..008d89fd4b88 --- /dev/null +++ b/javaunohelper/com/sun/star/lib/uno/adapter/OutputStreamToXOutputStreamAdapter.java @@ -0,0 +1,90 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: OutputStreamToXOutputStreamAdapter.java,v $ + * $Revision: 1.4 $ + * + * 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.lib.uno.adapter; + +import java.io.IOException; +import com.sun.star.io.XOutputStream; +import java.io.OutputStream; + +/** The <code>OutputStreamToXOutputStreamAdapter</code> wraps + a a UNO <code>XOutputStream</code> into a Java <code>OutputStream</code> + object in a Java. This allows users to access an <code>OutputStream</code> + as if it were an <code>XOutputStream</code>. + */ +public class OutputStreamToXOutputStreamAdapter implements XOutputStream { + + /** + * Internal handle to the OutputStream + */ + OutputStream iOut; + + /** + * Constructor. + * + * @param out The <code>XOutputStream</code> to be + * accessed as an <code>OutputStream</code>. + */ + public OutputStreamToXOutputStreamAdapter(OutputStream out) { + iOut = out; + } + + public void closeOutput() throws + com.sun.star.io.IOException + { + try { + iOut.close(); + } catch (IOException e) { + throw new com.sun.star.io.IOException(e.toString()); + } + } + + public void flush() throws + com.sun.star.io.IOException + { + try { + iOut.flush(); + } catch (IOException e) { + throw new com.sun.star.io.IOException(e.toString()); + } + } + + public void writeBytes(byte[] b) throws + com.sun.star.io.IOException + { + + try { + iOut.write(b); + } catch (IOException e) { + throw new com.sun.star.io.IOException(e.toString()); + } + } + +} diff --git a/javaunohelper/com/sun/star/lib/uno/adapter/XInputStreamToInputStreamAdapter.java b/javaunohelper/com/sun/star/lib/uno/adapter/XInputStreamToInputStreamAdapter.java new file mode 100644 index 000000000000..c2663b85af54 --- /dev/null +++ b/javaunohelper/com/sun/star/lib/uno/adapter/XInputStreamToInputStreamAdapter.java @@ -0,0 +1,210 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: XInputStreamToInputStreamAdapter.java,v $ + * $Revision: 1.7 $ + * + * 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.lib.uno.adapter; + +import java.io.IOException; +import com.sun.star.io.XInputStream; +import java.io.InputStream; + +/** + * The <code>XInputStreamToInputStreamAdapter</code> wraps + * the UNO <code>XInputStream</code> object in a Java + * <code>InputStream</code>. This allows users to access + * an <code>XInputStream</code> as if it were an + * <code>InputStream</code>. + * + * @author Brian Cameron + */ +public class XInputStreamToInputStreamAdapter extends InputStream { + + /** + * Internal handle to the XInputStream + */ + private XInputStream xin; + + /** + * Constructor. + * + * @param in The <code>XInputStream</code> to be + * accessed as an <code>InputStream</code>. + */ + public XInputStreamToInputStreamAdapter (XInputStream in) { + xin = in; + } + + public int available() throws IOException { + + int bytesAvail; + + try { + bytesAvail = xin.available(); + } catch (Exception e) { + throw new IOException(e.toString()); + } + + return(bytesAvail); + } + + public void close() throws IOException { + try { + xin.closeInput(); + } catch (Exception e) { + throw new IOException(e.toString()); + } + } + + public int read () throws IOException { + byte [][] tmp = new byte [1][1]; + try { + long bytesRead = xin.readBytes(tmp, 1); + + if (bytesRead <= 0) { + return (-1); + } else { + int tmpInt = tmp[0][0]; + if (tmpInt< 0 ){ + tmpInt = 256 +tmpInt; + } + return(tmpInt); + } + + } catch (Exception e) { + throw new IOException(e.toString()); + } + } + + public int read (byte[] b) throws IOException { + + byte [][] tmp = new byte [1][b.length]; + int bytesRead; + + try { + bytesRead = xin.readBytes(tmp, b.length); + if (bytesRead <= 0) { + return(-1); + } else if (bytesRead < b.length) { + System.arraycopy(tmp[0], 0, b, 0, bytesRead); + } else { + System.arraycopy(tmp[0], 0, b, 0, b.length); + } + } catch (Exception e) { + throw new IOException(e.toString()); + } + + return (bytesRead); + } + + public int read(byte[] b, int off, int len) throws IOException { + int count = 0; + byte [][] tmp = new byte [1][b.length]; + try { + long bytesRead=0; + int av = xin.available(); + if ( av != 0 && len > av) { + bytesRead = xin.readBytes(tmp, av); + } + else{ + bytesRead = xin.readBytes(tmp,len); + } + // Casting bytesRead to an int is okay, since the user can + // only pass in an integer length to read, so the bytesRead + // must <= len. + // + if (bytesRead <= 0) { + return(-1); + } else if (bytesRead < len) { + System.arraycopy(tmp[0], 0, b, off, (int)bytesRead); + } else { + System.arraycopy(tmp[0], 0, b, off, len); + } + + return ((int)bytesRead); + + + } catch (Exception e) { + throw new IOException("reader error: "+e.toString()); + } + } + + public long skip(long n) throws IOException { + + int avail; + long tmpLongVal = n; + int tmpIntVal; + + try { + avail = xin.available(); + } catch (Exception e) { + throw new IOException(e.toString()); + } + + do { + if (tmpLongVal >= Integer.MAX_VALUE) { + tmpIntVal = Integer.MAX_VALUE; + } else { + // Casting is safe here. + tmpIntVal = (int)tmpLongVal; + } + tmpLongVal -= tmpIntVal; + + try { + xin.skipBytes(tmpIntVal); + } catch (Exception e) { + throw new IOException(e.toString()); + } + } while (tmpLongVal > 0); + + if ( avail != 0 && avail < n) { + return(avail); + } else { + return(n); + } + } + + /** + * Tests if this input stream supports the mark and reset methods. + * The markSupported method of + * <code>XInputStreamToInputStreamAdapter</code> returns false. + * + * @returns false + */ + public boolean markSupported() { + return false; + } + + public void mark(int readlimit) { + // Not supported. + } + + public void reset() throws IOException { + // Not supported. + } +} + diff --git a/javaunohelper/com/sun/star/lib/uno/adapter/XOutputStreamToByteArrayAdapter.java b/javaunohelper/com/sun/star/lib/uno/adapter/XOutputStreamToByteArrayAdapter.java new file mode 100755 index 000000000000..3b02206696ce --- /dev/null +++ b/javaunohelper/com/sun/star/lib/uno/adapter/XOutputStreamToByteArrayAdapter.java @@ -0,0 +1,124 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: XOutputStreamToByteArrayAdapter.java,v $ + * $Revision: 1.4 $ + * + * 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. + * + ************************************************************************/ + +/* + * ByteArrayXOutputStream.java + * + * Created on 11. April 2003, 14:20 + */ + +package com.sun.star.lib.uno.adapter; + +/** + * + * @author lo119109 + */ + +import com.sun.star.io.*; +import com.sun.star.lib.uno.helper.ComponentBase; + +public class XOutputStreamToByteArrayAdapter + extends ComponentBase + implements XOutputStream +{ + private int initialSize = 100240; // 10 kb + private int size = 0; + private int position = 0; + private boolean externalBuffer = false; + private boolean closed = false; + private byte[] buffer; + + /** Creates a new instance of ByteArrayXOutputStream */ + public XOutputStreamToByteArrayAdapter() { + this(null); + } + + public XOutputStreamToByteArrayAdapter(byte[] aBuffer) { + if (aBuffer != null) { + externalBuffer = true; + buffer = aBuffer; + size = buffer.length; + // System.err.println("new outputbuffer with external storage"); + } else { + size = initialSize; + buffer = new byte[size]; + // System.err.println("new outputbuffer with internal storage"); + } + } + + public byte[] getBuffer() { + return buffer; + } + + public void closeOutput() + throws com.sun.star.io.NotConnectedException, + com.sun.star.io.BufferSizeExceededException, + com.sun.star.io.IOException + { + // trim buffer + if ( buffer.length > position && !externalBuffer ) + { + byte[] newBuffer = new byte[position]; + System.arraycopy(buffer, 0, newBuffer, 0, position); + buffer = newBuffer; + } + closed = true; + } + + public void flush() + throws com.sun.star.io.NotConnectedException, + com.sun.star.io.BufferSizeExceededException, + com.sun.star.io.IOException + { + } + + public void writeBytes(byte[] values) + throws com.sun.star.io.NotConnectedException, + com.sun.star.io.BufferSizeExceededException, + com.sun.star.io.IOException + { + // System.err.println("writeBytes("+values.length+")"); + if ( values.length > size-position ) + { + if ( externalBuffer ) + throw new BufferSizeExceededException("out of buffer space, cannot grow external buffer"); + byte[] newBuffer = null; + while ( values.length > size-position ) + size *= 2; + // System.err.println("new buffer size is "+size+" bytes."); + newBuffer = new byte[size]; + System.arraycopy(buffer, 0, newBuffer, 0, position); + buffer = newBuffer; + } + System.arraycopy(values, 0, buffer, position, values.length); + position += values.length; + } + +} diff --git a/javaunohelper/com/sun/star/lib/uno/adapter/XOutputStreamToOutputStreamAdapter.java b/javaunohelper/com/sun/star/lib/uno/adapter/XOutputStreamToOutputStreamAdapter.java new file mode 100644 index 000000000000..1df2f8dd4904 --- /dev/null +++ b/javaunohelper/com/sun/star/lib/uno/adapter/XOutputStreamToOutputStreamAdapter.java @@ -0,0 +1,114 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: XOutputStreamToOutputStreamAdapter.java,v $ + * $Revision: 1.5 $ + * + * 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.lib.uno.adapter; + +import java.io.IOException; +import com.sun.star.io.XOutputStream; +import java.io.OutputStream; + +/** + * The <code>XOutputStreamToOutputStreamAdapter</code> wraps + * the UNO <code>XOutputStream</code> object in a Java + * <code>OutputStream</code>. This allows users to access + * an <code>XOutputStream</code> as if it were an + * <code>OutputStream</code>. + * + * @author Brian Cameron + */ +public class XOutputStreamToOutputStreamAdapter extends OutputStream { + + /** + * Internal handle to the XInputStream + */ + XOutputStream xout; + + /** + * Constructor. + * + * @param out The <code>XOutputStream</code> to be + * accessed as an <code>OutputStream</code>. + */ + public XOutputStreamToOutputStreamAdapter(XOutputStream out) { + xout = out; + } + + public void close() throws IOException { + try { + xout.closeOutput(); + } catch (Exception e) { + throw new IOException(e.toString()); + } + } + + public void flush() throws IOException { + try { + xout.flush(); + } catch (Exception e) { + throw new IOException(e.toString()); + } + } + + public void write(byte[] b) throws IOException { + + try { + xout.writeBytes(b); + } catch (Exception e) { + throw new IOException(e.toString()); + } + } + + public void write(byte[] b, int off, int len) throws IOException { + + byte[] tmp = new byte[len]; + + // Copy the input array into a temp array, and write it out. + // + System.arraycopy(b, off, tmp, 0, len); + + try { + xout.writeBytes(tmp); + } catch (Exception e) { + throw new IOException(e.toString()); + } + } + + public void write(int b) throws IOException { + + byte [] oneByte = new byte [1]; + oneByte[0] = (byte) b; + + try { + xout.writeBytes(oneByte); + } catch (Exception e) { + throw new IOException(e.toString()); + } + } +} diff --git a/javaunohelper/com/sun/star/lib/uno/adapter/makefile.mk b/javaunohelper/com/sun/star/lib/uno/adapter/makefile.mk new file mode 100644 index 000000000000..12bc6e07f493 --- /dev/null +++ b/javaunohelper/com/sun/star/lib/uno/adapter/makefile.mk @@ -0,0 +1,58 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.7 $ +# +# 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. +# +#************************************************************************* + +PRJ=..$/..$/..$/..$/..$/.. + +PRJNAME = juhelper +PACKAGE = com$/sun$/star$/lib$/uno$/adapter +TARGET = com_sun_star_lib_uno_adapter + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk +.INCLUDE: $(PRJ)$/util$/settings.pmk + +# --- Files -------------------------------------------------------- + +JAVAFILES= \ + XInputStreamToInputStreamAdapter.java \ + XOutputStreamToOutputStreamAdapter.java \ + InputStreamToXInputStreamAdapter.java \ + OutputStreamToXOutputStreamAdapter.java \ + ByteArrayToXInputStreamAdapter.java \ + XOutputStreamToByteArrayAdapter.java + + +JAVACLASSFILES= $(foreach,i,$(JAVAFILES) $(CLASSDIR)$/$(PACKAGE)$/$(i:b).class) + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk diff --git a/javaunohelper/com/sun/star/lib/uno/helper/ComponentBase.java b/javaunohelper/com/sun/star/lib/uno/helper/ComponentBase.java new file mode 100644 index 000000000000..c6bc512fafab --- /dev/null +++ b/javaunohelper/com/sun/star/lib/uno/helper/ComponentBase.java @@ -0,0 +1,144 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ComponentBase.java,v $ + * $Revision: 1.5 $ + * + * 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.lib.uno.helper; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XEventListener; +import com.sun.star.lang.EventObject; +import com.sun.star.uno.Type; + +/** This class can be used as the base class for UNO components. In addition to the functionality ,which + * is inherited from WeakBase, it implements com.sun.star.lang.XComponent. + */ +public class ComponentBase extends WeakBase implements XComponent +{ + private final boolean DEBUG= false; + protected MultiTypeInterfaceContainer listenerContainer; + protected boolean bInDispose= false; + protected boolean bDisposed= false; + static final Type EVT_LISTENER_TYPE= new Type(XEventListener.class); + + + /** Creates a new instance of CompBase */ + public ComponentBase() + { + super(); + listenerContainer= new MultiTypeInterfaceContainer(); + } + + /** Override to perform extra clean-up work. Provided for subclasses. It is + called during dispose() + */ + protected void preDisposing() + { + } + /** Override to become notified right before the disposing action is performed. + */ + protected void postDisposing() + { + } + + + /** Method of XComponent. It is called by the owning client when the component is not needed + * anymore. The registered listeners are notified that this method has been called. + */ + public void dispose() + { + // Determine in a thread-safe way if this is the first call to this method. + // Only then we proceed with the notification of event listeners. + // It is an error to call this method more then once. + boolean bDoDispose= false; + synchronized (this) + { + if ( ! bInDispose && ! bDisposed) + { + bDoDispose= true; + bInDispose= true; + } + } + // The notification occures in an unsynchronized block in order to avoid + // deadlocks if one of the listeners calls back in a different thread on + // a synchronized method which uses the same object. + if (bDoDispose) + { + try + { + preDisposing(); + listenerContainer.disposeAndClear(new EventObject(this)); + //notify subclasses that disposing is in progress + postDisposing(); + } + finally + { + // finally makes sure that the flags are set even if a RuntimeException is thrown. + // That ensures that this function is only called once. + bDisposed= true; + bInDispose= false; + } + } + else + { + // in a multithreaded environment, it can't be avoided, that dispose is called twice. + // However this condition is traced, because it MAY indicate an error. + if (DEBUG) + System.out.println("OComponentHelper::dispose() - dispose called twice" ); + } + } + + /** Method of XComponent. + */ + public void removeEventListener(XEventListener xEventListener) + { + listenerContainer.removeInterface( EVT_LISTENER_TYPE, xEventListener); + } + + public void addEventListener(XEventListener listener) + { + boolean bDoDispose= false; + synchronized (this) + { + if (bDisposed || bInDispose) + bDoDispose= true; + else + listenerContainer.addInterface(EVT_LISTENER_TYPE, listener); + } + if (bDoDispose ) + { + listener.disposing( new EventObject(this)); + } + } + + protected void finalize() throws Throwable + { + if ( ! bInDispose && ! bDisposed) + dispose(); + super.finalize(); + } +} diff --git a/javaunohelper/com/sun/star/lib/uno/helper/Factory.java b/javaunohelper/com/sun/star/lib/uno/helper/Factory.java new file mode 100644 index 000000000000..5842c8eaf7f4 --- /dev/null +++ b/javaunohelper/com/sun/star/lib/uno/helper/Factory.java @@ -0,0 +1,247 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: Factory.java,v $ + * $Revision: 1.4 $ + * + * 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.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 = 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; + } +} + diff --git a/javaunohelper/com/sun/star/lib/uno/helper/InterfaceContainer.java b/javaunohelper/com/sun/star/lib/uno/helper/InterfaceContainer.java new file mode 100644 index 000000000000..d7bc61cbcbad --- /dev/null +++ b/javaunohelper/com/sun/star/lib/uno/helper/InterfaceContainer.java @@ -0,0 +1,859 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: InterfaceContainer.java,v $ + * $Revision: 1.4 $ + * + * 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.lib.uno.helper; +import java.util.Iterator; +import java.util.ListIterator; +import java.util.NoSuchElementException; +import java.util.Collection; +import com.sun.star.lang.EventObject; +import com.sun.star.lang.XEventListener; +import com.sun.star.uno.UnoRuntime; + +/** + * This class is a container for interfaces. + * + * It is intended to be used as storage for UNO interface of a specific type. + * The client has to ensure that the container contains only elements of the same + * type. If one needs to store different types, then one uses OMultiTypeInterfaceContainer. + * When the client calls disposeAndClear, the contained objects are queried for + * com.sun.star.lang.XEventListener and disposing is called. Afterwards + * the list cannot be used anymore. + * + * This list does not allow null values. + * All methods are thread-safe. The same holds true for + * iterators, issued by this class. Several iterators can exist at the same time and can also + * be modified (java.util.ListIterator.add, java.util.ListIterator.remove etc.). To make this work, + * the InterfaceContainer provides the iterators with copys of the list's data. + * The add and remove calls on the iterator modify the data in the iterator's list as well as + * in InterfaceContainer. Modification on InterfaceContainer, however, are not + * synchronized with existing iterators. For example + * <pre> + * InterfaceContainer cont= new InterfaceContainer(); + * ListIterator it= cont.listIterator(); + * + * cont.add( someInterface); + * // one cannot obtain someInterface through iterator it, + * // instead get a new iterator + * it= cont.listIterator(); + * // it now keeps a fresh copy of cont and hence contains someInterface + * + * // Adding an interface on the iterator will cause the interface also to be added + * // to InterfaceContainer + * it.add( someOtherInterface); + * // someOtherInterface is now in it and cont + * ListIterator it2= cont.listIterator(); + * //someOtherInterface can also be obtained by all newly created iterators, e.g. it2. + * </pre> + * + * The add and remove methods of an iterator work on a particular location within a list, + * dependent on what the value of the iterator's cursor is. After the call the value at the + * appropriate position has been modified. Since the iterator received a copy of InterfaceContainer's + * data, InterfaceContainer may have been modified (by List methods or through other iterators). + * Therefore both data sets may not contain the same elements anymore. Consequently, a List method + * that modifies data, does not modify InterfaceContainer's data at a certain index + * (according to the iterators cursor). Instead, new elements are added at the end of list. When + * Iterator.remove is called, then the first occurrence of that element in InterfaceContainer + * is removed. + * ListIterator.set is not supported. + * + * A lot of methods resemble those of the to java.util.List interface, allthough + * this class does not implement it. However, the list iterators returned, for example by + * the listIterator method implement the java.util.ListIterator interface. + * Implementing the List interface would mean to support all none - optional methods as + * prescribed by the interface declaration. Among those is the subList method which returns + * a range of values of the list's data wrapped in a List implementation. Changes to the sub + * list have to cause changes in the main list. This is a problem, since this class is to be + * used in a multi-threaded environment. The sub list could work on a copy as the iterators + * do, but all the functions which work on an given index could not be properly supported. + * Unfortunatly, the List interface documentation states that all optional methods implemented + * by the list have to be implemented in the sub list. That would mean to do without all those + * critical methods, allthough they might work well in the "main list" (as opposed to sub list). + */ +public class InterfaceContainer implements Cloneable +{ + final boolean DEBUG= false; + /** + * The array buffer into which the elements of the ArrayList are stored. + * The capacity of the ArrayList is the length of this array buffer. + */ + Object elementData[]; + + /** + * The size of the ArrayList (the number of elements it contains). + * + * @serial + */ + private int size; + + + //private ArrayList data= new ArrayList(); + /** Creates a new instance of InterfaceContainer */ + public InterfaceContainer() + { + this(10); + } + /** + * Constructs an empty list with the specified initial capacity. + * + * @param initialCapacity the initial capacity of the list. + * @exception IllegalArgumentException if the specified initial capacity + * is negative + */ + public InterfaceContainer(int initialCapacity) + { + if (initialCapacity < 0) + throw new java.lang.IllegalArgumentException("Illegal Capacity: "+ + initialCapacity); + this.elementData = new Object[initialCapacity]; + } + + /** + * Trims the capacity of this <tt>ArrayList</tt> instance to be the + * list's current size. An application can use this operation to minimize + * the storage of an <tt>ArrayList</tt> instance. + */ + synchronized public void trimToSize() + { + int oldCapacity = elementData.length; + if (size < oldCapacity) + { + Object oldData[] = elementData; + elementData = new Object[size]; + System.arraycopy(oldData, 0, elementData, 0, size); + } + } + + /** + * Increases the capacity of this <tt>ArrayList</tt> instance, if + * necessary, to ensure that it can hold at least the number of elements + * specified by the minimum capacity argument. + * + * @param minCapacity the desired minimum capacity. + */ + synchronized public void ensureCapacity(int minCapacity) + { + int oldCapacity = elementData.length; + if (minCapacity > oldCapacity) + { + Object oldData[] = elementData; + int newCapacity = (oldCapacity * 3)/2 + 1; + if (newCapacity < minCapacity) + newCapacity = minCapacity; + elementData = new Object[newCapacity]; + System.arraycopy(oldData, 0, elementData, 0, size); + } + } + + /** + * Appends the specified element to the end of this list. + * + * @param o element to be appended to this list. + * @return <tt>true</tt> (as per the general contract of Collection.add). + */ + synchronized public boolean add(Object o) + { + boolean ret= false; + if (elementData != null && o != null) + { + ensureCapacity(size + 1); // Increments modCount!! + elementData[size++] = o; + ret= true; + } + return ret; + } + + /** + * Inserts the specified element at the specified position in this + * list. Shifts the element currently at that position (if any) and + * any subsequent elements to the right (adds one to their indices). + * + * @param index index at which the specified element is to be inserted. + * @param element element to be inserted. + * @throws IndexOutOfBoundsException if index is out of range + * <tt>(index < 0 || index > size())</tt>. + */ + synchronized public void add(int index, Object element) + { + if (elementData != null && element != null) + { + if (index > size || index < 0) + throw new IndexOutOfBoundsException( + "Index: "+index+", Size: "+size); + + ensureCapacity(size+1); + System.arraycopy(elementData, index, elementData, index + 1, + size - index); + elementData[index] = element; + size++; + } + } + + + /** + * Appends all of the elements in the specified Collection to the end of + * this list, in the order that they are returned by the + * specified Collection's Iterator. The behavior of this operation is + * undefined if the specified Collection is modified while the operation + * is in progress. (This implies that the behavior of this call is + * undefined if the specified Collection is this list, and this + * list is nonempty.) + * + * @param c the elements to be inserted into this list. + * @throws IndexOutOfBoundsException if index out of range <tt>(index + * < 0 || index > size())</tt>. + */ + synchronized public boolean addAll(Collection c) + { + int numNew = c.size(); + ensureCapacity(size + numNew); + + Iterator e = c.iterator(); + for (int i=0; i<numNew; i++) + { + Object o= e.next(); + if (o != null) + elementData[size++] = o; + } + return numNew != 0; + } + /** + * Inserts all of the elements in the specified Collection into this + * list, starting at the specified position. Shifts the element + * currently at that position (if any) and any subsequent elements to + * the right (increases their indices). The new elements will appear + * in the list in the order that they are returned by the + * specified Collection's iterator. + * + * @param index index at which to insert first element + * from the specified collection. + * @param c elements to be inserted into this list. + * @throws IndexOutOfBoundsException if index out of range <tt>(index + * < 0 || index > size())</tt>. + */ + synchronized public boolean addAll(int index, Collection c) + { + boolean ret= false; + if (elementData != null) + { + if (index > size || index < 0) + throw new IndexOutOfBoundsException( + "Index: "+index+", Size: "+size); + // only add the non-null elements + int sizeCol= c.size(); + Object[] arColl= new Object[sizeCol]; + Iterator icol= c.iterator(); + int curIndex= 0; + for (int i=0; i < sizeCol; i++) + { + Object o= icol.next(); + if (o != null) + arColl[curIndex++]= o; + } + int numNew = curIndex; + ensureCapacity(size + numNew); // Increments modCount!! + + int numMoved = size - index; + if (numMoved > 0) + System.arraycopy(elementData, index, elementData, index + numNew, + numMoved); + + for (int i=0; i<numNew; i++) + { + elementData[index++]= arColl[i]; + } + size += numNew; + ret= numNew != 0; + } + return ret; + } + + /** + * Removes all of the elements from this list. The list will + * be empty after this call returns. + */ + synchronized public void clear() + { + if (elementData != null) + { + // Let gc do its work + for (int i = 0; i < size; i++) + elementData[i] = null; + + size = 0; + } + } + /** + * Returns <tt>true</tt> if this list contains the specified element. + * + * @param elem element whose presence in this List is to be tested. + */ + synchronized public boolean contains(Object elem) + { + return indexOf(elem) >= 0; + } + + synchronized public boolean containsAll(Collection collection) + { + boolean retVal= true; + if (elementData != null && collection != null) + { + Iterator it= collection.iterator(); + while (it.hasNext()) + { + Object obj= it.next(); + if (false == contains(obj)) + { + retVal= false; + break; + } + } + } + return retVal; + } + /** + * Returns the element at the specified position in this list. + * + * @param index index of element to return. + * @return the element at the specified position in this list. + * @throws IndexOutOfBoundsException if index is out of range <tt>(index + * < 0 || index >= size())</tt>. + */ + synchronized public Object get(int index) + { + if (elementData != null) + { + RangeCheck(index); + return elementData[index]; + } + return null; + } + + /** + * Searches for the first occurence of the given argument, testing + * for equality using the <tt>equals</tt> method. + * + * @param elem an object. + * @return the index of the first occurrence of the argument in this + * list; returns <tt>-1</tt> if the object is not found. + * @see Object#equals(Object) + */ + synchronized public int indexOf(Object elem) + { + int index= -1; + if (elementData != null && elem != null) + { + for (int i = 0; i < size; i++) + { + if (elem == elementData[i]) + { + index= i; + break; + } + } + + if (index == -1) + { + for (int i = 0; i < size; i++) + { + if (UnoRuntime.areSame(elem, elementData[i])) + { + index= i; + break; + } + } + } + } + return index; + } + /** + * Tests if this list has no elements. + * + * @return <tt>true</tt> if this list has no elements; + * <tt>false</tt> otherwise. + */ + synchronized public boolean isEmpty() + { + return size == 0; + } + + synchronized public Iterator iterator() + { + if (elementData != null) + { + InterfaceContainer aCopy= (InterfaceContainer) clone(); + return new Itr(aCopy); + } + return null; + } + /** + * Returns the index of the last occurrence of the specified object in + * this list. + * + * @param elem the desired element. + * @return the index of the last occurrence of the specified object in + * this list; returns -1 if the object is not found. + */ + synchronized public int lastIndexOf(Object elem) + { + int index= -1; + if (elementData != null && elem != null) + { + for (int i = size-1; i >= 0; i--) + { + if (elem == elementData[i]) + { + index= i; + break; + } + } + if (index == -1) + { + for (int i = size-1; i >= 0; i--) + { + if (UnoRuntime.areSame(elem, elementData[i])) + { + index= i; + break; + } + } + } + } + return index; + } + + /** + * Returns a shallow copy of this <tt>ArrayList</tt> instance. The contained + * references are copied but the objects not. + * + * @return a clone of this <tt>List</tt> instance. + */ + synchronized public Object clone() + { + Object ret= null; + if (elementData != null) + { + InterfaceContainer cont= new InterfaceContainer(); + cont.elementData = new Object[size]; + cont.size= size; + System.arraycopy(elementData, 0, cont.elementData, 0, size); + ret= cont; + } + return ret; + } + synchronized public ListIterator listIterator() + { + return listIterator(0); + } + + /** The iterator keeps a copy of the list. Changes to InterfaceContainer do not + * affect the data of the iterator. Conversly, changes to the iterator are effect + * InterfaceContainer. + */ + synchronized public ListIterator listIterator(int index) + { + if (elementData != null) + { + InterfaceContainer aCopy= (InterfaceContainer) clone(); + return new LstItr(aCopy, index); + } + return null; + } + /** + * Removes the element at the specified position in this list. + * Shifts any subsequent elements to the left (subtracts one from their + * indices). + * + * @param index the index of the element to removed. + * @return the element that was removed from the list. + * @throws IndexOutOfBoundsException if index out of range <tt>(index + * < 0 || index >= size())</tt>. + */ + synchronized public Object remove(int index) + { + Object ret= null; + if (elementData != null) + { + RangeCheck(index); + ret= elementData[index]; + + int numMoved = size - index - 1; + if (numMoved > 0) + System.arraycopy(elementData, index+1, elementData, index, + numMoved); + elementData[--size] = null; // Let gc do its work + } + return ret; + } + + + /** Parameter obj may */ + synchronized public boolean remove(Object obj) + { + boolean ret= false; + if (elementData != null && obj != null) + { + int index= indexOf(obj); + if (index != -1) + { + ret= true; + remove(index); + } + } + return ret; + } + + synchronized public boolean removeAll(Collection collection) + { + boolean retVal= false; + if (elementData != null && collection != null) + { + Iterator it= collection.iterator(); + while (it.hasNext()) + { + Object obj= it.next(); + boolean bMod= remove( obj); + if (bMod) + retVal= true; + } + } + return retVal; + } + + synchronized public boolean retainAll(Collection collection) + { + boolean retVal= false; + if (elementData != null && collection != null) + { + // iterate over data + Object[] arRetained= new Object[size]; + int indexRetained= 0; + for(int i= 0; i < size; i++) + { + Object curElem= elementData[i]; + // try to find the element in collection + Iterator itColl= collection.iterator(); + boolean bExists= false; + while (itColl.hasNext()) + { + if (curElem == itColl.next()) + { + // current element is in collection + bExists= true; + break; + } + } + if (bExists == false) + { + itColl= collection.iterator(); + while (itColl.hasNext()) + { + Object o= itColl.next(); + if (o != null) + { + if (UnoRuntime.areSame(o, curElem)) + { + bExists= true; + break; + } + } + } + } + if (bExists == true) + arRetained[indexRetained++]= curElem; + } + retVal= size != indexRetained; + if (indexRetained > 0) + { + elementData= arRetained; + size= indexRetained; + } + } + return retVal; + } + + + /** Not supported. + * @param index index of element to replace. + * @param element element to be stored at the specified position. + * @return the element previously at the specified position. + * @throws IndexOutOfBoundsException if index out of range + * <tt>(index < 0 || index >= size())</tt>. + */ + synchronized public Object set(int index, Object element) + { + Object ret= null; + if (elementData != null && element != null) + { + RangeCheck(index); + ret = elementData[index]; + elementData[index] = element; + } + return ret; + } + + /** + * Returns the number of elements in this list. + * + * @return the number of elements in this list. + */ + synchronized public int size() + { + if (elementData != null) + return size; + return 0; + } + + + /** + * Returns an array containing all of the elements in this list + * in the correct order. + * + * @return an array containing all of the elements in this list + * in the correct order. + */ + synchronized public Object[] toArray() + { + if (elementData != null) + { + Object[] result = new Object[size]; + System.arraycopy(elementData, 0, result, 0, size); + return result; + } + return null; + } + + /** + * Returns an array containing all of the elements in this list in the + * correct order. The runtime type of the returned array is that of the + * specified array. If the list fits in the specified array, it is + * returned therein. Otherwise, a new array is allocated with the runtime + * type of the specified array and the size of this list.<p> + * + * If the list fits in the specified array with room to spare (i.e., the + * array has more elements than the list), the element in the array + * immediately following the end of the collection is set to + * <tt>null</tt>. This is useful in determining the length of the list + * <i>only</i> if the caller knows that the list does not contain any + * <tt>null</tt> elements. + * + * @param a the array into which the elements of the list are to + * be stored, if it is big enough; otherwise, a new array of the + * same runtime type is allocated for this purpose. + * @return an array containing the elements of the list. + * @throws ArrayStoreException if the runtime type of a is not a supertype + * of the runtime type of every element in this list. + */ + synchronized public Object[] toArray(Object a[]) + { + if (a.length < size) + a = (Object[])java.lang.reflect.Array.newInstance( + a.getClass().getComponentType(), size); + if (elementData != null) + System.arraycopy(elementData, 0, a, 0, size); + + if (a.length > size) + a[size] = null; + + return a; + } + + /** + * Check if the given index is in range. If not, throw an appropriate + * runtime exception. + */ + private void RangeCheck(int index) + { + if (index >= size || index < 0) + throw new IndexOutOfBoundsException( + "Index: "+index+", Size: "+size); + } + + public void disposeAndClear(EventObject evt) + { + Iterator aIt; + synchronized (this) + { + aIt= iterator(); + // Container freigeben, falls im disposing neue Eintraege kommen + // set the member to null, the iterator delete the values + clear(); + elementData= null; + size= 0; + } + if (aIt != null) + { + while( aIt.hasNext() ) + { + try + { + Object o= aIt.next(); + XEventListener evtListener= UnoRuntime.queryInterface( + XEventListener.class, o); + if( evtListener != null ) + evtListener.disposing( evt ); + } + catch ( RuntimeException e) + { + // be robust, if e.g. a remote bridge has disposed already. + // there is no way, to delegate the error to the caller :o(. + } + } + } + } + + + private class Itr implements Iterator + { + InterfaceContainer dataIt; + /** + * Index of element to be returned by subsequent call to next. + */ + int cursor= 0; + /** + * Index of element returned by most recent call to next or + * previous. Reset to -1 if this element is deleted by a call + * to remove. + */ + int lastRet = -1; + + /** The object that has been returned by most recent call to next + * or previous. Reset to null if this element is deleted by a call + * to remove. + */ + Object lastRetObj= null; + + Itr(InterfaceContainer _data) + { + dataIt= _data; + } + + synchronized public boolean hasNext() + { + return cursor !=dataIt.size(); + } + + public synchronized Object next() + { + try + { + Object next = dataIt.get(cursor); + lastRet = cursor++; + lastRetObj= next; + return next; + } + catch(java.lang.IndexOutOfBoundsException e) + { + throw new java.util.NoSuchElementException(); + } + } + + /** Removes the interface from the list, that has been last returned by a + * call to next(). This is done according to the specification of the interface + * method. The element is also removed from InterfaceContainer but independent + * of the location. If the element is multiple times in InterfaceContainer then + * it is up to the java.util.ArrayList implementation what element is removed. + */ + public synchronized void remove() + { + if (lastRet == -1) + throw new IllegalStateException(); + // Remove the entry from InterfaceContainer. + InterfaceContainer.this.remove(lastRetObj); + dataIt.remove(lastRet); + + if (lastRet < cursor) + cursor--; + lastRet = -1; + lastRetObj= null; + } + } + + private class LstItr extends Itr implements ListIterator + { + + LstItr(InterfaceContainer _data, int _index) + { + super(_data); + cursor= _index; + } + + /** Inserts an element to the iterators list according to the specification + * of this interface method. The element is also added to InterfaceContainer + * but its location within the list cannot be guaranteed. + */ + public synchronized void add(Object o) + { + InterfaceContainer.this.add(o); + dataIt.add(cursor++, o); + lastRet = -1; + lastRetObj= null; + } + + synchronized public boolean hasPrevious() + { + return cursor != 0; + } + + synchronized public int nextIndex() + { + return cursor; + } + + public synchronized Object previous() + { + try + { + Object previous = dataIt.get(--cursor); + lastRet = cursor; + lastRetObj= previous; + return previous; + } catch(IndexOutOfBoundsException e) + { + throw new NoSuchElementException(); + } + } + + synchronized public int previousIndex() + { + return cursor-1; + } + + /** This is not possible since several iterators can modify InterfaceContainer + */ + public synchronized void set(Object o) + { + throw new UnsupportedOperationException(); + } + + + } // class LstItr +} + diff --git a/javaunohelper/com/sun/star/lib/uno/helper/MultiTypeInterfaceContainer.java b/javaunohelper/com/sun/star/lib/uno/helper/MultiTypeInterfaceContainer.java new file mode 100644 index 000000000000..c8d401de287b --- /dev/null +++ b/javaunohelper/com/sun/star/lib/uno/helper/MultiTypeInterfaceContainer.java @@ -0,0 +1,168 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: MultiTypeInterfaceContainer.java,v $ + * $Revision: 1.4 $ + * + * 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.lib.uno.helper; +import com.sun.star.uno.Type; +import com.sun.star.lang.EventObject; +import java.util.HashMap; +import java.util.Map; +import java.util.Iterator; + +public class MultiTypeInterfaceContainer +{ + + private Map map= new HashMap(); + + /** Creates a new instance of MultiTypeInterfaceContainer */ + public MultiTypeInterfaceContainer() + { + } + + /** only returns types which have at least one value in InterfaceContainer + * return value can contain an element null, if someone called + * addInterface (null, interf) + */ + synchronized public Type[] getContainedTypes() + { + int size; + Type[] retVal= null; + + if ( (size=map.size()) > 0) + { + Type [] arTypes= new Type[size]; + Iterator it= map.keySet().iterator(); + + int countTypes= 0; + while (it.hasNext()) + { + Object key= it.next(); + InterfaceContainer cont= (InterfaceContainer) map.get(key); + if (cont != null && cont.size() > 0) + { + if (key == null) + arTypes[countTypes++]= new Type(); + else if (key instanceof Type) + arTypes[countTypes++]= (Type) key; + else if (key instanceof Class) + arTypes[countTypes++]= new Type((Class) key); + else + arTypes[countTypes++]= new Type(key.getClass()); + } + } + + if (countTypes != size) + { + retVal= new Type[countTypes]; + System.arraycopy(arTypes, 0, retVal, 0, countTypes); + } + else + retVal= arTypes; + } + if (retVal == null) + retVal= new Type[0]; + return retVal; + } + + /** param key can be null */ + synchronized public InterfaceContainer getContainer(Object key) + { + InterfaceContainer retVal= null; + Iterator it= map.keySet().iterator(); + while (it.hasNext()) + { + Object obj= it.next(); + if (obj == null && key == null) + { + retVal= (InterfaceContainer) map.get(null); + break; + } + else if( obj != null && obj.equals(key)) + { + retVal= (InterfaceContainer) map.get(obj); + break; + } + } + return retVal; + } + + + synchronized public int addInterface(Object ckey, Object iface) + { + //If the key is a Type then it does not matter if the objects are different + // if they represent the same type. This is because Types overrides hashCode and + // equals. For example: + // Type a= new Type(XInterface.class); + // Type b= new Type(XInterface.class); + // Allthough a != b , the map interprets both as being the same. + InterfaceContainer cont= (InterfaceContainer) map.get(ckey); + if (cont != null) + { + cont.add(iface); + } + else + { + cont= new InterfaceContainer(); + cont.add(iface); + map.put(ckey, cont); + } + return cont.size(); + } + + + synchronized public int removeInterface(Object key, Object iface) + { + int retVal= 0; + InterfaceContainer cont= (InterfaceContainer) map.get(key); + if (cont != null) + { + cont.remove(iface); + retVal= cont.size(); + } + return retVal; + } + + public void disposeAndClear(EventObject evt) + { + Iterator it= null; + synchronized(this) + { + it= map.values().iterator(); + } + while (it.hasNext() ) + ((InterfaceContainer) it.next()).disposeAndClear(evt); + } + + synchronized public void clear() + { + Iterator it= map.values().iterator(); + while (it.hasNext()) + ((InterfaceContainer) it.next()).clear(); + } +} diff --git a/javaunohelper/com/sun/star/lib/uno/helper/PropertySet.java b/javaunohelper/com/sun/star/lib/uno/helper/PropertySet.java new file mode 100644 index 000000000000..d77c1600def3 --- /dev/null +++ b/javaunohelper/com/sun/star/lib/uno/helper/PropertySet.java @@ -0,0 +1,1102 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: PropertySet.java,v $ + * $Revision: 1.11 $ + * + * 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.lib.uno.helper; + +import com.sun.star.uno.Type; +import com.sun.star.lang.EventObject; +import com.sun.star.lang.WrappedTargetException; +import com.sun.star.uno.TypeClass; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.XInterface; +import com.sun.star.uno.Any; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.beans.XPropertyChangeListener; +import com.sun.star.beans.XVetoableChangeListener; +import com.sun.star.beans.PropertyChangeEvent; +import com.sun.star.beans.XPropertySet; +import com.sun.star.beans.Property; +import com.sun.star.beans.PropertyAttribute; +import com.sun.star.beans.UnknownPropertyException; +import com.sun.star.beans.XPropertiesChangeListener; +import com.sun.star.beans.XPropertySetInfo; +import com.sun.star.beans.XFastPropertySet; +import com.sun.star.beans.PropertyVetoException; +import com.sun.star.beans.XMultiPropertySet; +import java.util.Iterator; +import java.util.Collection; +import java.util.HashMap; +import java.lang.reflect.Field; +import com.sun.star.lang.DisposedException; + + +/** This class is an implementation of the interfaces com.sun.star.beans.XPropertySet, + * com.sun.star.beans.XFastPropertySet and com.sun.star.beans.XMultiPropertySet. This + * class has to be inherited to be used. The values of properties are stored in member + * variables of the inheriting class. By overriding the methods + * {@link #convertPropertyValue convertPropertyValue}, + * {@link #setPropertyValueNoBroadcast setPropertyValueNoBroadcast} and + * {@link #getPropertyValue(Property)} one can determine how + * property values are stored. + * When using the supplied implementations of this class then the member variables which + * hold property values have to be declared in the class which inherits last in the inheriting + * chain and they have to be public<p> + * Properties have to be registered by one of the registerProperty methods. They take among other + * arguments an Object named <em>id</em> which has to be a String that represents the name of + * the member variable. The registering has to occur in the constructor of the inheriting class. + * It is no allowed to add or change properties later on.<p> + * Example: + * <pre> + * public class Foo extends PropertySet + * { + * protected int intProp; + * + * public Foo() + * { + * registerProperty("PropertyA", 0, new Type(int.class), (short)0, "intProp"); + * } + * } + * + * </pre> + */ +public class PropertySet extends ComponentBase implements XPropertySet, XFastPropertySet, +XMultiPropertySet +{ + private HashMap _nameToPropertyMap; + private HashMap _handleToPropertyMap; + private HashMap _propertyToIdMap; + private Property[] arProperties; + + private int lastHandle= 1; + + protected XPropertySetInfo propertySetInfo; + protected MultiTypeInterfaceContainer aBoundLC= new MultiTypeInterfaceContainer(); + protected MultiTypeInterfaceContainer aVetoableLC= new MultiTypeInterfaceContainer(); + public PropertySet() + { + super(); + initMappings(); + } + + /** Registers a property with this helper class and associates the argument <em>id</em> with it. + * <em>id</em> is used to identify the storage of the property value. How property values are stored + * and retrieved is determined by the methods {@link #convertPropertyValue convertPropertyValue}, + * {@link #setPropertyValueNoBroadcast setPropertyValueNoBroadcast} and {@link #getPropertyValue(Property) getPropertyValue} + * These methods expect <em>id</em> to be a java.lang.String which represents the name of a member variable + * which holds the property value. + * Only properties which are registered can be accessed. Registration has to occur during + * initialization of the inheriting class (i.e. within the contructor). + * @param prop The property to be registered. + * @param id Identifies the properties storage. + * @see #getPropertyId + */ + protected void registerProperty(Property prop, Object id) + { + putProperty(prop); + assignPropertyId(prop, id); + } + + /** Registers a property with this helper class and associates the argument id with it. + * It does the same as {@link #registerProperty(Property, Object)}. The first four + * arguments are used to construct a Property object. + * Registration has to occur during + * initialization of the inheriting class (i.e. within the contructor) + * @param name The property's name (Property.Name). + * @param handle The property's handle (Property.Handle). + * @param Type The property's type (Property.Type). + * @param attributes The property's attributes (Property.Attributes). + * @param id Identifies the property's storage. + */ + protected void registerProperty(String name, int handle, Type type, short attributes, Object id) + { + Property p= new Property(name, handle, type, attributes); + registerProperty(p, id); + } + + /** Registers a property with this class and associates the argument id with it. + * It does the same as {@link #registerProperty(Property, Object)}. The first three + * arguments are used to construct a Property object. The value for the Property.Handle + * is generated and does not have to be specified here. Use this method for registering + * a property if you do not care about the Property's handles. + * Registration has to occur during + * initialization of the inheriting class (i.e. within the contructor). + * @param name The property's name (Property.Name). + * @param handle The property's handle (Property.Handle). + * @param Type The property's type (Property.Type). + * @param attributes The property's attributes (Property.Attributes). + * @param id Identifies the property's storage. + */ + protected void registerProperty(String name, Type type, short attributes, Object id) + { + Property p= new Property(name, lastHandle++, type, attributes); + registerProperty(p, id); + } + + /** Registers a property with this class. This method expects that property values + * are stored in member variables as is the case if the methods convertPropertyValue, + * setPropertyValueNoBroadcast and getPropertyValue(Property) are not overridden. + * It is presumed that the type of the member variable + * corresponds Property.Type. For example, if the TypeClass of Property.Type is to be + * a TypeClass.SHORT then the member must be a short or java.lang.Short. + * The handle for the property is generated.<br> + * If there is no member with the specified name or if the member has an incompatible type + * then a com.sun.star.uno.RuntimeException is thrown. + * @param propertyName The name of the property. + * @param memberName The name of the member variable that holds the value of the property. + * @param attributes The property attributes. + */ + protected void registerProperty(String propertyName, String memberName, short attributes) + { + Field propField= null; + try + { + propField= getClass().getDeclaredField(memberName); + } + catch (NoSuchFieldException e) + { + throw new com.sun.star.uno.RuntimeException("there is no member variable: " + memberName); + } + Class cl= propField.getType(); + Type t= new Type(cl); + if (t.getTypeClass() != TypeClass.UNKNOWN) + { + Property p= new Property(propertyName, lastHandle++, t, attributes); + registerProperty(p,memberName); + } + else + throw new com.sun.star.uno.RuntimeException("the member has an unknown type: " + memberName); + } + + /** Registers a property with this class. + * It is presumed that the name of property is equal to the name of the member variable + * that holds the property value. + * @param propertyName The name of the property and the member variable that holds the property's value. + * @param attributes The property attributes. + * @see #registerProperty(String, String, short) + */ + protected void registerProperty(String propertyName, short attributes) + { + registerProperty(propertyName, propertyName, attributes); + } + + + + /** Returns the Property object for a given property name or null if that property does + * not exists (i.e. it has not been registered). Override this method + * if you want to implement your own mapping from property names to Property objects. + * Then you also have to override {@link #initMappings}, {@link #getProperties()} and + * {@link #putProperty(Property)}. + * @param propertyName The name of the property (Property.Name) + * @return The Property object with the name <em>propertyName</em>. + */ + protected Property getProperty(String propertyName) + { + return (Property) _nameToPropertyMap.get(propertyName); + } + + /** Returns the Property object with a handle (Property.Handle) as specified by the argument + * <em>nHandle</em>. The method returns null if there is no such property (i.e. it has not + * been registered). Override this method if you want to implement your own mapping from handles + * to Property objects. Then you also have to override {@link #initMappings}, {@link #putProperty(Property)}. + * @param nHandle The handle of the property (Property.Handle). + * @return The Property object with the handle <em>nHandle</em> + */ + protected Property getPropertyByHandle(int nHandle) + { + return (Property) _handleToPropertyMap.get(new Integer(nHandle)); + } + + /** Returns an array of all Property objects or an array of length null if there + * are no properties. Override this method if you want to implement your own mapping from names + * to Property objects. Then you also have to override {@link #initMappings}, {@link #getProperty(String)} and + * {@link #putProperty}. + * @return Array of all Property objects. + */ + protected Property[] getProperties() + { + if (arProperties == null) + { + Collection values= _nameToPropertyMap.values(); + arProperties= (Property[]) values.toArray(new Property[_nameToPropertyMap.size()]); + } + return arProperties; + } + + /** Stores a Property object so that it can be retrieved subsequently by + * {@link #getProperty(String)},{@link #getProperties()},{@link #getPropertyByHandle(int)}. + * Override this method if you want to implement your own mapping from handles + * to Property objects and names to Property objects. Then you also need to override {@link #initMappings}, + * {@link #getProperty(String)},{@link #getProperties()},{@link #getPropertyByHandle(int)}. + * @param prop The Property object that is to be stored. + */ + protected void putProperty(Property prop) + { + _nameToPropertyMap.put(prop.Name, prop); + if (prop.Handle != -1) + _handleToPropertyMap.put(new Integer(prop.Handle), prop); + } + + /** Assigns an identifyer object to a Property object so that the identifyer + * can be obtained by {@link #getPropertyId getPropertyId} later on. The identifyer + * is used to specify a certain storage for the property's value. If you do not + * override {@link #setPropertyValueNoBroadcast setPropertyValueNoBroadcast} or {@link #getPropertyValue(Property)} + * then the argument <em>id</em> has to be a java.lang.String that equals the name of + * the member variable that holds the Property's value. + * Override this method if you want to implement your own mapping from Property objects to ids or + * if you need ids of a type other then java.lang.String. + * Then you also need to override {@link #initMappings initMappings} and {@link #getPropertyId getPropertyId}. + * @param prop The Property object that is being assigned an id. + * @param id The object which identifies the storage used for the property's value. + * @see #registerProperty(Property, Object) + */ + protected void assignPropertyId(Property prop, Object id) + { + if (id instanceof String && ((String) id).equals("") == false) + _propertyToIdMap.put(prop, id); + } + + /** Returns the identifyer object for a certain Property. The object must have been + * previously assigned to the Property object by {@link #assignPropertyId assignPropertyId}. + * Override this method if you want to implement your own mapping from Property objects to ids. + * Then you also need to override {@link #initMappings initMappings} and {@link #assignPropertyId assignPropertyId}. + * @param prop The property for which the id is to be retrieved. + * @return The id object that identifies the storage used for the property's value. + * @see #registerProperty(Property, Object) + */ + protected Object getPropertyId(Property prop) + { + return _propertyToIdMap.get(prop); + } + + /** Initializes data structures used for mappings of property names to property object, + * property handles to property objects and property objects to id objects. + * Override this method if you want to implement your own mappings. Then you also need to + * override {@link #putProperty putProperty},{@link #getProperty getProperty}, {@link #getPropertyByHandle}, + * {@link #assignPropertyId assignPropertyId} and {@link #getPropertyId getPropertyId}. + */ + protected void initMappings() + { + _nameToPropertyMap= new HashMap(); + _handleToPropertyMap= new HashMap(); + _propertyToIdMap= new HashMap(); + } + + /** Makes sure that listeners which are kept in aBoundLC (XPropertyChangeListener) and aVetoableLC + * (XVetoableChangeListener) receive a disposing call. Also those listeners are relesased. + */ + protected void postDisposing() + { + // Create an event with this as sender + EventObject aEvt= new EventObject(this); + + // inform all listeners to reelease this object + aBoundLC.disposeAndClear(aEvt); + aVetoableLC.disposeAndClear(aEvt); + } + + //XPropertySet ---------------------------------------------------- + synchronized public void addPropertyChangeListener(String str, XPropertyChangeListener xPropertyChangeListener) + throws UnknownPropertyException, WrappedTargetException + { + // only add listeners if you are not disposed + if (! bInDispose && ! bDisposed) + { + if (str.length() > 0) + { + Property prop= getProperty(str); + if (prop == null) + throw new UnknownPropertyException("Property " + str + " is unknown"); + + // Add listener for a certain property + if ((prop.Attributes & PropertyAttribute.BOUND) > 0) + aBoundLC.addInterface(str, xPropertyChangeListener); + else + //ignore silently + return; + } + else + // Add listener for all properties + listenerContainer.addInterface(XPropertyChangeListener.class, xPropertyChangeListener); + } + } + //XPropertySet ---------------------------------------------------- + synchronized public void addVetoableChangeListener(String str, com.sun.star.beans.XVetoableChangeListener xVetoableChangeListener) throws com.sun.star.beans.UnknownPropertyException, com.sun.star.lang.WrappedTargetException + { + // only add listeners if you are not disposed + if (! bInDispose && ! bDisposed) + { + if (str.length() > 0) + { + Property prop= getProperty(str); + if (prop == null) + throw new UnknownPropertyException("Property " + str + " is unknown"); + + // Add listener for a certain property + if ((prop.Attributes & PropertyAttribute.CONSTRAINED) > 0) + aVetoableLC.addInterface(str, xVetoableChangeListener); + else + //ignore silently + return; + } + else + // Add listener for all properties + listenerContainer.addInterface(XVetoableChangeListener.class, xVetoableChangeListener); + } + } + //XPropertySet ---------------------------------------------------- + public com.sun.star.beans.XPropertySetInfo getPropertySetInfo() + { + if (propertySetInfo == null) + { + synchronized (this) + { + if (propertySetInfo == null) + propertySetInfo= new PropertySetInfo(); + } + } + return propertySetInfo; + } + //XPropertySet ---------------------------------------------------- + public Object getPropertyValue(String name) throws UnknownPropertyException, WrappedTargetException + { + Object ret= null; + if (bInDispose || bDisposed) + throw new com.sun.star.lang.DisposedException("The component has been disposed already"); + + Property prop= getProperty(name); + if (prop == null) + throw new UnknownPropertyException("The property " + name + " is unknown"); + + synchronized (this) + { + ret= getPropertyValue(prop); + } + // null must not be returned. Either a void any is returned or an any containing + // an interface type and a null reference. + if (ret == null) + { + if (prop.Type.getTypeClass() == TypeClass.INTERFACE) + ret= new Any(prop.Type, null); + else + ret= new Any(new Type(void.class), null); + } + return ret; + } + + //XPropertySet ---------------------------------------------------- + synchronized public void removePropertyChangeListener(String propName, XPropertyChangeListener listener) throws UnknownPropertyException, WrappedTargetException + { // all listeners are automaticly released in a dispose call + if (!bInDispose && !bDisposed) + { + if (propName.length() > 0) + { + Property prop = getProperty(propName); + if (prop == null) + throw new UnknownPropertyException("Property " + propName + " is unknown"); + aBoundLC.removeInterface(propName, listener); + } + else + listenerContainer.removeInterface(XPropertyChangeListener.class, listener); + } + } + + //XPropertySet ---------------------------------------------------- + synchronized public void removeVetoableChangeListener(String propName, XVetoableChangeListener listener) throws UnknownPropertyException, WrappedTargetException + {// all listeners are automaticly released in a dispose call + if (!bInDispose && !bDisposed) + { + if (propName.length() > 0) + { + Property prop = getProperty(propName); + if (prop == null) + throw new UnknownPropertyException("Property " + propName + " is unknown"); + aVetoableLC.removeInterface(propName, listener); + } + else + listenerContainer.removeInterface(XVetoableChangeListener.class, listener); + } + } + + //XPropertySet ---------------------------------------------------- + /** Sets the value of a property. + * The idl description for this interfaces, stipulates that the argument value is an Any. Since a java.lang.Object + * reference has the same meaning as an Any this function accepts + * java anys (com.sun.star.uno.Any) and all other appropriate objects as arguments. The value argument can be one + * of these: + * <ul> + * <li>java.lang.Boolean</li> + * <li>java.lang.Character</li> + * <li>java.lang.Byte</li> + * <li>java.lang.Short</li> + * <li>java.lang.Integer</li> + * <li>java.lang.Long</li> + * <li>java.lang.Float</li> + * <li>java.lang.Double</li> + * <li>java.lang.String</li> + * <li>com.sun.star.uno.Type</li> + * <li><em>objects which implement UNO interfaces</em></li> + * <li><em>arrays which contain elements of the types above</em></li> + * <li>com.sun.star.uno.Any containing an instance of one of the above types</li> + * </ul> + * + * Properties can have the attribute com.sun.star.beans.PropertyAttribute.MAYBEVOID, which means that the value + * (not the type) can be void. In order to assign a void value to a property one can either pass an Any which + * contains a null reference or pass null directly. In bothe cases the null reference is only accepted if + * the PropertyAttribute.MAYBEVOID attribute is set for the property. + * + * Properties which have the attribute MAYBEVOID set (Property.Attributes) can have a void value. The following + * considerations presume that the Property has that attribute set. Further, when mentioning an Any's value we + * actually refer to the object returned by Any.getObject. + * If the argument <em>value</em> is null, or it is an Any whose value is null (but with a valid Type) + * then the member variable used for storing the property's value is set to null. + * Therefore those properties can only be stored in objects + * and primitive types are not allowed (one can use the wrapper classes instead,e.g. java.lang.Byte) . + * If a property's value is kept in a member variable of type Any and that reference is still null + * then when setPropertyValue is called with + * <em>value</em> = null then the member variable is assigned an Any with type void and a null value. + * Or if the argument is an Any with a null value then it is assigned to the member variable. + * Further, if the variable already + * references an Any and setPropertyValue is called with <em>value</em> = null, then the variable is assigned + * a new Any with the same type as the previously referenced Any and with a null value. + * @param name The name of the property. + * @param value The new value of the property. + * * */ + public void setPropertyValue(String name, Object value) throws UnknownPropertyException, + PropertyVetoException, com.sun.star.lang.IllegalArgumentException, WrappedTargetException + { + Property prop= getProperty(name); + if (prop == null) + throw new UnknownPropertyException("Property " + name + " is unknown"); + setPropertyValue(prop, value); + } + + /** Sets the value of a property. It checks if the property's attributes (READONLY,MAYBEVOID), allow that the + * new value can be set. It also causes the notification of listeners. + * @param prop The property whose value is to be set. + * @param value The new value for the property. + */ + protected void setPropertyValue(Property prop, Object value) throws UnknownPropertyException, + PropertyVetoException, com.sun.star.lang.IllegalArgumentException, WrappedTargetException + { + if ((prop.Attributes & PropertyAttribute.READONLY) == PropertyAttribute.READONLY) + throw new com.sun.star.beans.PropertyVetoException(); + // The value may be null only if MAYBEVOID attribute is set + boolean bVoidValue= false; + if (value instanceof Any) + bVoidValue= ((Any) value).getObject() == null; + else + bVoidValue= value == null; + if (bVoidValue && (prop.Attributes & PropertyAttribute.MAYBEVOID) == 0) + throw new com.sun.star.lang.IllegalArgumentException("The property must have a value; the MAYBEVOID attribute is not set!"); + if (bInDispose || bDisposed) + throw new DisposedException("Component is already disposed"); + + //Check if the argument is allowed + boolean bValueOk= false; + if (value instanceof Any) + bValueOk= checkType(((Any) value).getObject()); + else + bValueOk= checkType(value); + if (! bValueOk) + throw new com.sun.star.lang.IllegalArgumentException("No valid UNO type"); + + + boolean bConversionOk= false; + Object[] outConvertedVal= new Object[1]; + Object[] outOldValue= new Object[1]; + synchronized (this) + { + bConversionOk= convertPropertyValue(prop, outConvertedVal, outOldValue, value); + } + + //The next step following the conversion is to set the new value of the property. Prior to this + // the XVetoableChangeListener s have to be notified. + if (bConversionOk) + { + // If the property is CONSTRAINED, then we must notify XVetoableChangeListener. The listener can throw a com.sun.star.lang.beans.PropertyVetoException which + // will cause this method to return (the exception is not caught here). + fire( new Property[]{prop}, outConvertedVal, outOldValue, true); + + synchronized (this) + { + setPropertyValueNoBroadcast(prop, outConvertedVal[0]); + } + // fire a change event (XPropertyChangeListener, PropertyAttribute.BOUND + fire( new Property[]{prop}, outConvertedVal, outOldValue, false); + } + } + + /** Converts a value in a way so that it is appropriate for storing as a property value, that is + * {@link #setPropertyValueNoBroadcast setPropertyValueNoBroadcast} can process the value without any further + * conversion. This implementation presumes that + * the values are stored in member variables of the furthest inheriting class. For example, + * class A inherits this class then members of class A + * can hold property values. If there is a class B which inherits A then only members of B can hold + * property values. The variables must be public. A property must have been registered (e.g. by + * {@link #registerProperty(Property, Object)} in order for this method to work. The identifyer argument (type Object) + * used in the registerProperty methods must + * be a java.lang.String, which is, the name of the member variable that holds the property value. + * If one opts to store values differently then one may override + * this method, as well as {@link #setPropertyValueNoBroadcast setPropertyValueNoBroadcast} and + * {@link #getPropertyValue(Property) getPropertyValue(Property)}. + * This method is always called as a result of a call to one of the setter methods, such as + * {@link #setPropertyValue(String,Object) XPropertySet.setPropertyValue}, + * {@link #setFastPropertyValue XFastPropertySet.setFastPropertyValue} + * and {@link #setPropertyValues XMultiPropertySet.setPropertyValues}. + * If this method fails, that is, it returns false or throws an exception, then no listeners are notified and the + * property value, that was intended to be changed, remains untouched.<br /> This method does not have to deal with property attributes, such as + * PropertyAttribute.READONLY or PropertyAttribute.MAYBEVOID. The processing of these attributes occurs + * in the calling methods.<br /> + * Only if this method returns successfully further processing, such + * as listener notification and finally the modifiction of the property's value, will occur.<br /> + * + * The actual modification of a property's value is done by {@link #setPropertyValueNoBroadcast setPropertyValueNoBroadcast} + * which is called subsequent to convertPropertyValue. + *<p> + * This method converts values by help of the com.sun.star.uno.AnyConverter which only does a few widening + * conversions on integer types and floating point types. For example, there is the property PropA with a Type equivalent + * to int.class and the + * value of the property is to be stored in a member variable of type int with name intProp. Then setPropertyValue is + * called: + * <pre> + * set.setPropertyValue( "PropA", new Byte( (byte)111)); + * </pre> + * At some point setPropertyValue will call convertPropertyValue and pass in the Byte object. Since we allow + * that Byte values can be used with the property and know that the value is to be stored in intProp (type int) + * we convert the Byte object into an Integer object which is then returned in the out-parameter <em>newVal</em>. This + * conversion is actually performed by the AnyConverter. Later + * the setPropertyValueNoBroadcast is called with that Integer object and the int value can be easily extracted + * from the object and be assigned to the member intProp. + * <p> + * The method handles Any arguments the same as Object arguments. That is, the <em>setVal</em> argument can + * be a java.lang.Boolean or a com.sun.star.uno.Any containing a java.lang.Boolean. Likewise, a member + * containing a property value can be a com.sun.star.uno.Any or an java.lang.Object. + * Then, no conversion is necessary, since they can hold all possible values. However, if + * the member is an Object and <em>setVal</em> is an Any then the object contained in the any is assigned to + * the member. The extra type information which exists as Type object in the Any will get lost. If this is not + * intended then use an Any variable rather then an Object.<br /> + * If a member is an Object or Any and the argument <em>setVal</em> is an Object, other than String or array, + * then it is presumed to be an UNO object and queried for XInterface. If successful, the out-param <em>newVal</em> + * returns the XInterface.<br /> + * If a member is an UNO interface, then <em>setVal</em> is queried for this interface and the result is returned. + * If <em>setVal</em> is null then <em>newVal</em> will be null too after return. + * <p> + * If a property value is stored using a primitive type the the out-parameters + * <em>curVal</em> and <em>newVal</em> contain the respective wrapper class (e.g.java.lang.Byte, etc.). + * curVal is used in calls to the XVetoableChangeListener and XPropertyChangeListener. + * + * @param property - in-param property for which the data is to be converted. + * @param newVal - out-param which contains the converted value on return. + * @param curVal - out-param the current value of the property. It is used in calls to the + * XVetoableChangeListener and XPropertyChangeListener. + * @param setVal - in-param. The value that is to be converted so that it matches Property and the internally used + * dataformat for that property. + * @return true - Conversion was successful. <em>newVal</em> contains a valid value for the property. false - + * conversion failed for some reason. + * @throws com.sun.star.lang.IllegalArgumentException The value provided is unfit for the property. + * @throws com.sun.star.lang.WrappedTargetException - An exception occured during the conversion, that is to be made known + * to the caller. + */ + protected boolean convertPropertyValue(Property property, Object[] newVal, Object[]curVal, Object setVal) + throws com.sun.star.lang.IllegalArgumentException, WrappedTargetException, UnknownPropertyException + { + boolean ret= true; + try + { + // get the member name + String sMember= (String) getPropertyId(property); + if (sMember != null) + { + // use reflection to obtain the field that holds the property value + // Class.getDeclaredFields does not return inherited fields. One could use Class.getFields to + // also get inherited fields, but only those which are public. + Field propField= getClass().getDeclaredField(sMember); + if (propField != null) + { + curVal[0]= propField.get(this); + Class memberClass= propField.getType(); + + // MAYBEVOID: if setVal == null or it is an Any and getObject returns null, then a void value is to be set + // This works only if there are no primitive types. For those we use the respective wrapper classes. + // In this implementation, a null reference means void value. + boolean bVoidValue= false; + boolean bAnyVal= setVal instanceof Any; + if (bAnyVal) + bVoidValue= ((Any) setVal).getObject() == null; + else + bVoidValue= setVal == null; + if (bVoidValue && memberClass.isPrimitive()) + throw new com.sun.star.lang.IllegalArgumentException("The implementation does not support the MAYBEVOID attribute for this property"); + + Object convObj= null; + //The member that keeps the value of the Property is an Any. It can contain all possible + //types, therefore a conversion is not necessary. + if (memberClass.equals(Any.class)) + { + if (bAnyVal) + //parameter setVal is also an Any and can be used without further processing + convObj= setVal; + else + { + // Parameter setVal is not an Any. We need to construct an Any that contains + // the argument setVal. + // If setVal is an interface implementation then, we cannot constuct the + // Any with setVal.getClass(), because the Any.Type._typeClass would be TypeClass.UNKNOWN. + // We try to get an XInterface of setVal and set an XInterface type. + if (setVal instanceof XInterface) + { + XInterface xint= UnoRuntime.queryInterface(XInterface.class, setVal); + if (xint != null) + convObj= new Any(new Type(XInterface.class), xint); + } + // The member is an any, and the past in argument was null reference (MAYBEVOID is set) + else if (setVal == null) + { + // if the any member is still null we create a void any + if (curVal[0] == null) + convObj= new Any(new Type(), null); + else + { + //otherwise we create an Any with the same type as a value of null; + convObj= new Any( ((Any)curVal[0]).getType(), null); + } + } + else + convObj= new Any(new Type(setVal.getClass()), setVal); + } + } + else + convObj= convert(memberClass, setVal); + newVal[0]= convObj; + } + } + else + throw new UnknownPropertyException("Property " + property.Name + " is unknown"); + } + catch (java.lang.NoSuchFieldException e) + { + throw new WrappedTargetException("Field does not exist", this, e); + } + catch (java.lang.IllegalAccessException e) + { + throw new WrappedTargetException("", this ,e); + } + return ret; + } + + private boolean checkType(Object obj) + { + if (obj == null + || obj instanceof Boolean + || obj instanceof Character + || obj instanceof Number + || obj instanceof String + || obj instanceof XInterface + || obj instanceof Type + || obj instanceof com.sun.star.uno.Enum + || obj.getClass().isArray()) + return true; + return false; + } + + // Param object can be an Any or other object. If obj is null then the return value is null + private Object convert( Class cl, Object obj) throws com.sun.star.lang.IllegalArgumentException + { + Object retVal= null; + //The member that keeps the value of the Property is an Object.Objects are similar to Anys in that they can + // hold all types. + if (obj == null || (obj instanceof Any && ((Any) obj).getObject() == null)) + retVal= null; + else if(cl.equals(Object.class)) + { + if (obj instanceof Any) + obj= ((Any) obj).getObject(); + retVal= obj; + } + else if(cl.equals(boolean.class)) + retVal= new Boolean(AnyConverter.toBoolean(obj)); + else if (cl.equals(char.class)) + retVal= new Character(AnyConverter.toChar(obj)); + else if (cl.equals(byte.class)) + retVal= new Byte(AnyConverter.toByte(obj)); + else if (cl.equals(short.class)) + retVal= new Short(AnyConverter.toShort(obj)); + else if (cl.equals(int.class)) + retVal= new Integer(AnyConverter.toInt(obj)); + else if (cl.equals(long.class)) + retVal= new Long(AnyConverter.toLong(obj)); + else if (cl.equals(float.class)) + retVal= new Float(AnyConverter.toFloat(obj)); + else if (cl.equals(double.class)) + retVal= new Double(AnyConverter.toDouble(obj)); + else if (cl.equals(String.class)) + retVal= AnyConverter.toString(obj); + else if (cl.isArray()) + retVal= AnyConverter.toArray(obj); + else if (cl.equals(Type.class)) + retVal= AnyConverter.toType(obj); + else if (cl.equals(Boolean.class)) + retVal= new Boolean(AnyConverter.toBoolean(obj)); + else if (cl.equals(Character.class)) + retVal= new Character(AnyConverter.toChar(obj)); + else if (cl.equals(Byte.class)) + retVal= new Byte(AnyConverter.toByte(obj)); + else if (cl.equals(Short.class)) + retVal= new Short(AnyConverter.toShort(obj)); + else if (cl.equals(Integer.class)) + retVal= new Integer(AnyConverter.toInt(obj)); + else if (cl.equals(Long.class)) + retVal= new Long(AnyConverter.toLong(obj)); + else if (cl.equals(Float.class)) + retVal= new Float(AnyConverter.toFloat(obj)); + else if (cl.equals(Double.class)) + retVal= new Double(AnyConverter.toDouble(obj)); + else if (XInterface.class.isAssignableFrom(cl)) + retVal= AnyConverter.toObject(new Type(cl), obj); + else if (com.sun.star.uno.Enum.class.isAssignableFrom(cl)) + retVal= AnyConverter.toObject(new Type(cl), obj); + else + throw new com.sun.star.lang.IllegalArgumentException("Could not convert the argument"); + return retVal; + } + + /** Sets the value of a property. In this implementation property values are stored in member variables + * (see {@link #convertPropertyValue convertPropertyValue} Notification of property listeners + * does not occur in this method. By overriding this method one can take full control about how property values + * are stored. But then, the {@link #convertPropertyValue convertPropertyValue} and + * {@link #getPropertyValue(Property)} must be overridden too. + * + * A Property with the MAYBEVOID attribute set, is stored as null value. Therefore the member variable must be + * an Object in order to make use of the property attribute. An exception is Any. The Any variable can be initially null, but + * once it is set the reference will not become null again. If the value is to be set to + * void then a new Any will be stored + * with a valid type but without a value (i.e. Any.getObject returns null). + * If a property has the READONLY attribute set, and one of the setter methods, such as setPropertyValue, has been + * called, then this method is not going to be called. + * @param property the property for which the new value is set + * @param value the new value for the property. + * @throws com.sun.star.lang.WrappedTargetException An exception, which has to be made known to the caller, + * occured during the setting of the value. + */ + protected void setPropertyValueNoBroadcast(Property property, Object newVal) + throws WrappedTargetException + { + try + { + // get the member name + String sMember= (String) getPropertyId(property); + if (sMember != null) + { + // use reflection to obtain the field that holds the property value + // Class.getDeclaredFields does not return inherited fields. One could use Class.getFields to + // also get inherited fields, but only those which are public. + Field propField= getClass().getDeclaredField(sMember); + if (propField != null) + propField.set(this, newVal); + } + } + catch(java.lang.Exception e) + { + throw new WrappedTargetException("PropertySet.setPropertyValueNoBroadcast", this, e); + } + } + /** Retrieves the value of a property. This implementation presumes that the values are stored in member variables + * of the furthest inheriting class (see {@link #convertPropertyValue convertPropertyValue}) and that the + * variables are public. The property must have + * been registered, for example by {@link #registerProperty(Property, Object)}. The identifyer Object argument + * must have been a java.lang.String which was the name of the member variable holding the property value. + * When properties are to be stored differently one has to override this method as well as + * {@link #convertPropertyValue} and {@link #setPropertyValueNoBroadcast}. <br> + * If a value is stored in a variable of a primitive type then this method returns an instance of the respective + * wrapper class (e.g. java.lang.Boolean). + * @param property The property for which the value is to be retrieved. + * @return The value of the property. + */ + protected Object getPropertyValue(Property property) + throws com.sun.star.lang.WrappedTargetException + { + Object ret= null; + try + { + // get the member name + String sMember= (String) getPropertyId(property); + if (sMember != null) + { + // use reflection to obtain the field that holds the property value + // Class.getDeclaredFields does not return inherited fields. One could use Class.getFields to + // also get inherited fields, but only those which are public. + Field propField= getClass().getDeclaredField(sMember); + if (propField != null) + ret= propField.get(this); + } + } + catch(java.lang.Exception e) + { + throw new WrappedTargetException("PropertySet.setPropertyValue_NoBroadcast", this, e); + } + return ret; + } + + /** + * This method fires events to XPropertyChangeListener,XVetoableChangeListener and + * XPropertiesChangeListener event sinks. + * To distinguish what listeners are to be called the argument <em>bVetoable</em> is to be set to true if + * a XVetoableChangeListener is meant. For XPropertyChangeListener and XPropertiesChangeListener + * it is to be set to false. + * + * @param properties Properties wich will be or have been affected. + * @param newValues the new values of the properties. + * @param oldValues the old values of the properties. + * @param bVetoable true means fire to VetoableChangeListener, false means fire to + * XPropertyChangedListener and XMultiPropertyChangedListener. + */ + protected void fire( + Property[] properties, + Object[] newValues, + Object[] oldValues, + boolean bVetoable ) throws PropertyVetoException + { + // Only fire, if one or more properties changed + int nNumProps= properties.length; + if (nNumProps > 0) + { + PropertyChangeEvent[] arEvts= new PropertyChangeEvent[nNumProps]; + int nAffectedProps= 0; + // Loop over all changed properties to fill the event struct + for (int i= 0; i < nNumProps; i++) + { + if ((bVetoable && (properties[i].Attributes & PropertyAttribute.CONSTRAINED) > 0) + || (!bVetoable && (properties[i].Attributes & PropertyAttribute.BOUND) > 0)) + { + arEvts[i]= new PropertyChangeEvent(this, properties[i].Name, false, + properties[i].Handle, oldValues[i], newValues[i]); + nAffectedProps++; + } + } + // fire the events for all changed properties + for (int i= 0; i < nAffectedProps; i++) + { + // get the listener container for the property name + InterfaceContainer lc= null; + if (bVetoable) + lc= aVetoableLC.getContainer(arEvts[i].PropertyName); + else + lc= aBoundLC.getContainer(arEvts[i].PropertyName); + if (lc != null) + { + Iterator it= lc.iterator(); + while( it.hasNext()) + { + Object listener= it.next(); + if (bVetoable) + ((XVetoableChangeListener) listener).vetoableChange(arEvts[i]); + else + ((XPropertyChangeListener) listener).propertyChange(arEvts[i]); + } + } + // broadcast to all listeners with "" property name + if(bVetoable) + lc= listenerContainer.getContainer(XVetoableChangeListener.class); + else + lc= listenerContainer.getContainer(XPropertyChangeListener.class); + if(lc != null) + { + Iterator it= lc.iterator(); + while(it.hasNext() ) + { + Object listener= it.next(); + if( bVetoable ) // fire change Events? + ((XVetoableChangeListener) listener).vetoableChange(arEvts[i]); + else + ((XPropertyChangeListener) listener).propertyChange(arEvts[i]); + } + } + } + // fire at XPropertiesChangeListeners + // if nAffectedProps == 0 then there are no BOUND properties + if (!bVetoable && nAffectedProps > 0) + { + + PropertyChangeEvent[] arReduced= new PropertyChangeEvent[nAffectedProps]; + System.arraycopy(arEvts, 0, arReduced, 0, nAffectedProps); + InterfaceContainer lc= listenerContainer.getContainer(XPropertiesChangeListener.class); + if (lc != null) + { + Iterator it= lc.iterator(); + while (it.hasNext()) + { + XPropertiesChangeListener listener = (XPropertiesChangeListener) it.next(); + // fire the hole event sequence to the XPropertiesChangeListener's + listener.propertiesChange( arEvts ); + } + } + } + } + } + // XFastPropertySet-------------------------------------------------------------------------------- + public void setFastPropertyValue(int nHandle, Object aValue ) throws UnknownPropertyException, + PropertyVetoException, com.sun.star.lang.IllegalArgumentException, WrappedTargetException + { + Property prop= getPropertyByHandle(nHandle); + if (prop == null) + throw new UnknownPropertyException(" The property with handle : " + nHandle +" is unknown"); + setPropertyValue(prop, aValue); + } + + // XFastPropertySet -------------------------------------------------------------------------------- + public Object getFastPropertyValue(int nHandle ) throws UnknownPropertyException, + WrappedTargetException + { + Property prop= getPropertyByHandle(nHandle); + if (prop == null) + throw new UnknownPropertyException("The property with handle : " + nHandle + " is unknown"); + return getPropertyValue(prop); + } + + // XMultiPropertySet ----------------------------------------------------------------------------------- + public void addPropertiesChangeListener(String[] propNames, XPropertiesChangeListener listener) + { + listenerContainer.addInterface(XPropertiesChangeListener.class, listener); + } + + // XMultiPropertySet ----------------------------------------------------------------------------------- + public void firePropertiesChangeEvent(String[] propNames, XPropertiesChangeListener listener) + { + // Build the events. + PropertyChangeEvent[] arEvents= new PropertyChangeEvent[propNames.length]; + int eventCount= 0; + // get a snapshot of the current property values + synchronized (this) + { + for (int i= 0; i < propNames.length; i++) + { + Property prop= getProperty(propNames[i]); + if (prop != null) + { + Object value= null; + try + { + value= getPropertyValue(prop); + } + catch(WrappedTargetException e) + { + continue; + } + arEvents[eventCount]= new PropertyChangeEvent(this, prop.Name, + false, prop.Handle, value, value); + eventCount++; + } + } + } + + // fire events from unsynchronized section so as to prevent deadlocks + if (eventCount > 0) + { + // Reallocate the array of the events if necessary + if (arEvents.length != eventCount) + { + PropertyChangeEvent[] arPropsTmp= new PropertyChangeEvent[eventCount]; + System.arraycopy(arEvents, 0, arPropsTmp, 0, eventCount); + arEvents= arPropsTmp; + } + listener.propertiesChange(arEvents); + } + } + // XMultiPropertySet ----------------------------------------------------------------------------------- + /** If a value for a property could not be retrieved then the respective element in the returned + * array has the value null. + */ + public Object[] getPropertyValues(String[] propNames) + { + Object[] arValues= new Object[propNames.length]; + synchronized (this) + { + for (int i= 0; i < propNames.length; i++) + { + Object value= null; + try + { + value= getPropertyValue(propNames[i]); + } + catch (Exception e) + { + } + arValues[i]= value; + } + } + return arValues; + } + // XMultiPropertySet ----------------------------------------------------------------------------------- + public void removePropertiesChangeListener(XPropertiesChangeListener xPropertiesChangeListener) + { + listenerContainer.removeInterface(XPropertiesChangeListener.class, xPropertiesChangeListener); + } + // XMultiPropertySet ----------------------------------------------------------------------------------- + /** If the array of property names containes an unknown property then it will be ignored. + */ + public void setPropertyValues(String[] propNames, Object[] values) throws PropertyVetoException, com.sun.star.lang.IllegalArgumentException, com.sun.star.lang.WrappedTargetException + { + for (int i= 0; i < propNames.length; i++) + { + try + { + setPropertyValue(propNames[i], values[i]); + } + catch (UnknownPropertyException e) + { + continue; + } + + } + } + + private class PropertySetInfo implements XPropertySetInfo + { + public com.sun.star.beans.Property[] getProperties() + { + return PropertySet.this.getProperties(); + } + + public com.sun.star.beans.Property getPropertyByName(String name) throws UnknownPropertyException + { + return getProperty(name); + } + + public boolean hasPropertyByName(String name) + { + return getProperty(name) != null; + } + + } +} + + + + + diff --git a/javaunohelper/com/sun/star/lib/uno/helper/PropertySetMixin.java b/javaunohelper/com/sun/star/lib/uno/helper/PropertySetMixin.java new file mode 100644 index 000000000000..40c69a90f8a6 --- /dev/null +++ b/javaunohelper/com/sun/star/lib/uno/helper/PropertySetMixin.java @@ -0,0 +1,1096 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: PropertySetMixin.java,v $ + * $Revision: 1.5 $ + * + * 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.lib.uno.helper; + +import com.sun.star.beans.Property; +import com.sun.star.beans.PropertyAttribute; +import com.sun.star.beans.PropertyChangeEvent; +import com.sun.star.beans.PropertyState; +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.PropertyVetoException; +import com.sun.star.beans.UnknownPropertyException; +import com.sun.star.beans.XPropertyChangeListener; +import com.sun.star.beans.XPropertySetInfo; +import com.sun.star.beans.XVetoableChangeListener; +import com.sun.star.container.NoSuchElementException; +import com.sun.star.container.XHierarchicalNameAccess; +import com.sun.star.lang.DisposedException; +import com.sun.star.lang.EventObject; +import com.sun.star.lang.WrappedTargetException; +import com.sun.star.lang.WrappedTargetRuntimeException; +import com.sun.star.lang.XComponent; +import com.sun.star.reflection.XCompoundTypeDescription; +import com.sun.star.reflection.XIdlClass; +import com.sun.star.reflection.XIdlField2; +import com.sun.star.reflection.XIdlReflection; +import com.sun.star.reflection.XIndirectTypeDescription; +import com.sun.star.reflection.XInterfaceAttributeTypeDescription2; +import com.sun.star.reflection.XInterfaceMemberTypeDescription; +import com.sun.star.reflection.XInterfaceTypeDescription2; +import com.sun.star.reflection.XStructTypeDescription; +import com.sun.star.reflection.XTypeDescription; +import com.sun.star.uno.Any; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.DeploymentException; +import com.sun.star.uno.Type; +import com.sun.star.uno.TypeClass; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XComponentContext; +import com.sun.star.uno.XInterface; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Vector; + +/** + A helper mixin to implement certain UNO interfaces related to property set + handling on top of the attributes of a given UNO interface type. + + <p>A client will mix in this class by keeping a reference to an instance of + this class, and forwarding all methods of (a subset of the interfaces) + <code>com.sun.star.beans.XPropertySet</code>, + <code>com.sun.star.beans.XFastPropertySet</code>, and + <code>com.sun.star.beans.XPropertyAccess</code> to it.</p> + + <p>Client code should not use the monitors associated with instances of this + class, as they are used for internal purposes.</p> + + @since UDK 3.2 +*/ +public final class PropertySetMixin { + /** + The constructor. + + @param context the component context used by this instance; must not be + null, and must supply the service + <code>com.sun.star.reflection.CoreReflection</code> and the singleton + <code>com.sun.star.reflection.theTypeDescriptionManager</code> + + @param object the client UNO object into which this instance is mixed in; + must not be null, and must support the given <code>type</code> + + @param type the UNO interface type whose attributes are mapped to + properties; must not be null, and must represent a UNO interface type + + @param absentOptional a list of optional properties that are not present, + and should thus not be visible via + <code>com.sun.star.beans.XPropertySet.getPropertySetInfo</code>, + <code>com.sun.star.beans.XPropertySet.addPropertyChangeListener</code>, + <code>com.sun.star.beans.XPropertySet.removePropertyChangeListener<!-- + --></code>, + <code>com.sun.star.beans.XPropertySet.addVetoableChangeListener</code>, + and <code>com.sun.star.beans.XPropertySet.<!-- + -->removeVetoableChangeListener</code>; null is treated the same as an + empty list; if non-null, the given array must not be modified after it is + passed to this constructor. For consistency reasons, the given + <code>absentOptional</code> should only contain the names of attributes + that represent optional properties that are not present (that is, the + attribute getters and setters always throw a + <code>com.sun.star.beans.UnknownPropertyException</code>), and should + contain each such name only once. If an optional property is not present + (that is, the corresponding attribute getter and setter always throw a + <code>com.sun.star.beans.UnknownPropertyException</code>) but is not + contained in the given <code>absentOptional</code>, then it will be + visible via + <code>com.sun.star.beans.XPropertySet.getPropertySetInfo</code> as a + <code>com.sun.star.beans.Property</code> with a set + <code>com.sun.star.beans.PropertyAttribute.OPTIONAL</code>. If the given + <code>object</code> does not implement + <code>com.sun.star.beans.XPropertySet</code>, then the given + <code>absentOptional</code> is effectively ignored and can be null or + empty. + */ + public PropertySetMixin( + XComponentContext context, XInterface object, Type type, + String[] absentOptional) + { + // assert context != null && object != null && type != null + // && type.getTypeClass() == TypeClass.INTERFACE; + this.context = context; + this.object = object; + this.type = type; + this.absentOptional = absentOptional; + idlClass = getReflection(type.getTypeName()); + XTypeDescription ifc; + try { + ifc = UnoRuntime.queryInterface( + XTypeDescription.class, + (UnoRuntime.queryInterface( + XHierarchicalNameAccess.class, + context.getValueByName( + "/singletons/com.sun.star.reflection." + + "theTypeDescriptionManager")). + getByHierarchicalName(type.getTypeName()))); + } catch (NoSuchElementException e) { + throw new RuntimeException( + "unexpected com.sun.star.container.NoSuchElementException: " + + e.getMessage()); + } + HashMap map = new HashMap(); + ArrayList handleNames = new ArrayList(); + initProperties(ifc, map, handleNames, new HashSet()); + properties = map; + handleMap = (String[]) handleNames.toArray( + new String[handleNames.size()]); + } + + /** + A method used by clients when implementing UNO interface type attribute + setter functions. + + <p>First, this method checks whether this instance has already been + disposed (see {@link #dispose}), and throws a + <code>com.sun.star.beans.DisposedException</code> if applicable. For a + constrained attribute (whose setter can explicitly raise + <code>com.sun.star.beans.PropertyVetoException</code>), this method + notifies any <code>com.sun.star.beans.XVetoableChangeListener</code>s. + For a bound attribute, this method modifies the passed-in + <code>bound</code> so that it can afterwards be used to notify any + <code>com.sun.star.beans.XPropertyChangeListener</code>s. This method + should be called before storing the new attribute value, and + <code>bound.notifyListeners()</code> should be called exactly once after + storing the new attribute value (in case the attribute is bound; + otherwise, calling <code>bound.notifyListeners()</code> is ignored). + Furthermore, <code>bound.notifyListeners()</code> and this method have to + be called from the same thread.</p> + + @param propertyName the name of the property (which is the same as the + name of the attribute that is going to be set) + + @param oldValue the property value corresponding to the old attribute + value. This is only used as + <code>com.sun.star.beans.PropertyChangeEvent.OldValue</code>, which is + rather useless, anyway (see “Using the Observer Pattern” in + <a href="http://tools.openoffice.org/CodingGuidelines.sxw"> + <cite>OpenOffice.org Coding Guidelines</cite></a>). If the attribute + that is going to be set is neither bound nor constrained, or if + <code>com.sun.star.beans.PropertyChangeEvent.OldValue</code> should not + be set, {@link Any#VOID} can be used instead. + + @param newValue the property value corresponding to the new + attribute value. This is only used as + <code>com.sun.star.beans.PropertyChangeEvent.NewValue</code>, which is + rather useless, anyway (see “Using the Observer Pattern&rdquo: in + <a href="http://tools.openoffice.org/CodingGuidelines.sxw"> + <cite>OpenOffice.org Coding Guidelines</cite></a>), <em>unless</em> the + attribute that is going to be set is constrained. If the attribute + that is going to be set is neither bound nor constrained, or if it is + only bound but + <code>com.sun.star.beans.PropertyChangeEvent.NewValue</code> should not + be set, {@link Any#VOID} can be used instead. + + @param bound a reference to a fresh {@link BoundListeners} instance + (which has not been passed to this method before, and on which + {@link BoundListeners#notifyListeners} has not yet been called); may only + be null if the attribute that is going to be set is not bound + */ + public void prepareSet( + String propertyName, Object oldValue, Object newValue, + BoundListeners bound) + throws PropertyVetoException + { + // assert properties.get(propertyName) != null; + Property p = ((PropertyData) properties.get(propertyName)).property; + Vector specificVeto = null; + Vector unspecificVeto = null; + synchronized (this) { + if (disposed) { + throw new DisposedException("disposed", object); + } + if ((p.Attributes & PropertyAttribute.CONSTRAINED) != 0) { + Object o = vetoListeners.get(propertyName); + if (o != null) { + specificVeto = (Vector) ((Vector) o).clone(); + } + o = vetoListeners.get(""); + if (o != null) { + unspecificVeto = (Vector) ((Vector) o).clone(); + } + } + if ((p.Attributes & PropertyAttribute.BOUND) != 0) { + // assert bound != null; + Object o = boundListeners.get(propertyName); + if (o != null) { + bound.specificListeners = (Vector) ((Vector) o).clone(); + } + o = boundListeners.get(""); + if (o != null) { + bound.unspecificListeners = (Vector) ((Vector) o).clone(); + } + } + } + if ((p.Attributes & PropertyAttribute.CONSTRAINED) != 0) { + PropertyChangeEvent event = new PropertyChangeEvent( + object, propertyName, false, p.Handle, oldValue, newValue); + if (specificVeto != null) { + for (Iterator i = specificVeto.iterator(); i.hasNext();) { + try { + ((XVetoableChangeListener) i.next()).vetoableChange( + event); + } catch (DisposedException e) {} + } + } + if (unspecificVeto != null) { + for (Iterator i = unspecificVeto.iterator(); i.hasNext();) { + try { + ((XVetoableChangeListener) i.next()).vetoableChange( + event); + } catch (DisposedException e) {} + } + } + } + if ((p.Attributes & PropertyAttribute.BOUND) != 0) { + // assert bound != null; + bound.event = new PropertyChangeEvent( + object, propertyName, false, p.Handle, oldValue, newValue); + } + } + + /** + A simplified version of {@link #prepareSet(String, Object, Object, + PropertySetMixin.BoundListeners)}. + + <p>This method is useful for attributes that are not constrained.</p> + + @param propertyName the name of the property (which is the same as the + name of the attribute that is going to be set) + + @param bound a reference to a fresh {@link BoundListeners} instance + (which has not been passed to this method before, and on which + {@link BoundListeners#notifyListeners} has not yet been called); may only + be null if the attribute that is going to be set is not bound + */ + public void prepareSet(String propertyName, BoundListeners bound) { + try { + prepareSet(propertyName, Any.VOID, Any.VOID, bound); + } catch (PropertyVetoException e) { + throw new RuntimeException("unexpected " + e); + } + } + + /** + Marks this instance as being disposed. + + <p>See <code>com.sun.star.lang.XComponent</code> for the general concept + of disposing UNO objects. On the first call to this method, all + registered listeners + (<code>com.sun.star.beans.XPropertyChangeListener</code>s and + <code>com.sun.star.beans.XVetoableChangeListener</code>s) are notified of + the disposing source. Any subsequent calls to this method are + ignored.</p> + */ + public void dispose() { + HashMap bound; + HashMap veto; + synchronized (this) { + bound = boundListeners; + boundListeners = null; + veto = vetoListeners; + vetoListeners = null; + disposed = true; + } + EventObject event = new EventObject(object); + if (bound != null) { + for (Iterator i = bound.values().iterator(); i.hasNext();) { + for (Iterator j = ((Vector) i.next()).iterator(); j.hasNext();) + { + ((XPropertyChangeListener) j.next()).disposing(event); + } + } + } + if (veto != null) { + for (Iterator i = veto.values().iterator(); i.hasNext();) { + for (Iterator j = ((Vector) i.next()).iterator(); j.hasNext();) + { + ((XVetoableChangeListener) j.next()).disposing(event); + } + } + } + } + + /** + Implements + <code>com.sun.star.beans.XPropertySet.getPropertySetInfo</code>. + */ + public XPropertySetInfo getPropertySetInfo() { + return new Info(properties); + } + + /** + Implements <code>com.sun.star.beans.XPropertySet.setPropertyValue</code>. + */ + public void setPropertyValue(String propertyName, Object value) + throws UnknownPropertyException, PropertyVetoException, + com.sun.star.lang.IllegalArgumentException, WrappedTargetException + { + setProperty(propertyName, value, false, false, (short) 1); + } + + /** + Implements <code>com.sun.star.beans.XPropertySet.getPropertyValue</code>. + */ + public Object getPropertyValue(String propertyName) + throws UnknownPropertyException, WrappedTargetException + { + return getProperty(propertyName, null); + } + + /** + Implements + <code>com.sun.star.beans.XPropertySet.addPropertyChangeListener</code>. + + <p>If a listener is added more than once, it will receive all relevant + notifications multiple times.</p> + */ + public void addPropertyChangeListener( + String propertyName, XPropertyChangeListener listener) + throws UnknownPropertyException, WrappedTargetException + { + // assert listener != null; + checkUnknown(propertyName); + boolean disp; + synchronized (this) { + disp = disposed; + if (!disp) { + Vector v = (Vector) boundListeners.get(propertyName); + if (v == null) { + v = new Vector(); + boundListeners.put(propertyName, v); + } + v.add(listener); + } + } + if (disp) { + listener.disposing(new EventObject(object)); + } + } + + /** + Implements <code> + com.sun.star.beans.XPropertySet.removePropertyChangeListener</code>. + */ + public void removePropertyChangeListener( + String propertyName, XPropertyChangeListener listener) + throws UnknownPropertyException, WrappedTargetException + { + // assert listener != null; + checkUnknown(propertyName); + synchronized (this) { + if (boundListeners != null) { + Vector v = (Vector) boundListeners.get(propertyName); + if (v != null) { + v.remove(listener); + } + } + } + } + + /** + Implements + <code>com.sun.star.beans.XPropertySet.addVetoableChangeListener</code>. + + <p>If a listener is added more than once, it will receive all relevant + notifications multiple times.</p> + */ + public void addVetoableChangeListener( + String propertyName, XVetoableChangeListener listener) + throws UnknownPropertyException, WrappedTargetException + { + // assert listener != null; + checkUnknown(propertyName); + boolean disp; + synchronized (this) { + disp = disposed; + if (!disp) { + Vector v = (Vector) vetoListeners.get(propertyName); + if (v == null) { + v = new Vector(); + vetoListeners.put(propertyName, v); + } + v.add(listener); + } + } + if (disp) { + listener.disposing(new EventObject(object)); + } + } + + /** + Implements <code> + com.sun.star.beans.XPropertySet.removeVetoableChangeListener</code>. + */ + public void removeVetoableChangeListener( + String propertyName, XVetoableChangeListener listener) + throws UnknownPropertyException, WrappedTargetException + { + // assert listener != null; + checkUnknown(propertyName); + synchronized (this) { + if (vetoListeners != null) { + Vector v = (Vector) vetoListeners.get(propertyName); + if (v != null) { + v.remove(listener); + } + } + } + } + + /** + Implements + <code>com.sun.star.beans.XFastPropertySet.setFastPropertyValue</code>. + */ + public void setFastPropertyValue(int handle, Object value) + throws UnknownPropertyException, PropertyVetoException, + com.sun.star.lang.IllegalArgumentException, WrappedTargetException + { + setProperty(translateHandle(handle), value, false, false, (short) 1); + } + + /** + Implements + <code>com.sun.star.beans.XFastPropertySet.getFastPropertyValue</code>. + */ + public Object getFastPropertyValue(int handle) + throws UnknownPropertyException, WrappedTargetException + { + return getProperty(translateHandle(handle), null); + } + + /** + Implements + <code>com.sun.star.beans.XPropertyAccess.getPropertyValues</code>. + */ + public PropertyValue[] getPropertyValues() { + PropertyValue[] s = new PropertyValue[handleMap.length]; + int n = 0; + for (int i = 0; i < handleMap.length; ++i) { + PropertyState[] state = new PropertyState[1]; + Object value; + try { + value = getProperty(handleMap[i], state); + } catch (UnknownPropertyException e) { + continue; + } catch (WrappedTargetException e) { + throw new WrappedTargetRuntimeException( + e.getMessage(), object, e.TargetException); + } + s[n++] = new PropertyValue(handleMap[i], i, value, state[0]); + } + if (n < handleMap.length) { + PropertyValue[] s2 = new PropertyValue[n]; + System.arraycopy(s, 0, s2, 0, n); + s = s2; + } + return s; + } + + /** + Implements + <code>com.sun.star.beans.XPropertyAccess.setPropertyValues</code>. + */ + public void setPropertyValues(PropertyValue[] props) + throws UnknownPropertyException, PropertyVetoException, + com.sun.star.lang.IllegalArgumentException, WrappedTargetException + { + for (int i = 0; i < props.length; ++i) { + if (props[i].Handle != -1 + && !props[i].Name.equals(translateHandle(props[i].Handle))) + { + throw new UnknownPropertyException( + ("name " + props[i].Name + " does not match handle " + + props[i].Handle), + object); + } + setProperty( + props[i].Name, props[i].Value, + props[i].State == PropertyState.AMBIGUOUS_VALUE, + props[i].State == PropertyState.DEFAULT_VALUE, (short) 0); + } + } + + /** + A class used by clients of {@link PropertySetMixin} when implementing UNO + interface type attribute setter functions. + + @see #prepareSet(String, Object, Object, PropertySetMixin.BoundListeners) + */ + public static final class BoundListeners { + /** + The constructor. + */ + public BoundListeners() {} + + /** + Notifies any + <code>com.sun.star.beans.XPropertyChangeListener</code>s. + + @see #prepareSet(String, Object, Object, + PropertySetMixin.BoundListeners) + */ + public void notifyListeners() { + if (specificListeners != null) { + for (Iterator i = specificListeners.iterator(); i.hasNext();) { + try { + ((XPropertyChangeListener) i.next()).propertyChange( + event); + } catch (DisposedException e) {} + } + } + if (unspecificListeners != null) { + for (Iterator i = unspecificListeners.iterator(); i.hasNext();) + { + try { + ((XPropertyChangeListener) i.next()).propertyChange( + event); + } catch (DisposedException e) {} + } + } + } + + private Vector specificListeners = null; + private Vector unspecificListeners = null; + private PropertyChangeEvent event = null; + } + + private XIdlClass getReflection(String typeName) { + XIdlReflection refl; + try { + refl = UnoRuntime.queryInterface( + XIdlReflection.class, + context.getServiceManager().createInstanceWithContext( + "com.sun.star.reflection.CoreReflection", context)); + } catch (com.sun.star.uno.Exception e) { + throw new DeploymentException( + ("component context fails to supply service" + + " com.sun.star.reflection.CoreReflection: " + + e.getMessage()), + context); + } + try { + return refl.forName(typeName); + } finally { + XComponent comp = UnoRuntime.queryInterface(XComponent.class, refl); + if (comp != null) { + comp.dispose(); + } + } + } + + private void initProperties( + XTypeDescription type, HashMap map, ArrayList handleNames, HashSet seen) + { + XInterfaceTypeDescription2 ifc = UnoRuntime.queryInterface( + XInterfaceTypeDescription2.class, resolveTypedefs(type)); + if (seen.add(ifc.getName())) { + XTypeDescription[] bases = ifc.getBaseTypes(); + for (int i = 0; i < bases.length; ++i) { + initProperties(bases[i], map, handleNames, seen); + } + XInterfaceMemberTypeDescription[] members = ifc.getMembers(); + for (int i = 0; i < members.length; ++i) { + if (members[i].getTypeClass() == TypeClass.INTERFACE_ATTRIBUTE) + { + XInterfaceAttributeTypeDescription2 attr = + UnoRuntime.queryInterface( + XInterfaceAttributeTypeDescription2.class, + members[i]); + short attrAttribs = 0; + if (attr.isBound()) { + attrAttribs |= PropertyAttribute.BOUND; + } + boolean setUnknown = false; + if (attr.isReadOnly()) { + attrAttribs |= PropertyAttribute.READONLY; + setUnknown = true; + } + XCompoundTypeDescription[] excs = attr.getGetExceptions(); + boolean getUnknown = false; + //XXX Special interpretation of getter/setter exceptions + // only works if the specified exceptions are of the exact + // type, not of a supertype: + for (int j = 0; j < excs.length; ++j) { + if (excs[j].getName().equals( + "com.sun.star.beans.UnknownPropertyException")) + { + getUnknown = true; + break; + } + } + excs = attr.getSetExceptions(); + for (int j = 0; j < excs.length; ++j) { + if (excs[j].getName().equals( + "com.sun.star.beans.UnknownPropertyException")) + { + setUnknown = true; + } else if (excs[j].getName().equals( + "com.sun.star.beans." + + "PropertyVetoException")) + { + attrAttribs |= PropertyAttribute.CONSTRAINED; + } + } + if (getUnknown && setUnknown) { + attrAttribs |= PropertyAttribute.OPTIONAL; + } + XTypeDescription t = attr.getType(); + for (;;) { + t = resolveTypedefs(t); + short n; + if (t.getName().startsWith( + "com.sun.star.beans.Ambiguous<")) + { + n = PropertyAttribute.MAYBEAMBIGUOUS; + } else if (t.getName().startsWith( + "com.sun.star.beans.Defaulted<")) + { + n = PropertyAttribute.MAYBEDEFAULT; + } else if (t.getName().startsWith( + "com.sun.star.beans.Optional<")) + { + n = PropertyAttribute.MAYBEVOID; + } else { + break; + } + attrAttribs |= n; + t = (UnoRuntime.queryInterface( + XStructTypeDescription.class, t)). + getTypeArguments()[0]; + } + String name = members[i].getMemberName(); + boolean present = true; + if (absentOptional != null) { + for (int j = 0; j < absentOptional.length; ++j) { + if (name.equals(absentOptional[j])) { + present = false; + break; + } + } + } + if (map.put( + name, + new PropertyData( + new Property( + name, handleNames.size(), + new Type(t.getName(), t.getTypeClass()), + attrAttribs), + present)) + != null) + { + throw new RuntimeException( + "inconsistent UNO type registry"); + } + handleNames.add(name); + } + } + } + } + + private String translateHandle(int handle) throws UnknownPropertyException { + if (handle < 0 || handle >= handleMap.length) { + throw new UnknownPropertyException("bad handle " + handle, object); + } + return handleMap[handle]; + } + + private void setProperty( + String name, Object value, boolean isAmbiguous, boolean isDefaulted, + short illegalArgumentPosition) + throws UnknownPropertyException, PropertyVetoException, + com.sun.star.lang.IllegalArgumentException, WrappedTargetException + { + PropertyData p = (PropertyData) properties.get(name); + if (p == null) { + throw new UnknownPropertyException(name, object); + } + if ((isAmbiguous + && (p.property.Attributes & PropertyAttribute.MAYBEAMBIGUOUS) == 0) + || (isDefaulted + && ((p.property.Attributes & PropertyAttribute.MAYBEDEFAULT) + == 0))) + { + throw new com.sun.star.lang.IllegalArgumentException( + ("flagging as ambiguous/defaulted non-ambiguous/defaulted" + + " property " + name), + object, illegalArgumentPosition); + + } + XIdlField2 f = UnoRuntime.queryInterface( + XIdlField2.class, idlClass.getField(name)); + Object[] o = new Object[] { + new Any(type, UnoRuntime.queryInterface(type, object)) }; + Object v = wrapValue( + value, + UnoRuntime.queryInterface( + XIdlField2.class, idlClass.getField(name)).getType(), + (p.property.Attributes & PropertyAttribute.MAYBEAMBIGUOUS) != 0, + isAmbiguous, + (p.property.Attributes & PropertyAttribute.MAYBEDEFAULT) != 0, + isDefaulted, + (p.property.Attributes & PropertyAttribute.MAYBEVOID) != 0); + try { + f.set(o, v); + } catch (com.sun.star.lang.IllegalArgumentException e) { + if (e.ArgumentPosition == 1) { + throw new com.sun.star.lang.IllegalArgumentException( + e.getMessage(), object, illegalArgumentPosition); + } else { + throw new RuntimeException( + "unexpected com.sun.star.lang.IllegalArgumentException: " + + e.getMessage()); + } + } catch (com.sun.star.lang.IllegalAccessException e) { + //TODO Clarify whether PropertyVetoException is the correct + // exception to throw when trying to set a read-only property: + throw new PropertyVetoException( + "cannot set read-only property " + name, object); + } catch (WrappedTargetRuntimeException e) { + //FIXME A WrappedTargetRuntimeException from XIdlField2.get is not + // guaranteed to originate directly within XIdlField2.get (and thus + // have the expected semantics); it might also be passed through + // from lower layers. + if (new Type(UnknownPropertyException.class).isSupertypeOf( + AnyConverter.getType(e.TargetException)) + && (p.property.Attributes & PropertyAttribute.OPTIONAL) != 0) + { + throw new UnknownPropertyException(name, object); + } else if (new Type(PropertyVetoException.class).isSupertypeOf( + AnyConverter.getType(e.TargetException)) + && ((p.property.Attributes + & PropertyAttribute.CONSTRAINED) + != 0)) + { + throw new PropertyVetoException(name, object); + } else { + throw new WrappedTargetException( + e.getMessage(), object, e.TargetException); + } + } + } + + Object getProperty(String name, PropertyState[] state) + throws UnknownPropertyException, WrappedTargetException + { + PropertyData p = (PropertyData) properties.get(name); + if (p == null) { + throw new UnknownPropertyException(name, object); + } + XIdlField2 field = UnoRuntime.queryInterface( + XIdlField2.class, idlClass.getField(name)); + Object value; + try { + value = field.get( + new Any(type, UnoRuntime.queryInterface(type, object))); + } catch (com.sun.star.lang.IllegalArgumentException e) { + throw new RuntimeException( + "unexpected com.sun.star.lang.IllegalArgumentException: " + + e.getMessage()); + } catch (WrappedTargetRuntimeException e) { + //FIXME A WrappedTargetRuntimeException from XIdlField2.get is not + // guaranteed to originate directly within XIdlField2.get (and thus + // have the expected semantics); it might also be passed through + // from lower layers. + if (new Type(UnknownPropertyException.class).isSupertypeOf( + AnyConverter.getType(e.TargetException)) + && (p.property.Attributes & PropertyAttribute.OPTIONAL) != 0) + { + throw new UnknownPropertyException(name, object); + } else { + throw new WrappedTargetException( + e.getMessage(), object, e.TargetException); + } + } + boolean undoAmbiguous + = (p.property.Attributes & PropertyAttribute.MAYBEAMBIGUOUS) != 0; + boolean undoDefaulted + = (p.property.Attributes & PropertyAttribute.MAYBEDEFAULT) != 0; + boolean undoOptional + = (p.property.Attributes & PropertyAttribute.MAYBEVOID) != 0; + boolean isAmbiguous = false; + boolean isDefaulted = false; + while (undoAmbiguous || undoDefaulted || undoOptional) { + String typeName = AnyConverter.getType(value).getTypeName(); + if (undoAmbiguous + && typeName.startsWith("com.sun.star.beans.Ambiguous<")) + { + XIdlClass ambiguous = getReflection(typeName); + try { + isAmbiguous = AnyConverter.toBoolean( + UnoRuntime.queryInterface( + XIdlField2.class, + ambiguous.getField("IsAmbiguous")).get(value)); + value = UnoRuntime.queryInterface( + XIdlField2.class, + ambiguous.getField("Value")).get(value); + } catch (com.sun.star.lang.IllegalArgumentException e) { + throw new RuntimeException( + "unexpected" + + " com.sun.star.lang.IllegalArgumentException: " + + e.getMessage()); + } + undoAmbiguous = false; + } else if (undoDefaulted + && typeName.startsWith("com.sun.star.beans.Defaulted<")) + { + XIdlClass defaulted = getReflection(typeName); + try { + isDefaulted = AnyConverter.toBoolean( + UnoRuntime.queryInterface( + XIdlField2.class, + defaulted.getField("IsDefaulted")).get(value)); + value = UnoRuntime.queryInterface( + XIdlField2.class, + defaulted.getField("Value")).get(value); + } catch (com.sun.star.lang.IllegalArgumentException e) { + throw new RuntimeException( + "unexpected" + + " com.sun.star.lang.IllegalArgumentException: " + + e.getMessage()); + } + undoDefaulted = false; + } else if (undoOptional + && typeName.startsWith("com.sun.star.beans.Optional<")) + { + XIdlClass optional = getReflection(typeName); + try { + boolean present = AnyConverter.toBoolean( + UnoRuntime.queryInterface( + XIdlField2.class, + optional.getField("IsPresent")).get(value)); + if (!present) { + value = Any.VOID; + break; + } + value = UnoRuntime.queryInterface( + XIdlField2.class, + optional.getField("Value")).get(value); + } catch (com.sun.star.lang.IllegalArgumentException e) { + throw new RuntimeException( + "unexpected" + + " com.sun.star.lang.IllegalArgumentException: " + + e.getMessage()); + } + undoOptional = false; + } else { + throw new RuntimeException( + "unexpected type of attribute " + name); + } + } + if (state != null) { + //XXX If isAmbiguous && isDefaulted, arbitrarily choose + // AMBIGUOUS_VALUE over DEFAULT_VALUE: + state[0] = isAmbiguous + ? PropertyState.AMBIGUOUS_VALUE + : isDefaulted + ? PropertyState.DEFAULT_VALUE : PropertyState.DIRECT_VALUE; + } + return value; + } + + private Object wrapValue( + Object value, XIdlClass type, boolean wrapAmbiguous, + boolean isAmbiguous, boolean wrapDefaulted, boolean isDefaulted, + boolean wrapOptional) + { + // assert (wrapAmbiguous || !isAmbiguous) + // && (wrapDefaulted || !isDefaulted); + if (wrapAmbiguous + && type.getName().startsWith("com.sun.star.beans.Ambiguous<")) + { + Object[] strct = new Object[1]; + type.createObject(strct); + try { + XIdlField2 field = UnoRuntime.queryInterface( + XIdlField2.class, type.getField("Value")); + field.set( + strct, + wrapValue( + value, field.getType(), false, false, wrapDefaulted, + isDefaulted, wrapOptional)); + UnoRuntime.queryInterface( + XIdlField2.class, type.getField("IsAmbiguous")).set( + strct, new Boolean(isAmbiguous)); + } catch (com.sun.star.lang.IllegalArgumentException e) { + throw new RuntimeException( + "unexpected com.sun.star.lang.IllegalArgumentException: " + + e.getMessage()); + } catch (com.sun.star.lang.IllegalAccessException e) { + throw new RuntimeException( + "unexpected com.sun.star.lang.IllegalAccessException: " + + e.getMessage()); + } + return strct[0]; + } else if (wrapDefaulted + && type.getName().startsWith( + "com.sun.star.beans.Defaulted<")) + { + Object[] strct = new Object[1]; + type.createObject(strct); + try { + XIdlField2 field = UnoRuntime.queryInterface( + XIdlField2.class, type.getField("Value")); + field.set( + strct, + wrapValue( + value, field.getType(), wrapAmbiguous, isAmbiguous, + false, false, wrapOptional)); + UnoRuntime.queryInterface( + XIdlField2.class, type.getField("IsDefaulted")).set( + strct, new Boolean(isDefaulted)); + } catch (com.sun.star.lang.IllegalArgumentException e) { + throw new RuntimeException( + "unexpected com.sun.star.lang.IllegalArgumentException: " + + e.getMessage()); + } catch (com.sun.star.lang.IllegalAccessException e) { + throw new RuntimeException( + "unexpected com.sun.star.lang.IllegalAccessException: " + + e.getMessage()); + } + return strct[0]; + } else if (wrapOptional + && type.getName().startsWith("com.sun.star.beans.Optional<")) + { + Object[] strct = new Object[1]; + type.createObject(strct); + boolean present = !AnyConverter.isVoid(value); + try { + UnoRuntime.queryInterface( + XIdlField2.class, type.getField("IsPresent")).set( + strct, new Boolean(present)); + if (present) { + XIdlField2 field = UnoRuntime.queryInterface( + XIdlField2.class, type.getField("Value")); + field.set( + strct, + wrapValue( + value, field.getType(), wrapAmbiguous, isAmbiguous, + wrapDefaulted, isDefaulted, false)); + } + } catch (com.sun.star.lang.IllegalArgumentException e) { + throw new RuntimeException( + "unexpected com.sun.star.lang.IllegalArgumentException: " + + e.getMessage()); + } catch (com.sun.star.lang.IllegalAccessException e) { + throw new RuntimeException( + "unexpected com.sun.star.lang.IllegalAccessException: " + + e.getMessage()); + } + return strct[0]; + } else { + if (wrapAmbiguous || wrapDefaulted || wrapOptional) { + throw new RuntimeException("unexpected type of attribute"); + } + return value; + } + } + + private static XTypeDescription resolveTypedefs(XTypeDescription type) { + while (type.getTypeClass() == TypeClass.TYPEDEF) { + type = UnoRuntime.queryInterface( + XIndirectTypeDescription.class, type).getReferencedType(); + } + return type; + } + + private PropertyData get(Object object, String propertyName) + throws UnknownPropertyException + { + PropertyData p = (PropertyData) properties.get(propertyName); + if (p == null || !p.present) { + throw new UnknownPropertyException(propertyName, object); + } + return p; + } + + private void checkUnknown(String propertyName) + throws UnknownPropertyException + { + if (!propertyName.equals("")) { + get(this, propertyName); + } + } + + private static final class PropertyData { + public PropertyData(Property property, boolean present) { + this.property = property; + this.present = present; + } + + public final Property property; + public final boolean present; + } + + private final class Info extends WeakBase implements XPropertySetInfo + { + public Info(Map properties) { + this.properties = properties; + } + + public Property[] getProperties() { + ArrayList al = new ArrayList(properties.size()); + for (Iterator i = properties.values().iterator(); i.hasNext();) { + PropertyData p = (PropertyData) i.next(); + if (p.present) { + al.add(p.property); + } + } + return (Property[]) al.toArray(new Property[al.size()]); + } + + public Property getPropertyByName(String name) + throws UnknownPropertyException + { + return get(this, name).property; + } + + public boolean hasPropertyByName(String name) { + PropertyData p = (PropertyData) properties.get(name); + return p != null && p.present; + } + + private final Map properties; // from String to Property + } + + private final XComponentContext context; + private final XInterface object; + private final Type type; + private final String[] absentOptional; + private final XIdlClass idlClass; + private final Map properties; // from String to Property + private final String[] handleMap; + + private HashMap boundListeners = new HashMap(); + // from String to Vector of XPropertyChangeListener + private HashMap vetoListeners = new HashMap(); + // from String to Vector of XVetoableChangeListener + private boolean disposed = false; +} diff --git a/javaunohelper/com/sun/star/lib/uno/helper/UnoUrl.java b/javaunohelper/com/sun/star/lib/uno/helper/UnoUrl.java new file mode 100644 index 000000000000..70a610c38d1b --- /dev/null +++ b/javaunohelper/com/sun/star/lib/uno/helper/UnoUrl.java @@ -0,0 +1,415 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: UnoUrl.java,v $ + * $Revision: 1.6 $ + * + * 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.lib.uno.helper; +import java.io.UnsupportedEncodingException; +import java.util.HashMap; +import java.util.Vector; + +/** + * Object representation and parsing of Uno Urls, + * which allow to locate a named Uno object in a + * different process. An Uno Url consists of the + * specification of a connection, protocol and + * rootOid delimited with a ';'. + * The syntax of an Uno Url is + * + * <code> + * [uno:]connection-type,parameters;protocol-name,parameters;objectname"; + * </code> + * + * An example Uno Url will look like this: + * + * <code> + * socket,host=localhost,port=2002;urp;StarOffice.ServiceManager + * </code> + * + * For more information about Uno Url please consult + * <a href="http://udk.openoffice.org/common/man/spec/uno-url.html"> + * http://udk.openoffice.org/common/man/spec/uno-url.html</a> + * + * Usage: + * + * <code> + * UnoUrl url = UnoUrl.parseUnoUrl("socket,host=localhost,port=2002;urp;StarOffice.ServiceManager"); + * </code> + * + * @author Joerg Brunsmann + */ +public class UnoUrl { + + private static final String FORMAT_ERROR = + "syntax: [uno:]connection-type,parameters;protocol-name,parameters;objectname"; + + private static final String VALUE_CHAR_SET = "!$&'()*+-./:?@_~"; + private static final String OID_CHAR_SET = VALUE_CHAR_SET + ",="; + + private UnoUrlPart connection; + private UnoUrlPart protocol; + private String rootOid; + + static private class UnoUrlPart { + + private String partTypeName; + private HashMap partParameters; + private String uninterpretedParameterString; + + public UnoUrlPart( + String uninterpretedParameterString, + String partTypeName, + HashMap partParameters) { + this.uninterpretedParameterString = uninterpretedParameterString; + this.partTypeName = partTypeName; + this.partParameters = partParameters; + } + + public String getPartTypeName() { + return partTypeName; + } + + public HashMap getPartParameters() { + return partParameters; + } + + public String getUninterpretedParameterString() { + return uninterpretedParameterString; + } + + public String getUninterpretedString() { + StringBuffer buf = new StringBuffer(partTypeName); + if (uninterpretedParameterString.length() > 0) { + buf.append(','); + buf.append(uninterpretedParameterString); + } + return buf.toString(); + } + } + + private UnoUrl( + UnoUrlPart connectionPart, + UnoUrlPart protocolPart, + String rootOid) { + this.connection = connectionPart; + this.protocol = protocolPart; + this.rootOid = rootOid; + } + + /** + * Returns the name of the connection of this + * Uno Url. Encoded characters are not allowed. + * + * @return The connection name as string. + */ + public String getConnection() { + return connection.getPartTypeName(); + } + + /** + * Returns the name of the protocol of this + * Uno Url. Encoded characters are not allowed. + * + * @return The protocol name as string. + */ + public String getProtocol() { + return protocol.getPartTypeName(); + } + + /** + * Return the object name. Encoded character are + * not allowed. + * + * @return The object name as String. + */ + public String getRootOid() { + return rootOid; + } + + /** + * Returns the protocol parameters as + * a Hashmap with key/value pairs. Encoded + * characters like '%41' are decoded. + * + * @return a HashMap with key/value pairs for protocol parameters. + */ + public HashMap getProtocolParameters() { + return protocol.getPartParameters(); + } + + /** + * Returns the connection parameters as + * a Hashmap with key/value pairs. Encoded + * characters like '%41' are decoded. + * + * @return a HashMap with key/value pairs for connection parameters. + */ + public HashMap getConnectionParameters() { + return connection.getPartParameters(); + } + + /** + * Returns the raw specification of the protocol + * parameters. Encoded characters like '%41' are + * not decoded. + * + * @return The uninterpreted protocol parameters as string. + */ + public String getProtocolParametersAsString() { + return protocol.getUninterpretedParameterString(); + } + + /** + * Returns the raw specification of the connection + * parameters. Encoded characters like '%41' are + * not decoded. + * + * @return The uninterpreted connection parameters as string. + */ + public String getConnectionParametersAsString() { + return connection.getUninterpretedParameterString(); + } + + /** + * Returns the raw specification of the protocol + * name and parameters. Encoded characters like '%41' are + * not decoded. + * + * @return The uninterpreted protocol name and parameters as string. + */ + public String getProtocolAndParametersAsString() { + return protocol.getUninterpretedString(); + } + + /** + * Returns the raw specification of the connection + * name and parameters. Encoded characters like '%41' are + * not decoded. + * + * @return The uninterpreted connection name and parameters as string. + */ + public String getConnectionAndParametersAsString() { + return connection.getUninterpretedString(); + } + + private static int hexToInt(int ch) + throws com.sun.star.lang.IllegalArgumentException { + int c = Character.toLowerCase((char) ch); + boolean isDigit = ('0' <= c && c <= '9'); + boolean isValidChar = ('a' <= c && c <= 'f') || isDigit; + + if (!isValidChar) + throw new com.sun.star.lang.IllegalArgumentException( + "Invalid UTF-8 hex byte '" + c + "'."); + + return isDigit ? ch - '0' : 10 + ((char) c - 'a') & 0xF; + } + + private static String decodeUTF8(String s) + throws com.sun.star.lang.IllegalArgumentException { + Vector v = new Vector(); + + for (int i = 0; i < s.length(); i++) { + int ch = s.charAt(i); + + if (ch == '%') { + int hb = hexToInt(s.charAt(++i)); + int lb = hexToInt(s.charAt(++i)); + ch = (hb << 4) | lb; + } + + v.addElement(new Integer(ch)); + } + + int size = v.size(); + byte[] bytes = new byte[size]; + for (int i = 0; i < size; i++) { + Integer anInt = (Integer) v.elementAt(i); + bytes[i] = (byte) (anInt.intValue() & 0xFF); + } + + try { + return new String(bytes, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new com.sun.star.lang.IllegalArgumentException( + "Couldn't convert parameter string to UTF-8 string:" + e.getMessage()); + } + } + + private static HashMap buildParamHashMap(String paramString) + throws com.sun.star.lang.IllegalArgumentException { + HashMap params = new HashMap(); + + int pos = 0; + + while (true) { + char c = ','; + String aKey = ""; + String aValue = ""; + + while ((pos < paramString.length()) + && ((c = paramString.charAt(pos++)) != '=')) { + aKey += c; + } + + while ((pos < paramString.length()) + && ((c = paramString.charAt(pos++)) != ',') + && c != ';') { + aValue += c; + } + + if ((aKey.length() > 0) && (aValue.length() > 0)) { + + if (!isAlphaNumeric(aKey)) { + throw new com.sun.star.lang.IllegalArgumentException( + "The parameter key '" + + aKey + + "' may only consist of alpha numeric ASCII characters."); + } + + if (!isValidString(aValue, VALUE_CHAR_SET + "%")) { + throw new com.sun.star.lang.IllegalArgumentException( + "The parameter value for key '" + aKey + "' contains illegal characters."); + } + + params.put(aKey, decodeUTF8(aValue)); + } + + if ((pos >= paramString.length()) || (c != ',')) + break; + + } + + return params; + } + + private static UnoUrlPart parseUnoUrlPart(String thePart) + throws com.sun.star.lang.IllegalArgumentException { + String partName = thePart; + String theParamPart = ""; + int index = thePart.indexOf(","); + if (index != -1) { + partName = thePart.substring(0, index).trim(); + theParamPart = thePart.substring(index + 1).trim(); + } + + if (!isAlphaNumeric(partName)) { + throw new com.sun.star.lang.IllegalArgumentException( + "The part name '" + + partName + + "' may only consist of alpha numeric ASCII characters."); + } + + HashMap params = buildParamHashMap(theParamPart); + + return new UnoUrlPart(theParamPart, partName, params); + } + + private static boolean isAlphaNumeric(String s) { + return isValidString(s, null); + } + + private static boolean isValidString(String identifier, String validCharSet) { + + int len = identifier.length(); + + for (int i = 0; i < len; i++) { + + int ch = identifier.charAt(i); + + boolean isValidChar = + ('A' <= ch && ch <= 'Z') + || ('a' <= ch && ch <= 'z') + || ('0' <= ch && ch <= '9'); + + if (!isValidChar && (validCharSet != null)) { + isValidChar = (validCharSet.indexOf(ch) != -1); + } + + if (!isValidChar) + return false; + } + + return true; + } + + /** + * Parses the given Uno Url and returns + * an in memory object representation. + * + * @param unoUrl The given uno URl as string. + * @return Object representation of class UnoUrl. + * @throws IllegalArgumentException if Url cannot be parsed. + */ + public static UnoUrl parseUnoUrl(String unoUrl) + throws com.sun.star.lang.IllegalArgumentException { + + String url = unoUrl; + + int index = url.indexOf(':'); + if (index != -1) { + String unoStr = url.substring(0, index).trim(); + if (!"uno".equals(unoStr)) { + throw new com.sun.star.lang.IllegalArgumentException( + "Uno Urls must start with 'uno:'. " + FORMAT_ERROR); + } + } + + url = url.substring(index + 1).trim(); + + index = url.indexOf(';'); + if (index == -1) { + throw new com.sun.star.lang.IllegalArgumentException("'"+unoUrl+"' is an invalid Uno Url. " + FORMAT_ERROR); + } + + String connection = url.substring(0, index).trim(); + url = url.substring(index + 1).trim(); + + UnoUrlPart connectionPart = parseUnoUrlPart(connection); + + index = url.indexOf(';'); + if (index == -1) { + throw new com.sun.star.lang.IllegalArgumentException("'"+unoUrl+"' is an invalid Uno Url. " + FORMAT_ERROR); + } + + String protocol = url.substring(0, index).trim(); + url = url.substring(index + 1).trim(); + + UnoUrlPart protocolPart = parseUnoUrlPart(protocol); + + String rootOid = url.trim(); + if (!isValidString(rootOid, OID_CHAR_SET)) { + throw new com.sun.star.lang.IllegalArgumentException( + "Root OID '"+ rootOid + "' contains illegal characters."); + } + + return new UnoUrl(connectionPart, protocolPart, rootOid); + + } + +} diff --git a/javaunohelper/com/sun/star/lib/uno/helper/WeakAdapter.java b/javaunohelper/com/sun/star/lib/uno/helper/WeakAdapter.java new file mode 100644 index 000000000000..10fdc5f426a8 --- /dev/null +++ b/javaunohelper/com/sun/star/lib/uno/helper/WeakAdapter.java @@ -0,0 +1,105 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: WeakAdapter.java,v $ + * $Revision: 1.3 $ + * + * 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.lib.uno.helper; +import java.lang.ref.WeakReference; +import com.sun.star.uno.XAdapter; +import com.sun.star.uno.XReference; +import java.util.List; +import java.util.Collections; +import java.util.LinkedList; + +/** An XAdapter implementation that holds a weak reference (java.lang.ref.WeakReference) + * to an object. Clients can register listener (com.sun.star.lang.XReference) which + * are notified when the the object (the one which is kept weak) is being finalized. That + * is, that object is being destroyed because there are not any hard references + * to it. + */ +public class WeakAdapter implements XAdapter +{ + private final boolean DEBUG= false; + // references the XWeak implementation + private WeakReference m_weakRef; + // contains XReference objects registered by addReference + private List m_xreferenceList; + + /** + *@param component the object that is to be held weak + */ + public WeakAdapter(Object component) + { + m_weakRef= new WeakReference(component); + m_xreferenceList= Collections.synchronizedList( new LinkedList()); + } + + /** Called by the XWeak implementation (WeakBase) when it is being finalized. + * It is only being called once. + * The registererd XReference listeners are notified. On notification they are + * to unregister themselves. The notification is thread-safe. However, it is possible + * to add a listener during the notification process, which will never receive a + * notification. To prevent this, one would have to synchronize this method with + * the addReference method. But this can result in deadlocks in a multithreaded + * environment. + */ + void referentDying() + { + //synchronized call + Object[] references= m_xreferenceList.toArray(); + for (int i= references.length; i > 0; i--) + { + ((XReference) references[i-1]).dispose(); + } + } + + /** Method of com.sun.star.uno.XAdapter. It is called to obtain a hard reference + * to the object which is kept weak by this instance. + * @return hard reference to the object + */ + public Object queryAdapted() + { + return m_weakRef.get(); + } + /** Method of com.sun.star.uno.XAdapter. Called by clients to register listener which + * are notified when the weak object is dying. + *@param xReference a listener + */ + public void removeReference(XReference xReference) + { + m_xreferenceList.remove(xReference); + } + /** Method of com.sun.star.uno.XAdapter. Called by clients to unregister listeners. + *@param a listener + */ + public void addReference(XReference xReference) + { + m_xreferenceList.add(xReference); + } +} + diff --git a/javaunohelper/com/sun/star/lib/uno/helper/WeakBase.java b/javaunohelper/com/sun/star/lib/uno/helper/WeakBase.java new file mode 100644 index 000000000000..28d9c9bd35a9 --- /dev/null +++ b/javaunohelper/com/sun/star/lib/uno/helper/WeakBase.java @@ -0,0 +1,146 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: WeakBase.java,v $ + * $Revision: 1.4 $ + * + * 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.lib.uno.helper; +import com.sun.star.uno.XWeak; +import com.sun.star.uno.XAdapter; +import com.sun.star.lang.XTypeProvider; +import com.sun.star.uno.Type; +import java.util.Vector; +import java.util.Map; +import java.util.Hashtable; + + +/** This class can be used as the base class for UNO components. It implements the capability + * to be kept weak (com.sun.star.uno.XWeak) and it implements com.sun.star.lang.XTypeProvider + * which is necessary for using the component with StarBasic. + */ +public class WeakBase implements XWeak, XTypeProvider +{ + private final boolean DEBUG= false; + + // Contains all WeakAdapter which have been created in this class + // They have to be notified when this object dies + private WeakAdapter m_adapter; + + protected static Map _mapImplementationIds= new Hashtable(); + protected static Map _mapTypes= new Hashtable(); + + /** Method of XWeak. The returned XAdapter implementation can be used to keap + * a weak reference to this object. + * @return a com.sun.star.uno.XAdapter implementation. + */ + synchronized public XAdapter queryAdapter() + { + if (m_adapter == null) + m_adapter= new WeakAdapter(this); + return m_adapter; + } + + /** Override of Object.finalize. When there are no references to this object anymore + * then the garbage collector calls this method. Thereby causing the adapter object + * to be notified. The adapter, in turn, notifies all listeners (com.sun.star.uno.XReference) + */ + protected void finalize() throws java.lang.Throwable + { + if (m_adapter != null) + m_adapter.referentDying(); + super.finalize(); + } + + /** Method of XTypeProvider. It returns an array of Type objects which represent + * all implemented UNO interfaces of this object. + * @return Type objects of all implemented interfaces. + */ + public Type[] getTypes() + { + Type[] arTypes= (Type[]) _mapTypes.get( getClass()); + if (arTypes == null) + { + Vector vec= new Vector(); + Class currentClass= getClass(); + do + { + Class interfaces[]= currentClass.getInterfaces(); + for(int i = 0; i < interfaces.length; ++ i) + { + // Test if it is a UNO interface + if (com.sun.star.uno.XInterface.class.isAssignableFrom((interfaces[i]))) + vec.add(new Type(interfaces[i])); + } + // get the superclass the currentClass inherits from + currentClass= currentClass.getSuperclass(); + } while (currentClass != null); + + Type types[]= new Type[vec.size()]; + for( int i= 0; i < types.length; i++) + types[i]= (Type) vec.elementAt(i); + _mapTypes.put(getClass(), types); + arTypes= types; + } + return arTypes; + } + + /** Method of XTypeProvider. It provides an identifier that represents the set of UNO + * interfaces implemented by this class. All instances of this class + * which run in the same Java Virtual Machine return the same array. (This only works as long + * the ClassLoader preserves the class even if no instance exist.) + *@return identifier as array of bytes + */ + public byte[] getImplementationId() + { + byte[] id= null; + synchronized (_mapImplementationIds) + { + id= (byte[]) _mapImplementationIds.get(getClass()); + + if (id == null) + { + int hash = hashCode(); + String sName= getClass().getName(); + byte[] arName= sName.getBytes(); + int nNameLength= arName.length; + + id= new byte[ 4 + nNameLength]; + id[0]= (byte)(hash & 0xff); + id[1]= (byte)((hash >>> 8) & 0xff); + id[2]= (byte)((hash >>> 16) & 0xff); + id[3]= (byte)((hash >>>24) & 0xff); + + for (int i= 0; i < nNameLength; i++) + { + id[4 + i]= arName[i]; + } + _mapImplementationIds.put(getClass(), id); + } + } + return id; + } +} diff --git a/javaunohelper/com/sun/star/lib/uno/helper/makefile.mk b/javaunohelper/com/sun/star/lib/uno/helper/makefile.mk new file mode 100644 index 000000000000..ee2535f291a1 --- /dev/null +++ b/javaunohelper/com/sun/star/lib/uno/helper/makefile.mk @@ -0,0 +1,53 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.9 $ +# +# 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. +# +#************************************************************************* + +PRJ=..$/..$/..$/..$/..$/.. + +PRJNAME = juhelper +PACKAGE = com$/sun$/star$/lib$/uno$/helper +TARGET = com_sun_star_lib_uno_helper + +.INCLUDE : settings.mk +.INCLUDE: $(PRJ)$/util$/settings.pmk + +JAVAFILES = \ + ComponentBase.java \ + Factory.java \ + InterfaceContainer.java \ + MultiTypeInterfaceContainer.java \ + PropertySet.java \ + PropertySetMixin.java \ + UnoUrl.java \ + WeakAdapter.java \ + WeakBase.java + +.INCLUDE : target.mk + diff --git a/javaunohelper/inc/makefile.mk b/javaunohelper/inc/makefile.mk new file mode 100644 index 000000000000..3a658a8a9eba --- /dev/null +++ b/javaunohelper/inc/makefile.mk @@ -0,0 +1,51 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.3 $ +# +# 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. +# +#************************************************************************* +PRJ=.. + +PRJNAME=javaunohelper +TARGET=inc + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk + +# --- Files -------------------------------------------------------- +# --- Targets ------------------------------------------------------- + +.INCLUDE : target.mk + +.IF "$(ENABLE_PCH)"!="" +ALLTAR : \ + $(SLO)$/precompiled.pch \ + $(SLO)$/precompiled_ex.pch + +.ENDIF # "$(ENABLE_PCH)"!="" + diff --git a/javaunohelper/inc/pch/precompiled_javaunohelper.cxx b/javaunohelper/inc/pch/precompiled_javaunohelper.cxx new file mode 100644 index 000000000000..7adb7cfd98ae --- /dev/null +++ b/javaunohelper/inc/pch/precompiled_javaunohelper.cxx @@ -0,0 +1,32 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: precompiled_javaunohelper.cxx,v $ + * $Revision: 1.3 $ + * + * 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. + * + ************************************************************************/ + +#include "precompiled_javaunohelper.hxx" + diff --git a/javaunohelper/inc/pch/precompiled_javaunohelper.hxx b/javaunohelper/inc/pch/precompiled_javaunohelper.hxx new file mode 100644 index 000000000000..a523b198e4f2 --- /dev/null +++ b/javaunohelper/inc/pch/precompiled_javaunohelper.hxx @@ -0,0 +1,35 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: precompiled_javaunohelper.hxx,v $ + * $Revision: 1.3 $ + * + * 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. + * + ************************************************************************/ + +// MARKER(update_precomp.py): Generated on 2006-09-01 17:49:50.311334 + +#ifdef PRECOMPILED_HEADERS +#endif + diff --git a/javaunohelper/prj/build.lst b/javaunohelper/prj/build.lst new file mode 100644 index 000000000000..c18dd3eb94dc --- /dev/null +++ b/javaunohelper/prj/build.lst @@ -0,0 +1,10 @@ +jh javaunohelper : bridges cppuhelper jurt ridljar unoil NULL +jh javaunohelper usr1 - all jh_mkout NULL +jh javaunohelper\inc nmake - all jh_inc NULL +jh javaunohelper\com\sun\star\comp\helper nmake - all jh_helper jh_inc NULL +jh javaunohelper\com\sun\star\comp\juhtest nmake - all jh_juhtest jh_helper jh_libhelp NULL +jh javaunohelper\com\sun\star\comp nmake - all jh_comp jh_juhtest NULL +jh javaunohelper\com\sun\star\lib\uno\adapter nmake - all jh_adapter jh_libhelp jh_inc NULL +jh javaunohelper\com\sun\star\lib\uno\helper nmake - all jh_libhelp jh_inc NULL +jh javaunohelper\source nmake - all jh_source jh_inc NULL +jh javaunohelper\util nmake - all jh_util jh_helper jh_source jh_adapter jh_libhelp jh_comp NULL diff --git a/javaunohelper/prj/d.lst b/javaunohelper/prj/d.lst new file mode 100644 index 000000000000..1fbd9c223bab --- /dev/null +++ b/javaunohelper/prj/d.lst @@ -0,0 +1,6 @@ +..\%__SRC%\class\juh.jar %_DEST%\bin%_EXT%\juh.jar +..\%__SRC%\bin\juh*.dll %_DEST%\bin%_EXT%\juh*.dll +..\%__SRC%\lib\libjuh*.so %_DEST%\lib%_EXT%\libjuh*.so +..\%__SRC%\lib\libjuh*.dylib %_DEST%\lib%_EXT%\libjuh*.dylib + +..\%__SRC%\bin\juh_src.zip %COMMON_DEST%\bin%_EXT%\juh_src.zip diff --git a/javaunohelper/source/bootstrap.cxx b/javaunohelper/source/bootstrap.cxx new file mode 100644 index 000000000000..98219d4f4f67 --- /dev/null +++ b/javaunohelper/source/bootstrap.cxx @@ -0,0 +1,192 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: bootstrap.cxx,v $ + * $Revision: 1.13 $ + * + * 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. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_javaunohelper.hxx" + +#include "osl/diagnose.h" + +#include "rtl/alloc.h" +#include "rtl/bootstrap.hxx" +#include "rtl/string.hxx" + +#include "uno/mapping.hxx" +#include "uno/environment.hxx" + +#include "cppuhelper/bootstrap.hxx" + +#include "com/sun/star/lang/XComponent.hpp" +#include "com/sun/star/lang/XSingleComponentFactory.hpp" + +#include "jni.h" +#include "jvmaccess/virtualmachine.hxx" +#include "jvmaccess/unovirtualmachine.hxx" + +#include "vm.hxx" + +#define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) ) + + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using ::rtl::OString; +using ::rtl::OUString; + +namespace javaunohelper +{ + +inline ::rtl::OUString jstring_to_oustring( jstring jstr, JNIEnv * jni_env ) +{ + OSL_ASSERT( sizeof (sal_Unicode) == sizeof (jchar) ); + jsize len = jni_env->GetStringLength( jstr ); + rtl_uString * ustr = + (rtl_uString *)rtl_allocateMemory( sizeof (rtl_uString) + (len * sizeof (sal_Unicode)) ); + jni_env->GetStringRegion( jstr, 0, len, ustr->buffer ); + OSL_ASSERT( JNI_FALSE == jni_env->ExceptionCheck() ); + ustr->refCount = 1; + ustr->length = len; + ustr->buffer[ len ] = '\0'; + return ::rtl::OUString( ustr, SAL_NO_ACQUIRE ); +} + +} + +//================================================================================================== +extern "C" JNIEXPORT jobject JNICALL Java_com_sun_star_comp_helper_Bootstrap_cppuhelper_1bootstrap( + JNIEnv * jni_env, jclass, jstring juno_rc, jobjectArray jpairs, + jobject loader ) +{ + try + { + if (0 != jpairs) + { + jsize nPos = 0, len = jni_env->GetArrayLength( jpairs ); + while (nPos < len) + { + // name + jstring jstr = (jstring)jni_env->GetObjectArrayElement( jpairs, nPos ); + if (JNI_FALSE != jni_env->ExceptionCheck()) + { + jni_env->ExceptionClear(); + throw RuntimeException( + OUSTR("index out of bounds?!"), Reference< XInterface >() ); + } + if (0 != jstr) + { + OUString name( ::javaunohelper::jstring_to_oustring( jstr, jni_env ) ); + // value + jstr = (jstring)jni_env->GetObjectArrayElement( jpairs, nPos +1 ); + if (JNI_FALSE != jni_env->ExceptionCheck()) + { + jni_env->ExceptionClear(); + throw RuntimeException( + OUSTR("index out of bounds?!"), Reference< XInterface >() ); + } + if (0 != jstr) + { + OUString value( ::javaunohelper::jstring_to_oustring( jstr, jni_env ) ); + + // set bootstrap parameter + ::rtl::Bootstrap::set( name, value ); + } + } + nPos += 2; + } + } + + // bootstrap uno + Reference< XComponentContext > xContext; + if (0 == juno_rc) + { + xContext = ::cppu::defaultBootstrap_InitialComponentContext(); + } + else + { + OUString uno_rc( ::javaunohelper::jstring_to_oustring( juno_rc, jni_env ) ); + xContext = ::cppu::defaultBootstrap_InitialComponentContext( uno_rc ); + } + + // create vm access + ::rtl::Reference< ::jvmaccess::UnoVirtualMachine > vm_access( + ::javaunohelper::create_vm_access( jni_env, loader ) ); + // wrap vm singleton entry + xContext = ::javaunohelper::install_vm_singleton( xContext, vm_access ); + + // get uno envs + OUString cpp_env_name = OUSTR(CPPU_CURRENT_LANGUAGE_BINDING_NAME); + OUString java_env_name = OUSTR(UNO_LB_JAVA); + Environment java_env, cpp_env; + uno_getEnvironment((uno_Environment **)&cpp_env, cpp_env_name.pData, NULL); + uno_getEnvironment( (uno_Environment **)&java_env, java_env_name.pData, vm_access.get() ); + + // map to java + Mapping mapping( cpp_env.get(), java_env.get() ); + if (! mapping.is()) + { + Reference< lang::XComponent > xComp( xContext, UNO_QUERY ); + if (xComp.is()) + xComp->dispose(); + throw RuntimeException( + OUSTR("cannot get mapping C++ <-> Java!"), + Reference< XInterface >() ); + } + + jobject jret = (jobject)mapping.mapInterface( xContext.get(), ::getCppuType( &xContext ) ); + jobject jlocal = jni_env->NewLocalRef( jret ); + jni_env->DeleteGlobalRef( jret ); + + return jlocal; + } + catch (RuntimeException & exc) + { + jclass c = jni_env->FindClass( "com/sun/star/uno/RuntimeException" ); + if (0 != c) + { + OString cstr( ::rtl::OUStringToOString( + exc.Message, RTL_TEXTENCODING_JAVA_UTF8 ) ); + OSL_TRACE( __FILE__": forwarding RuntimeException: %s", cstr.getStr() ); + jni_env->ThrowNew( c, cstr.getStr() ); + } + } + catch (Exception & exc) + { + jclass c = jni_env->FindClass( "com/sun/star/uno/Exception" ); + if (0 != c) + { + OString cstr( ::rtl::OUStringToOString( + exc.Message, RTL_TEXTENCODING_JAVA_UTF8 ) ); + OSL_TRACE( __FILE__": forwarding Exception: %s", cstr.getStr() ); + jni_env->ThrowNew( c, cstr.getStr() ); + } + } + + return 0; +} + diff --git a/javaunohelper/source/javaunohelper.cxx b/javaunohelper/source/javaunohelper.cxx new file mode 100644 index 000000000000..1ba29dc8d640 --- /dev/null +++ b/javaunohelper/source/javaunohelper.cxx @@ -0,0 +1,326 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: javaunohelper.cxx,v $ + * $Revision: 1.13 $ + * + * 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. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_javaunohelper.hxx" + +#include <osl/diagnose.h> +#include <osl/module.h> + +#include <uno/environment.hxx> +#include <uno/mapping.hxx> + +#include <cppuhelper/factory.hxx> +#include <cppuhelper/servicefactory.hxx> +#include <cppuhelper/component_context.hxx> + +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/registry/XRegistryKey.hpp> + +#include "jni.h" +#include "jvmaccess/virtualmachine.hxx" +#include "jvmaccess/unovirtualmachine.hxx" + +#include "vm.hxx" + +#define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) ) + + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using ::rtl::OString; +using ::rtl::OUString; + +/* + * Class: com_sun_star_comp_helper_SharedLibraryLoader + * Method: component_writeInfo + * Signature: (Ljava/lang/String;Lcom/sun/star/lang/XMultiServiceFactory;Lcom/sun/star/registry/XRegistryKey;)Z + */ +extern "C" JNIEXPORT jboolean JNICALL +Java_com_sun_star_comp_helper_SharedLibraryLoader_component_1writeInfo( + JNIEnv * pJEnv, jclass, jstring jLibName, jobject jSMgr, + jobject jRegKey, jobject loader ) +{ + sal_Bool bRet = sal_False; + + const jchar* pJLibName = pJEnv->GetStringChars( jLibName, NULL ); + OUString aLibName( pJLibName ); + pJEnv->ReleaseStringChars( jLibName, pJLibName); + + oslModule lib = osl_loadModule( aLibName.pData, SAL_LOADMODULE_LAZY | SAL_LOADMODULE_GLOBAL ); + if (lib) + { + // ========================= LATEST VERSION ========================= + OUString aGetEnvName( RTL_CONSTASCII_USTRINGPARAM(COMPONENT_GETENV) ); + oslGenericFunction pSym = + osl_getFunctionSymbol( lib, aGetEnvName.pData ); + if (pSym) + { + Environment java_env, loader_env; + + const sal_Char * pEnvTypeName = 0; + (*((component_getImplementationEnvironmentFunc)pSym))( + &pEnvTypeName, (uno_Environment **)&loader_env ); + if (! loader_env.is()) + { + OUString aEnvTypeName( OUString::createFromAscii( pEnvTypeName ) ); + uno_getEnvironment( (uno_Environment **)&loader_env, aEnvTypeName.pData, 0 ); + } + + // create vm access + ::rtl::Reference< ::jvmaccess::UnoVirtualMachine > vm_access( + ::javaunohelper::create_vm_access( pJEnv, loader ) ); + OUString java_env_name = OUSTR(UNO_LB_JAVA); + uno_getEnvironment( + (uno_Environment **)&java_env, java_env_name.pData, vm_access.get() ); + + OUString aWriteInfoName( RTL_CONSTASCII_USTRINGPARAM(COMPONENT_WRITEINFO) ); + pSym = osl_getFunctionSymbol( lib, aWriteInfoName.pData ); + if (pSym) + { + if (loader_env.is() && java_env.is()) + { + Mapping java2dest(java_env.get(), loader_env.get()); + + if ( java2dest.is() ) + { + void * pSMgr = + java2dest.mapInterface( + jSMgr, getCppuType((Reference< lang::XMultiServiceFactory > *) 0) ); + void * pKey = + java2dest.mapInterface( + jRegKey, getCppuType((Reference< registry::XRegistryKey > *) 0) ); + + uno_ExtEnvironment * env = loader_env.get()->pExtEnv; + if (pKey) + { + bRet = (*((component_writeInfoFunc)pSym))( pSMgr, pKey ); + + if (env) + (*env->releaseInterface)( env, pKey ); + } + + if (pSMgr && env) + (*env->releaseInterface)( env, pSMgr ); + } + } + } + } + } + + return bRet == sal_False? JNI_FALSE : JNI_TRUE; +} + +/* + * Class: com_sun_star_comp_helper_SharedLibraryLoader + * Method: component_getFactory + * Signature: (Ljava/lang/String;Ljava/lang/String;Lcom/sun/star/lang/XMultiServiceFactory;Lcom/sun/star/registry/XRegistryKey;)Ljava/lang/Object; + */ +extern "C" JNIEXPORT jobject JNICALL +Java_com_sun_star_comp_helper_SharedLibraryLoader_component_1getFactory( + JNIEnv * pJEnv, jclass, jstring jLibName, jstring jImplName, + jobject jSMgr, jobject jRegKey, jobject loader ) +{ + const jchar* pJLibName = pJEnv->GetStringChars(jLibName, NULL); + OUString aLibName( pJLibName ); + pJEnv->ReleaseStringChars( jLibName, pJLibName); + + aLibName += OUString( RTL_CONSTASCII_USTRINGPARAM(SAL_DLLEXTENSION) ); + + jobject joSLL_cpp = 0; + + oslModule lib = osl_loadModule( aLibName.pData, SAL_LOADMODULE_LAZY | SAL_LOADMODULE_GLOBAL ); + if (lib) + { + // ========================= LATEST VERSION ========================= + OUString aGetEnvName( RTL_CONSTASCII_USTRINGPARAM(COMPONENT_GETENV) ); + oslGenericFunction pSym = + osl_getFunctionSymbol( lib, aGetEnvName.pData ); + if (pSym) + { + Environment java_env, loader_env; + + const sal_Char * pEnvTypeName = 0; + (*((component_getImplementationEnvironmentFunc)pSym))( + &pEnvTypeName, (uno_Environment **)&loader_env ); + + if (! loader_env.is()) + { + OUString aEnvTypeName( OUString::createFromAscii( pEnvTypeName ) ); + uno_getEnvironment( (uno_Environment **)&loader_env, aEnvTypeName.pData, 0 ); + } + + // create vm access + ::rtl::Reference< ::jvmaccess::UnoVirtualMachine > vm_access( + ::javaunohelper::create_vm_access( pJEnv, loader ) ); + OUString java_env_name = OUSTR(UNO_LB_JAVA); + uno_getEnvironment( + (uno_Environment **)&java_env, java_env_name.pData, vm_access.get() ); + + OUString aGetFactoryName( RTL_CONSTASCII_USTRINGPARAM(COMPONENT_GETFACTORY) ); + pSym = osl_getFunctionSymbol( lib, aGetFactoryName.pData ); + if (pSym) + { + if (loader_env.is() && java_env.is()) + { + Mapping java2dest( java_env.get(), loader_env.get() ); + Mapping dest2java( loader_env.get(), java_env.get() ); + + if (dest2java.is() && java2dest.is()) + { + void * pSMgr = + java2dest.mapInterface( + jSMgr, ::getCppuType((Reference< lang::XMultiServiceFactory > *) 0) ); + void * pKey = + java2dest.mapInterface( + jRegKey, ::getCppuType((Reference< registry::XRegistryKey > *) 0) ); + + const char* pImplName = pJEnv->GetStringUTFChars( jImplName, NULL ); + + void * pSSF = (*((component_getFactoryFunc)pSym))( + pImplName, pSMgr, pKey ); + + pJEnv->ReleaseStringUTFChars( jImplName, pImplName ); + + uno_ExtEnvironment * env = loader_env.get()->pExtEnv; + + if (pKey && env) + (*env->releaseInterface)( env, pKey ); + if (pSMgr && env) + (*env->releaseInterface)( env, pSMgr ); + + if (pSSF) + { + jobject jglobal = (jobject) dest2java.mapInterface( + pSSF, getCppuType((Reference< XInterface > *) 0) ); + joSLL_cpp = pJEnv->NewLocalRef( jglobal ); + pJEnv->DeleteGlobalRef( jglobal ); + if (env) + (*env->releaseInterface)( env, pSSF ); + } + } + } + } + } + } + + return joSLL_cpp; +} + +/* + * Class: com_sun_star_comp_helper_RegistryServiceFactory + * Method: createRegistryServiceFactory + * Signature: (Ljava/lang/String;Ljava/lang/String;Z)Ljava/lang/Object; + */ +extern "C" JNIEXPORT jobject JNICALL +Java_com_sun_star_comp_helper_RegistryServiceFactory_createRegistryServiceFactory( + JNIEnv * pJEnv, jclass, jstring jWriteRegFile, + jstring jReadRegFile, jboolean jbReadOnly, jobject loader ) +{ + jobject joRegServiceFac = 0; + + try + { + OUString aWriteRegFile; + OUString aReadRegFile; + + sal_Bool bReadOnly = jbReadOnly == JNI_FALSE ? sal_False : sal_True; + + if (jReadRegFile) { + const jchar* pjReadRegFile = pJEnv->GetStringChars(jReadRegFile, NULL); + aReadRegFile = OUString(pjReadRegFile); + pJEnv->ReleaseStringChars(jReadRegFile, pjReadRegFile); + } + + if (jWriteRegFile) { + const jchar * pjWriteRegFile = pJEnv->GetStringChars(jWriteRegFile, NULL); + aWriteRegFile = OUString(pjWriteRegFile); + pJEnv->ReleaseStringChars(jWriteRegFile, pjWriteRegFile); + } + + // bootstrap + Reference< lang::XMultiServiceFactory > rMSFac; + if (aReadRegFile.getLength() == 0) + rMSFac = ::cppu::createRegistryServiceFactory( aWriteRegFile, bReadOnly); + else + rMSFac = ::cppu::createRegistryServiceFactory(aWriteRegFile, aReadRegFile, bReadOnly); + + Reference< beans::XPropertySet > xProps( + rMSFac, UNO_QUERY_THROW ); + Reference< XComponentContext > xContext( + xProps->getPropertyValue( OUSTR("DefaultContext") ), UNO_QUERY_THROW ); + + // create vm access + ::rtl::Reference< ::jvmaccess::UnoVirtualMachine > vm_access( + ::javaunohelper::create_vm_access( pJEnv, loader ) ); + // wrap vm singleton entry + xContext = ::javaunohelper::install_vm_singleton( xContext, vm_access ); + rMSFac.set( xContext->getServiceManager(), UNO_QUERY_THROW ); + + // get uno envs + OUString aCurrentEnv(RTL_CONSTASCII_USTRINGPARAM(CPPU_CURRENT_LANGUAGE_BINDING_NAME)); + OUString java_env_name = OUSTR(UNO_LB_JAVA); + Environment java_env, curr_env; + uno_getEnvironment((uno_Environment **)&curr_env, aCurrentEnv.pData, NULL); + uno_getEnvironment( (uno_Environment **)&java_env, java_env_name.pData, vm_access.get() ); + + Mapping curr_java(curr_env.get(), java_env.get()); + if (! curr_java.is()) + { + throw RuntimeException( + OUSTR("no C++ <-> Java mapping available!"), Reference< XInterface >() ); + } + + jobject joGlobalRegServiceFac = + (jobject)curr_java.mapInterface( + rMSFac.get(), + getCppuType((Reference< lang::XMultiServiceFactory > *)0) ); + joRegServiceFac = pJEnv->NewLocalRef( joGlobalRegServiceFac ); + pJEnv->DeleteGlobalRef(joGlobalRegServiceFac); + } + catch (Exception & exc) + { + jclass c = pJEnv->FindClass( "com/sun/star/uno/RuntimeException" ); + if (0 != c) + { + OString cstr( ::rtl::OUStringToOString( + exc.Message, RTL_TEXTENCODING_JAVA_UTF8 ) ); + OSL_TRACE( __FILE__": forwarding Exception: %s", cstr.getStr() ); + pJEnv->ThrowNew( c, cstr.getStr() ); + } + return 0; + } + + OSL_TRACE("javaunohelper.cxx: object %i", joRegServiceFac); + + return joRegServiceFac; +} diff --git a/javaunohelper/source/javaunohelper.map b/javaunohelper/source/javaunohelper.map new file mode 100644 index 000000000000..a7bf6b0721af --- /dev/null +++ b/javaunohelper/source/javaunohelper.map @@ -0,0 +1,9 @@ +UDK_3.1 { + global: + Java_com_sun_star_comp_helper_SharedLibraryLoader_component_1writeInfo; + Java_com_sun_star_comp_helper_SharedLibraryLoader_component_1getFactory; + Java_com_sun_star_comp_helper_RegistryServiceFactory_createRegistryServiceFactory; + Java_com_sun_star_comp_helper_Bootstrap_cppuhelper_1bootstrap; + local: + *; +}; diff --git a/javaunohelper/source/makefile.mk b/javaunohelper/source/makefile.mk new file mode 100644 index 000000000000..4898c6a1179b --- /dev/null +++ b/javaunohelper/source/makefile.mk @@ -0,0 +1,138 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.18 $ +# +# 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. +# +#************************************************************************* + +PRJ=.. + +PRJNAME=javaunohelper +TARGET=juh +USE_DEFFILE=TRUE +ENABLE_EXCEPTIONS=TRUE +LIBTARGET=NO + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk + +.IF "$(SOLAR_JAVA)"=="" +nojava: + @echo "Not building javaunohelper because Java is disabled" +.ENDIF + +# ------------------------------------------------------------------ + +UNOUCRDEP=$(SOLARBINDIR)$/udkapi.rdb +UNOUCRRDB=$(SOLARBINDIR)$/udkapi.rdb + +UNOUCROUT=$(OUT)$/inc$/comprehensive +INCPRE+=$(OUT)$/inc$/comprehensive +NO_OFFUH=TRUE +CPPUMAKERFLAGS+=-C + +UNOTYPES= \ + com.sun.star.beans.NamedValue \ + com.sun.star.container.XHierarchicalNameAccess \ + com.sun.star.loader.XImplementationLoader \ + com.sun.star.registry.XRegistryKey \ + com.sun.star.registry.XSimpleRegistry \ + com.sun.star.beans.XPropertySet \ + com.sun.star.lang.DisposedException \ + com.sun.star.lang.IllegalArgumentException \ + com.sun.star.lang.XTypeProvider \ + com.sun.star.lang.XServiceInfo \ + com.sun.star.lang.XMultiServiceFactory \ + com.sun.star.lang.XMultiComponentFactory \ + com.sun.star.lang.XSingleServiceFactory \ + com.sun.star.lang.XSingleComponentFactory \ + com.sun.star.uno.TypeClass \ + com.sun.star.uno.XWeak \ + com.sun.star.uno.XAggregation \ + com.sun.star.uno.XComponentContext \ + com.sun.star.lang.XInitialization \ + com.sun.star.lang.XComponent + +SLOFILES= \ + $(SLO)$/javaunohelper.obj \ + $(SLO)$/bootstrap.obj \ + $(SLO)$/preload.obj \ + $(SLO)$/vm.obj + +# ------------------------------------------------------------------ + +LIB1TARGET=$(SLB)$/$(SHL1TARGET).lib +LIB1OBJFILES=\ + $(SLO)$/javaunohelper.obj \ + $(SLO)$/bootstrap.obj \ + $(SLO)$/vm.obj + +SHL1TARGET=juhx + +SHL1STDLIBS= \ + $(JVMACCESSLIB) \ + $(SALHELPERLIB) \ + $(SALLIB) \ + $(CPPULIB) \ + $(CPPUHELPERLIB) + +SHL1VERSIONMAP = javaunohelper.map + +SHL1DEPN= +SHL1IMPLIB=i$(SHL1TARGET) +SHL1LIBS=$(LIB1TARGET) +SHL1DEF=$(MISC)$/$(SHL1TARGET).def +SHL1RPATH=URELIB + +DEF1NAME=$(SHL1TARGET) + +# ------------------------------------------------------------------ + +LIB2TARGET=$(SLB)$/$(SHL2TARGET).lib +LIB2OBJFILES=\ + $(SLO)$/preload.obj + +SHL2TARGET=juh + +SHL2STDLIBS= \ + $(SALLIB) + +SHL2VERSIONMAP = javaunohelper.map + +SHL2DEPN= +SHL2IMPLIB=i$(SHL2TARGET) +SHL2LIBS=$(LIB2TARGET) +SHL2DEF=$(MISC)$/$(SHL2TARGET).def +SHL2RPATH=URELIB + +DEF2NAME=$(SHL2TARGET) + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + diff --git a/javaunohelper/source/preload.cxx b/javaunohelper/source/preload.cxx new file mode 100644 index 000000000000..9d2d8a5eeeaf --- /dev/null +++ b/javaunohelper/source/preload.cxx @@ -0,0 +1,161 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: preload.cxx,v $ + * $Revision: 1.8 $ + * + * 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. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_javaunohelper.hxx" + +#include "jni.h" + +#include "rtl/ustring.hxx" +#include "osl/module.h" + +#define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) ) + +#if ! defined SAL_DLLPREFIX +#define SAL_DLLPREFIX "" +#endif + +using ::rtl::OUString; + +extern "C" +{ +typedef jboolean (JNICALL * fptr_writeInfo)( + JNIEnv *, jclass, jstring, jobject, jobject, jobject ); +typedef jobject (JNICALL * fptr_getFactory)( + JNIEnv *, jclass, jstring, jstring, jobject, jobject, jobject ); +typedef jobject (JNICALL * fptr_createRegistryServiceFactory)( + JNIEnv *, jclass, jstring, jstring, jboolean, jobject ); +typedef jobject (JNICALL * fptr_bootstrap)( + JNIEnv *_env, jclass, jstring, jobjectArray, jobject ); + +static fptr_writeInfo s_writeInfo; +static fptr_getFactory s_getFactory; +static fptr_createRegistryServiceFactory s_createRegistryServiceFactory; +static fptr_bootstrap s_bootstrap; +static bool s_inited = false; + +extern "C" { static void SAL_CALL thisModule() {} } + +//-------------------------------------------------------------------------------------------------- +static bool inited_juhx( JNIEnv * jni_env ) +{ + if (s_inited) + return true; + OUString lib_name = OUSTR(SAL_DLLPREFIX "juhx" SAL_DLLEXTENSION); + oslModule hModule = + osl_loadModuleRelative( &thisModule, lib_name.pData, SAL_LOADMODULE_LAZY | SAL_LOADMODULE_GLOBAL ); + if (0 == hModule) + { + jclass c = jni_env->FindClass( "java/lang/RuntimeException" ); + jni_env->ThrowNew( + c, "error loading " SAL_DLLPREFIX "juhx" SAL_DLLEXTENSION "!" ); + return false; + } + else + { + OUString symbol = + OUSTR("Java_com_sun_star_comp_helper_SharedLibraryLoader_component_1writeInfo"); + s_writeInfo = (fptr_writeInfo)osl_getFunctionSymbol( + hModule, symbol.pData ); + symbol = + OUSTR("Java_com_sun_star_comp_helper_SharedLibraryLoader_component_1getFactory"); + s_getFactory = (fptr_getFactory)osl_getFunctionSymbol( + hModule, symbol.pData ); + symbol = + OUSTR("Java_com_sun_star_comp_helper_RegistryServiceFactory_createRegistryServiceFactory"); + s_createRegistryServiceFactory = + (fptr_createRegistryServiceFactory)osl_getFunctionSymbol( + hModule, symbol.pData ); + symbol = + OUSTR("Java_com_sun_star_comp_helper_Bootstrap_cppuhelper_1bootstrap"); + s_bootstrap = + (fptr_bootstrap)osl_getFunctionSymbol( hModule, symbol.pData ); + + if (0 == s_writeInfo || + 0 == s_getFactory || + 0 == s_createRegistryServiceFactory || + 0 == s_bootstrap) + { + jclass c = jni_env->FindClass( "java/lang/RuntimeException" ); + jni_env->ThrowNew( + c, "error resolving symbols of " SAL_DLLPREFIX "juhx" SAL_DLLEXTENSION "!" ); + return false; + } + } + s_inited = true; + return true; +} + +//================================================================================================== +JNIEXPORT jboolean JNICALL +Java_com_sun_star_comp_helper_SharedLibraryLoader_component_1writeInfo( + JNIEnv * pJEnv, jclass jClass, jstring jLibName, jobject jSMgr, + jobject jRegKey, jobject loader ) +{ + if (inited_juhx( pJEnv )) + return (*s_writeInfo)( + pJEnv, jClass, jLibName, jSMgr, jRegKey, loader ); + return JNI_FALSE; +} +//================================================================================================== +JNIEXPORT jobject JNICALL +Java_com_sun_star_comp_helper_SharedLibraryLoader_component_1getFactory( + JNIEnv * pJEnv, jclass jClass, jstring jLibName, jstring jImplName, + jobject jSMgr, jobject jRegKey, jobject loader ) +{ + if (inited_juhx( pJEnv )) + return (*s_getFactory)( + pJEnv, jClass, jLibName, jImplName, jSMgr, jRegKey, loader ); + return 0; +} +//================================================================================================== +JNIEXPORT jobject JNICALL +Java_com_sun_star_comp_helper_RegistryServiceFactory_createRegistryServiceFactory( + JNIEnv * pJEnv, jclass jClass, jstring jWriteRegFile, + jstring jReadRegFile, jboolean jbReadOnly, jobject loader ) +{ + if (inited_juhx( pJEnv )) + { + return (*s_createRegistryServiceFactory)( + pJEnv, jClass, jWriteRegFile, jReadRegFile, jbReadOnly, loader ); + } + return 0; +} +//================================================================================================== +JNIEXPORT jobject JNICALL +Java_com_sun_star_comp_helper_Bootstrap_cppuhelper_1bootstrap( + JNIEnv * jni_env, jclass jClass, jstring juno_rc, jobjectArray jpairs, + jobject loader ) +{ + if (inited_juhx( jni_env )) + return (*s_bootstrap)( jni_env, jClass, juno_rc, jpairs, loader ); + return 0; +} +} diff --git a/javaunohelper/source/vm.cxx b/javaunohelper/source/vm.cxx new file mode 100644 index 000000000000..778e105f4961 --- /dev/null +++ b/javaunohelper/source/vm.cxx @@ -0,0 +1,150 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: vm.cxx,v $ + * $Revision: 1.6 $ + * + * 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. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_javaunohelper.hxx" + +#include "sal/config.h" + +#include "vm.hxx" + +#include "com/sun/star/beans/NamedValue.hpp" +#include "com/sun/star/lang/XSingleComponentFactory.hpp" +#include "cppuhelper/compbase1.hxx" +#include "cppuhelper/component_context.hxx" +#include "jvmaccess/virtualmachine.hxx" +#include "jvmaccess/unovirtualmachine.hxx" +#include "osl/mutex.hxx" + +namespace { + +namespace css = ::com::sun::star; + +struct MutexHolder +{ + ::osl::Mutex m_mutex; +}; +typedef ::cppu::WeakComponentImplHelper1< + css::lang::XSingleComponentFactory > t_impl; + +class SingletonFactory : public MutexHolder, public t_impl +{ + ::rtl::Reference< ::jvmaccess::UnoVirtualMachine > m_vm_access; + +protected: + virtual void SAL_CALL disposing(); + +public: + inline SingletonFactory( ::rtl::Reference< ::jvmaccess::UnoVirtualMachine > const & vm_access ) + : t_impl( m_mutex ), + m_vm_access( vm_access ) + {} + + // XSingleComponentFactory impl + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstanceWithContext( + css::uno::Reference< css::uno::XComponentContext > const & xContext ) + throw (css::uno::Exception); + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstanceWithArgumentsAndContext( + css::uno::Sequence< css::uno::Any > const & args, css::uno::Reference< css::uno::XComponentContext > const & xContext ) + throw (css::uno::Exception); +}; + +void SingletonFactory::disposing() +{ + m_vm_access.clear(); +} + +css::uno::Reference< css::uno::XInterface > SingletonFactory::createInstanceWithContext( + css::uno::Reference< css::uno::XComponentContext > const & xContext ) + throw (css::uno::Exception) +{ + sal_Int64 handle = reinterpret_cast< sal_Int64 >( m_vm_access.get() ); + css::uno::Any arg( + css::uno::makeAny( + css::beans::NamedValue( + rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( "UnoVirtualMachine" ) ), + css::uno::makeAny( handle ) ) ) ); + return xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + ::rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "com.sun.star.java.JavaVirtualMachine")), + css::uno::Sequence< css::uno::Any >( &arg, 1 ), xContext ); +} + +css::uno::Reference< css::uno::XInterface > SingletonFactory::createInstanceWithArgumentsAndContext( + css::uno::Sequence< css::uno::Any > const & args, css::uno::Reference< css::uno::XComponentContext > const & xContext ) + throw (css::uno::Exception) +{ + return xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + ::rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "com.sun.star.java.JavaVirtualMachine")), + args, xContext ); +} + +} + +namespace javaunohelper { + +::rtl::Reference< ::jvmaccess::UnoVirtualMachine > create_vm_access( + JNIEnv * jni_env, jobject loader ) +{ + JavaVM * vm; + jni_env->GetJavaVM( &vm ); + try { + return new ::jvmaccess::UnoVirtualMachine( + new ::jvmaccess::VirtualMachine( + vm, JNI_VERSION_1_2, false, jni_env ), + loader ); + } catch ( ::jvmaccess::UnoVirtualMachine::CreationException & ) { + throw css::uno::RuntimeException( + ::rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "jmvaccess::UnoVirtualMachine::CreationException" + " occurred" ) ), + css::uno::Reference< css::uno::XInterface >() ); + } +} + +css::uno::Reference< css::uno::XComponentContext > install_vm_singleton( + css::uno::Reference< ::css::uno::XComponentContext > const & xContext, + ::rtl::Reference< ::jvmaccess::UnoVirtualMachine > const & vm_access ) +{ + css::uno::Reference< css::lang::XSingleComponentFactory > xFac( new SingletonFactory( vm_access ) ); + ::cppu::ContextEntry_Init entry( + ::rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "/singletons/com.sun.star.java.theJavaVirtualMachine")), + css::uno::makeAny( xFac ), true ); + return ::cppu::createComponentContext( &entry, 1, xContext ); +} + +} diff --git a/javaunohelper/source/vm.hxx b/javaunohelper/source/vm.hxx new file mode 100644 index 000000000000..f68bdd9f6ec0 --- /dev/null +++ b/javaunohelper/source/vm.hxx @@ -0,0 +1,58 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: vm.hxx,v $ + * $Revision: 1.5 $ + * + * 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. + * + ************************************************************************/ + +#ifndef INCLUDED_JAVAUNOHELPER_SOURCE_VM_HXX +#define INCLUDED_JAVAUNOHELPER_SOURCE_VM_HXX + +#include "sal/config.h" + +#include "jni.h" +#include "com/sun/star/uno/Reference.hxx" +#include "rtl/ref.hxx" + +namespace com { namespace sun { namespace star { namespace uno { + class XComponentContext; +} } } } +namespace jvmaccess { class UnoVirtualMachine; } + +namespace javaunohelper { + +::rtl::Reference< ::jvmaccess::UnoVirtualMachine > create_vm_access( + JNIEnv * jni_env, jobject loader ); + +::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > +install_vm_singleton( + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > + const & xContext, + ::rtl::Reference< ::jvmaccess::UnoVirtualMachine > const & vm_access ); + +} + +#endif diff --git a/javaunohelper/test/com/sun/star/comp/helper/Bootstrap_Test.java b/javaunohelper/test/com/sun/star/comp/helper/Bootstrap_Test.java new file mode 100644 index 000000000000..b94b85771d8d --- /dev/null +++ b/javaunohelper/test/com/sun/star/comp/helper/Bootstrap_Test.java @@ -0,0 +1,120 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: Bootstrap_Test.java,v $ + * $Revision: 1.4 $ + * + * 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.helper; + +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.AnyConverter; + +import com.sun.star.uno.XComponentContext; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiServiceFactory; + + +public class Bootstrap_Test { + + static public boolean test( String ini_file, java.util.Hashtable bootstrap_parameters ) + throws java.lang.Exception + { + boolean passed = false; + System.err.println(); + System.out.println("*******************************************************************"); + System.err.println("Bootstrap - doing tests..."); + System.err.println(); + + try { + XComponentContext xContext = + com.sun.star.comp.helper.Bootstrap.defaultBootstrap_InitialComponentContext( + ini_file, bootstrap_parameters ); + + if (AnyConverter.isVoid( + xContext.getValueByName( + "/singletons/com.sun.star.reflection.theTypeDescriptionManager" ) )) + { + throw new Exception( + "no /singletons/com.sun.star.reflection.theTypeDescriptionManager!" ); + } + + XMultiServiceFactory msf = UnoRuntime.queryInterface( + XMultiServiceFactory.class, xContext.getServiceManager() ); + String services[] = msf.getAvailableServiceNames(); + System.out.println("Available services are:"); + System.err.println(); + if (services.length == 0) + System.out.println("No services avialable!"); + + else + for ( int i=0; i<services.length; i++ ) + System.out.println(services[i]); + + XComponent xComp = UnoRuntime.queryInterface( + XComponent.class, xContext ); + xComp.dispose(); + + passed = true; + } + catch (Exception e) { + e.printStackTrace(); + } + System.err.println(); + System.err.println("Bootstrap test passed? " + passed); + System.out.println("*******************************************************************"); + System.err.println(); + return passed; + } + + private static void usage() { + System.out.println(); + System.out.println("usage:"); + System.out.println("java com.sun.star.comp.helper.Bootstrap_Test ini-file name=value ..."); + System.out.println("example:"); + System.out.println("java com.sun.star.comp.helper.Bootstrap_Test file:///c:/ooo10/program/uno.ini SYSBINDIR=file:///c:/ooo10/program"); + System.exit( -1 ); + } + + static public void main(String args[]) throws java.lang.Exception { + if ( args.length == 0 ) + usage(); + + java.util.Hashtable bootstrap_parameters = new java.util.Hashtable(); + for ( int nPos = 1; nPos < args.length; ++nPos ) + { + String arg = args[ nPos ]; + int n = arg.indexOf( '=' ); + if (n > 0) + { + bootstrap_parameters.put( arg.substring( 0, n ), arg.substring( n +1 ) ); + } + } + + System.exit( test(args[0], bootstrap_parameters) == true ? 0: -1 ); + } +} + diff --git a/javaunohelper/test/com/sun/star/comp/helper/ComponentContext_Test.java b/javaunohelper/test/com/sun/star/comp/helper/ComponentContext_Test.java new file mode 100644 index 000000000000..f88864f2d3ba --- /dev/null +++ b/javaunohelper/test/com/sun/star/comp/helper/ComponentContext_Test.java @@ -0,0 +1,102 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ComponentContext_Test.java,v $ + * $Revision: 1.3 $ + * + * 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.helper; + +import com.sun.star.uno.XComponentContext; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiComponentFactory; + +import com.sun.star.comp.helper.ComponentContext; +import com.sun.star.comp.helper.ComponentContextEntry; +import com.sun.star.uno.UnoRuntime; + +import java.util.Hashtable; + + +public class ComponentContext_Test { + public static void main(String args[]) { + try { + Hashtable table = new Hashtable(); + table.put( "bla1", new ComponentContextEntry( null, new Integer( 1 ) ) ); + XComponentContext xInitialContext = Bootstrap.createInitialComponentContext( table ); + + table = new Hashtable(); + table.put( "bla2", new ComponentContextEntry( new Integer( 2 ) ) ); + table.put( "bla3", new Integer( 3 ) ); + XComponentContext xContext = new ComponentContext( table, xInitialContext ); + + XMultiComponentFactory xSMgr = xContext.getServiceManager(); + Object o = xSMgr.createInstanceWithContext( "com.sun.star.loader.Java", xContext ); + if (o == null) + System.err.println( "### failed raising service: 1!" ); + o = xSMgr.createInstanceWithContext( "com.sun.star.bridge.BridgeFactory", xContext ); + if (o == null) + System.err.println( "### failed raising service: 2!" ); + o = xSMgr.createInstanceWithContext( "com.sun.star.bridge.UnoUrlResolver", xContext ); + if (o == null) + System.err.println( "### failed raising service: 3!" ); + o = xSMgr.createInstanceWithContext( "com.sun.star.connection.Connector", xContext ); + if (o == null) + System.err.println( "### failed raising service: 4!" ); + o = xSMgr.createInstanceWithContext( "com.sun.star.connection.Acceptor", xContext ); + if (o == null) + System.err.println( "### failed raising service: 5!" ); + o = xSMgr.createInstanceWithContext( "com.sun.star.lang.ServiceManager", xContext ); + if (o == null) + System.err.println( "### failed raising service: 6!" ); + + if (xContext.getValueByName( "bla1" ) == null || + xContext.getValueByName( "bla2" ) == null || + xContext.getValueByName( "bla3" ) == null || + xInitialContext.getValueByName( "bla2" ) != null || + xInitialContext.getValueByName( "bla3" ) != null) + { + System.err.println( "### bootstrap context test failed: 1!" ); + } + if (((Integer)xContext.getValueByName( "bla1" )).intValue() != 1 || + ((Integer)xContext.getValueByName( "bla2" )).intValue() != 2 || + ((Integer)xContext.getValueByName( "bla3" )).intValue() != 3 || + ((Integer)xInitialContext.getValueByName( "bla1" )).intValue() != 1) + { + System.err.println( "### bootstrap context test failed: 2!" ); + } + + XComponent xComp = UnoRuntime.queryInterface( + XComponent.class, xInitialContext ); + xComp.dispose(); + } + catch(Exception exception) { + System.err.println("exception occurred:" + exception); + exception.printStackTrace(); + } + } +} + + diff --git a/javaunohelper/test/com/sun/star/comp/helper/RegistryServiceFactory_Test.java b/javaunohelper/test/com/sun/star/comp/helper/RegistryServiceFactory_Test.java new file mode 100644 index 000000000000..b1d448bf4080 --- /dev/null +++ b/javaunohelper/test/com/sun/star/comp/helper/RegistryServiceFactory_Test.java @@ -0,0 +1,103 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: RegistryServiceFactory_Test.java,v $ + * $Revision: 1.3 $ + * + * 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.helper; + +import com.sun.star.comp.loader.JavaLoader; + +import com.sun.star.comp.servicemanager.ServiceManager; +import com.sun.star.uno.UnoRuntime; + +import com.sun.star.container.XSet; +import com.sun.star.container.XContentEnumerationAccess; +import com.sun.star.container.XEnumeration; +import com.sun.star.container.XEnumerationAccess; +import com.sun.star.container.XElementAccess; + +import com.sun.star.lang.XComponent; + +import com.sun.star.lang.XServiceInfo; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XSingleServiceFactory; +import com.sun.star.lang.XInitialization; + +import com.sun.star.loader.XImplementationLoader; + +import com.sun.star.registry.XSimpleRegistry; + +public class RegistryServiceFactory_Test { + + static public boolean test(String applicat) throws java.lang.Exception { + boolean passed = false; + System.err.println(); + System.out.println("*******************************************************************"); + System.err.println("RegistryServiceFactory - doing tests..."); + System.err.println(); + + try { + XMultiServiceFactory msf = RegistryServiceFactory.create( applicat ); + String services[] = msf.getAvailableServiceNames(); + System.out.println("Available services are:"); + System.err.println(); + if (services.length == 0) + System.out.println("No services avialable!"); + + else + for ( int i=0; i<services.length; i++ ) + System.out.println(services[i]); + + passed = true; + } + catch (Exception e) { + e.printStackTrace(); + } + System.err.println(); + System.err.println("RegistryServiceFactory test passed? " + passed); + System.out.println("*******************************************************************"); + System.err.println(); + return passed; + } + + private static void usage() { + System.out.println(); + System.out.println("usage:"); + System.out.println("java com.sun.star.comp.helper.RegistryServiceFactory [rdb-file]"); + System.out.println("example:"); + System.out.println("java com.sun.star.comp.helper.RegistryServiceFactory c:\\applicat.rdb"); + System.exit( -1 ); + } + + static public void main(String args[]) throws java.lang.Exception { + if ( args.length != 1 ) + usage(); + System.exit( test(args[0]) == true ? 0: -1 ); + } +} + diff --git a/javaunohelper/test/com/sun/star/comp/helper/SharedLibraryLoader_Test.java b/javaunohelper/test/com/sun/star/comp/helper/SharedLibraryLoader_Test.java new file mode 100644 index 000000000000..fc4c2c06f463 --- /dev/null +++ b/javaunohelper/test/com/sun/star/comp/helper/SharedLibraryLoader_Test.java @@ -0,0 +1,197 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: SharedLibraryLoader_Test.java,v $ + * $Revision: 1.4 $ + * + * 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.helper; + +import com.sun.star.comp.loader.JavaLoader; + +import com.sun.star.comp.servicemanager.ServiceManager; +import com.sun.star.uno.UnoRuntime; + +import com.sun.star.container.XSet; +import com.sun.star.container.XContentEnumerationAccess; +import com.sun.star.container.XEnumeration; +import com.sun.star.container.XEnumerationAccess; +import com.sun.star.container.XElementAccess; + +import com.sun.star.lang.XComponent; + +import com.sun.star.lang.XServiceInfo; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XSingleServiceFactory; +import com.sun.star.lang.XInitialization; + +import com.sun.star.loader.XImplementationLoader; + +import com.sun.star.registry.XSimpleRegistry; + + +public class SharedLibraryLoader_Test { + + private static final String NATIVE_SERVICE_MANAGER_IMP_NAME = "com.sun.star.comp.stoc.OServiceManager"; + private static final String NATIVE_SERVICE_MANAGER_LIB_NAME = "servicemgr.uno"; + private static final String NATIVE_REGISTRY_IMP_NAME = "com.sun.star.comp.stoc.SimpleRegistry"; + private static final String NATIVE_REGISTRY_LIB_NAME = "simplereg.uno"; + + private static XMultiServiceFactory nativeServiceManager = null; + private static XSingleServiceFactory sharedLibraryLoaderFactory = null; + private static XImplementationLoader sharedLibraryLoader = null; + private static XSimpleRegistry simpleRegistry = null; + + static public boolean test_getSharedLibraryLoaderFactory() + throws java.lang.Exception + { + sharedLibraryLoaderFactory = null; + System.out.println("*******************************************************************"); + System.out.println("Test: <<< get SharedLibraryLoader factory >>>"); + sharedLibraryLoaderFactory = SharedLibraryLoader.getServiceFactory(null, null); + + System.out.print("Test - "); + System.out.println(sharedLibraryLoaderFactory == null? "failed" : "successfull"); + System.out.println("*******************************************************************"); + System.out.println(); + + return sharedLibraryLoaderFactory != null; + } + + static public boolean test_instantiateSharedLibraryLoader() + throws java.lang.Exception + { + sharedLibraryLoader = null; + System.out.println("*******************************************************************"); + System.out.println("Test: <<< instantiate SharedLibraryLoader >>>"); + if ( sharedLibraryLoaderFactory == null ) + if ( ! test_getSharedLibraryLoaderFactory() ) + return false; + + sharedLibraryLoader = UnoRuntime.queryInterface( + XImplementationLoader.class, sharedLibraryLoaderFactory.createInstance() ); + + System.out.print("Test - "); + System.out.println(sharedLibraryLoader == null? "failed" : "successfull"); + System.out.println("*******************************************************************"); + System.out.println(); + + return sharedLibraryLoader != null; + } + + static public boolean test_loadNativeServiceManager() + throws java.lang.Exception + { + nativeServiceManager = null; + + System.out.println("*******************************************************************"); + System.out.println("Test: <<< load native ServiceManager >>>"); + if ( sharedLibraryLoader == null ) + if ( ! test_instantiateSharedLibraryLoader() ) + return false; + + System.err.println("- get the native ServiceManger factory"); + XSingleServiceFactory aSMgrFac = + UnoRuntime.queryInterface( XSingleServiceFactory.class, + sharedLibraryLoader.activate(NATIVE_SERVICE_MANAGER_IMP_NAME, null, NATIVE_SERVICE_MANAGER_LIB_NAME, null)); + + System.err.println("- instantiate the native ServiceManger"); + nativeServiceManager = UnoRuntime.queryInterface( XMultiServiceFactory.class, aSMgrFac.createInstance() ); + + System.out.print("Test - "); + System.out.println(nativeServiceManager == null? "failed" : "successfull"); + + System.out.println("*******************************************************************"); + System.out.println(); + return nativeServiceManager != null; + } + + static public boolean test_loadNativeSimpleRegistry() + throws java.lang.Exception + { + boolean result = false; + System.out.println("*******************************************************************"); + System.out.println("Test: <<< load native SimpleRegistry >>>"); + if ( sharedLibraryLoader == null ) + if ( ! test_instantiateSharedLibraryLoader() ) + return false; + + System.err.println("- get factory of the Registry"); + XSingleServiceFactory aRegFac = + UnoRuntime.queryInterface( XSingleServiceFactory.class, + sharedLibraryLoader.activate(NATIVE_REGISTRY_IMP_NAME, null, NATIVE_REGISTRY_LIB_NAME, null) + ); + System.err.println("- instantiate the Registry"); + simpleRegistry = + UnoRuntime.queryInterface( XSimpleRegistry.class, aRegFac.createInstance() ); + System.out.print("Test - "); + System.out.println(simpleRegistry == null? "failed" : "successfull"); + System.out.println("*******************************************************************"); + System.err.println(); + return true; + } + + static public boolean test_registerSharedLibraryLoader() + throws java.lang.Exception + { + boolean result = true; + System.out.println("*******************************************************************"); + System.out.println("Test: <<< register SharedLibraryLoader at the Registry >>>"); + + if ( simpleRegistry == null ) + if ( ! test_loadNativeSimpleRegistry() ) + return false; + + com.sun.star.registry.XRegistryKey regKey = simpleRegistry.getRootKey(); + result = SharedLibraryLoader.writeRegistryServiceInfo( null, regKey ); + + System.out.print("Test - "); + System.out.println( result==false ? "failed" : "successfull"); + System.out.println("*******************************************************************"); + System.out.println(); + return result; + } + + static public boolean test() throws java.lang.Exception { + boolean passed = true; + + System.err.println("SharedLibraryLoader - doing tests..."); + passed = test_getSharedLibraryLoaderFactory() && passed; + passed = test_instantiateSharedLibraryLoader() && passed; + passed = test_loadNativeServiceManager() && passed; + passed = test_loadNativeSimpleRegistry() && passed; + //passed = test_registerSharedLibraryLoader() && passed; + + System.err.println("SharedLibraryLoader test passed? " + passed); + + return passed; + } + + static public void main(String args[]) throws java.lang.Exception { + System.exit( test() == true ? 0: -1 ); + } +} + diff --git a/javaunohelper/test/com/sun/star/comp/helper/makefile.mk b/javaunohelper/test/com/sun/star/comp/helper/makefile.mk new file mode 100644 index 000000000000..047a1e4ccaea --- /dev/null +++ b/javaunohelper/test/com/sun/star/comp/helper/makefile.mk @@ -0,0 +1,56 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.6 $ +# +# 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. +# +#************************************************************************* + +PRJ =..$/..$/..$/..$/..$/.. +PRJNAME = juhelper +PACKAGE = com$/sun$/star$/comp$/helper +TARGET = com_sun_star_comp_helper_test + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk + +# --- Files -------------------------------------------------------- + +JARFILES = jurt.jar ridl.jar + +JAVACLASSFILES= \ + $(CLASSDIR)$/$(PACKAGE)$/ComponentContext_Test.class \ + $(CLASSDIR)$/$(PACKAGE)$/SharedLibraryLoader_Test.class \ + $(CLASSDIR)$/$(PACKAGE)$/RegistryServiceFactory_Test.class \ + $(CLASSDIR)$/$(PACKAGE)$/Bootstrap_Test.class + +JAVAFILES= $(subst,$(CLASSDIR)$/$(PACKAGE)$/, $(subst,.class,.java $(JAVACLASSFILES))) + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + diff --git a/javaunohelper/test/com/sun/star/lib/uno/helper/AWeakBase.java b/javaunohelper/test/com/sun/star/lib/uno/helper/AWeakBase.java new file mode 100644 index 000000000000..3c78e9fef9ab --- /dev/null +++ b/javaunohelper/test/com/sun/star/lib/uno/helper/AWeakBase.java @@ -0,0 +1,53 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: AWeakBase.java,v $ + * $Revision: 1.3 $ + * + * 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.lib.uno.helper; +import com.sun.star.lang.XEventListener; + + +public class AWeakBase extends WeakBase implements XEventListener +{ + public int nDisposingCalled= 0; + + public AWeakBase(int i) + { + } + public AWeakBase() + { + } + + public void disposing(com.sun.star.lang.EventObject eventObject) + { +// System.out.println(getClass().getName() + " .disposing called"); + nDisposingCalled++; + } + +} + diff --git a/javaunohelper/test/com/sun/star/lib/uno/helper/ComponentBase_Test.java b/javaunohelper/test/com/sun/star/lib/uno/helper/ComponentBase_Test.java new file mode 100644 index 000000000000..46e7f60b7def --- /dev/null +++ b/javaunohelper/test/com/sun/star/lib/uno/helper/ComponentBase_Test.java @@ -0,0 +1,156 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ComponentBase_Test.java,v $ + * $Revision: 1.4 $ + * + * 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.lib.uno.helper; +import com.sun.star.uno.XWeak; +import com.sun.star.lang.XTypeProvider; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.lang.XEventListener; + +public class ComponentBase_Test +{ + AWeakBase obj1, obj2, obj3; + Object proxyObj1Weak1; + Object proxyObj3Weak1; + Object proxyObj3Weak2; + Object proxyObj3TypeProv; + Object proxyObj2TypeProv; + + /** Creates a new instance of ComponentBase_Test */ + public ComponentBase_Test() + { + obj1= new AWeakBase(); + obj2= new AWeakBase(); + obj3= new AWeakBase(); + proxyObj1Weak1= ProxyProvider.createProxy(obj1, XWeak.class); + proxyObj3Weak1= ProxyProvider.createProxy(obj3, XWeak.class); + proxyObj3Weak2= ProxyProvider.createProxy(obj3, XWeak.class); + proxyObj2TypeProv= ProxyProvider.createProxy(obj2, XTypeProvider.class); + proxyObj3TypeProv= ProxyProvider.createProxy(obj3, XTypeProvider.class); + } + + public boolean dispose() + { + System.out.println("Testing ComponentBase"); + ComponentBase comp= new ComponentBase(); + boolean r[]= new boolean[50]; + int i= 0; + // addEventListener + + comp.addEventListener(obj1); + comp.addEventListener(obj2); + comp.addEventListener(obj3); + comp.addEventListener(UnoRuntime.queryInterface(XEventListener.class, proxyObj1Weak1)); + comp.addEventListener(UnoRuntime.queryInterface(XEventListener.class, proxyObj3Weak2)); + comp.addEventListener(UnoRuntime.queryInterface(XEventListener.class, proxyObj3TypeProv)); + obj1.nDisposingCalled = 0; + obj2.nDisposingCalled = 0; + obj3.nDisposingCalled = 0; + + comp.dispose(); + r[i++]= obj1.nDisposingCalled == 1; + r[i++]= obj2.nDisposingCalled == 1; + r[i++]= obj3.nDisposingCalled == 1; + // adding a listener after dispose, causes a immediate call to the listerner + obj1.nDisposingCalled= 0; + comp.addEventListener(obj1); + r[i++]= obj1.nDisposingCalled == 1; + //calling dispose again must not notify the listeners again + obj1.nDisposingCalled= 0; + obj2.nDisposingCalled= 0; + obj3.nDisposingCalled= 0; + comp.dispose(); // allready disposed; + r[i++]= obj1.nDisposingCalled == 0; + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean test_finalize() + { + System.out.println("Testing ComponentBase"); + ComponentBase comp= new ComponentBase(); + boolean r[]= new boolean[50]; + int i= 0; + obj1.nDisposingCalled = 0; + comp.addEventListener(obj1); + + comp= null; + System.out.println("Waiting 10s"); + for(int c= 0; c < 100; c++) + { + try + { + Thread.currentThread().sleep(100); + System.gc(); + System.runFinalization(); + }catch (InterruptedException ie) + { + } + } + r[i++]= obj1.nDisposingCalled == 1; + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public static void main(String[] args) + { + ComponentBase_Test test= new ComponentBase_Test(); + + boolean r[]= new boolean[50]; + int i= 0; + r[i++]= test.dispose(); + r[i++]= test.test_finalize(); + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Errors occured!"); + else + System.out.println("No errors."); + + } + +} + diff --git a/javaunohelper/test/com/sun/star/lib/uno/helper/Factory_Test.java b/javaunohelper/test/com/sun/star/lib/uno/helper/Factory_Test.java new file mode 100644 index 000000000000..732db947b97a --- /dev/null +++ b/javaunohelper/test/com/sun/star/lib/uno/helper/Factory_Test.java @@ -0,0 +1,210 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: Factory_Test.java,v $ + * $Revision: 1.3 $ + * + * 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.lib.uno.helper; + +import com.sun.star.uno.XComponentContext; +import com.sun.star.uno.Type; +import com.sun.star.uno.AnyConverter; +import com.sun.star.lang.XServiceInfo; +import com.sun.star.lang.XSingleComponentFactory; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XComponent; +import com.sun.star.beans.XPropertySet; +import com.sun.star.registry.XRegistryKey; +import com.sun.star.registry.XSimpleRegistry; +import com.sun.star.registry.XImplementationRegistration; +import com.sun.star.container.XSet; + +import com.sun.star.lib.uno.helper.Factory; +import com.sun.star.comp.helper.Bootstrap; +import com.sun.star.comp.helper.RegistryServiceFactory; +import com.sun.star.uno.UnoRuntime; + + +//================================================================================================== +public class Factory_Test + extends WeakBase + implements XServiceInfo +{ + static final String m_impl_name = Factory_Test.class.getName(); + static final String m_supported_services [] = { + "Factory_Test.Service0", "Factory_Test.Service1" }; + + //______________________________________________________________________________________________ + public Factory_Test() + { + } + //______________________________________________________________________________________________ + public Factory_Test( XComponentContext xContext ) + throws com.sun.star.uno.Exception + { + if (null == xContext.getValueByName( "/singletons/com.sun.star.lang.theServiceManager" )) + { + throw new com.sun.star.uno.RuntimeException( + "bad component context given!", this ); + } + } + //______________________________________________________________________________________________ + public static Object __create( XComponentContext xContext ) + throws com.sun.star.uno.Exception + { + return new Factory_Test( xContext ); + } + + // 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; + } + + //============================================================================================== + public static XSingleComponentFactory __getComponentFactory( String implName ) + { + if (implName.equals( m_impl_name )) + { + return Factory.createComponentFactory( + Factory_Test.class, Factory_Test.m_supported_services ); + } + return null; + } + //============================================================================================== + public static boolean __writeRegistryServiceInfo( XRegistryKey xKey ) + { + return Factory.writeRegistryServiceInfo( + m_impl_name, Factory_Test.m_supported_services, xKey ); + } + + //============================================================================================== + static void service_info_test( Object inst ) + { + XServiceInfo xInfo = UnoRuntime.queryInterface( XServiceInfo.class, inst ); + + if (! xInfo.getImplementationName().equals( m_impl_name )) + { + System.err.println( "Factory_Test: err -- 1" ); + System.exit( 1 ); + } + String supported_services [] = xInfo.getSupportedServiceNames(); + if (supported_services.length != m_supported_services.length) + { + System.err.println( "Factory_Test: err -- 2" ); + System.exit( 1 ); + } + for ( int nPos = 0; nPos < supported_services.length; ++nPos ) + { + if (! supported_services[ nPos ].equals( m_supported_services[ nPos ] )) + { + System.err.println( "Factory_Test: err -- 3" ); + System.exit( 1 ); + } + if (! xInfo.supportsService( m_supported_services[ nPos ] )) + { + System.err.println( "Factory_Test: err -- 4" ); + System.exit( 1 ); + } + } + } + //============================================================================================== + public static void main( String args [] ) + { + try + { + String jar = "file://" + new java.io.File( args[ 0 ] ).toURL().getPath(); + String rdb = "file://" + new java.io.File( args[ 1 ] ).toURL().getPath(); + System.out.println( "jar file = " + jar ); + System.out.println( "rdb file = " + rdb ); + + // bootstrap service manager + XMultiServiceFactory xMgr = RegistryServiceFactory.create( rdb ); + XPropertySet xProps = UnoRuntime.queryInterface( + XPropertySet.class, xMgr ); + XComponentContext xContext = (XComponentContext)AnyConverter.toObject( + new Type( XComponentContext.class ), xProps.getPropertyValue( "DefaultContext" ) ); + // insert java loader + XSet xSet = (XSet)AnyConverter.toObject( + new Type( XSet.class ), xContext.getServiceManager() ); + xSet.insert( new com.sun.star.comp.loader.JavaLoaderFactory( xMgr ) ); + // get rdb of smgr + XSimpleRegistry xRDB = (XSimpleRegistry)AnyConverter.toObject( + new Type( XSimpleRegistry.class ), xProps.getPropertyValue( "Registry" ) ); + // register impl + XImplementationRegistration xImpReg = + UnoRuntime.queryInterface( + XImplementationRegistration.class, + xContext.getServiceManager().createInstanceWithContext( + "com.sun.star.registry.ImplementationRegistration", xContext ) ); + xImpReg.registerImplementation( "com.sun.star.loader.Java2", jar, xRDB ); + + // tests + System.out.println( "testing instance" ); + service_info_test( new Factory_Test() ); + System.out.println( "testing instance" ); + service_info_test( new Factory_Test( xContext ) ); + System.out.println( "testing instance" ); + service_info_test( Factory_Test.__create( xContext ) ); + System.out.println( "testing factory __getComponentFactory()" ); + service_info_test( __getComponentFactory( m_impl_name ) ); + for ( int nPos = 0; nPos < m_supported_services.length; ++nPos ) + { + System.out.println( "testing factory " + m_supported_services[ nPos ] ); + service_info_test( + // create Service + xContext.getServiceManager().createInstanceWithContext( + m_supported_services[ nPos ], xContext ) ); + } + + XComponent xComp = UnoRuntime.queryInterface( XComponent.class, xContext ); + xComp.dispose(); + } + catch (Exception exc) + { + System.err.println( ">>>>>>>>>> exc occured: " + exc.toString() ); + exc.printStackTrace(); + } + System.exit( 0 ); + } +} + diff --git a/javaunohelper/test/com/sun/star/lib/uno/helper/InterfaceContainer_Test.java b/javaunohelper/test/com/sun/star/lib/uno/helper/InterfaceContainer_Test.java new file mode 100644 index 000000000000..8aa05074e69a --- /dev/null +++ b/javaunohelper/test/com/sun/star/lib/uno/helper/InterfaceContainer_Test.java @@ -0,0 +1,995 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: InterfaceContainer_Test.java,v $ + * $Revision: 1.4 $ + * + * 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.lib.uno.helper; + +import com.sun.star.uno.XInterface; +import java.util.Iterator; +import java.util.ListIterator; +import com.sun.star.uno.Type; +import com.sun.star.uno.XWeak; +import com.sun.star.lang.XTypeProvider; +import com.sun.star.lang.XEventListener; +import java.util.ArrayList; +import com.sun.star.lang.XMultiComponentFactory; +import com.sun.star.uno.XComponentContext; +import com.sun.star.comp.helper.Bootstrap; +import com.sun.star.bridge.XUnoUrlResolver; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XSingleServiceFactory; +import com.sun.star.uno.IQueryInterface; +//import com.sun.star.lib.uno.environments.java.IRequester; +import com.sun.star.bridge.XBridge; +//import com.sun.star.lib.uno.environments.java.Proxy; +import com.sun.star.lib.uno.environments.java.java_environment; +import com.sun.star.lib.uno.typedesc.TypeDescription; +import java.util.HashMap; +import java.util.List; +import java.util.NoSuchElementException; + +public class InterfaceContainer_Test +{ + java_environment env= new java_environment(null); + /** Creates a new instance of InterfaceContainerTest */ + AWeakBase obj1,obj2,obj3,obj4; + Object proxyObj1Weak1; + Object proxyObj3Weak1; + Object proxyObj3Weak2; + Object proxyObj3TypeProv; + Object proxyObj2TypeProv; + //contains original objects + List list1; + //contains original objects + proxies + List list2; + //contains original object + proxies + null value + List list3; + + public InterfaceContainer_Test() + { + obj1= new AWeakBase(); + obj2= new AWeakBase(); + obj3= new AWeakBase(); + obj4= new AWeakBase(); + proxyObj1Weak1= ProxyProvider.createProxy(obj1, XWeak.class); + proxyObj3Weak1= ProxyProvider.createProxy(obj3, XWeak.class); + proxyObj3Weak2= ProxyProvider.createProxy(obj3, XWeak.class); + proxyObj2TypeProv= ProxyProvider.createProxy(obj2, XTypeProvider.class); + proxyObj3TypeProv= ProxyProvider.createProxy(obj3, XTypeProvider.class); + + list1= new ArrayList(); + list1.add(obj1); + list1.add(obj2); + list1.add(obj3); + list2= new ArrayList(); + list2.add(obj1); + list2.add(proxyObj2TypeProv); + list2.add(proxyObj3TypeProv); + list3= new ArrayList(); + list3.add(obj1); + list3.add(null); + list3.add(proxyObj2TypeProv); + list3.add(proxyObj3Weak1); + } + + /** Tests add(object), size(), clear(); + */ + public boolean add() + { + System.out.println("Testing List.add(Object), List.size(), List.clear(), List.isEmpty()"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + + r[i++]= cont.size() == 0; + r[i++]= cont.add(obj1); + r[i++]= cont.size() == 1; + r[i++]= cont.add(obj1); // add the same object again + r[i++]= cont.size() == 2; + r[i++]= cont.add(proxyObj3TypeProv); + r[i++]= cont.size() == 3; + r[i++]= cont.isEmpty() ? false: true; + cont.clear(); + r[i++]= cont.size() == 0; + r[i++]= cont.isEmpty(); + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + /**Tests list.addAll(Collection c), list.addAll(int index, Collection c) + */ + public boolean listConstructors() + { + System.out.println("Testing Constructors of InterfaceContainer"); + boolean r[]= new boolean[50]; + int i= 0; + InterfaceContainer cont= new InterfaceContainer(100); + + r[i++]= cont.elementData.length == 100; + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + public boolean trimToSize() + { + System.out.println("Testing InterfaceContainer.trimToSize"); + InterfaceContainer cont= new InterfaceContainer(100); + boolean r[]= new boolean[50]; + int i= 0; + cont.trimToSize(); + r[i++]= cont.isEmpty(); + cont= new InterfaceContainer(10); + cont.addAll(list1); + cont.trimToSize(); + r[i++]= cont.elementData.length == list1.size(); + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + public boolean ensureCapacity() + { + System.out.println("Testing InterfaceContainer.ensureCapacity"); + InterfaceContainer cont= new InterfaceContainer(10); + boolean r[]= new boolean[50]; + int i= 0; + + cont.ensureCapacity(9); + r[i++]= cont.elementData.length >= 9; + cont.ensureCapacity(11); + r[i++]= cont.elementData.length >= 11; + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean addAll() + { + System.out.println("Testing List.addAll(Collection c), List.addAll(int index, Collection c)"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + + r[i++]= cont.addAll(list1); + r[i++]= cont.size() == list1.size(); + for (int c= 0; c < cont.size(); c++) + { + r[i++]= list1.get(c) == cont.get(c); + } + cont.add(obj1); + r[i++]= cont.addAll(1, list2); + r[i++]= cont.get(0) == list1.get(0); + r[i++]= cont.get(1) == list2.get(0); + r[i++]= cont.get(2) == list2.get(1); + r[i++]= cont.get(3) == list2.get(2); + r[i++]= cont.get(4) == list1.get(1); + r[i++]= cont.get(5) == list1.get(2); + r[i++]= cont.get(6) == obj1; + cont.clear(); + cont.addAll(list3); + // the null element in list3 at index 1 is not added to cont + r[i++]= cont.get(0) == list3.get(0); + r[i++]= cont.get(1) == list3.get(2); + r[i++]= cont.get(2) == list3.get(3); + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + /** Tests List.add(int index, Object element), List.get(int index) + */ + public boolean get() + { + System.out.println("Testing List.add(int index, Object element), List.get(int index)"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + + cont.add(0, obj1); + cont.add(1, obj2); + cont.add(1, proxyObj3Weak1); + cont.add(3, obj3); + r[i++]= cont.get(0) == obj1; + r[i++]= cont.get(1) == proxyObj3Weak1; + r[i++]= cont.get(2) == obj2; + r[i++]= cont.get(3) == obj3; + try + { + cont.add(5, obj1); + }catch( java.lang.Exception e) + { + r[i++]= true; + } + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + /** Tests List.contains + */ + public boolean contains() + { + System.out.println("Testing List.contains()"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + + r[i++]= cont.contains(obj1) ? false : true; // nothing in the list + cont.add(obj1); + cont.add(proxyObj2TypeProv); + cont.add(proxyObj3TypeProv); + r[i++]= cont.contains(obj1); + r[i++]= cont.contains(obj2); + r[i++]= cont.contains(proxyObj3Weak1); + r[i++]= cont.contains(proxyObj3Weak2); + r[i++]= cont.contains(proxyObj1Weak1); + r[i++]= cont.contains(obj3); + r[i++]= cont.contains(null) ? false : true; + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + /** Tests List.containsAll + */ + public boolean containsAll() + { + System.out.println("Testing List.containsAll"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + cont.addAll(list1); + r[i++]= cont.containsAll(list1); + cont.clear(); + cont.addAll(list2); + r[i++]= cont.containsAll(list2); + cont.clear(); + cont.addAll(list3); // the null element in list3 is not added to cont + r[i++]= cont.containsAll(list3) ? false : true; + cont.clear(); + for( int x= 0; x < 6; x++) + cont.add(obj4); + r[i++]= cont.contains(list1) ? false : true; + cont.add(1, list1.get(0)); + cont.add(3, list1.get(1)); + cont.add(5, list1.get(2)); + r[i++]= cont.contains(list1) ? false : true; + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + /** Tests List.indexOf, List.lastIndexOf + */ + public boolean indexOf() + { + System.out.println("Testing List.indexOf(Object element), List.lastIndexOf(Object element)"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + cont.addAll(list1); + cont.addAll(list1); + r[i++]= cont.indexOf(obj3) == 2; + r[i++]= cont.lastIndexOf(obj3) == 5; + cont.clear(); + cont.addAll(list2); + cont.addAll(list2); + r[i++]= cont.indexOf(proxyObj3Weak1) == 2; + r[i++]= cont.lastIndexOf(proxyObj3Weak2) == 5; + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + /** Tests List.remove(int index), List.remove(Object element), List.removeAll(Collection c) + */ + public boolean remove() + { + System.out.println("Testing List.remove(int index), List.remove(Object element), List.removeAll(Collection c)"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + + cont.addAll(list2); + r[i++]= proxyObj2TypeProv.equals(cont.remove(1)); + r[i++]= cont.size() == 2; + cont.clear(); + cont.addAll(list2); + r[i++]= cont.remove(obj1); + r[i++]= cont.remove(proxyObj2TypeProv); + r[i++]= cont.remove(proxyObj3Weak2); + r[i++]= cont.isEmpty(); + cont.clear(); + cont.addAll(list3); + r[i++]= cont.removeAll(list3); + r[i++]= cont.isEmpty(); + cont.addAll(list2); + + List list= new ArrayList(); + list.add(list2.get(0)); + list.add(list2.get(1)); + list.add(proxyObj3Weak2); + r[i++]= cont.removeAll(list); + r[i++]= cont.isEmpty(); + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + /** Tests List.retainAll + */ + public boolean retainAll() + { + System.out.println("Testing List.retainAll(Collection c)"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + + cont.addAll(list1); //obj1, obj2, obj3 + cont.addAll(list2); //obj1, proxyObj2TypeProv, proxyObj3TypeProv + List list = new ArrayList(); + list.add(obj1); + list.add(proxyObj3Weak1); + + r[i++]= cont.retainAll(list); + r[i++]= cont.get(0) == obj1; + r[i++]= cont.get(1) == obj3; + r[i++]= cont.get(2) == obj1; + r[i++]= cont.get(3) == proxyObj3TypeProv; + r[i++]= 4 == cont.size(); + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + /** Tests List.set(int index, Object element) + **/ + public boolean set() + { + System.out.println("Testing List.set(int index, Object element)"); + boolean r[]= new boolean[50]; + int i= 0; + InterfaceContainer cont= new InterfaceContainer(); + cont.addAll(list2); + Object o1= cont.set(0, obj3); + Object o2= cont.set(2, proxyObj3Weak1); + r[i++]= o1 == list2.get(0); + r[i++]= o2 == list2.get(2); + r[i++]= cont.get(0) == obj3; + r[i++]= cont.get(2) == proxyObj3Weak1; + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + /** Tests List.toArray(), List.toArray(Object[] a) + */ + public boolean toArray() + { + System.out.println("Testing List.toArray(), List.toArray(Object[] a)"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + + cont.addAll(list1); + Object[] ar= cont.toArray(); + Object[] arOrig= list1.toArray(); + r[i++]= ar.length == arOrig.length; + + r[i]= true; + for (int c= 0; c < ar.length; c++) + r[i]= r[i] && ar[c] == arOrig[c]; + + i++; + XWeak[] arWeak= new XWeak[3]; + XWeak[] arWeak2= (XWeak[])cont.toArray(arWeak); + r[i++]= ar.length == arWeak2.length; + r[i]= true; + for (int c= 0; c < ar.length; c++) + r[i]= r[i] && ar[c] == arWeak2[c]; + + i++; + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean Iterator_next() + { + System.out.println("Testing InterfaceContainer.iterator, Iterator.next()"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + + cont.addAll(list1); + Iterator it= cont.iterator(); + r[i++]= it.next() == list1.get(0); + r[i++]= it.next() == list1.get(1); + r[i++]= it.next() == list1.get(2); + try + { + it.next(); + }catch(java.util.NoSuchElementException ne) + { + r[i++]= true; + }catch(Exception e) + { + r[i++]= false; + } + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean Iterator_hasNext() + { + System.out.println("Testing, Iterator.next()"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + + Iterator it= cont.iterator(); + r[i++]= ! it.hasNext(); + cont.addAll(list1); + it= cont.iterator(); + r[i++]= it.hasNext(); + it.next(); + r[i++]= it.hasNext(); + it.next(); + r[i++]= it.hasNext(); + it.next(); + r[i++]= ! it.hasNext(); + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean Iterator_remove() + { + System.out.println("Testing, Iterator.remove()"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + + Iterator it= cont.iterator(); + try + { + it.remove(); + } + catch( IllegalStateException ie) + { + r[i++]= true; + } + catch(java.lang.Exception e) + { + r[i++]= false; + } + cont.add(obj1); + it= cont.iterator(); + it.next(); + it.remove(); + r[i++]= cont.isEmpty(); + try + { + it.remove(); + } + catch (IllegalStateException ie) + { + r[i++]= true; + } + catch (Exception e) + { + r[i++]= false; + } + cont.clear(); + cont.addAll(list1); + it= cont.iterator(); + while (it.hasNext()) + { + it.next(); + it.remove(); + } + r[i++]= cont.isEmpty(); + + // 2 iterators, remove must not impair the other iterator + cont.clear(); + cont.addAll(list1); + int size= cont.size(); + it= cont.iterator(); + Iterator it2= cont.iterator(); + while (it.hasNext()) + { + it.next(); + it.remove(); + } + try + { + for( int c= 0; c < size; c++) + it2.next(); + r[i++]= true; + } + catch(Exception e) + { + r[i++]= false; + } + r[i++]= cont.size() == 0; + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + public boolean ListIterator_next() + { + System.out.println("Testing InterfaceContainer.listIerator, ListIterator.next()"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + + cont.addAll(list1); + Iterator it= cont.listIterator(); + r[i++]= it.next() == list1.get(0); + r[i++]= it.next() == list1.get(1); + r[i++]= it.next() == list1.get(2); + try + { + it.next(); + }catch(java.util.NoSuchElementException ne) + { + r[i++]= true; + }catch(Exception e) + { + r[i++]= false; + } + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean ListIterator_hasNext() + { + System.out.println("Testing ListIterator.hasNext()"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + + Iterator it= cont.listIterator(); + r[i++]= ! it.hasNext(); + cont.addAll(list1); + it= cont.listIterator(); + r[i++]= it.hasNext(); + it.next(); + r[i++]= it.hasNext(); + it.next(); + r[i++]= it.hasNext(); + it.next(); + r[i++]= ! it.hasNext(); + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean ListIterator_remove() + { + System.out.println("Testing ListIterator.remove()"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + + ListIterator it= cont.listIterator(); + try + { + it.remove(); + } + catch( IllegalStateException ie) + { + r[i++]= true; + } + catch(java.lang.Exception e) + { + r[i++]= false; + } + cont.add(obj1); + it= cont.listIterator(); + it.next(); + it.remove(); + r[i++]= cont.isEmpty(); + try + { + it.remove(); + } + catch (IllegalStateException ie) + { + r[i++]= true; + } + catch (Exception e) + { + r[i++]= false; + } + cont.clear(); + cont.addAll(list1); + it= cont.listIterator(); + while (it.hasNext()) + { + it.next(); + it.remove(); + } + r[i++]= cont.isEmpty(); + + // 2 iterators, remove must not impair the other iterator + cont.clear(); + cont.addAll(list1); + int size= cont.size(); + it= cont.listIterator(); + Iterator it2= cont.listIterator(); + while (it.hasNext()) + { + it.next(); + it.remove(); + } + try + { + for( int c= 0; c < size; c++) + it2.next(); + r[i++]= true; + } + catch(Exception e) + { + r[i++]= false; + } + r[i++]= cont.size() == 0; + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean ListIterator_hasPrevious() + { + System.out.println("Testing ListIterator.hasPrevious()"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + + ListIterator it= cont.listIterator(); + r[i++]= ! it.hasPrevious(); + cont.addAll(list1); + it= cont.listIterator(); + while (it.hasNext()) + { + it.next(); + r[i++]= it.hasPrevious(); + } + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean ListIterator_previous() + { + System.out.println("Testing ListIterator.previous()"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + boolean bOk= true; + + cont.addAll(list1); + // go to the end of our list and list1 + ListIterator it= cont.listIterator(); + while (it.hasNext()) + it.next(); + ListIterator it_list1= list1.listIterator(); + while (it_list1.hasNext()) + it_list1.next(); + + while (it.hasPrevious()) + { + r[i++]= it.previous() == it_list1.previous(); + } + try + { + it.previous(); + r[i++]= false; + } + catch (java.util.NoSuchElementException e) + { + r[i++]=true; + } + + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean ListIterator_nextIndex() + { + System.out.println("Testing ListIterator.nextIndex()"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + boolean bOk= true; + + ListIterator it= cont.listIterator(); + cont.addAll(list1); + it= cont.listIterator(); + r[i++]= it.nextIndex() == 0; + it.next(); + r[i++]= it.nextIndex() == 1; + it.next(); + r[i++]= it.nextIndex() == 2; + + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + public boolean ListIterator_previousIndex() + { + System.out.println("Testing ListIterator.previousIndex()"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + boolean bOk= true; + + ListIterator it= cont.listIterator(); + cont.addAll(list1); + it= cont.listIterator(); + while (it.hasNext()) + it.next(); + + r[i++]= it.previousIndex() == 2; + it.previous(); + r[i++]= it.previousIndex() == 1; + it.previous(); + r[i++]= it.previousIndex() == 0; + it.previous(); + + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + public boolean ListIterator_add() + { + System.out.println("Testing ListIterator.add()"); + InterfaceContainer cont= new InterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + boolean bOk= true; + + ListIterator it= cont.listIterator(); + it.add(obj1); + r[i++]= cont.size() == 1; + it.add(obj2); + r[i++]= cont.size() == 2; + it.add(obj3); + r[i++]= it.previous() == obj3; + r[i++]= it.previous() == obj2; + r[i++]= it.previous() == obj1; + + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean disposeAndClear() + { + System.out.println("Testing InterfaceContainer.disposeAndClear"); + InterfaceContainer cont= new InterfaceContainer(10); + boolean r[]= new boolean[50]; + int i= 0; + + cont.add(obj1); + cont.add(obj2); + cont.add(obj3); + cont.add(proxyObj1Weak1); + cont.add(proxyObj3TypeProv); + System.out.println("Two proxies are called. Check the output:"); + cont.disposeAndClear(new com.sun.star.lang.EventObject()); + r[i++]= obj1.nDisposingCalled == 1; + r[i++]= obj2.nDisposingCalled == 1; + r[i++]= obj3.nDisposingCalled == 1; + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + + public static void main(String[] args) + { + InterfaceContainer_Test test= new InterfaceContainer_Test(); + boolean r[]= new boolean[50]; + int i= 0; + r[i++]= test.listConstructors(); + r[i++]= test.trimToSize(); + r[i++]= test.ensureCapacity(); + r[i++]= test.add(); + r[i++]= test.indexOf(); + r[i++]= test.contains(); + r[i++]= test.containsAll(); + r[i++]= test.get(); + r[i++]= test.addAll(); + r[i++]= test.remove(); + r[i++]= test.retainAll(); + r[i++]= test.set(); + r[i++]= test.toArray(); + r[i++]= test.Iterator_next(); + r[i++]= test.Iterator_hasNext(); + r[i++]= test.Iterator_remove(); + r[i++]= test.ListIterator_next(); + r[i++]= test.ListIterator_hasNext(); + r[i++]= test.ListIterator_remove(); + r[i++]= test.ListIterator_hasPrevious(); + r[i++]= test.ListIterator_previous(); + r[i++]= test.ListIterator_nextIndex(); + r[i++]= test.ListIterator_previousIndex(); + r[i++]= test.ListIterator_add(); + r[i++]= test.disposeAndClear(); + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Test finished.\nErrors occured!!!"); + else + System.out.println("Test finished. \nNo errors."); + + } + +} diff --git a/javaunohelper/test/com/sun/star/lib/uno/helper/MultiTypeInterfaceContainer_Test.java b/javaunohelper/test/com/sun/star/lib/uno/helper/MultiTypeInterfaceContainer_Test.java new file mode 100644 index 000000000000..59070b8b15e3 --- /dev/null +++ b/javaunohelper/test/com/sun/star/lib/uno/helper/MultiTypeInterfaceContainer_Test.java @@ -0,0 +1,375 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: MultiTypeInterfaceContainer_Test.java,v $ + * $Revision: 1.4 $ + * + * 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.lib.uno.helper; +import com.sun.star.lib.uno.environments.java.java_environment; +import java.util.List; +import com.sun.star.uno.XWeak; +import com.sun.star.lang.XTypeProvider; +import java.util.ArrayList; +import com.sun.star.uno.Type; +import com.sun.star.lib.uno.typedesc.TypeDescription; +import com.sun.star.uno.UnoRuntime; +//import com.sun.star.lib.uno.environments.java.Proxy; +import com.sun.star.uno.XInterface; +import com.sun.star.lang.XSingleComponentFactory; + +public class MultiTypeInterfaceContainer_Test +{ +// java_environment env= new java_environment(null); + /** Creates a new instance of InterfaceContainerTest */ + AWeakBase obj1,obj2,obj3,obj4; + Object proxyObj1Weak1; + Object proxyObj3Weak1; + Object proxyObj3Weak2; + Object proxyObj3TypeProv; + Object proxyObj2TypeProv; + //contains original objects + List list1; + //contains original objects + proxies + List list2; + //contains original object + proxies + null value + List list3; + + /** Creates a new instance of MultiTypeInterfaceContainer_Test */ + public MultiTypeInterfaceContainer_Test() + { + obj1= new AWeakBase(); + obj2= new AWeakBase(); + obj3= new AWeakBase(); + obj4= new AWeakBase(); + + proxyObj1Weak1= ProxyProvider.createProxy(obj1, XWeak.class); + proxyObj3Weak1= ProxyProvider.createProxy(obj3, XWeak.class); + proxyObj3Weak2= ProxyProvider.createProxy(obj3, XWeak.class); + proxyObj2TypeProv= ProxyProvider.createProxy(obj2, XTypeProvider.class); + proxyObj3TypeProv= ProxyProvider.createProxy(obj3, XTypeProvider.class); + + list1= new ArrayList(); + list1.add(obj1); + list1.add(obj2); + list1.add(obj3); + list2= new ArrayList(); + list2.add(obj1); + list2.add(proxyObj2TypeProv); + list2.add(proxyObj3TypeProv); + list3= new ArrayList(); + list3.add(obj1); + list3.add(null); + list3.add(proxyObj2TypeProv); + list3.add(proxyObj3Weak1); + } + /** returns Holder proxy objects for the specified interface. If the method is called + * several times with the same arguments then each time a new HolderProxy is returned. + * Then all HolderProxy s refer to the same Proxy object. + * The proxy can be queried for XEventListener. On the returned proxy disposing can be called + * + */ +// public Object getHolderProxy(Object obj, Class iface) +// { +// Object retVal= null; +// if (obj == null || iface == null || iface.isInstance(obj) == false ) +// return retVal; +// +// Type type= new Type(TypeDescription.getTypeDescription(iface)); +// Type evtType= new Type(TypeDescription.getTypeDescription(com.sun.star.lang.XEventListener.class)); +// // find the object identifier +// String sOid= UnoRuntime.generateOid(obj); +// retVal= env.getRegisteredInterface(sOid, type); +// // if retVal == null then probably not registered +// if (retVal == null) +// { +// // create the XEventListener proxy +// Requester eventRequester = new Requester(false, false, null); +// Object aProxyEvt = Proxy.create(eventRequester, sOid, evtType, false, false); +// String[] arOid= new String[]{sOid}; +// retVal= env.registerInterface(aProxyEvt, arOid, evtType); +// +// Requester requester = new Requester(false, false, aProxyEvt); +// Object aProxy = Proxy.create(requester, sOid, type, false, false); +// arOid= new String[] {sOid}; +// retVal= env.registerInterface(aProxy, arOid, type); +// } +// return retVal; +// } + + public boolean addInterface() + { + System.out.println("Testing MultiTypeInterfaceContainer.addInterface"); + MultiTypeInterfaceContainer cont= new MultiTypeInterfaceContainer(); + boolean r[]= new boolean[200]; + int i= 0; + + int ci= 0; + ci= cont.addInterface(new Type(XInterface.class), obj1); + ci= cont.addInterface(new Type(XInterface.class), obj2); + ci= cont.addInterface(new Type(XInterface.class), obj3); + r[i++]= ci == 3; + ci= cont.addInterface(new Type(XWeak.class), obj1); + ci= cont.addInterface(new Type(XWeak.class), obj2); + r[i++]= ci ==2; + ci= cont.addInterface(null,obj1); + r[i++]= ci == 1; + ci= cont.addInterface(new Type(XTypeProvider.class), null); + r[i++]= ci == 0; + + cont= new MultiTypeInterfaceContainer(); + AWeakBase[] arObj= new AWeakBase[100]; + for (int c= 0; c < 100; c++) + { + arObj[c]= new AWeakBase(); + ci= cont.addInterface(new Type(XInterface.class), arObj[c]); + } + Type[] arT= cont.getContainedTypes(); + for (int c=0; c < 100; c++) + { + ci= cont.removeInterface(new Type(XInterface.class), arObj[c]); + r[i++]= ci == 100 -c -1; + + } + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean getContainedTypes() + { + System.out.println("Testing MultiTypeInterfaceContainer.getContainedTypes"); + MultiTypeInterfaceContainer cont= new MultiTypeInterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + + cont.addInterface(new Type(XInterface.class), obj1); + cont.addInterface(new Type(XWeak.class), obj1); + cont.addInterface(null, obj1); + cont.addInterface(new Type(XTypeProvider.class), null); + Object aObj= new Object(); + cont.addInterface(aObj, obj1); + cont.addInterface(XSingleComponentFactory.class, obj1); + Type[] types= cont.getContainedTypes(); + // 3 types and no XTypeProvider + r[i++]= types.length == 5; + for (int c= 0; c < types.length; c++) + { + if (types[c] == null) + r[i++]= true; + else if(types[c].equals( new Type(XTypeProvider.class))) + r[i++]= false; + else if(types[c].equals(new Type(XInterface.class))) + r[i++]= true; + else if (types[c].equals(new Type(XWeak.class))) + r[i++]= true; + else if (types[c].equals(new Type())) + r[i++]= true; + else if (types[c].equals(new Type( aObj.getClass()))) + r[i++]= true; + else if (types[c].equals(new Type(XSingleComponentFactory.class))) + r[i++]= true; + else + r[i++]= false; + } + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean getContainer() + { + System.out.println("Testing MultiTypeInterfaceContainer.getContainedTypes"); + MultiTypeInterfaceContainer cont= new MultiTypeInterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + + int ci= 0; + ci= cont.addInterface(new Type(XInterface.class), obj1); + ci= cont.addInterface(new Type(XInterface.class), obj2); + ci= cont.addInterface(new Type(XInterface.class), obj3); + ci= cont.addInterface(new Type(XWeak.class), obj1); + ci= cont.addInterface(new Type(XWeak.class), obj2); + ci= cont.addInterface(null, obj1); + ci= cont.addInterface(new Type(XTypeProvider.class), null); + + InterfaceContainer icont= null; + icont= cont.getContainer( new Type(XTypeProvider.class)); + r[i++]= icont.size() == 0; + icont= cont.getContainer(new Type(XWeak.class)); + r[i++]= icont.size() == 2; + icont= cont.getContainer(null); + r[i++]= icont.size() == 1; + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean removeInterface() + { + System.out.println("Testing MultiTypeInterfaceContainer.removeInterface"); + MultiTypeInterfaceContainer cont= new MultiTypeInterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + + int count= 0; + count= cont.removeInterface( new Type(XTypeProvider.class), obj1); + r[i++]= count == 0; + count= cont.removeInterface( new Type(XTypeProvider.class), null); + r[i++]= count == 0; + count= cont.removeInterface(null, obj2); + r[i++]= count == 0; + + cont.addInterface(new Type(XInterface.class), obj1); + cont.addInterface(null, obj1); + count= cont.removeInterface(null, obj2); + // count must still be 1 + r[i++]= count == 1; + count= cont.removeInterface(null, obj1); + r[i++]= count == 0; + count= cont.removeInterface(new Type(XInterface.class), obj1); + r[i++]= count == 0; + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean clear() + { + System.out.println("Testing MultiTypeInterfaceContainer.clear"); + MultiTypeInterfaceContainer cont= new MultiTypeInterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + + int count= 0; + cont.clear(); + Type[] types= cont.getContainedTypes(); + r[i++]= types.length == 0; + int ci; + ci= cont.addInterface(new Type(XInterface.class), obj1); + ci= cont.addInterface(new Type(XInterface.class), obj2); + ci= cont.addInterface(new Type(XInterface.class), obj3); + ci= cont.addInterface(new Type(XWeak.class), obj1); + ci= cont.addInterface(new Type(XWeak.class), obj2); + ci= cont.addInterface(null, obj1); + ci= cont.addInterface(new Type(XTypeProvider.class), null); + types= cont.getContainedTypes(); + r[i++]= types.length == 3; + cont.clear(); + types= cont.getContainedTypes(); + r[i++]= types.length == 0; + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean disposeAndClear() + { + System.out.println("Testing MultiTypeInterfaceContainer.disposeAndClear"); + MultiTypeInterfaceContainer cont= new MultiTypeInterfaceContainer(); + boolean r[]= new boolean[50]; + int i= 0; + obj1.nDisposingCalled= 0; + obj2.nDisposingCalled= 0; + obj3.nDisposingCalled= 0; + cont.addInterface(new Type(XInterface.class), null); + cont.addInterface(new Type(XInterface.class), obj1); + cont.addInterface(new Type(XInterface.class), obj2); + cont.addInterface(new Type(XInterface.class), obj3); + cont.addInterface(new Type(XWeak.class),obj1); + cont.addInterface(new Type(XWeak.class), obj2); + cont.addInterface(new Type(XTypeProvider.class), obj1); + cont.disposeAndClear(new com.sun.star.lang.EventObject("blabla")); + + r[i++]= obj1.nDisposingCalled == 3; + r[i++]= obj2.nDisposingCalled == 2; + r[i++]= obj3.nDisposingCalled == 1; + Type[] types= cont.getContainedTypes(); + r[i++]= types.length == 0; + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + + public static void main(String[] args) + { + MultiTypeInterfaceContainer_Test test= new MultiTypeInterfaceContainer_Test(); + boolean r[]= new boolean[50]; + int i= 0; + r[i++]= test.addInterface(); + r[i++]= test.getContainedTypes(); + r[i++]= test.getContainer(); + r[i++]= test.removeInterface(); + r[i++]= test.clear(); + r[i++]= test.disposeAndClear(); + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if ( ! bOk ) + System.out.println("Test finished.\nErrors occured!!!"); + else + System.out.println("Test finished. \nNo errors."); + + } +} + + + diff --git a/javaunohelper/test/com/sun/star/lib/uno/helper/PropertySet_Test.java b/javaunohelper/test/com/sun/star/lib/uno/helper/PropertySet_Test.java new file mode 100644 index 000000000000..b203f26ab085 --- /dev/null +++ b/javaunohelper/test/com/sun/star/lib/uno/helper/PropertySet_Test.java @@ -0,0 +1,1696 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: PropertySet_Test.java,v $ + * $Revision: 1.8 $ + * + * 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.lib.uno.helper; +import com.sun.star.lang.EventObject; +import com.sun.star.lang.DisposedException; +import com.sun.star.uno.Type; +import com.sun.star.uno.TypeClass; +import com.sun.star.uno.XInterface; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.Any; +import com.sun.star.uno.XWeak; +import com.sun.star.beans.XPropertySet; +import com.sun.star.beans.UnknownPropertyException; +import com.sun.star.beans.Property; +import com.sun.star.beans.PropertyAttribute; +import com.sun.star.beans.XPropertyChangeListener; +import com.sun.star.beans.PropertyVetoException; +import com.sun.star.beans.PropertyChangeEvent; +import com.sun.star.beans.XVetoableChangeListener; +import com.sun.star.beans.XPropertySetInfo; +import com.sun.star.beans.XPropertiesChangeListener; + +import java.util.Arrays; + +public class PropertySet_Test +{ + + /** Creates a new instance of PropertySet_Test */ + public PropertySet_Test() + { + } + + public boolean convertPropertyValue() + { + System.out.println("PropertySet.convertPropertyValue"); + boolean[] r= new boolean[50]; + int i= 0; + + TestClass cl= new TestClass(); + try { + r[i++]= cl.test_convertPropertyValue(); + }catch(java.lang.Exception e){ + i++; + } + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean setPropertyValueNoBroadcast() + { + System.out.println("PropertySet.setValueNoBroadcast"); + boolean[] r= new boolean[50]; + int i= 0; + + TestClass cl= new TestClass(); + try { + r[i++]= cl.test_setPropertyValueNoBroadcast(); + }catch(java.lang.Exception e){ + i++; + } + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean setPropertyValue() + { + System.out.println("PropertySet.setPropertyValue"); + boolean[] r= new boolean[150]; + int i= 0; + + TestClass cl= new TestClass(); + try { + cl.resetPropertyMembers(); + Object value; + Object ret; + value= new Boolean(true); + cl.setPropertyValue("PropBoolA", value); + ret= cl.getPropertyValue("PropBoolA"); + r[i++]= ((Boolean) ret).equals( (Boolean) value); + value= new Character('A'); + cl.setPropertyValue("PropCharA",value); + ret= cl.getPropertyValue("PropCharA"); + r[i++]= ((Character) ret).equals((Character) value); + value= new Byte((byte) 111); + cl.setPropertyValue("PropByteA",value); + ret= cl.getPropertyValue("PropByteA"); + r[i++]= ((Byte) ret).equals((Byte) value); + value= new Short((short)112); + cl.setPropertyValue("PropShortA", value); + ret= cl.getPropertyValue("PropShortA"); + r[i++]= ((Short) ret).equals((Short) value); + value= new Integer(113); + cl.setPropertyValue("PropIntA", value); + ret= cl.getPropertyValue("PropIntA"); + r[i++]= ((Integer) ret).equals((Integer) value); + value= new Long(115); + cl.setPropertyValue("PropLongA", value); + ret= cl.getPropertyValue("PropLongA"); + r[i++]= ((Long) ret).equals((Long) value); + value= new Float(3.14); + cl.setPropertyValue("PropFloatA", value); + ret= cl.getPropertyValue("PropFloatA"); + r[i++]= ((Float) ret).equals((Float) value); + value= new Double(3.145); + cl.setPropertyValue("PropDoubleA",value); + ret= cl.getPropertyValue("PropDoubleA"); + r[i++]= ((Double) ret).equals((Double) value); + value= new String("string"); + cl.setPropertyValue("PropStringA",value); + ret= cl.getPropertyValue("PropStringA"); + r[i++]= ((String) ret).equals((String) value); + value= new ComponentBase(); + cl.setPropertyValue("PropXInterfaceA",value); + ret= cl.getPropertyValue("PropXInterfaceA"); + r[i++]= ((XInterface) ret).equals((XInterface) value); + value= new ComponentBase(); + cl.setPropertyValue("PropXWeakA",value); + ret= cl.getPropertyValue("PropXWeakA"); + r[i++]= ((XWeak) ret).equals((XWeak) value); + value = com.sun.star.beans.PropertyState.AMBIGUOUS_VALUE; + cl.setPropertyValue("PropEnum",value); + ret= cl.getPropertyValue("PropEnum"); + r[i++]= ret == value; + value= new byte[]{1,2,3}; + cl.setPropertyValue("PropArrayByteA", value); + ret= cl.getPropertyValue("PropArrayByteA"); + r[i++]= ((byte[]) ret).equals((byte[]) value); + value= new Type(String.class); + cl.setPropertyValue("PropTypeA", value); + ret= cl.getPropertyValue("PropTypeA"); + r[i++]= ((Type) ret).equals(value); + + // test protected,package,private members + value= new Boolean(true); + cl.setPropertyValue("PropBoolB", value); + ret= cl.getPropertyValue("PropBoolB"); + r[i++]= ((Boolean) ret).equals((Boolean) value); + cl.setPropertyValue("PropBoolC", value); + ret= cl.getPropertyValue("PropBoolC"); + r[i++]= ((Boolean) ret).equals((Boolean) value); + + try{ + cl.setPropertyValue("PropBoolD", value); + i++; + }catch (Exception e) + { + r[i++]= true; + } + cl.resetPropertyMembers(); + + value= new Boolean(true); + cl.setPropertyValue("PropObjectA", value); + ret= cl.getPropertyValue("PropObjectA"); + r[i++]= ((Boolean) ret).equals((Boolean) value); + value= new Character('A'); + cl.setPropertyValue("PropObjectA",value); + ret= cl.getPropertyValue("PropObjectA"); + r[i++]= ((Character) ret).equals((Character) value); + value= new Byte((byte) 111); + cl.setPropertyValue("PropObjectA",value); + ret= cl.getPropertyValue("PropObjectA"); + r[i++]= ((Byte) ret).equals((Byte) value); + value= new Short((short)112); + cl.setPropertyValue("PropObjectA", value); + ret= cl.getPropertyValue("PropObjectA"); + r[i++]= ((Short) ret).equals((Short) value); + value= new Integer(113); + cl.setPropertyValue("PropObjectA", value); + ret= cl.getPropertyValue("PropObjectA"); + r[i++]= ((Integer) ret).equals((Integer) value); + value= new Long(115); + cl.setPropertyValue("PropObjectA", value); + ret= cl.getPropertyValue("PropObjectA"); + r[i++]= ((Long) ret).equals((Long) value); + value= new Float(3.14); + cl.setPropertyValue("PropObjectA", value); + ret= cl.getPropertyValue("PropObjectA"); + r[i++]= ((Float) ret).equals((Float) value); + value= new Double(3.145); + cl.setPropertyValue("PropObjectA",value); + ret= cl.getPropertyValue("PropObjectA"); + r[i++]= ((Double) ret).equals((Double) value); + value= new String("string"); + cl.setPropertyValue("PropObjectA",value); + ret= cl.getPropertyValue("PropObjectA"); + r[i++]= ((String) ret).equals((String) value); + value= new ComponentBase(); + cl.setPropertyValue("PropObjectA",value); + ret= cl.getPropertyValue("PropObjectA"); + r[i++]= ((XInterface) ret).equals((XInterface) value); + value= new ComponentBase(); + cl.setPropertyValue("PropObjectA",value); + ret= cl.getPropertyValue("PropObjectA"); + r[i++]= ((XWeak) ret).equals((XWeak) value); + value= new byte[]{1,2,3}; + cl.setPropertyValue("PropObjectA", value); + ret= cl.getPropertyValue("PropObjectA"); + r[i++]= ((byte[]) ret).equals((byte[]) value); + value= new Type(String.class); + cl.setPropertyValue("PropObjectA", value); + ret= cl.getPropertyValue("PropObjectA"); + r[i++]= ((Type) ret).equals(value); + cl.setPropertyValue("PropObjectA", new Any( new Type(byte.class), new Byte((byte)1))); + ret= cl.getPropertyValue("PropObjectA"); + r[i++]= ((Byte) ret).byteValue() == 1; + + cl.resetPropertyMembers(); + value= new Boolean(true); + cl.setPropertyValue("PropAnyA", value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Character('A'); + cl.setPropertyValue("PropAnyA",value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Byte((byte) 111); + cl.setPropertyValue("PropAnyA",value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Short((short)112); + cl.setPropertyValue("PropAnyA", value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Integer(113); + cl.setPropertyValue("PropAnyA", value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Long(115); + cl.setPropertyValue("PropAnyA", value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Float(3.14); + cl.setPropertyValue("PropAnyA", value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Double(3.145); + cl.setPropertyValue("PropAnyA",value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new String("string"); + cl.setPropertyValue("PropAnyA",value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new ComponentBase(); + cl.setPropertyValue("PropAnyA",value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new ComponentBase(); + cl.setPropertyValue("PropAnyA",value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new byte[]{1,2,3}; + cl.setPropertyValue("PropAnyA", value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Type(String.class); + cl.setPropertyValue("PropAnyA", value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + + cl.resetPropertyMembers(); + value= new Any(new Type(boolean.class), new Boolean(true)); + cl.setPropertyValue("PropBoolA", value); + ret= cl.getPropertyValue("PropBoolA"); + r[i++]= ret instanceof Boolean && util.anyEquals(value, ret); + value= new Any (new Type(char.class), new Character('A')); + cl.setPropertyValue("PropCharA",value); + ret= cl.getPropertyValue("PropCharA"); + r[i++]= ret instanceof Character && util.anyEquals(value, ret); + value= new Any(new Type(byte.class), new Byte((byte) 111)); + cl.setPropertyValue("PropByteA",value); + ret= cl.getPropertyValue("PropByteA"); + r[i++]= ret instanceof Byte && util.anyEquals(value, ret); + value= new Any(new Type(short.class), new Short((short)112)); + cl.setPropertyValue("PropShortA", value); + ret= cl.getPropertyValue("PropShortA"); + r[i++]= ret instanceof Short && util.anyEquals(value, ret); + value= new Any(new Type(int.class), new Integer(113)); + cl.setPropertyValue("PropIntA", value); + ret= cl.getPropertyValue("PropIntA"); + r[i++]= ret instanceof Integer && util.anyEquals(value, ret); + value= new Any(new Type(long.class), new Long(115)); + cl.setPropertyValue("PropLongA", value); + ret= cl.getPropertyValue("PropLongA"); + r[i++]= ret instanceof Long && util.anyEquals(value, ret); + value= new Any(new Type(float.class), new Float(3.14)); + cl.setPropertyValue("PropFloatA", value); + ret= cl.getPropertyValue("PropFloatA"); + r[i++]= ret instanceof Float && util.anyEquals(value, ret); + value= new Any(new Type(double.class),new Double(3.145)); + cl.setPropertyValue("PropDoubleA",value); + ret= cl.getPropertyValue("PropDoubleA"); + r[i++]= ret instanceof Double && util.anyEquals(value, ret); + value= new Any(new Type(String.class), new String("string")); + cl.setPropertyValue("PropStringA",value); + ret= cl.getPropertyValue("PropStringA"); + r[i++]= ret instanceof String && util.anyEquals(value, ret); + value= new Any(new Type(ComponentBase.class), new ComponentBase()); + cl.setPropertyValue("PropXInterfaceA",value); + ret= cl.getPropertyValue("PropXInterfaceA"); + r[i++]= ret instanceof ComponentBase && util.anyEquals(value, ret); + value= new Any( new Type(ComponentBase.class), new ComponentBase()); + cl.setPropertyValue("PropXWeakA",value); + ret= cl.getPropertyValue("PropXWeakA"); + r[i++]= ret instanceof ComponentBase && util.anyEquals(value, ret); + value= new Any(new Type(byte[].class), new byte[]{1,2,3}); + cl.setPropertyValue("PropArrayByteA", value); + ret= cl.getPropertyValue("PropArrayByteA"); + r[i++]= ret instanceof byte[] && util.anyEquals(value, ret); + value= new Any(new Type(Type.class), new Type(String.class)); + cl.setPropertyValue("PropTypeA", value); + ret= cl.getPropertyValue("PropTypeA"); + r[i++]= ret instanceof Type && util.anyEquals(value, ret); + + + cl.resetPropertyMembers(); + value= new Any(new Type(boolean.class), new Boolean(true)); + cl.setPropertyValue("PropAnyA", value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Any (new Type(char.class), new Character('A')); + cl.setPropertyValue("PropAnyA",value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Any(new Type(byte.class), new Byte((byte) 111)); + cl.setPropertyValue("PropAnyA",value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Any(new Type(short.class), new Short((short)112)); + cl.setPropertyValue("PropAnyA", value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Any(new Type(int.class), new Integer(113)); + cl.setPropertyValue("PropAnyA", value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Any(new Type(long.class), new Long(115)); + cl.setPropertyValue("PropAnyA", value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Any(new Type(float.class), new Float(3.14)); + cl.setPropertyValue("PropAnyA", value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Any(new Type(double.class),new Double(3.145)); + cl.setPropertyValue("PropAnyA",value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Any(new Type(String.class), new String("string")); + cl.setPropertyValue("PropAnyA",value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Any(new Type(ComponentBase.class), new ComponentBase()); + cl.setPropertyValue("PropAnyA",value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Any( new Type(ComponentBase.class), new ComponentBase()); + cl.setPropertyValue("PropAnyA",value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Any(new Type(byte[].class), new byte[]{1,2,3}); + cl.setPropertyValue("PropAnyA", value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + value= new Any(new Type(Type.class), new Type(String.class)); + cl.setPropertyValue("PropAnyA", value); + ret= cl.getPropertyValue("PropAnyA"); + r[i++]= ret instanceof Any && util.anyEquals(value, ret); + + + // ------------------------------------------------------------------------------ + cl.resetPropertyMembers(); + value= new Boolean(true); + cl.setPropertyValue("PropBoolClass", value); + ret= cl.getPropertyValue("PropBoolClass"); + r[i++]= ((Boolean) ret).equals( (Boolean) value); + value= new Character('A'); + cl.setPropertyValue("PropCharClass",value); + ret= cl.getPropertyValue("PropCharClass"); + r[i++]= ((Character) ret).equals((Character) value); + value= new Byte((byte) 111); + cl.setPropertyValue("PropByteClass",value); + ret= cl.getPropertyValue("PropByteClass"); + r[i++]= ((Byte) ret).equals((Byte) value); + value= new Short((short)112); + cl.setPropertyValue("PropShortClass", value); + ret= cl.getPropertyValue("PropShortClass"); + r[i++]= ((Short) ret).equals((Short) value); + value= new Integer(113); + cl.setPropertyValue("PropIntClass", value); + ret= cl.getPropertyValue("PropIntClass"); + r[i++]= ((Integer) ret).equals((Integer) value); + value= new Long(115); + cl.setPropertyValue("PropLongClass", value); + ret= cl.getPropertyValue("PropLongClass"); + r[i++]= ((Long) ret).equals((Long) value); + value= new Float(3.14); + cl.setPropertyValue("PropFloatClass", value); + ret= cl.getPropertyValue("PropFloatClass"); + r[i++]= ((Float) ret).equals((Float) value); + value= new Double(3.145); + cl.setPropertyValue("PropDoubleClass",value); + ret= cl.getPropertyValue("PropDoubleClass"); + r[i++]= ((Double) ret).equals((Double) value); + + cl.resetPropertyMembers(); + + cl.resetPropertyMembers(); + value= new Any(new Type(boolean.class), new Boolean(true)); + cl.setPropertyValue("PropBoolClass", value); + ret= cl.getPropertyValue("PropBoolClass"); + r[i++]= ret instanceof Boolean && util.anyEquals(value, ret); + value= new Any (new Type(char.class), new Character('A')); + cl.setPropertyValue("PropCharClass",value); + ret= cl.getPropertyValue("PropCharClass"); + r[i++]= ret instanceof Character && util.anyEquals(value, ret); + value= new Any(new Type(byte.class), new Byte((byte) 111)); + cl.setPropertyValue("PropByteClass",value); + ret= cl.getPropertyValue("PropByteClass"); + r[i++]= ret instanceof Byte && util.anyEquals(value, ret); + value= new Any(new Type(short.class), new Short((short)112)); + cl.setPropertyValue("PropShortClass", value); + ret= cl.getPropertyValue("PropShortClass"); + r[i++]= ret instanceof Short && util.anyEquals(value, ret); + value= new Any(new Type(int.class), new Integer(113)); + cl.setPropertyValue("PropIntClass", value); + ret= cl.getPropertyValue("PropIntClass"); + r[i++]= ret instanceof Integer && util.anyEquals(value, ret); + value= new Any(new Type(long.class), new Long(115)); + cl.setPropertyValue("PropLongClass", value); + ret= cl.getPropertyValue("PropLongClass"); + r[i++]= ret instanceof Long && util.anyEquals(value, ret); + value= new Any(new Type(float.class), new Float(3.14)); + cl.setPropertyValue("PropFloatClass", value); + ret= cl.getPropertyValue("PropFloatClass"); + r[i++]= ret instanceof Float && util.anyEquals(value, ret); + value= new Any(new Type(double.class),new Double(3.145)); + cl.setPropertyValue("PropDoubleClass",value); + ret= cl.getPropertyValue("PropDoubleClass"); + r[i++]= ret instanceof Double && util.anyEquals(value, ret); + value= new Any(new Type(String.class), new String("string")); + + + + // PropertyAttribute.READONLY + cl.propBoolA.Attributes= PropertyAttribute.READONLY; + try{ + cl.setPropertyValue("PropBoolA", new Boolean(true)); + i++; + }catch (com.sun.star.beans.PropertyVetoException e) + { + r[i++]= true; + } + cl.propBoolA.Attributes= 0; + + // MAYBEVOID + cl.resetPropertyMembers(); + // first MAYBEVOID not set + + //primitive members: must not work + + cl.boolPropA= false; + try { + cl.setPropertyValue("PropBoolA", null); i++; + } catch (com.sun.star.lang.IllegalArgumentException e) { + r[i++]= true; + } + try { + cl.setPropertyValue("PropBoolA", new Any(new Type(boolean.class), null)); i++; + } catch (com.sun.star.lang.IllegalArgumentException e) { + r[i++]= true; + } + cl.propBoolA.Attributes= PropertyAttribute.MAYBEVOID; + try{ + cl.setPropertyValue("PropBoolA", null); i++; + } catch (com.sun.star.lang.IllegalArgumentException e) { + r[i++]= true; + } + cl.propBoolA.Attributes= 0; + + cl.propBoolClass.Attributes= PropertyAttribute.MAYBEVOID; + cl.boolClassProp= null; + cl.setPropertyValue("PropBoolClass", null); + r[i++]= cl.boolClassProp == null; + // the returned value must be a void any + Object objAny= cl.getPropertyValue("PropBoolClass"); + r[i++]= util.isVoidAny( objAny); + + cl.boolClassProp= new Boolean(true); + cl.setPropertyValue("PropBoolClass", null); + r[i++]= cl.boolClassProp == null; + cl.boolClassProp= new Boolean(false); + cl.setPropertyValue("PropBoolClass", new Any(new Type(boolean.class),null)); + r[i++]= cl.boolClassProp == null; + + cl.propXWeakA.Attributes= PropertyAttribute.MAYBEVOID; + cl.setPropertyValue("PropXWeakA", null); + r[i++]= util.isVoidAny(cl.getPropertyValue("PropXWeakA")); + cl.propXWeakA.Attributes= 0; + + cl.anyPropA= null; + try{ + cl.setPropertyValue("PropAnyA", null); i++; + }catch (com.sun.star.lang.IllegalArgumentException e) { + r[i++]= true; + } + cl.anyPropA= null; + cl.propAnyA.Attributes= PropertyAttribute.MAYBEVOID; + + Type _t= new Type(Object.class); + cl.setPropertyValue("PropAnyA", null); + r[i++]= cl.anyPropA.getType().equals(new Type(void.class)) && + cl.anyPropA.getObject() == null; + + cl.anyPropA= new Any(new Type(byte.class),new Byte((byte) 111)); + cl.setPropertyValue("PropAnyA", null); + r[i++]= cl.anyPropA.getType().equals(new Type(byte.class)) && + cl.anyPropA.getObject() == null; + + cl.anyPropA= null; + try{ + cl.setPropertyValue("PropAnyA", new Object()); i++; + }catch (com.sun.star.lang.IllegalArgumentException e) + { + r[i++]= true; + } + + cl.propObjectA.Attributes= 0; + try{ + cl.setPropertyValue("PropObjectA", null); i++; + }catch (com.sun.star.lang.IllegalArgumentException e) + { + r[i++]= true; + } + try{ + cl.setPropertyValue("PropObjectA", new Any( new Type(byte.class), null)); i++; + } catch (com.sun.star.lang.IllegalArgumentException e) + { + r[i++]= true; + } + + cl.propObjectA.Attributes= PropertyAttribute.MAYBEVOID; + cl.propObjectA= null; + cl.setPropertyValue("PropObjectA", null); + r[i++]= cl.propObjectA == null; + + cl.propObjectA= null; + cl.setPropertyValue("PropObjectA", new Any( new Type(byte.class), null)); + r[i++]= cl.propObjectA == null; + + + // + + }catch(java.lang.Exception e){ + i++; + } + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean addPropertyChangeListener() + { + System.out.println("PropertySet.addPropertyChangeListener,\n" + + "PropertySet.removePropertChangeListener," + + "PropertySet.addVetoableChangeListener, \n" + + "PropertySet.removeVetoableChangeListener" + + "Notification of listeners"); + boolean[] r= new boolean[50]; + int i= 0; + try { + TestClass cl= new TestClass(); + Listener li= new Listener(); + cl.addPropertyChangeListener("PropByteA", li); + Byte val1= new Byte((byte)115); + cl.setPropertyValue("PropByteA", val1); + r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 0; + cl.propByteA.Attributes = PropertyAttribute.BOUND; + cl.addPropertyChangeListener("PropByteA", li); + Byte val2= new Byte((byte)116); + cl.setPropertyValue("PropByteA", val2); + r[i++]= li.nChangeCalled == 1 && li.nVetoCalled == 0; + r[i++]= li.evt.OldValue.equals(val1) && li.evt.NewValue.equals(val2) && li.evt.Source == cl; + + li.reset(); + Listener li2= new Listener(); + cl.addPropertyChangeListener("PropByteA", li2); + Byte val3= new Byte((byte) 117); + cl.setPropertyValue("PropByteA", val3); + r[i++]= li.nChangeCalled == 1 && li.nVetoCalled == 0 + && li2.nChangeCalled == 1 && li2.nVetoCalled == 0; + r[i++]= li.evt.OldValue.equals(val2) && li.evt.NewValue.equals(val3) && li.evt.Source == cl + && li2.evt.OldValue.equals(val2) && li2.evt.NewValue.equals(val3) && li2.evt.Source == cl ; + + li.reset(); + li2.reset(); + Listener li3= new Listener(); + val1= new Byte((byte)118); + cl.addPropertyChangeListener("", li3); + cl.setPropertyValue("PropByteA", val1); + r[i++]= li.nChangeCalled == 1 && li.nVetoCalled == 0 + && li2.nChangeCalled == 1 && li2.nVetoCalled == 0 + && li3.nChangeCalled == 1 && li3.nVetoCalled == 0; + r[i++]= li.evt.OldValue.equals(val3) && li.evt.NewValue.equals(val1) && li.evt.Source == cl; + r[i++]= li2.evt.OldValue.equals(val3) && li2.evt.NewValue.equals(val1) && li2.evt.Source == cl; + r[i++]= li3.evt.OldValue.equals(val3) && li3.evt.NewValue.equals(val1) && li3.evt.Source == cl ; + + li.reset(); + li2.reset(); + li3.reset(); + cl.removePropertyChangeListener("PropByteA",li); + cl.setPropertyValue("PropByteA", val1); + r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 0 + && li2.nChangeCalled == 1 && li2.nVetoCalled == 0 + && li3.nChangeCalled == 1 && li3.nVetoCalled == 0; + cl.removePropertyChangeListener("PropByteA", li2); + li.reset(); + li2.reset(); + li3.reset(); + cl.setPropertyValue("PropByteA", val1); + r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 0 + && li2.nChangeCalled == 0 && li2.nVetoCalled == 0 + && li3.nChangeCalled == 1 && li3.nVetoCalled == 0; + + cl.removePropertyChangeListener("", li3); + li.reset(); + li2.reset(); + li3.reset(); + cl.setPropertyValue("PropByteA", val2); + r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 0 + && li2.nChangeCalled == 0 && li2.nVetoCalled == 0 + && li3.nChangeCalled == 0 && li3.nVetoCalled == 0; + + cl.addPropertyChangeListener("PropByteA", li); + cl.addPropertyChangeListener("PropByteA", li2); + cl.addPropertyChangeListener("", li3); + cl.dispose(); + li.reset(); + li2.reset(); + li3.reset(); + try { + cl.setPropertyValue("PropByteA", val2); i++; + }catch (DisposedException e) + { + r[i++]= true; + } + + //Vetoable tests + cl= new TestClass(); + li.reset(); + li2.reset(); + li3.reset(); + cl.addVetoableChangeListener("PropByteA", li); + val1= new Byte((byte)115); + cl.setPropertyValue("PropByteA", val1); + r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 0; + cl.propByteA.Attributes = PropertyAttribute.CONSTRAINED; + cl.addVetoableChangeListener("PropByteA", li); + val2= new Byte((byte)116); + li.reset(); + cl.setPropertyValue("PropByteA", val2); + r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 1; + r[i++]= li.evt.OldValue.equals(val1) && li.evt.NewValue.equals(val2) && li.evt.Source == cl; + + li.reset(); + li2.reset(); + li3.reset(); + cl.addVetoableChangeListener("PropByteA", li2); + val3= new Byte((byte) 117); + cl.setPropertyValue("PropByteA", val3); + r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 1 + && li2.nChangeCalled == 0 && li2.nVetoCalled == 1; + r[i++]= li.evt.OldValue.equals(val2) && li.evt.NewValue.equals(val3) && li.evt.Source == cl + && li2.evt.OldValue.equals(val2) && li2.evt.NewValue.equals(val3) && li2.evt.Source == cl ; + + li.reset(); + li2.reset(); + li3.reset(); + val1= new Byte((byte)118); + cl.addVetoableChangeListener("", li3); + cl.setPropertyValue("PropByteA", val1); + r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 1 + && li2.nChangeCalled == 0 && li2.nVetoCalled == 1 + && li3.nChangeCalled == 0 && li3.nVetoCalled == 1; + r[i++]= li.evt.OldValue.equals(val3) && li.evt.NewValue.equals(val1) && li.evt.Source == cl; + r[i++]= li2.evt.OldValue.equals(val3) && li2.evt.NewValue.equals(val1) && li2.evt.Source == cl; + r[i++]= li3.evt.OldValue.equals(val3) && li3.evt.NewValue.equals(val1) && li3.evt.Source == cl ; + + li.reset(); + li2.reset(); + li3.reset(); + // Test Veto Exception + cl.setPropertyValue("PropByteA", val1); + li.bVeto= true; + try { + cl.setPropertyValue("PropByteA", val2);i++; + } catch (PropertyVetoException e) + { + r[i++]= true; + } + r[i++]= cl.bytePropA == val1.byteValue(); + li.bVeto= false; + + li.reset(); + li2.reset(); + li3.reset(); + cl.removeVetoableChangeListener("PropByteA",li); + cl.setPropertyValue("PropByteA", val1); + r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 0 + && li2.nChangeCalled == 0 && li2.nVetoCalled == 1 + && li3.nChangeCalled == 0 && li3.nVetoCalled == 1; + cl.removeVetoableChangeListener("PropByteA", li2); + li.reset(); + li2.reset(); + li3.reset(); + cl.setPropertyValue("PropByteA", val1); + r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 0 + && li2.nChangeCalled == 0 && li2.nVetoCalled == 0 + && li3.nChangeCalled == 0 && li3.nVetoCalled == 1; + + cl.removeVetoableChangeListener("", li3); + li.reset(); + li2.reset(); + li3.reset(); + cl.setPropertyValue("PropByteA", val2); + r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 0 + && li2.nChangeCalled == 0 && li2.nVetoCalled == 0 + && li3.nChangeCalled == 0 && li3.nVetoCalled == 0; + + cl.addVetoableChangeListener("PropByteA", li); + cl.addVetoableChangeListener("PropByteA", li2); + cl.addVetoableChangeListener("", li3); + cl.dispose(); + li.reset(); + li2.reset(); + li3.reset(); + try { + cl.setPropertyValue("PropByteA", val2); + }catch (DisposedException e) + { + r[i++]= true; + } + }catch (Exception e) + { + i++; + } + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean getPropertySetInfo() + { + System.out.println("PropertySet.getPropertySetInfo"); + boolean[] r= new boolean[50]; + int i= 0; + + TestClass cl= new TestClass(); + try { + XPropertySetInfo info= cl.getPropertySetInfo(); + Property[] arProps= info.getProperties(); + Property[] arRegProps= cl.getRegisteredProperties(); + r[i++]= arProps.length == arRegProps.length; + for (int j= 0; j < arProps.length; j++) + { + boolean bFound= false; + for (int k= 0; k < arRegProps.length; k++) + { + if (arProps[j] == arRegProps[k]) + { + bFound= true; + break; + } + } + if ( !bFound) + r[i++]= false; + } + + for (int j= 0; j < arRegProps.length; j++) + { + Property prop= info.getPropertyByName(arRegProps[j].Name); + if (prop != arRegProps[j]) + r[i++]= false; + if (! info.hasPropertyByName(arRegProps[j].Name)) + r[i++]= false; + } + + + }catch(java.lang.Exception e){ + System.out.println(e.getMessage()); + i++; + } + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean setFastPropertyValue() + { + System.out.println("PropertySet.setFastPropertyValue"); + boolean[] r= new boolean[50]; + int i= 0; + + TestClass cl= new TestClass(); + try { + cl.setFastPropertyValue(5, new Integer(111)); + r[i++]= cl.intPropA == 111; + try { + cl.setFastPropertyValue(-1, new Integer(1)); i++; + } catch(UnknownPropertyException e) + { + r[i++]= true; + } + }catch(java.lang.Exception e){ + System.out.println(e.getMessage()); + i++; + } + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean getFastPropertyValue() + { + System.out.println("PropertySet.setFastPropertyValue"); + boolean[] r= new boolean[50]; + int i= 0; + + TestClass cl= new TestClass(); + try { + cl.setFastPropertyValue(5, new Integer(111)); + Integer aInt= (Integer) cl.getFastPropertyValue(5); + r[i++]= aInt.intValue() == 111; + }catch(java.lang.Exception e){ + System.out.println(e.getMessage()); + i++; + } + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean setPropertyValues() + { + System.out.println("PropertySet.setPropertyValues"); + boolean[] r= new boolean[50]; + int i= 0; + + TestClass cl= new TestClass(); + try { + cl.setPropertyValues(new String[0], new Object[0]); + String[] arNames= new String[] {"PropCharA","PropIntClass","PropObjectA"}; + Character aChar= new Character('A'); + Integer aInt= new Integer(111); + Byte aByte= new Byte((byte)11); + Object[] values= new Object[]{aChar, aInt, aByte}; + cl.setPropertyValues(arNames, values); + r[i++]= cl.charPropA == 'A' && cl.intClassProp.intValue() == 111 && ((Byte)cl.objectPropA).byteValue() == 11; + + arNames= new String[] {"blabla","PropIntClass","PropObjectA"}; + cl.resetPropertyMembers(); + cl.setPropertyValues(arNames, values); + r[i++]= cl.intClassProp.intValue() == 111 && ((Byte)cl.objectPropA).byteValue() == 11; + }catch(java.lang.Exception e){ + System.out.println(e.getMessage()); + i++; + } + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean getPropertyValues() + { + System.out.println("PropertySet.getPropertyValues"); + boolean[] r= new boolean[50]; + int i= 0; + + TestClass cl= new TestClass(); + try { + cl.charPropA= 'A'; + cl.intClassProp= new Integer(111); + cl.objectPropA= new Byte((byte)11); + Object[] values= cl.getPropertyValues(new String[] {"PropCharA","PropIntClass","PropObjectA"}); + + r[i++]= ((Character) values[0]).charValue() == 'A' && ((Integer) values[1]).intValue() == 111 + && ((Byte) values[2]).byteValue() == 11; + }catch(java.lang.Exception e){ + System.out.println(e.getMessage()); + i++; + } + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + // Currently the listeners are always notified if one of properties has changed. + // The property names in the first argument are ignored. + public boolean addPropertiesChangeListener() + { + System.out.println("PropertySet.addPropertiesChangeListener\n" + + "PropertySet.removePropertiesChangeListener\n" + + "notification of such listeners"); + boolean[] r= new boolean[50]; + int i= 0; + + TestClass cl= new TestClass(); + try { + Listener li1= new Listener(); + Listener li2= new Listener(); + cl.addPropertiesChangeListener(new String[]{"PropCharA"}, li1); + cl.setPropertyValue("PropCharA", new Character('B')); + r[i++]= li1.nPropertiesChange == 0; + cl.propCharA.Attributes= PropertyAttribute.BOUND; + cl.setPropertyValue("PropCharA", new Character('C')); + r[i++]= li1.nPropertiesChange == 1; + + PropertyChangeEvent evt= li1.arEvt[0]; + r[i++]= evt.PropertyName.equals("PropCharA") && ((Character)evt.OldValue).charValue() == 'B' + && ((Character) evt.NewValue).charValue() == 'C'; + li1.reset(); + cl.removePropertiesChangeListener(li1); + cl.setPropertyValue("PropCharA", new Character('F')); + r[i++]= li1.nPropertiesChange == 0; + }catch(java.lang.Exception e){ + System.out.println(e.getMessage()); + i++; + } + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean firePropertiesChangeEvent() + { + System.out.println("PropertySet.firePropertiesChangeEvent"); + boolean[] r= new boolean[50]; + int i= 0; + + TestClass cl= new TestClass(); + try { + Listener li1= new Listener(); + cl.intClassProp= new Integer(111); + cl.charPropA= 'A'; + cl.firePropertiesChangeEvent(new String[]{"PropCharA","PropIntClass"}, li1); + r[i++]= li1.nPropertiesChange == 1; + PropertyChangeEvent[] arEvt= li1.arEvt; + r[i++]= arEvt[0].PropertyName.equals("PropCharA") + && ((Character) arEvt[0].OldValue).charValue() == 'A' + && ((Character) arEvt[0].NewValue).charValue() == 'A'; + r[i++]= arEvt[1].PropertyName.equals("PropIntClass") + && ((Integer) arEvt[1].OldValue).intValue() == 111 + && ((Integer) arEvt[1].NewValue).intValue() == 111; + }catch(java.lang.Exception e){ + System.out.println(e.getMessage()); + i++; + } + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean registerProperty1() + { + TestClass2 cl= new TestClass2(); + return cl.test_registerProperty1(); + } + + public boolean registerProperty2() + { + TestClass2 cl= new TestClass2(); + return cl.test_registerProperty2(); + } + + public static boolean test() + { + PropertySet_Test test= new PropertySet_Test(); + boolean r[]= new boolean[50]; + int i= 0; + r[i++]= test.convertPropertyValue(); + r[i++]= test.setPropertyValueNoBroadcast(); + r[i++]= test.setPropertyValue(); + r[i++]= test.addPropertyChangeListener(); + r[i++]= test.getPropertySetInfo(); + r[i++]= test.setFastPropertyValue(); + r[i++]= test.getFastPropertyValue(); + r[i++]= test.setPropertyValues(); + r[i++]= test.getPropertyValues(); + r[i++]= test.addPropertiesChangeListener(); + r[i++]= test.firePropertiesChangeEvent(); + r[i++]= test.registerProperty1(); + r[i++]= test.registerProperty2(); + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Errors occured!"); + else + System.out.println("No errors."); + return bOk; + } + public static void main(String[] args) + { + test(); + } +} + +class TestClass extends PropertySet +{ + public Property propBoolA= new Property("PropBoolA", 1, new Type(Boolean.TYPE), (short)0); + public boolean boolPropA; + public Property propCharA= new Property("PropCharA", 2, new Type(Character.TYPE), (short) 0); + public char charPropA; + public Property propByteA= new Property("PropByteA", 3, new Type(Byte.TYPE), (short) 0); + public byte bytePropA; + public Property propShortA= new Property("PropShortA", 4, new Type(Short.TYPE), (short) 0); + public short shortPropA; + public Property propIntA= new Property("PropIntA", 5, new Type(Integer.TYPE), (short) 0); + public int intPropA; + public Property propLongA= new Property("PropLongA", 6, new Type(Long.TYPE), (short) 0); + public long longPropA; + public Property propFloatA= new Property("PropFloatA", 7, new Type(Float.TYPE), (short) 0); + public float floatPropA; + public Property propDoubleA= new Property("PropDoubleA", 8, new Type(Double.TYPE), (short) 0); + public double doublePropA; + public Property propStringA= new Property("PropStringA", 9, new Type(String.class), (short) 0); + public String stringPropA; + public Property propArrayByteA= new Property("PropArrayByteA", 10, new Type(byte[].class), (short) 0); + public byte[] arBytePropA; + public Property propTypeA= new Property("PropTypeA", 11, new Type(Type.class), (short) 0); + public Type typePropA; + public Property propObjectA= new Property("PropObjectA",12, new Type(Object.class), (short) 0); + public Object objectPropA; + public Property propAnyA= new Property("PropAnyA", 13, new Type(Any.class), (short) 0); + public Any anyPropA; + public Property propXInterfaceA= new Property("PropXInterfaceA", 13, new Type(Any.class), (short) 0); + public XInterface xInterfacePropA; + public Property propXWeakA= new Property("PropXWeakA", 13, new Type(Any.class), (short) 0); + public XWeak xWeakPropA; + public Property propEnum = + new Property("PropEnum", 14, new Type("com.sun.star.beans.PropertyState", TypeClass.ENUM), (short)0); + public com.sun.star.beans.PropertyState enumPropertyState = com.sun.star.beans.PropertyState.DEFAULT_VALUE; + // Test private, protected, package access, Anys as arguments and members, members whith a value + + public Property propBoolB= new Property("PropBoolB", 101, new Type(Boolean.TYPE), (short) 0); + protected boolean boolPropB; + + public Property propBoolC= new Property("PropBoolC", 201, new Type(Boolean.TYPE), (short) 0); + boolean boolPropC; + + public Property propBoolD= new Property("PropBoolD", 301, new Type(Boolean.TYPE), (short) 0); + private boolean boolPropD; + + public Property propBoolClass= new Property("PropBoolClass", 1001, new Type(Boolean.class), (short) 0); + public Boolean boolClassProp; + public Property propCharClass= new Property("PropCharClass", 1002, new Type(Character.class), (short) 0); + public Character charClassProp; + public Property propByteClass= new Property("PropByteClass", 1003, new Type(Byte.class), (short) 0); + public Byte byteClassProp; + public Property propShortClass= new Property("PropShortClass", 1004, new Type(Short.class), (short) 0); + public Short shortClassProp; + public Property propIntClass= new Property("PropIntClass", 1005, new Type(Integer.class), (short) 0); + public Integer intClassProp; + public Property propLongClass= new Property("PropLongClass", 1006, new Type(Long.class), (short) 0); + public Long longClassProp; + public Property propFloatClass= new Property("PropFloatClass", 1007, new Type(Float.class), (short) 0); + public Float floatClassProp; + public Property propDoubleClass= new Property("PropDoubleClass", 1008, new Type(Double.class), (short) 0); + public Double doubleClassProp; + + + public TestClass() + { + + super(); +// When adding properties then modify the getRegisteredProperties method + //registerProperty(String name, int handle, Type type, short attributes, String memberName) + registerProperty(propBoolA, "boolPropA"); + registerProperty(propCharA, "charPropA"); + registerProperty(propByteA, "bytePropA"); + registerProperty(propShortA, "shortPropA"); + registerProperty(propIntA, "intPropA"); + registerProperty(propLongA, "longPropA"); + registerProperty(propFloatA, "floatPropA"); + registerProperty(propDoubleA, "doublePropA"); + registerProperty(propStringA, "stringPropA"); + registerProperty(propArrayByteA, "arBytePropA"); + registerProperty(propTypeA, "typePropA"); + registerProperty(propObjectA, "objectPropA"); + registerProperty(propAnyA, "anyPropA"); + registerProperty(propXInterfaceA, "xInterfacePropA"); + registerProperty(propXWeakA, "xWeakPropA"); + registerProperty(propEnum,"enumPropertyState"); + registerProperty(propBoolB, "boolPropB"); + registerProperty(propBoolC, "boolPropC"); + registerProperty(propBoolD, "boolPropD"); + registerProperty(propBoolClass, "boolClassProp"); + registerProperty(propCharClass, "charClassProp"); + registerProperty(propByteClass, "byteClassProp"); + registerProperty(propShortClass, "shortClassProp"); + registerProperty(propIntClass, "intClassProp"); + registerProperty(propLongClass, "longClassProp"); + registerProperty(propFloatClass, "floatClassProp"); + registerProperty(propDoubleClass, "doubleClassProp"); + } + + /** When adding properties then modify the getRegisteredProperties method + */ + public Property[] getRegisteredProperties() + { + return new Property[] { + propBoolA, propCharA, propByteA, propShortA, + propIntA, propLongA, propFloatA, propDoubleA, + propStringA, propArrayByteA, propTypeA, propObjectA, + propAnyA, propXInterfaceA, propXWeakA, propEnum, propBoolB, + propBoolC, propBoolD, propBoolClass, propCharClass, + propByteClass, propShortClass, propIntClass, propLongClass, + propFloatClass, propDoubleClass + }; + + } + public boolean test_convertPropertyValue() + { + boolean[] r= new boolean[150]; + int i= 0; + + resetPropertyMembers(); + Object[] outOldVal= new Object[1]; + Object[] outNewVal= new Object[1]; + + Object value= new Boolean(true); + try + { + r[i++]= convertPropertyValue(propBoolA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Boolean && outNewVal[0].equals(value) && outOldVal[0].equals(new Boolean(false)); + value= new Character('A'); + r[i++]= convertPropertyValue(propCharA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Character && outNewVal[0].equals(value) && outOldVal[0].equals(new Character((char)0)); + charPropA= 'B'; + r[i++]= convertPropertyValue(propCharA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Character && outNewVal[0].equals(value) && outOldVal[0].equals(new Character('B')); + value= new Byte((byte) 111); + r[i++]= convertPropertyValue(propByteA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Byte && outNewVal[0].equals(value); + value= new Short((short) 112); + r[i++]= convertPropertyValue(propShortA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Short && outNewVal[0].equals(value); + value= new Integer( 113); + r[i++]= convertPropertyValue(propIntA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Integer && outNewVal[0].equals(value); + value= new Long(114); + r[i++]= convertPropertyValue(propLongA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Long && outNewVal[0].equals(value); + value= new Float(3.14); + r[i++]= convertPropertyValue(propFloatA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Float && outNewVal[0].equals(value); + value= new Double(3.145); + r[i++]= convertPropertyValue(propDoubleA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Double && outNewVal[0].equals(value); + value= "string"; + r[i++]= convertPropertyValue(propStringA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof String && outNewVal[0].equals(value); + value= new byte[]{1,2,3}; + arBytePropA= null; + r[i++]= convertPropertyValue(propArrayByteA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof byte[] && outNewVal[0].equals(value) && outOldVal[0] == null; + r[i++]= convertPropertyValue(propArrayByteA, outNewVal, outOldVal, value); + r[i++]= outOldVal[0] == null; + value= new Type(XInterface.class); + r[i++]= convertPropertyValue(propTypeA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Type && outNewVal[0].equals(value); + + value= new Object(); // TypeClass.VOID + r[i++]= convertPropertyValue(propObjectA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Object && outNewVal[0].equals(value); + value= new Integer(111); + r[i++]= convertPropertyValue(propObjectA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Integer && outNewVal[0].equals(value); + value= new ComponentBase(); + r[i++]= convertPropertyValue(propObjectA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Object && outNewVal[0].equals(value); + value= new Integer(111); + r[i++]= convertPropertyValue(propAnyA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Any && ((Any)outNewVal[0]).getType().equals(new Type(Integer.class)) + && ((Any)outNewVal[0]).getObject().equals(value); + XWeak oWeak= new ComponentBase(); + value= oWeak; + // The returned Any must contain an XInterface + r[i++]= convertPropertyValue(propAnyA, outNewVal, outOldVal, value); + r[i++]= ((Any) outNewVal[0]).getType().equals(new Type(XInterface.class)) + && ((Any) outNewVal[0]).getObject() == oWeak; + value= new ComponentBase(); + r[i++]= convertPropertyValue(propXInterfaceA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof XInterface && outNewVal[0].equals(value); + r[i++]= convertPropertyValue(propXWeakA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof XWeak && outNewVal[0].equals(value); + + value = com.sun.star.beans.PropertyState.DIRECT_VALUE; + r[i++]= convertPropertyValue(propEnum, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof com.sun.star.uno.Enum && outNewVal[0].equals(value); + + // Any arguments ------------------------------------------------------------------ + value= new Any( new Type(Integer.class),new Integer(111)); + r[i++]= convertPropertyValue(propIntA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Integer && ((Integer)outNewVal[0]).equals( ((Any)value).getObject()); + value= new Any(new Type(Boolean.class), new Boolean(true)); + r[i++]= convertPropertyValue(propBoolA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Boolean && ((Boolean)outNewVal[0]).equals(((Any) value).getObject()); + //Character, Byte, Short, Long + // must fail + value= new Any(new Type(Object.class), new Object()); + r[i++]= convertPropertyValue(propObjectA, outNewVal, outOldVal, value); + r[i++]= convertPropertyValue(propAnyA, outNewVal, outOldVal, value); + value= new Any(new Type(Integer.class), new Integer(111)); + r[i++]= convertPropertyValue(propObjectA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Integer && outNewVal[0].equals( ((Any)value).getObject()); + r[i++]= convertPropertyValue(propAnyA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Any && ((Any) outNewVal[0]).getType().equals( ((Any) value).getType()) + && ((Any) outNewVal[0]).getObject().equals( ((Any) value).getObject()); + value= new Any(new Type(XInterface.class), new ComponentBase()); + r[i++]= convertPropertyValue(propObjectA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof XInterface && outNewVal[0] == ((Any) value).getObject(); + r[i++]= convertPropertyValue(propXInterfaceA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] == ((Any) value).getObject(); + value= new Any(new Type(byte[].class), new byte[]{1,2,3}); + r[i++]= convertPropertyValue(propArrayByteA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof byte[]; + + + + // test private, protected, package fields + value= new Boolean(true); + r[i++]= convertPropertyValue(propBoolB, outNewVal, outOldVal, value); + r[i++]= ((Boolean)value).booleanValue() == ((Boolean) outNewVal[0]).booleanValue(); + r[i++]= convertPropertyValue(propBoolC, outNewVal, outOldVal, value); + r[i++]= ((Boolean)value).booleanValue() == ((Boolean) outNewVal[0]).booleanValue(); + // must fail because the the member boolPropD is private + try{ + convertPropertyValue(propBoolD, outNewVal, outOldVal, value); + i++; + }catch (Exception e) + { + r[i++]= true; + } + + // Properties member of type Byte,Short etc. + value= new Boolean(true); + r[i++]= convertPropertyValue(propBoolClass, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Boolean && outNewVal[0].equals(value); + value= new Character('A'); + r[i++]= convertPropertyValue(propCharClass, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Character && outNewVal[0].equals(value); + value= new Byte((byte) 111); + r[i++]= convertPropertyValue(propByteClass, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Byte && outNewVal[0].equals(value); + value= new Short((short) 112); + r[i++]= convertPropertyValue(propShortClass, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Short && outNewVal[0].equals(value); + value= new Integer( 113); + r[i++]= convertPropertyValue(propIntClass, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Integer && outNewVal[0].equals(value); + value= new Long(114); + r[i++]= convertPropertyValue(propLongClass, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Long && outNewVal[0].equals(value); + value= new Float(3.14); + r[i++]= convertPropertyValue(propFloatClass, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Float && outNewVal[0].equals(value); + value= new Double(3.145); + r[i++]= convertPropertyValue(propDoubleA, outNewVal, outOldVal, value); + r[i++]= outNewVal[0] instanceof Double && outNewVal[0].equals(value); + }catch (com.sun.star.uno.Exception e) + { + i++; + } + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + + return bOk; + } + + public boolean test_setPropertyValueNoBroadcast() + { + boolean[] r= new boolean[150]; + int i= 0; + resetPropertyMembers(); + try { + Object value= new Boolean(true); + setPropertyValueNoBroadcast(propBoolA, value); + r[i++]= boolPropA == ((Boolean) value).booleanValue(); + value= new Character('A'); + setPropertyValueNoBroadcast(propCharA, value); + r[i++]= charPropA == ((Character) value).charValue(); + value= new Byte((byte) 111); + setPropertyValueNoBroadcast(propByteA, value); + r[i++]= bytePropA == ((Byte)value).byteValue(); + value= new Short((short) 112); + setPropertyValueNoBroadcast(propShortA, value); + r[i++]= shortPropA == ((Short) value).shortValue(); + value= new Integer( 113); + setPropertyValueNoBroadcast(propIntA, value); + r[i++]= intPropA == ((Integer) value).intValue(); + value= new Long(114); + setPropertyValueNoBroadcast(propLongA, value); + r[i++]= longPropA == ((Long) value).longValue(); + value= new Float(3.14); + setPropertyValueNoBroadcast(propFloatA, value); + r[i++]= floatPropA == ((Float) value).floatValue(); + value= new Double(3.145); + setPropertyValueNoBroadcast(propDoubleA, value); + r[i++]= doublePropA == ((Double) value).doubleValue(); + value= "string"; + setPropertyValueNoBroadcast(propStringA, value); + r[i++]= stringPropA.equals(value); + value= new byte[]{1,2,3}; + setPropertyValueNoBroadcast(propArrayByteA, value); + r[i++]= arBytePropA.equals(value); + value= new Type(XInterface.class); + setPropertyValueNoBroadcast(propTypeA, value); + r[i++]= typePropA.equals(value); + value= new Integer(111); + setPropertyValueNoBroadcast(propObjectA, value); + r[i++]= objectPropA.equals(value); + value= (XInterface) new ComponentBase(); + setPropertyValueNoBroadcast(propObjectA, value); + r[i++]= objectPropA.equals(value); + value= new Any( new Type(Integer.TYPE), new Integer(111)); + setPropertyValueNoBroadcast(propAnyA, value); + r[i++]= util.anyEquals(anyPropA, value); + value= new ComponentBase(); + setPropertyValueNoBroadcast(propXInterfaceA, value); + r[i++]= xInterfacePropA instanceof XInterface && xInterfacePropA.equals(value); + setPropertyValueNoBroadcast(propXWeakA, value); + r[i++]= xInterfacePropA instanceof XWeak && xInterfacePropA.equals(value); + value = com.sun.star.beans.PropertyState.AMBIGUOUS_VALUE; + setPropertyValueNoBroadcast(propEnum, value); + r[i++]= enumPropertyState == value; + value= new Boolean(true); + setPropertyValueNoBroadcast(propBoolB, value); + r[i++]= boolPropB == ((Boolean) value).booleanValue(); + setPropertyValueNoBroadcast(propBoolC, value); + r[i++]= boolPropC == ((Boolean) value).booleanValue(); + // must fail because the the member boolPropD is private + try{ + setPropertyValueNoBroadcast(propBoolD, value); + }catch(com.sun.star.lang.WrappedTargetException e) + { + r[i++]= true; + } + }catch (java.lang.Exception e) + { + i++; + } + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + return bOk; + } + + void resetPropertyMembers() + { + boolPropA= false; + charPropA= (char) 0; + bytePropA= 0; + shortPropA= 0; + intPropA= 0; + longPropA= 0; + floatPropA= 0; + doublePropA= 0.; + stringPropA= null; + arBytePropA= null; + typePropA= null; + objectPropA= null; + anyPropA= null; + xInterfacePropA= null; + xWeakPropA= null; + enumPropertyState = com.sun.star.beans.PropertyState.DEFAULT_VALUE; + boolPropB= false; + boolPropC= false; + boolPropD= false; + boolClassProp= null; + charClassProp= null; + byteClassProp= null; + shortClassProp= null; + intClassProp= null; + longClassProp= null; + floatClassProp= null; + doubleClassProp= null; + } +} + +class TestClass2 extends PropertySet +{ + + public char charA; + protected char charB; + char charC; + + int intMemberA; + + public Character charClassA; + protected Character charClassB; + Character charClassC; + + boolean test_registerProperty1() + { + System.out.println("registerProperty Test 1"); + boolean r[]= new boolean[50]; + int i= 0; + + registerProperty("PropChar", new Type(char.class), (short) 0, "PropChar"); + registerProperty("PropInt", new Type(int.class), (short) 0, "PropInt"); + registerProperty("PropString", new Type(String.class), (short) 0, "PropString"); + + XPropertySetInfo info= getPropertySetInfo(); + Property[] props= info.getProperties(); + for (int j= 0; j < props.length; j++) + { + Property aProp= props[j]; + if (aProp.Name.equals("PropChar") && aProp.Type.equals(new Type(char.class)) && + aProp.Attributes == 0) + r[i++]= true; + else if (aProp.Name.equals("PropInt") && aProp.Type.equals(new Type(int.class)) && + aProp.Attributes == 0) + r[i++]= true; + else if (aProp.Name.equals("PropString") && aProp.Type.equals(new Type(String.class)) && + aProp.Attributes == 0) + r[i++]= true; + else + r[i++]= false; + } + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + boolean test_registerProperty2() + { + System.out.println("registerProperty Test 2"); + boolean r[]= new boolean[50]; + int i= 0; + + registerProperty("charA", "charA", (short) 0); + registerProperty("charB", "charB", (short) 0); + registerProperty("charC", "charC", (short) 0); + registerProperty("charClassB", "charClassB", PropertyAttribute.MAYBEVOID); + registerProperty("IntProp", "intMemberA", (short) 0); + + XPropertySetInfo info= getPropertySetInfo(); + Property[] props= info.getProperties(); + for (int j= 0; j < props.length; j++) + { + Property aProp= props[j]; + if (aProp.Name.equals("charA") && aProp.Type.equals(new Type(char.class)) && + aProp.Attributes == 0) + r[i++]= true; + else if (aProp.Name.equals("charB") && aProp.Type.equals(new Type(char.class)) && + aProp.Attributes == 0) + r[i++]= true; + else if (aProp.Name.equals("charC") && aProp.Type.equals(new Type(char.class)) && + aProp.Attributes == 0) + r[i++]= true; + else if (aProp.Name.equals("charClassB") && aProp.Type.equals(new Type(char.class)) && + aProp.Attributes == PropertyAttribute.MAYBEVOID) + r[i++]= true; + else if (aProp.Name.equals("IntProp") && aProp.Type.equals(new Type(int.class)) && + aProp.Attributes == 0) + r[i++]= true; + else + r[i++]= false; + } + Object ret; + Object val= new Character('A'); + try{ + setPropertyValue("charA", val); + ret= getPropertyValue("charA"); + r[i++]= val.equals(ret); + setPropertyValue("charClassB",val); + ret= getPropertyValue("charClassB"); + r[i++]= val.equals(ret); + val= new Integer(111); + setPropertyValue("IntProp",val); + ret= getPropertyValue("IntProp"); + r[i++]= val.equals(ret); + } + catch(Exception e) + { + r[i++]=false; + } + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + +} + +class util +{ + // An Object is considered an Any with TypeClass.VOID and no value. + static boolean anyEquals(Object val1, Object val2) + { + Object obj1= null; + Object obj2= null; + Type t1= null; + Type t2= null; + if (val1 instanceof Any) + { + obj1= ((Any) val1).getObject(); + t1= ((Any) val1).getType(); + } + else + obj1= val1; + + if (val2 instanceof Any) + { + obj2= ((Any) val2).getObject(); + t2= ((Any) val2).getType(); + } + else + obj2= val2; + + if (obj1 != null && obj1.equals(obj2)) + return true; + else if ((obj1 == null && obj2 == null) && t1 != null && t1.equals(t2)) + return true; + return false; + } + + // returns true if obj is an any that contains a void or interface type and the + // object is null + static boolean isVoidAny(Object obj) + { + boolean ret= false; + if( obj != null && obj instanceof Any) + { + Any a= (Any) obj; + if( a.getType().getTypeClass().equals( TypeClass.INTERFACE) + && a.getObject() == null) { + ret= true; + } + else if( a.getType().equals( new Type(void.class)) && a.getObject() == null) { + ret= true; + } + } + return ret; + } +} + +class Listener implements XPropertyChangeListener, XVetoableChangeListener, +XPropertiesChangeListener +{ + int nChangeCalled; + int nPropertiesChange; + int nVetoCalled; + int nDisposingCalled; + boolean bVeto= false; + PropertyChangeEvent evt; + PropertyChangeEvent[] arEvt; + // XPropertyChangeListener + public void propertyChange(PropertyChangeEvent evt ) + { + nChangeCalled++; + this.evt= evt; + } + + //VetoableChangeListener + public void vetoableChange(PropertyChangeEvent evt ) throws PropertyVetoException + { + nVetoCalled++; + this.evt= evt; + if (bVeto) + throw new PropertyVetoException(); + } + + public void disposing( /*IN*/EventObject Source ) + { + nDisposingCalled++; + } + + public void reset() + { + nChangeCalled= 0; + nPropertiesChange= 0; + nVetoCalled= 0; + nDisposingCalled= 0; + evt= null; + arEvt= null; + bVeto= false; + } + // XPropertiesChangeListener + public void propertiesChange(PropertyChangeEvent[] propertyChangeEvent) + { + nPropertiesChange++; + arEvt= propertyChangeEvent; + } + +} diff --git a/javaunohelper/test/com/sun/star/lib/uno/helper/ProxyProvider.java b/javaunohelper/test/com/sun/star/lib/uno/helper/ProxyProvider.java new file mode 100644 index 000000000000..f91944ae303b --- /dev/null +++ b/javaunohelper/test/com/sun/star/lib/uno/helper/ProxyProvider.java @@ -0,0 +1,168 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ProxyProvider.java,v $ + * $Revision: 1.4 $ + * + * 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.lib.uno.helper; +import com.sun.star.uno.Type; +import com.sun.star.lib.uno.typedesc.TypeDescription; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.lang.XEventListener; +import com.sun.star.uno.IQueryInterface; +//import com.sun.star.lib.uno.environments.java.Proxy; +import com.sun.star.lib.uno.environments.java.java_environment; +//import com.sun.star.lib.uno.environments.java.IRequester; + + +public class ProxyProvider +{ + static java_environment env= new java_environment(null); + + /** Creates a new instance of ProxyProvider */ + public ProxyProvider() + { + } + /** returns Holder proxy objects for the specified interface. If the method is called + * several times with the same arguments then each time a new HolderProxy is returned. + * Then all HolderProxy s refer to the same Proxy object. + * The proxy can be queried for XEventListener. On the returned proxy disposing can be called + * + */ + public static Object createProxy(Object obj, Class iface) + { + + Object retVal= null; + if (obj == null || iface == null || iface.isInstance(obj) == false ) + return retVal; + + Type type= new Type(TypeDescription.getTypeDescription(iface)); + Type evtType= new Type(TypeDescription.getTypeDescription(com.sun.star.lang.XEventListener.class)); + // find the object identifier + String sOid= UnoRuntime.generateOid(obj); + retVal= env.getRegisteredInterface(sOid, type); + // if retVal == null then probably not registered + if (retVal == null) + { + Object aProxy = new Proxy(sOid, type); + String[] arOid = new String[] + {sOid}; + retVal= env.registerInterface(aProxy, arOid, type); + } + return retVal; + } +} + +class Proxy implements IQueryInterface, XEventListener +{ + String oid; + Type type; + Proxy(String oid, Type t) { + this.oid = oid; + this.type = t; + } + + public String getOid() { + return oid; + } + + public boolean isSame(Object object) { + if (object instanceof IQueryInterface) + { + IQueryInterface iquery = (IQueryInterface) object; + if (iquery != null) + { + if (iquery.getOid().equals(oid)) + return true; + else + return false; + } + } + + String oidObj = UnoRuntime.generateOid(object); + if (oidObj.equals(oid)) + return true; + else + return false; + } + + public Object queryInterface(Type type) { + return null; + } + + public void disposing(com.sun.star.lang.EventObject eventObject) { + } + +} + + +//class Requester //implements IRequester +//{ +// int _modus; +// boolean _virtual; +// boolean _forceSynchronous; +// boolean _passed = true; +// +// Object _xEventListenerProxy; +// int nDisposingCalled= 0; +// +// Requester(boolean virtual, boolean forceSynchronous, Object evtListener) +// { +// _virtual = virtual; +// _forceSynchronous = forceSynchronous; +// _xEventListenerProxy= evtListener; +// +// } +// +// public Object sendRequest(Object object, +// Type type, +// String operation, +// Object params[], +// Boolean synchron[], +// Boolean mustReply[]) throws Throwable +// { +// +// Object result = null; +// if (operation.equals("disposing")) +// { +// System.out.println("Disposing called on XEventListener proxy"); +// nDisposingCalled++; +// } +// else if (operation.equals("queryInterface")) +// { +// if (params[0] instanceof Type) +// { +// Type t= (Type) params[0]; +// if (t.equals( new Type("com.sun.star.lang.XEventListener"))) +// result= _xEventListenerProxy; +// } +// } +// return result; +// } +//} + + diff --git a/javaunohelper/test/com/sun/star/lib/uno/helper/UnoUrlTest.java b/javaunohelper/test/com/sun/star/lib/uno/helper/UnoUrlTest.java new file mode 100644 index 000000000000..e5bf5b74113a --- /dev/null +++ b/javaunohelper/test/com/sun/star/lib/uno/helper/UnoUrlTest.java @@ -0,0 +1,264 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: UnoUrlTest.java,v $ + * $Revision: 1.4 $ + * + * 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.lib.uno.helper; +public class UnoUrlTest { + + private UnoUrlTest() { + } + + + private void fail(String msg) { + System.err.println(msg); + System.exit(1); + } + + private static void log(String msg) { + System.out.println(msg); + } + + private void assertTrue(boolean b) { + if (!b) + fail("boolean assertion failed"); + } + + private void assertEquals(String expected, String actual) { + if (!expected.equals(actual)) { + fail("Expected: '"+ expected + "' but was: '"+actual+"'"); + } + } + + private void assertEquals(int expected, int actual) { + if (expected != actual) { + fail("Expected: "+ expected + " but was: "+actual); + } + } + + public void testStart1() { + try { + UnoUrl url = UnoUrl.parseUnoUrl("uno:x;y;z"); + assertTrue((url != null)); + assertEquals("x", url.getConnection()); + } catch (com.sun.star.lang.IllegalArgumentException e) { + fail("Caught exception:" + e.getMessage()); + } + } + + public void testStart2() { + try { + UnoUrl url = UnoUrl.parseUnoUrl("uno1:x;y;z"); + fail("Should throw an exception"); + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + public void testStart3() { + try { + UnoUrl url = UnoUrl.parseUnoUrl("un:x;y;z"); + fail("Should throw an exception"); + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + public void testStart4() { + try { + UnoUrl url = UnoUrl.parseUnoUrl("x;y;z"); + assertTrue((url != null)); + assertEquals("y", url.getProtocol()); + } catch (com.sun.star.lang.IllegalArgumentException e) { + fail("Caught exception:" + e.getMessage()); + } + } + + public void testParam1() { + try { + UnoUrl url = UnoUrl.parseUnoUrl("uno:"); + fail("Should throw an exception"); + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + public void testParam2() { + try { + UnoUrl url = UnoUrl.parseUnoUrl("uno:a;"); + fail("Should throw an exception"); + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + public void testPartName1() { + try { + UnoUrl url = UnoUrl.parseUnoUrl("uno:abc!abc;b;c"); + fail("Should throw an exception"); + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + public void testOID1() { + try { + UnoUrl url = UnoUrl.parseUnoUrl("uno:x;y;ABC<ABC"); + fail("Should throw an exception"); + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + public void testOIDandParams1() { + try { + UnoUrl url = UnoUrl.parseUnoUrl("uno:x,key9=val9;y;ABC"); + assertTrue((url != null)); + assertEquals("ABC", url.getRootOid()); + assertEquals(1, url.getConnectionParameters().size()); + assertEquals("val9", (String)url.getConnectionParameters().get("key9")); + } catch (com.sun.star.lang.IllegalArgumentException e) { + fail(e.getMessage()); + } + } + + public void testOIDandParams2() { + try { + UnoUrl url = UnoUrl.parseUnoUrl("uno:x,key1=val1,k2=v2;y,k3=v3;ABC()!/"); + assertTrue((url != null)); + assertEquals("ABC()!/", url.getRootOid()); + assertEquals(2, url.getConnectionParameters().size()); + assertEquals(1, url.getProtocolParameters().size()); + } catch (com.sun.star.lang.IllegalArgumentException e) { + fail("Caught exception:" + e.getMessage()); + } + } + + public void testParams1() { + try { + UnoUrl url = UnoUrl.parseUnoUrl("uno:x,abc!abc=val;y;ABC"); + fail("Should throw an exception"); + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + public void testParams2() { + try { + UnoUrl url = UnoUrl.parseUnoUrl("uno:x,abc=val<val;y;ABC"); + fail("Should throw an exception"); + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + public void testParams3() { + try { + UnoUrl url = UnoUrl.parseUnoUrl("uno:x,abc=val!()val;y;ABC"); + assertTrue((url != null)); + assertEquals(1, url.getConnectionParameters().size()); + } catch (com.sun.star.lang.IllegalArgumentException e) { + fail("Caught exception:" + e.getMessage()); + } + } + + public void testCommon() { + try { + UnoUrl url = + UnoUrl.parseUnoUrl( + "socket,host=localhost,port=2002;urp;StarOffice.ServiceManager"); + assertTrue((url != null)); + assertEquals("StarOffice.ServiceManager", url.getRootOid()); + assertEquals("socket", url.getConnection()); + assertEquals("urp", url.getProtocol()); + assertEquals("2002", (String)url.getConnectionParameters().get("port")); + } catch (com.sun.star.lang.IllegalArgumentException e) { + fail("Caught exception:" + e.getMessage()); + } + } + + public void testUTF() { + try { + UnoUrl url = + UnoUrl.parseUnoUrl( + "socket,host=localhost,horst=abc%c3%9c%c3%a4ABC%41%2c%2C,port=2002;urp;StarOffice.ServiceManager"); + assertEquals("abcÜäABCA,,", (String)url.getConnectionParameters().get("horst")); + assertEquals( + "host=localhost,horst=abc%c3%9c%c3%a4ABC%41%2c%2C,port=2002", + url.getConnectionParametersAsString()); + } catch (com.sun.star.lang.IllegalArgumentException e) { + fail("Caught exception:" + e.getMessage()); + } + + } + + public void testUTF1() { + try { + UnoUrl url = UnoUrl.parseUnoUrl("uno:x,abc=val%4t;y;ABC"); + fail("Should throw an exception"); + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + + public static void main(String args[]) { + UnoUrlTest t = new UnoUrlTest(); + + log("Running test case 1"); + t.testStart1(); + log("Running test case 2"); + t.testStart2(); + log("Running test case 3"); + t.testStart3(); + log("Running test case 4"); + t.testStart4(); + + log("Running test case 5"); + t.testParam1(); + log("Running test case 6"); + t.testParam2(); + + log("Running test case 7"); + t.testPartName1(); + + log("Running test case 8"); + t.testOID1(); + + log("Running test case 9"); + t.testOIDandParams1(); + log("Running test case 10"); + t.testOIDandParams2(); + + log("Running test case 11"); + t.testParams1(); + log("Running test case 12"); + t.testParams2(); + log("Running test case 13"); + t.testParams3(); + + log("Running test case 14"); + t.testCommon(); + + log("Running test case 15"); + t.testUTF(); + log("Running test case 16"); + t.testUTF1(); + } +} diff --git a/javaunohelper/test/com/sun/star/lib/uno/helper/WeakBase_Test.java b/javaunohelper/test/com/sun/star/lib/uno/helper/WeakBase_Test.java new file mode 100644 index 000000000000..c63cf327f2ec --- /dev/null +++ b/javaunohelper/test/com/sun/star/lib/uno/helper/WeakBase_Test.java @@ -0,0 +1,254 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: WeakBase_Test.java,v $ + * $Revision: 1.4 $ + * + * 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.lib.uno.helper; +import com.sun.star.uno.Type; +import com.sun.star.bridge.XBridgeSupplier2; +import com.sun.star.uno.XReference; +import com.sun.star.uno.XWeak; +import com.sun.star.lang.XTypeProvider; +import com.sun.star.uno.XAdapter; + +public class WeakBase_Test +{ + + /** Creates a new instance of WeakBase_Test */ + public WeakBase_Test() + { + } + + public boolean getTypes() + { + System.out.println("Testing WeakBase.getTypes"); + boolean[] r= new boolean[50]; + int i= 0; + + SomeClass comp= new SomeClass(); + Type[] types= comp.getTypes(); //XWeak,XTypeProvider,XReference,XBridgeSupplier2 + r[i++]= types.length == 4; + for (int c= 0; c < types.length; c++) + { + if (types[c].equals( new Type( XWeak.class))) + r[i++]= true; + else if (types[c].equals(new Type(XTypeProvider.class))) + r[i++]= true; + else if (types[c].equals(new Type(XReference.class))) + r[i++]= true; + else if (types[c].equals(new Type(XBridgeSupplier2.class))) + r[i++]= true; + else + r[i++]= false; + + } + + Foo1 f1= new Foo1(); + Foo1 f2= new Foo1(); + Type[] t1= f1.getTypes(); + Type[] t2= f2.getTypes(); + r[i++]= t1.equals(t2); + Foo2 f3= new Foo2(); + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean getImplementationId() + { + System.out.println("Testing WeakBase.getImplementationId"); + boolean[] r= new boolean[50]; + int i= 0; + + SomeClass comp= new SomeClass(); + // byte 0 - 3 contain hashcode and the remaining bytes represent the classname + byte [] ar= comp.getImplementationId(); + + StringBuffer buff= new StringBuffer(); + for (int c= 0; c < ar.length - 4; c++){ + buff.append((char) ar[4 + c]); +// buff.append(" "); + } + String retStr= buff.toString(); + r[i++]= retStr.equals("com.sun.star.lib.uno.helper.SomeClass"); +// System.out.println(buff.toString()); + + Foo1 f1= new Foo1(); + Foo1 f2= new Foo1(); + r[i++]= f1.getImplementationId().equals(f2.getImplementationId()); + Foo2 f3= new Foo2(); + r[i++]= ! f1.getImplementationId().equals(f3.getImplementationId()); + Foo3 f4= new Foo3(); + r[i++]= ! f1.getImplementationId().equals(f4.getImplementationId()); + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public boolean queryAdapter() + { + System.out.println("Testing WeakBase.queryAdapter, XAdapter tests"); + boolean[] r= new boolean[50]; + int i= 0; + + SomeClass comp= new SomeClass(); + XAdapter adapter= comp.queryAdapter(); + MyRef aRef1= new MyRef(); + MyRef aRef2= new MyRef(); + adapter.addReference(aRef1); + adapter.addReference(aRef2); + + r[i++]= adapter.queryAdapted() == comp; + comp= null; + System.out.println("Wait 5 sec"); + for(int c= 0; c < 50; c++) + { + try + { + Thread.currentThread().sleep(100); + System.gc(); + System.runFinalization(); + }catch (InterruptedException ie) + { + } + } + + r[i++]= aRef1.nDisposeCalled == 1; + r[i++]= aRef2.nDisposeCalled == 1; + r[i++]= adapter.queryAdapted() == null; + adapter.removeReference(aRef1); // should not do any harm + adapter.removeReference(aRef2); + + comp= new SomeClass(); + adapter= comp.queryAdapter(); + aRef1.nDisposeCalled= 0; + aRef2.nDisposeCalled= 0; + + adapter.addReference(aRef1); + adapter.addReference(aRef2); + + adapter.removeReference(aRef1); + System.out.println("Wait 5 sec"); + comp= null; + for(int c= 0; c < 50; c++) + { + try + { + Thread.currentThread().sleep(100); + System.gc(); + System.runFinalization(); + }catch (InterruptedException ie) + { + } + } + r[i++]= aRef1.nDisposeCalled == 0; + r[i++]= aRef2.nDisposeCalled == 1; + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Failed"); + else + System.out.println("Ok"); + return bOk; + } + + public static void main(String[] args) + { + WeakBase_Test test= new WeakBase_Test(); + boolean r[]= new boolean[50]; + int i= 0; + r[i++]= test.getTypes(); + r[i++]= test.getImplementationId(); + r[i++]= test.queryAdapter(); + + boolean bOk= true; + for (int c= 0; c < i; c++) + bOk= bOk && r[c]; + if (bOk == false) + System.out.println("Errors occured!"); + else + System.out.println("No errors."); + + } + +} + +interface Aint +{ +} +class OtherClass extends WeakBase implements XBridgeSupplier2 +{ + + public Object createBridge(Object obj, byte[] values, short param, short param3) throws com.sun.star.lang.IllegalArgumentException + { + return null; + } +} + +class SomeClass extends OtherClass implements Aint,XReference +{ + + public void dispose() + { + } + +} + +class MyRef implements XReference +{ + int nDisposeCalled; + + public void dispose() + { + nDisposeCalled++; + } +} + +class Foo1 extends WeakBase +{ +} + +class Foo2 extends WeakBase +{ +} + +class Foo3 extends Foo1 +{ +} diff --git a/javaunohelper/test/com/sun/star/lib/uno/helper/makefile.mk b/javaunohelper/test/com/sun/star/lib/uno/helper/makefile.mk new file mode 100644 index 000000000000..a5f413ec2e95 --- /dev/null +++ b/javaunohelper/test/com/sun/star/lib/uno/helper/makefile.mk @@ -0,0 +1,72 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.8 $ +# +# 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. +# +#************************************************************************* + +PRJ=..$/..$/..$/..$/..$/..$/.. +PRJNAME = juhelper +PACKAGE = com$/sun$/star$/lib$/uno$/helper +TARGET = com_sun_star_lib_uno_helper_test + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk + +# --- Files -------------------------------------------------------- + +JARFILES = jurt.jar ridl.jar juh.jar + +JAVACLASSFILES= \ + $(CLASSDIR)$/$(PACKAGE)$/WeakBase_Test.class \ + $(CLASSDIR)$/$(PACKAGE)$/ComponentBase_Test.class \ + $(CLASSDIR)$/$(PACKAGE)$/InterfaceContainer_Test.class \ + $(CLASSDIR)$/$(PACKAGE)$/MultiTypeInterfaceContainer_Test.class \ + $(CLASSDIR)$/$(PACKAGE)$/ProxyProvider.class \ + $(CLASSDIR)$/$(PACKAGE)$/AWeakBase.class \ + $(CLASSDIR)$/$(PACKAGE)$/PropertySet_Test.class \ + $(CLASSDIR)$/$(PACKAGE)$/UnoUrlTest.class \ + $(CLASSDIR)$/$(PACKAGE)$/Factory_Test.class + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + +CPATH_JARS = java_uno.jar $(JARFILES) +CPATH_TMP1 = $(foreach,j,$(CPATH_JARS) $(SOLARBINDIR)$/$j) +CPATH_TMP2 = $(strip $(subst,!,$(PATH_SEPERATOR) $(CPATH_TMP1:s/ /!/))) +CPATH = $(CPATH_TMP2)$(PATH_SEPERATOR)$(OUT)$/bin$/factory_test.jar$(PATH_SEPERATOR)$(XCLASSPATH) + +$(OUT)$/bin$/factory_test.jar : $(CLASSDIR)$/$(PACKAGE)$/Factory_Test.class + -rm -f $@ + @echo RegistrationClassName: com.sun.star.lib.uno.helper.Factory_Test > $(OUT)$/bin$/manifest.mf + -jar cvfm $@ $(OUT)$/bin$/manifest.mf -C $(CLASSDIR) $(PACKAGE)$/Factory_Test.class + +run_factory_test : $(OUT)$/bin$/factory_test.jar + -$(GNUCOPY) $(SOLARBINDIR)$/udkapi.rdb $(OUT)$/bin$/factory_test.rdb + -java -classpath $(CPATH) com.sun.star.lib.uno.helper.Factory_Test $(OUT)$/bin$/factory_test.jar $(OUT)$/bin$/factory_test.rdb diff --git a/javaunohelper/util/delzip b/javaunohelper/util/delzip new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/javaunohelper/util/delzip diff --git a/javaunohelper/util/makefile.mk b/javaunohelper/util/makefile.mk new file mode 100644 index 000000000000..071d1f8a2ef0 --- /dev/null +++ b/javaunohelper/util/makefile.mk @@ -0,0 +1,57 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.11 $ +# +# 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. +# +#************************************************************************* + +PRJ = .. +PRJNAME = juhelper +TARGET = juh + +.INCLUDE : settings.mk +.INCLUDE: settings.pmk + +JARCLASSDIRS = com +JARTARGET = $(TARGET).jar +JARCOMPRESS = TRUE +JARCLASSPATH = $(JARFILES) ../../lib/ ../bin/ +CUSTOMMANIFESTFILE = manifest + +# Special work necessary for building java reference with javadoc. +# The source of puplic APIs must be delivered and used later in the +# odk module. +ZIP1TARGET=$(TARGET)_src +ZIP1FLAGS=-u -r +ZIP1DIR=$(PRJ) +ZIP1LIST=com -x "*makefile.mk" + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + + diff --git a/javaunohelper/util/manifest b/javaunohelper/util/manifest new file mode 100644 index 000000000000..2620d3330912 --- /dev/null +++ b/javaunohelper/util/manifest @@ -0,0 +1,3 @@ +Sealed: true +RegistrationClassName: com.sun.star.comp.JavaUNOHelperServices +UNO-Type-Path: diff --git a/javaunohelper/util/settings.pmk b/javaunohelper/util/settings.pmk new file mode 100644 index 000000000000..4bf153626453 --- /dev/null +++ b/javaunohelper/util/settings.pmk @@ -0,0 +1,32 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: settings.pmk,v $ +# +# $Revision: 1.4 $ +# +# 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. +# +#************************************************************************* + +JARFILES = ridl.jar jurt.jar |