InterfaceJavaProxy.java

  1. /*
  2.  * To change this template, choose Tools | Templates
  3.  * and open the template in the editor.
  4.  */

  5. package org.jruby.java.proxies;

  6. import org.jruby.Ruby;
  7. import org.jruby.RubyClass;
  8. import org.jruby.RubyProc;
  9. import org.jruby.anno.JRubyMethod;
  10. import org.jruby.javasupport.JavaClass;
  11. import org.jruby.runtime.Block;
  12. import org.jruby.runtime.ObjectAllocator;
  13. import org.jruby.runtime.ThreadContext;
  14. import org.jruby.runtime.Visibility;
  15. import org.jruby.runtime.builtin.IRubyObject;

  16. /**
  17.  *
  18.  * @author headius
  19.  */
  20. public class InterfaceJavaProxy extends JavaProxy {
  21.     public InterfaceJavaProxy(Ruby runtime, RubyClass klazz) {
  22.         super(runtime, klazz);
  23.     }

  24.     public static RubyClass createInterfaceJavaProxy(ThreadContext context) {
  25.         Ruby runtime = context.runtime;
  26.        
  27.         RubyClass ifcJavaProxy = runtime.defineClass(
  28.                 "InterfaceJavaProxy",
  29.                 runtime.getJavaSupport().getJavaProxyClass(), new ObjectAllocator() {
  30.             public IRubyObject allocate(Ruby runtime, RubyClass klazz) {
  31.                 return new InterfaceJavaProxy(runtime, klazz);
  32.             }
  33.         });

  34.         RubyClass javaIfcExtender = runtime.defineClass(
  35.                 "JavaInterfaceExtender", runtime.getObject(), runtime.getObject().getAllocator());
  36.         javaIfcExtender.defineAnnotatedMethods(JavaInterfaceExtender.class);

  37.         return ifcJavaProxy;
  38.     }

  39.     public static class JavaInterfaceExtender {
  40.         @JRubyMethod(visibility = Visibility.PRIVATE)
  41.         public static IRubyObject initialize(ThreadContext context, IRubyObject self, IRubyObject javaClassName, Block block) {
  42.             Ruby runtime = context.runtime;
  43.            
  44.             self.getInstanceVariables().setInstanceVariable("@java_class", JavaClass.forNameVerbose(runtime, javaClassName.asJavaString()));
  45.             self.getInstanceVariables().setInstanceVariable("@block", RubyProc.newProc(runtime, block, block.type));

  46.             return runtime.getNil();
  47.         }

  48.         @JRubyMethod
  49.         public static IRubyObject extend_proxy(ThreadContext context, IRubyObject self, IRubyObject proxyClass) {
  50.             return proxyClass.callMethod(context, "class_eval", IRubyObject.NULL_ARRAY,
  51.                     ((RubyProc)self.getInstanceVariables().getInstanceVariable("@block")).getBlock());
  52.         }
  53.     }
  54. }