Use a new-style singelton (aka interface-based singleton) instead!
(Look up those terms in the DevGuide if you are not familiar with them.)

foo/XSentence.idl:
---8<---
module foo {
 interface XSentence {
   void reverse();
   void getInput;
 };
};
---8<---

foo/theSentence.idl:
---8<---
module foo {
 interface XSentence;
 singleton theSentence: XSentence;
};
---8<---

Java:
---8<---
foo.XSentence sentence = foo.theSentence.get(xContext);
---8<---

I have attached my 2 idl files and 1 java file. I edited them according to
your direction to support singleton. I get the following errors:

/usr/lib/openoffice/sdk/linux/bin/idlc.bin: compile 'theSentence.idl' ...
/home/tfm/ooo/myAddon/theSentence.idl(15) : Malformed interface declaration:
syntax error, unexpected IDL_SCOPESEPARATOR, expecting ';'
/home/tfm/ooo/myAddon/theSentence.idl(18) : Statement can not be parsed:
interface definition
/home/tfm/ooo/myAddon/theSentence.idl(21) : Illegal syntax following module
export(s): syntax error, unexpected $end, expecting '}'

SentenceProtocolHandler.java:129: cannot find symbol
symbol  : variable theSentence
location: class com.sun.star.ex.comp.SentenceProtocolHandler.OwnDispatch
                   XSentence sentence = theSentence.get(xContext);


Please correct me where I'm wrong.
Thanks

On 11/15/06, Stephan Bergmann <[EMAIL PROTECTED]> wrote:

Use a new-style singelton (aka interface-based singleton) instead!
(Look up those terms in the DevGuide if you are not familiar with them.)

foo/XSentence.idl:
---8<---
module foo {
   interface XSentence {
     void reverse();
     void getInput;
   };
};
---8<---

foo/theSentence.idl:
---8<---
module foo {
   interface XSentence;
   singleton theSentence: XSentence;
};
---8<---

Java:
---8<---
foo.XSentence sentence = foo.theSentence.get(xContext);
---8<---

-Stephan

