Title: [waffle-scm] [83] trunk: Ruby Aware CA loads ruby scripts from the class loader.

Diff

Modified: trunk/core/core.iml (82 => 83)

--- trunk/core/core.iml	2007-05-24 15:28:16 UTC (rev 82)
+++ trunk/core/core.iml	2007-05-24 19:25:52 UTC (rev 83)
@@ -8,6 +8,7 @@
     <content url=""
       <sourceFolder url="" isTestSource="false" />
       <sourceFolder url="" isTestSource="false" />
+      <sourceFolder url="" isTestSource="false" />
       <sourceFolder url="" isTestSource="true" />
       <sourceFolder url="" isTestSource="true" />
       <excludeFolder url="" />
@@ -137,6 +138,17 @@
           <root url="" />
         </CLASSES>
         <JAVADOC />
+        <SOURCES>
+          <root url="" />
+        </SOURCES>
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="" />
+        </CLASSES>
+        <JAVADOC />
         <SOURCES />
       </library>
     </orderEntry>

Modified: trunk/core/pom.xml (82 => 83)

--- trunk/core/pom.xml	2007-05-24 15:28:16 UTC (rev 82)
+++ trunk/core/pom.xml	2007-05-24 19:25:52 UTC (rev 83)
@@ -46,6 +46,14 @@
   </dependencies>
 
   <build>
