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.

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