Forum at OOoForum.orgThe Forum
 [Home]   [FAQ]   [Search]   [Memberlist]   [Usergroups]   [Register
 [Profile]   [Log in to check your private messages]   [Log in

(Jython) using MRI with Hanya-Wrapped objects

Post new topic   Reply to topic Forum Index -> Code Snippets
View previous topic :: View next topic  
Author Message
Power User
Power User

Joined: 06 Nov 2010
Posts: 74

PostPosted: Fri Aug 19, 2011 5:39 am    Post subject: (Jython) using MRI with Hanya-Wrapped objects Reply with quote

There's a brilliant chap called Hanya who has written a way of Jython users of OOo (of whom there may well only be 2, him and me) being able to avoid endlessly fetching XInterfaces from the Uno runtime, as in Java, instead of the automatic reflection of Python. Details of his Wrapper can be found here:

But this then leads to a problem when you want to use MRI (written incidentally by Hanya!) which, because Jython is written in Java, expects to receive XInterfaces to introspect, and also an XComponentContext.

So my little contribution overcomes this by allowing you to submit either an object exporting XInterface(s) for the object for introspection, or a Wrapper wrapping one, and also either an XComponentContext, or a Wrapper wrapping one, as param 2. It's child's play really but for those discovering the raw power of Jython-OOo-Hanya Wrapper will hopefully be useful.

NB getUnoInterface() and isUnoInterfaceInstanceOf() might be used by production code, but inspect() will only be used during development - this consideration has determined my use of assert and __debug__

def getUnoInterface( unoInterface, object ):
    if __debug__:
        checkNotNull( ( unoInterface, object ) )
        _checkClassAndPackage( unoInterface )
    returnedObject = unoInterface, object )
    assert returnedObject != None, \
        "could not get interface " + unoInterface.getSimpleName() + " for object of class " \
        + object.getClass().getSimpleName()
    return returnedObject

def _checkClassAndPackage( unoInterface ):
    interfaceSimpleName = unoInterface.getSimpleName()
    packageName = unoInterface.getPackage().getName()
    assert packageName.startswith(""), "not a UNO module: " + packageName
    assert interfaceSimpleName.startswith("X"), "not a UNO interface: " + interfaceSimpleName + " (must begin with \"X\")"

def isUnoInterfaceInstanceOf( unoInterface, object ):
    if __debug__:
        checkNotNull( (unoInterface, object ))
        _checkClassAndPackage( unoInterface )
    return unoInterface, object) != None

# NB this method will only be used during development: hence the lack of "__debug__" check
# and the liberal use of assert
def inspect( object, compContext ):
    checkNotNull( ( object, compContext ))
    import UnoWrapper
    if isinstance ( compContext, UnoWrapper.Wrapper ):
        unoObject = UnoWrapper.Wrapper.getUnoObject( compContext )
        assert isUnoInterfaceInstanceOf(, unoObject ), \
            "Wrapper compContext's Uno object does not export XComponentContext"
        compContext = getUnoInterface(, unoObject )
        assert isUnoInterfaceInstanceOf(, compContext ), \
            "compContext param does not export XComponentContext and is not Wrapper"

    if isinstance ( object, UnoWrapper.Wrapper ):
        object = UnoWrapper.Wrapper.getUnoObject( object )

    # NB at this point the compContext is a real XComponentContext object, not wrapped and
    # the object is an unwrapped object which is hopefully a UNO object
    oMri = compContext.getServiceManager().createInstanceWithContext( "mytools.Mri", compContext )
    getUnoInterface( star.beans.XIntrospection, oMri ).inspect(object)
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic Forum Index -> Code Snippets All times are GMT - 8 Hours
Page 1 of 1

Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum

Powered by phpBB © 2001, 2005 phpBB Group