+    <resources>
+      <resource>
+        <directory>src/main/ruby</directory>
+        <includes>
+          <include>**/*.rb</include>
+        </includes>
+      </resource>
+    </resources>
     <plugins>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>

Modified: trunk/core/src/main/java/org/codehaus/waffle/bind/RubyDataBinder.java (82 => 83)

--- trunk/core/src/main/java/org/codehaus/waffle/bind/RubyDataBinder.java	2007-05-24 15:28:16 UTC (rev 82)
+++ trunk/core/src/main/java/org/codehaus/waffle/bind/RubyDataBinder.java	2007-05-24 19:25:52 UTC (rev 83)
@@ -1,7 +1,10 @@
 package org.codehaus.waffle.bind;
 
 import ognl.TypeConverter;
+import org.codehaus.waffle.controller.RubyController;
 import org.codehaus.waffle.validation.ErrorsContext;
+import org.jruby.Ruby;
+import org.jruby.javasupport.JavaEmbedUtils;
 import org.jruby.runtime.builtin.IRubyObject;
 
 import javax.servlet.http.HttpServletRequest;
@@ -13,11 +16,17 @@
         super(typeConverter, bindErrorMessageResolver);
     }
 
-    public void bind(HttpServletRequest request, ErrorsContext errorsContext, Object model) {
-        if(model instanceof IRubyObject) {
-            // does nothing for the moment
+    public void bind(HttpServletRequest request, ErrorsContext errorsContext, Object controller) {
+        if(controller instanceof RubyController) {
+            IRubyObject rubyObject = ((RubyController)controller).getRubyObject();
+            Ruby runtime = rubyObject.getRuntime();
+
+            // set request on the controller
+            JavaEmbedUtils.invokeMethod(runtime, rubyObject, "request=", new HttpServletRequest[] {request}, Object.class);
+            
         } else {
-            super.bind(request, errorsContext, model);
+            // default to standard binding
+            super.bind(request, errorsContext, controller);
         }
     }
 }

Modified: trunk/core/src/main/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactory.java (82 => 83)

--- trunk/core/src/main/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactory.java	2007-05-24 15:28:16 UTC (rev 82)
+++ trunk/core/src/main/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactory.java	2007-05-24 19:25:52 UTC (rev 83)
@@ -1,10 +1,16 @@
 package org.codehaus.waffle.context.pico;
 
+import org.codehaus.waffle.WaffleException;
+import org.codehaus.waffle.context.ContextContainer;
 import org.codehaus.waffle.i18n.MessageResources;
-import org.codehaus.waffle.context.ContextContainer;
+import org.jruby.Ruby;
 import org.picocontainer.MutablePicoContainer;
-import org.jruby.Ruby;
 
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
 public class RubyAwarePicoContextContainerFactory extends PicoContextContainerFactory {
 
     public RubyAwarePicoContextContainerFactory(MessageResources messageResources) {
@@ -16,23 +22,43 @@
 
         Ruby runtime = Ruby.getDefaultInstance();
 
-        // TODO Ruby ... this needs to be moved to an actual Ruby file and loaded from clas loader
-        String script =
-            "def String.camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true)\n" +
-            "  if first_letter_in_uppercase\n" +
-            "    lower_case_and_underscored_word.to_s.gsub(/\\/(.?)/) { \"::\" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }\n" +
-            "  else\n" +
-            "    lower_case_and_underscored_word.first + camelize(lower_case_and_underscored_word)[1..-1]\n" +
-            "  end\n" +
-            "end";
+        loadRubyScriptFromClassLoader("string.rb", runtime);
+        loadRubyScriptFromClassLoader("waffle.rb", runtime);
 
-        runtime.evalScript(script); // load waffle extensions to Ruby language
-
         // Register RubyRuntime at Application level
         MutablePicoContainer picoContainer = (MutablePicoContainer) contextContainer.getDelegate();
         picoContainer.registerComponentInstance(Ruby.class, runtime);
 
         return contextContainer;
     }
-    
+
+    private void loadRubyScriptFromClassLoader(String fileName, Ruby runtime) {
+        BufferedReader bufferedReader = null;
+        InputStream inputStream = null;
+
+        try {
+            inputStream = this.getClass().getClassLoader().getResourceAsStream(fileName);
+            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
+            StringBuilder script = new StringBuilder();
+            String line = bufferedReader.readLine();
+
+            while (line != null) {
+                script.append(line).append("\n");
+                line = bufferedReader.readLine();
+            }
+
+            runtime.evalScript(script.toString());
+        } catch (IOException e) {
+            throw new WaffleException(e);
+        } finally {
+            try {
+                if(inputStream != null) inputStream.close();
+                if(bufferedReader != null) bufferedReader.close();
+            } catch (IOException ignore) {
+                // ignore
+            }
+        }
+
+    }
+
 }

Modified: trunk/core/src/main/java/org/codehaus/waffle/controller/RubyController.java (82 => 83)

--- trunk/core/src/main/java/org/codehaus/waffle/controller/RubyController.java	2007-05-24 15:28:16 UTC (rev 82)
+++ trunk/core/src/main/java/org/codehaus/waffle/controller/RubyController.java	2007-05-24 19:25:52 UTC (rev 83)
@@ -1,7 +1,8 @@
 package org.codehaus.waffle.controller;
 
+import org.jruby.Ruby;
+import org.jruby.javasupport.JavaUtil;
 import org.jruby.runtime.builtin.IRubyObject;
-import org.jruby.javasupport.JavaUtil;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -10,8 +11,8 @@
  * This is a wrapper for the underlying ruby script
  */
 public class RubyController {
+    private String methodName;
     private final IRubyObject rubyObject;
-    private String methodName;
 
     public RubyController(IRubyObject rubyObject) {
         this.rubyObject = rubyObject;
@@ -21,8 +22,13 @@
         this.methodName = methodName;
     }
 
+    public IRubyObject getRubyObject() {
+        return rubyObject;
+    }
+
     public Object execute(HttpServletRequest request, HttpServletResponse response) {
-        IRubyObject result = rubyObject.callMethod(rubyObject.getRuntime().getCurrentContext(), methodName);
+        Ruby runtime = rubyObject.getRuntime();
+        IRubyObject result = rubyObject.callMethod(runtime.getCurrentContext(), methodName);
 
         return JavaUtil.convertRubyToJava(result);
     }

Modified: trunk/core/src/main/java/org/codehaus/waffle/controller/RubyControllerDefinitionFactory.java (82 => 83)

--- trunk/core/src/main/java/org/codehaus/waffle/controller/RubyControllerDefinitionFactory.java	2007-05-24 15:28:16 UTC (rev 82)
+++ trunk/core/src/main/java/org/codehaus/waffle/controller/RubyControllerDefinitionFactory.java	2007-05-24 19:25:52 UTC (rev 83)
@@ -56,4 +56,5 @@
         }
         return super.findMethodDefinition(controller, request, response);
     }
+    
 }

Modified: trunk/core/src/main/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapter.java (82 => 83)

--- trunk/core/src/main/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapter.java	2007-05-24 15:28:16 UTC (rev 82)
+++ trunk/core/src/main/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapter.java	2007-05-24 19:25:52 UTC (rev 83)
@@ -1,12 +1,12 @@
 package org.codehaus.waffle.registrar.pico;
 
-import org.picocontainer.PicoVisitor;
+import org.jruby.Ruby;
+import org.jruby.runtime.builtin.IRubyObject;
 import org.picocontainer.ComponentAdapter;
 import org.picocontainer.PicoContainer;
+import org.picocontainer.PicoInitializationException;
 import org.picocontainer.PicoIntrospectionException;
