On Tue, May 7, 2013 at 1:15 PM, Andi Vajda <va...@apache.org> wrote:

>
> On May 7, 2013, at 9:03, Barry Wark <ba...@physion.us> wrote:
>
> > Andi, thank you for the great info!
> >
> >
> > On Tue, May 7, 2013 at 11:58 AM, Andi Vajda <va...@apache.org> wrote:
> >
> >>
> >> On Tue, 7 May 2013, Barry Wark wrote:
> >>
> >> I recently discovered JCC (awesome project!) and am attempting to use it
> >>> to
> >>> wrap a Java API for Python users. It's been working great, with two
> >>> exceptions. I'd be grateful for any advice on the following:
> >>>
> >>> 1) Public methods from implemented interfaces are not wrapped
> >>>
> >>> We have where (public) methods of interfaces are not wrapped. Here's a
> toy
> >>> example:
> >>>
> >>> package us.physion.mixin;
> >>> public interface MixinA {
> >>> void mixinMethodA(String);
> >>> }
> >>>
> >>> public interface MixinB {
> >>> void mixinMethodB(String);
> >>> }
> >>>
> >>>
> >>> package us.physion.domain;
> >>> public interface Entity extends us.physion.mixin.MixinA,
> >>> us.physion.mixin.MixinB
> >>> {
> >>> void entityMethod();
> >>> }
> >>>
> >>> public interface MyClass extends Entity
> >>>
> >>> package us.physion.domain.impl;
> >>> public class EnityBase implements us.physion.domain.Entity {
> >>> }
> >>>
> >>> public class MyClass extends EntityBase implements
> >>> us.physion.domain.MyClass {
> >>> }
> >>>
> >>> MyClass is wrapped correctly, and exposes entityMethod. However, the
> >>> mixinMethodA and mixinMethodB aren't exposed. We get an AttributeError
> >>> when
> >>> calling mixinMethodA on a MyClass instance:
> >>>
> >>> In [10]: myInstance = MyClass()
> >>> In [11]: myInstance.mixinMethodA()
> >>> ------------------------------**------------------------------**
> >>> ---------------
> >>> AttributeError                            Traceback (most recent call
> >>> last)
> >>> <ipython-input-10-**51f1cf2e8c2d> in <module>()
> >>> ----> 1 myInstance.mixinMethodA('foo')
> >>>
> >>> AttributeError: 'MyClass' object has no attribute 'mixinMethodA'
> >>>
> >>> The issue may or may not be related to the second issue of name
> >>> collisions.
> >>
> >> You can access these mixin methods by casting to the owning interface:
> >>
> >>  MixinA.cast_(myInstance).**mixinMethodA('foo')
> >>
> >> The cast_() here function rewraps your Java object with a wrapper for
> the
> >> MixinA interface (also checking that the Java instance can be cast to
> it).
> >
> >
> > Yup, that works! Is there any way to get the "uber" wrapper so that, at
> the
> > interactive prompt, a user can call any of the methods in MyClass, MixinA
> > and MixinB?
>
> I think I didn't implement that because I didn't know how conflicting
> method names would be resolved. Synchronizing multiple inheritance logic
> between Java, C++ and Python looked a little daunting.
>

Hmm, from the Java side, isn't there only one method implementation with a
given name? Java's single inheritance + interfaces (i.e. pure abstract
classes) allows only one implementation; unlike C#, there would be no way
to distinguish between different interfaces' implementations in a single
class. So would multiple inheritance really be an issue? It would make a
*huge* difference to us to be able to provide a single wrapper that exposes
all of the classes' methods, whether declared directly or by an implemented
interface.

Thanks!

Barry


>
> Andi..
>
> >
> > Thanks,
> > Barry
> >
> >
> >>
> >>
> >> Note that we have an interface us.physion.domain.MyClass, and the
> >>> implementation us.physion.domain.impl.**MyClass. JCC 2.15 sees these
> as a
> >>> name conflict, so we have
> >>>
> >>> --rename us.physion.domain.impl.**MyClass=us_physion_domain_**
> >>> impl_MyClass
> >>>
> >>> in our wrapper invocation.
> >>>
> >>> Can anyone guide me in the right direction?
> >>>
> >>> 2) Name collisions across packages
> >>>
> >>> The same example above shows a name collision
> >>> between us.physion.domain.impl.MyClass and us.physion.domain.MyClass.
> >>> We're
> >>> using
> >>>
> >>> --rename us.physion.domain.impl.**MyClass=us_physion_domain_**
> >>> impl_MyClass
> >>>
> >>> in our wrapper invocation, but --rename is not well documented on the
> JCC
> >>> web site, so i'm not positive we're using it correctly. I saw a post
> from
> >>> Aug 29 to this list that says JCC 2.16 models the entire package
> >>> structure,
> >>> avoiding these name collisions, but when running JCC from SVN trunk
> this
> >>> doesn't appear to be the case (we still get the name collision without
> the
> >>> --rename).
> >>>
> >>> Are we using --rename correctly?
> >>
> >> Looks correct to me but you should use JCC 2.16 instead and use its
> >> --use_full_names command line flag instead so that the full package
> >> hierarchy is reproduced as Python modules. JCC 2.16 is available from
> trunk
> >> and its release is imminent (PyLucene 4.3.0 rc1 is up for release vote).
> >>
> >> When using --use_full_names, you must first import your main Python
> >> extension - which causes the java packages to be installed - then the
> java
> >> hierarchy packages. For PyLucene, the main extension is called 'lucene',
> >> for example:
> >>
> >>>>> from lucene import initVM
> >>>>> from org.apache.lucene.document import Document
> >>>>> etc....
> >>
> >>>>> initVM()
> >>>>> d = Document()
> >>
> >> Andi..
> >>
> >>
> >>> Thank you,
> >>> Barry
> >>>
> >>>
>

Reply via email to