JavaProxy should be an interface to make Java integration easier
----------------------------------------------------------------

                 Key: JRUBY-4314
                 URL: http://jira.codehaus.org/browse/JRUBY-4314
             Project: JRuby
          Issue Type: Improvement
          Components: Java Integration
    Affects Versions: JRuby 1.5
            Reporter: Yoko Harada
         Attachments: ji_improvement.patch, ji_improvement.zip

This is a proposal of Java integration improvement. The purpose of this 
proposal is to make the implementation of Java proxy objects much easier.

Currently, most instances passed from Java to Ruby are just Java objects in 
Ruby program and don't have Ruby methods such as "each." For example, when 
people put a HashMap type object in a method argument to invoke Ruby method, 
the object is still a Java object in Ruby code, not a RubyHash object. This is 
a filed issue, JRUBY-4223.

The answer to solve the issue is to write a proxy class of 
org.jruby.java.proxies packages. For example, MapJavaProxy class is. However, 
it is not easy and not efficient because of the class inheritance design. When 
we look at current hierarchy of ArrayJavaProxy, it is:

  RubyBasicObject <- RubyObject <- JavaProxy <- ArrayJavaProxy

ArrayJavaProxy doesn't have RubyArray in its ancestors.  Thus, ArrayJavaProxy 
needs to implement Ruby's Array methods by itself. Redefining all Ruby methods 
in the proxy class is not easy. Also, it is weird since multiple kinds of 
implementation of one Ruby method will be scattered around.  If we can reuse 
RubyHash, RubyArray or other matured classes for proxies, we can wrap Java 
object up more easily.

The reason that ArrayJavaProxy couldn't inherit RubyArray is probably JavaProxy 
is a concrete class. My proposal is to change JavaProxy to an interface. Then, 
in my implementation, instance methods are in JavaProxyProvier, and class 
methods are in JavaProxyProviderUtils since static methods can't be defined in 
the interface and implemented directly. Although the patch includes changes of 
JavaProxy, I attached complete code of these three to clarify what I did. (see 
the zipped files)

If JavaProxy is the interface, new proxies will be:

  public class MapJavaProxy extends RubyHash implements JavaProxy {}
  public class ListJavaProxy extends RubyArray implements JavaProxy {}
  .....

I attached MapJavaProxy in the zip file to show how it was implemented. The 
class is a mock based on ArrayJavaProxy, but perhaps is enough to show what the 
implementation will be.

The influence to other classes seems not to be so big. Attached patch includes 
whole change along with the new design of JavaProxy. After I made this change, 
JRuby was compiled successfully and worked as was before though I might have 
needed to test more and various cases.

To make Java integration easier, I'd like to submit this idea.


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to