-import org.picocontainer.PicoInitializationException;
-import org.jruby.Ruby;
-import org.jruby.runtime.builtin.IRubyObject;
+import org.picocontainer.PicoVisitor;
 
 public class RubyScriptComponentAdapter implements ComponentAdapter {
     private Object componentKey;
@@ -29,9 +29,10 @@
         Ruby runtime = (Ruby) picoContainer.getComponentInstance(Ruby.class);
         runtime.evalScript(rubyScript);
 
-        // TODO RUBY: mixin custom module!
-
-        return runtime.evalScript("eval(\"#{String.camelize('" + componentKey + "')}.new\")");
+        String script =
+                "controller = eval(\"#{String.camelize('" + componentKey + "')}.new\")\n" + // instantiate controller
+                "controller.extend(Waffle::Controller)"; // mixin Waffle module
+        return runtime.evalScript(script);
     }
 
     public void verify(PicoContainer picoContainer) throws PicoIntrospectionException {

Added: trunk/core/src/main/ruby/string.rb (0 => 83)

--- trunk/core/src/main/ruby/string.rb	                        (rev 0)
+++ trunk/core/src/main/ruby/string.rb	2007-05-24 19:25:52 UTC (rev 83)
@@ -0,0 +1,8 @@
+# Following was copied from RoR (Inflector module)...
+def String.camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true)
+  if first_letter_in_uppercase
+    lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
+  else
+    lower_case_and_underscored_word.first + camelize(lower_case_and_underscored_word)[1..-1]
+  end
+end
\ No newline at end of file

Added: trunk/core/src/main/ruby/waffle.rb (0 => 83)

--- trunk/core/src/main/ruby/waffle.rb	                        (rev 0)
+++ trunk/core/src/main/ruby/waffle.rb	2007-05-24 19:25:52 UTC (rev 83)
@@ -0,0 +1,22 @@
+module Waffle
+    module Controller
+
+        attr_accessor :request, :response, :session
+
+        # Still a work in progress
+        def __pico_container=(pico)
+            @@__pico_container = pico
+        end
+
+        def method_missing(symbol, *args)
+            if symbol.to_s =~ /^find_/
+                # Pico
+
+
+            end
+        end
+
+        
+
+    end
+end
\ No newline at end of file

Modified: trunk/core/src/test/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactoryTest.java (82 => 83)

--- trunk/core/src/test/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactoryTest.java	2007-05-24 15:28:16 UTC (rev 82)
+++ trunk/core/src/test/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactoryTest.java	2007-05-24 19:25:52 UTC (rev 83)
@@ -1,10 +1,12 @@
 package org.codehaus.waffle.context.pico;
 
+import org.codehaus.waffle.context.ContextContainer;
 import org.jmock.MockObjectTestCase;
-import org.codehaus.waffle.context.ContextContainer;
+import org.jruby.Ruby;
+import org.jruby.RubyBoolean;
+import org.jruby.javasupport.JavaEmbedUtils;
 import org.picocontainer.MutablePicoContainer;
 import org.picocontainer.PicoContainer;
-import org.jruby.Ruby;
 
 public class RubyAwarePicoContextContainerFactoryTest extends MockObjectTestCase {
 
@@ -12,7 +14,12 @@
         RubyAwarePicoContextContainerFactory factory = new RubyAwarePicoContextContainerFactory(null);
         ContextContainer contextContainer = factory.buildApplicationContextContainer();
         PicoContainer picoContainer = (MutablePicoContainer)contextContainer.getDelegate();
-        assertNotNull(picoContainer.getComponentInstance(Ruby.class));
+        Ruby runtime = (Ruby) picoContainer.getComponentInstance(Ruby.class);
+        assertNotNull(runtime);
+
+        // ensure mixin occurred
+        RubyBoolean rubyBoolean = (RubyBoolean) runtime.evalScript("String.respond_to? :camelize");
+        assertTrue((Boolean)JavaEmbedUtils.rubyToJava(runtime, rubyBoolean, Boolean.class));
     }
 
 }

Modified: trunk/core/src/test/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapterTest.java (82 => 83)

--- trunk/core/src/test/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapterTest.java	2007-05-24 15:28:16 UTC (rev 82)
+++ trunk/core/src/test/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapterTest.java	2007-05-24 19:25:52 UTC (rev 83)
@@ -21,6 +21,10 @@
         runtime.evalScript("$my_global = 'Waffle'\n");
 
         String script =
+                "module Waffle\n" +
+                "  module Controller\n" +
+                "  end\n" +
+                "end\n" +
                 "def String.camelize(param_1)\n" +
                 "  return 'FooBar'\n" + // fake out functionality
                 "end\n" +

Modified: trunk/examples/jruby-example/jruby-example.iml (82 => 83)