Tabish F. Mufti wrote:
> I have Sentence.idl:
>
> module com {  module sun {  module star {  module ex {  module comp {
> service Sentence
> {
>    interface com::sun::star::ex::comp::XSentence;
> };
> singleton theSentence
> {
>  service com::sun::star::ex::comp::Sentence;
> };
> }; }; }; }; };
>
> and XSentence.idl:
>
> module com {  module sun {  module star {  module ex {  module comp {
> interface XSentence: com::sun::star::uno::XInterface
> {
>    void reverse();
>    void getInput();
> };
> }; }; }; }; };
>
> I have a class Sentence.java which provides the service Sentence:
> static final String SERVICENAME = "com.sun.star.ex.comp.Sentence";
>
>
> I want to know how do I create a Singleton service given the above
> context ?
> The code which I'm using to create the service Sentence is the
following:
>
> XMultiComponentFactory factory = xContext.getServiceManager();
> Object transObj = factory.createInstanceWithContext("
> com.sun.star.ex.comp.Sentence", xContext);
> XSentence sentence = (XSentence)UnoRuntime.queryInterface(
XSentence.class,
> transObj);
>
> But this does not returns me Sentence as Singleton class infact
everytime a
> new instance of the class Sentence is returned.

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


#ifndef __com_sun_star_ex_comp_Sentence_idl__
#define __com_sun_star_ex_comp_Sentence_idl__


// Avoid redefinition of already included types or interface, for instance,
// the following case, com/sun/star/foo/Bar.idl have XSentence interface
// definition.

#ifndef __com_sun_star_foo_Bar_idl__
#include "XSentence.idl" 
#endif

module com {  module sun {  module star {  module ex {  module comp {

interface com::sun::star::ex::comp::XSentence; 
singleton theSentence:XSentence

}; }; }; }; };
 
#endif
#ifndef __com_sun_star_ex_comp_XSentence_idl__ 
#define __com_sun_star_ex_comp_XSentence_idl__
 
#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif

module com {  module sun {  module star {  module ex {  module comp {
interface XSentence: com::sun::star::uno::XInterface
{ 
	/** return translated string for source string
	@param source
	source text
	*/
	void reverse();
	void getInput();
};
}; }; }; }; };
 
#endif
/*
 *  SentenceProtocolHandler.java
 *
 *  Protocol Handler
 *
 *  $Id: SentenceProtocolHandler.java,v 1.1.1.1 2005/11/04 05:57:10 toshi Exp $
 */

/*************************************************************************
 *
 *  The Contents of this file are made available subject to the terms of
 *  the BSD license.
 *  
 *  Copyright (c) 2004-2005 SAITOU Toshihide <[EMAIL PROTECTED]>
 *  All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions
 *  are met:
 *  1. Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *  2. Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *  3. The name of the author may be used to endorse or promote products
 *     derived from this software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY SAITOU Toshihide AND CONTRIBUTORS "AS IS"
 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 *  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 *  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL SAITOU Toshihide OR
 *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *     
 *************************************************************************/

// Integrate Components into OpenOffice.org
//
// To call from OpenOffice.org user interface, it must be able to take
// part in the communication between the UI layer and the application
// objects.  OpenOffice.org uses command URLs for this purpose.
//  ...
// From version 1.1, OpenOffice.org provides user interface support
// for custom components by two basic mechanisms:
// (Developer's Guide June 2003,  Sun Microsystems, Inc, pp. 230.)
// 
// 1. Add components that can be enabled to process command URLs
//    (a) make a protocol handler for them(command URLs)
//    (b) integrate them into the job execution environment
//
// 2. The user interface can be adjust to new components.
//    In short replacement.  This also means, it is possible to
//    disable existing command.  This dose not need a additional
//    components differ from the 1.
// 
// * This example is 1. (a).

package com.sun.star.ex.comp;
// For the above this component implements as inner class with
// Sentence component.  Look the work directory and the Sentence.java.

import com.sun.star.ex.comp.XSentence;

import com.sun.star.beans.PropertyValue;
import com.sun.star.container.XIndexAccess;
import com.sun.star.frame.DispatchDescriptor;
import com.sun.star.frame.XDispatch;
import com.sun.star.frame.XDispatchProvider;
import com.sun.star.frame.XFrame;
import com.sun.star.frame.XModel;
import com.sun.star.frame.XStatusListener;
import com.sun.star.lang.XInitialization;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.lib.uno.helper.ComponentBase;
import com.sun.star.text.XTextRange;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.util.URL;


/** SentenceProtocolHandler service implementation */

public class SentenceProtocolHandler
    extends ComponentBase
    implements XServiceInfo,
               XDispatchProvider,
               XInitialization
{

    /** points to the component context in which this handler object creates,
        is set in SentenceProtocolHandler(). constructor
    */
    private XComponentContext xContext;

    /** points to the frame context in which this handler runs, is set in
        initialize()
    */
    private XFrame xFrame;


    /** Dispatch object as inner class */
    class OwnDispatch implements XDispatch {

        /** take over all necessary parameters from outside. */
	public OwnDispatch(XComponentContext context, XFrame frame) {
            xContext = context;
            xFrame = frame;
	}

	/** execute the functionality, which is described by this URL. */
	public void dispatch(URL aURL, PropertyValue[] lArgs) 
	{
	    try 
		{

                // ------------------------------
                // creates an instance of the XSentence

		//XMultiComponentFactory factory = xContext.getServiceManager();
		//Object transObj = factory.createInstanceWithContext("/singletons/com.sun.star.ex.comp.theSentence", xContext);
		//XSentence sentence = (XSentence)UnoRuntime.queryInterface(XSentence.class, transObj);
		
		    XSentence sentence = theSentence.get(xContext);

		    System.out.println("In dispatch in ProtocolHandler: " + aURL.Protocol);

		    if (aURL.Protocol.equals("Reverse:"))
			{
			    //call reverse method of Sentence service
			    sentence.reverse();
			}
		    else if (aURL.Protocol.equals("myInput:"))
			{
			    //call getInput method of Sentence service
			    sentence.getInput();
			    
			}
		    else 
			{
			    //targetText = aURL.Main.toString();
			    aURL.Main.toString();
			}      
		} 
	    catch(Exception e) 
		{
		    e.printStackTrace();
		}
	}
	
        /** register a new listener and bind it toe given URL. */
     public void addStatusListener(XStatusListener l, URL url) 
	{}
	
        /** deregister a listener for this URL. */
        public void removeStatusListener(XStatusListener l, URL url) 
	{}

    }
    
    
    /** initialize a new instance of this class with default values. */
    public SentenceProtocolHandler( XComponentContext context ) 
    {
	xContext = context;
    }


    // ------------------------------------------------------------

    /** XInitialization implementation */

    public void initialize(Object[] object) throws com.sun.star.uno.Exception 
    {
	
        if (object.length > 0) 
	    {
		xFrame = (XFrame)UnoRuntime.queryInterface(XFrame.class, object[0]);
	    }
    }


    // ------------------------------------------------------------

    /** XDispatchProvider implementation */

    // should return a valid dispatch object for the given URL.
    // 
    // In case the URL is not valid an empty reference can be returned.  The
    // parameter sTarget and nFlags can be ignored. These will be "_self" and 0
    // everytime.
    // (Developer's Guide June 2003,  Sun Microsystems, Inc, pp. 236.)

    public XDispatch queryDispatch(com.sun.star.util.URL aURL, String sTarget, int nFlags )
    {
	System.out.println("In queryDispatch in ProtocolHandler: " + aURL.Protocol);
	
	if (aURL.Protocol.equals("Reverse:")) 
	    {
		return new OwnDispatch( xContext, xFrame );
	    }
	if (aURL.Protocol.equals("myInput:")) 
	    {
		return new OwnDispatch( xContext, xFrame );
	    }
	return null;
    }

    // optimized API call for remote.
    // 
    // It should be forwarded to queryDispatch() for every request item of the
    // given DispatchDescriptor list.
    // 
    // But note: it is not allowed to pack the return list of dispatch objects.
    // Every request in source list must match to a reference (null or valid) in
    // the destination list!
    // (Developer's Guide June 2003,  Sun Microsystems, Inc, pp. 236.)

    public XDispatch[] queryDispatches(DispatchDescriptor[] descs)
    {
	XDispatch[] lDispatcher = new XDispatch[descs.length];
	
	System.out.println("In queryDispatches in ProtocolHandler descs length: " + descs.length);
	
	for(int i = 0; i < descs.length; ++i ) {
	    lDispatcher[i] = queryDispatch(descs[i].FeatureURL,
					   descs[i].FrameName,
					   descs[i].SearchFlags );
	}
	
	return lDispatcher;           
    }


    // ------------------------------------------------------------

    /** XServiceInfo implementation */

    static final String SERVICENAME = "com.sun.star.frame.ProtocolHandler";

    public String getImplementationName() {
	return getClass().getName();
    }

    public boolean supportsService(String serviceName) {
	if (serviceName.equals(SERVICENAME))
	    return true;
	return false;
    }

    public String[] getSupportedServiceNames() {
	return new String[] {
	    SERVICENAME
	};
    }

}

// End of file.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to