--- trunk/examples/jruby-example/jruby-example.iml	2007-05-24 15:28:16 UTC (rev 82)
+++ trunk/examples/jruby-example/jruby-example.iml	2007-05-24 19:25:52 UTC (rev 83)
@@ -10,6 +10,7 @@
     <output-test url="" />
     <content url=""
       <sourceFolder url="" isTestSource="false" />
+      <sourceFolder url="" isTestSource="false" />
       <sourceFolder url="" isTestSource="true" />
     </content>
     <orderEntry type="inheritedJdk" />
@@ -83,16 +84,6 @@
       <url>jar://$APPLICATION_HOME_DIR$/lib/j2ee.jar!/</url>
     </containerElement>
     <containerElement type="library" level="module">
-      <attribute name="method" value="0" />
-      <attribute name="URI" value="/WEB-INF/lib/asm-2.2.3.jar" />
-      <url>jar://$M2_REPOSITORY$/asm/asm/2.2.3/asm-2.2.3.jar!/</url>
-    </containerElement>
-    <containerElement type="library" level="module">
-      <attribute name="method" value="0" />
-      <attribute name="URI" value="/WEB-INF/lib/backport-util-concurrent-3.0.jar" />
-      <url>jar://$M2_REPOSITORY$/backport-util-concurrent/backport-util-concurrent/3.0/backport-util-concurrent-3.0.jar!/</url>
-    </containerElement>
-    <containerElement type="library" level="module">
       <attribute name="method" value="1" />
       <attribute name="URI" value="/WEB-INF/lib/paranamer-1.0-RC-3-SNAPSHOT.jar" />
       <url>jar://$M2_REPOSITORY$/com/thoughtworks/paranamer/paranamer/1.0-RC-3-SNAPSHOT/paranamer-1.0-RC-3-SNAPSHOT.jar!/</url>
@@ -138,11 +129,6 @@
       <url>jar://$M2_REPOSITORY$/org/jruby/jruby-complete/1.0RC2/jruby-complete-1.0RC2.jar!/</url>
     </containerElement>
     <containerElement type="library" level="module">
-      <attribute name="method" value="0" />
-      <attribute name="URI" value="/WEB-INF/lib/jruby-1.0RC2.jar" />
-      <url>jar://$M2_REPOSITORY$/org/jruby/jruby/1.0RC2/jruby-1.0RC2.jar!/</url>
-    </containerElement>
-    <containerElement type="library" level="module">
       <attribute name="method" value="1" />
       <attribute name="URI" value="/WEB-INF/lib/picocontainer-1.2.jar" />
       <url>jar://$M2_REPOSITORY$/org/picocontainer/picocontainer/1.2/picocontainer-1.2.jar!/</url>

Modified: trunk/examples/jruby-example/src/main/java/org/codehaus/waffle/example/jruby/JRubyRegistrar.java (82 => 83)

--- trunk/examples/jruby-example/src/main/java/org/codehaus/waffle/example/jruby/JRubyRegistrar.java	2007-05-24 15:28:16 UTC (rev 82)
+++ trunk/examples/jruby-example/src/main/java/org/codehaus/waffle/example/jruby/JRubyRegistrar.java	2007-05-24 19:25:52 UTC (rev 83)
@@ -21,14 +21,15 @@
 
         String script =
                 "class FooBar\n" +
+                //"  attr_accessor :request\n" +
                 "  def index\n" +
-                "    'HELLO WORLD from the index method'\n" +
+                "    \"HELLO WORLD from the index method #{request}\"\n" +
                 "  end\n" +
                 "  def bar\n" +
-                "    'HELLO WORLD'\n" +
+                "    \"HELLO WORLD #{request.local_name} #{request.local_port}\"\n" +
                 "  end\n" +
                 "end\n";
-        
+
         ComponentAdapter componentAdapter = new RubyScriptComponentAdapter("foo_bar", script);
         picoRegistrar.registerComponentAdapter(componentAdapter);
     }

Modified: trunk/waffle.ipr (82 => 83)

--- trunk/waffle.ipr	2007-05-24 15:28:16 UTC (rev 82)
+++ trunk/waffle.ipr	2007-05-24 19:25:52 UTC (rev 83)
@@ -35,6 +35,7 @@
       <entry name="?*.jpeg" />
       <entry name="?*.tld" />
       <entry name="?*.list" />
+      <entry name="*.rb" />
     </wildcardResourcePatterns>
   </component>
   <component name="DataSourceManager" />


To unsubscribe from this list please visit:

http://xircles.codehaus.org/manage_email

Reply via email to