- Revision
- 447
- Author
- mward
- Date
- 2007-12-01 00:09:42 -0600 (Sat, 01 Dec 2007)
Log Message
fixed NPE issue when read property missing from controller (when binding property from controller to the request to simplify view development)
Modified Paths
- trunk/examples/simple-example/src/main/java/org/codehaus/waffle/example/simple/AutomobileController.java
- trunk/examples/simple-example/src/test/java/org/codehaus/waffle/example/simple/AutomobileControllerValidatorTest.java
- trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/IntrospectingRequestAttributeBinder.java
- trunk/waffle-core/src/test/java/org/codehaus/waffle/bind/IntrospectingRequestAttributeBinderTest.java
- trunk/waffle-core/src/test/java/org/codehaus/waffle/testmodel/StubMonitor.java
Diff
Modified: trunk/examples/simple-example/src/main/java/org/codehaus/waffle/example/simple/AutomobileController.java (446 => 447)
--- trunk/examples/simple-example/src/main/java/org/codehaus/waffle/example/simple/AutomobileController.java 2007-11-30 23:10:40 UTC (rev 446) +++ trunk/examples/simple-example/src/main/java/org/codehaus/waffle/example/simple/AutomobileController.java 2007-12-01 06:09:42 UTC (rev 447) @@ -1,8 +1,8 @@ package org.codehaus.waffle.example.simple; -import org.codehaus.waffle.i18n.MessagesContext; import org.codehaus.waffle.validation.ErrorsContext; import org.codehaus.waffle.validation.FieldErrorMessage; +import org.codehaus.waffle.i18n.MessagesContext; public class AutomobileController { private String make = "ford"; @@ -46,9 +46,8 @@ return topSpeed; } - public void setTopSpeed(int topSpeed, MessagesContext messagesContext) { + public void setTopSpeed(int topSpeed) { this.topSpeed = topSpeed; - messagesContext.addMessage("success", "Set top speed "+topSpeed); } public void accelerate(int value) { @@ -62,7 +61,8 @@ } } - public void stop() { + public void stop(MessagesContext messagesContext) { + messagesContext.addMessage("stop", "Stop called"); speed = 0; }
Modified: trunk/examples/simple-example/src/test/java/org/codehaus/waffle/example/simple/AutomobileControllerValidatorTest.java (446 => 447)
--- trunk/examples/simple-example/src/test/java/org/codehaus/waffle/example/simple/AutomobileControllerValidatorTest.java 2007-11-30 23:10:40 UTC (rev 446) +++ trunk/examples/simple-example/src/test/java/org/codehaus/waffle/example/simple/AutomobileControllerValidatorTest.java 2007-12-01 06:09:42 UTC (rev 447) @@ -1,9 +1,7 @@ package org.codehaus.waffle.example.simple; import org.codehaus.waffle.i18n.DefaultMessageResources; -import org.codehaus.waffle.i18n.DefaultMessagesContext; import org.codehaus.waffle.i18n.MessageResources; -import org.codehaus.waffle.i18n.MessagesContext; import org.codehaus.waffle.validation.DefaultErrorsContext; import org.codehaus.waffle.validation.ErrorMessage; import org.codehaus.waffle.validation.ErrorsContext; @@ -22,11 +20,8 @@ AutomobileController controller = new AutomobileController(); controller.setSpeed(50); - MessagesContext messagesContext = new DefaultMessagesContext(null); - controller.setTopSpeed(150, messagesContext); + controller.setTopSpeed(150); - assertEquals("Set top speed 150", messagesContext.getMessage("success")); - AutomobileControllerValidator validator = new AutomobileControllerValidator(controller, messageResources); ErrorsContext errorsContext = new DefaultErrorsContext(null); validator.accelerate(errorsContext, 15); @@ -40,7 +35,7 @@ AutomobileController controller = new AutomobileController(); controller.setSpeed(140); - controller.setTopSpeed(150, new DefaultMessagesContext(null)); + controller.setTopSpeed(150); AutomobileControllerValidator validator = new AutomobileControllerValidator(controller, messageResources); ErrorsContext errorsContext = new DefaultErrorsContext(null);
Modified: trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/IntrospectingRequestAttributeBinder.java (446 => 447)
--- trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/IntrospectingRequestAttributeBinder.java 2007-11-30 23:10:40 UTC (rev 446) +++ trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/IntrospectingRequestAttributeBinder.java 2007-12-01 06:09:42 UTC (rev 447) @@ -1,5 +1,12 @@ package org.codehaus.waffle.bind; +import org.codehaus.waffle.WaffleException; +import org.codehaus.waffle.controller.RubyController; +import org.codehaus.waffle.monitor.BindMonitor; +import org.jruby.javasupport.JavaEmbedUtils; +import org.jruby.runtime.builtin.IRubyObject; + +import javax.servlet.http.HttpServletRequest; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; @@ -9,14 +16,6 @@ import java.util.Map; import java.util.Set; -import javax.servlet.http.HttpServletRequest; - -import org.codehaus.waffle.WaffleException; -import org.codehaus.waffle.controller.RubyController; -import org.codehaus.waffle.monitor.BindMonitor; -import org.jruby.javasupport.JavaEmbedUtils; -import org.jruby.runtime.builtin.IRubyObject; - /** * This implementation can handle all standard Java objects and RubyControllers are handled specially (instance_variables) * @@ -43,8 +42,8 @@ for (PropertyDescriptor propertyDescriptor : propertyDescriptors) { Method readMethod = propertyDescriptor.getReadMethod(); - // skip getClass() method and any get/is methods that take arguments - if (readMethod.getParameterTypes().length == 0 && !readMethod.getName().equals("getClass")) { + + if(readMethod != null && readMethod.getParameterTypes().length == 0 && !readMethod.getName().equals("getClass")) { request.setAttribute(propertyDescriptor.getName(), readMethod.invoke(controller)); } }
Modified: trunk/waffle-core/src/test/java/org/codehaus/waffle/bind/IntrospectingRequestAttributeBinderTest.java (446 => 447)
--- trunk/waffle-core/src/test/java/org/codehaus/waffle/bind/IntrospectingRequestAttributeBinderTest.java 2007-11-30 23:10:40 UTC (rev 446) +++ trunk/waffle-core/src/test/java/org/codehaus/waffle/bind/IntrospectingRequestAttributeBinderTest.java 2007-12-01 06:09:42 UTC (rev 447) @@ -1,7 +1,5 @@ package org.codehaus.waffle.bind; -import javax.servlet.http.HttpServletRequest; - import org.codehaus.waffle.controller.RubyController; import org.codehaus.waffle.monitor.SilentMonitor; import org.jmock.Expectations; @@ -12,6 +10,8 @@ import org.junit.Test; import org.junit.runner.RunWith; +import javax.servlet.http.HttpServletRequest; + @RunWith(JMock.class) public class IntrospectingRequestAttributeBinderTest { private final Mockery context = new Mockery(); @@ -29,6 +29,14 @@ binder.bind(request, new SimpleController()); } + @Test + public void shouldNotThrowNullPointerExceptionWhenControllerMissingReadMethodForProperty() { + final ControllerWithMissingReadMethod controller = new ControllerWithMissingReadMethod(); + + IntrospectingRequestAttributeBinder binder = new IntrospectingRequestAttributeBinder(new SilentMonitor()); + binder.bind(null, controller); + } + class SimpleController { private String name = "my controller"; @@ -41,6 +49,13 @@ } } + class ControllerWithMissingReadMethod { + @SuppressWarnings({"UnusedDeclaration"}) + public void setName(String name) { + // do nothing + } + } + @Test public void rubyInstanceVariablesShouldBeBound() { String rubyScript =
Modified: trunk/waffle-core/src/test/java/org/codehaus/waffle/testmodel/StubMonitor.java (446 => 447)
--- trunk/waffle-core/src/test/java/org/codehaus/waffle/testmodel/StubMonitor.java 2007-11-30 23:10:40 UTC (rev 446) +++ trunk/waffle-core/src/test/java/org/codehaus/waffle/testmodel/StubMonitor.java 2007-12-01 06:09:42 UTC (rev 447) @@ -1,13 +1,8 @@ package org.codehaus.waffle.testmodel; -import java.lang.reflect.Method; -import java.util.Set; - -import javax.servlet.http.HttpServletResponse; - import org.codehaus.waffle.action.ActionMethodResponse; -import org.codehaus.waffle.action.MethodDefinition; import org.codehaus.waffle.action.HierarchicalArgumentResolver.Scope; +import org.codehaus.waffle.action.MethodDefinition; import org.codehaus.waffle.context.ContextContainer; import org.codehaus.waffle.controller.ControllerDefinition; import org.codehaus.waffle.monitor.ActionMonitor; @@ -24,6 +19,10 @@ import org.codehaus.waffle.view.ResponderView; import org.codehaus.waffle.view.View; +import javax.servlet.http.HttpServletResponse; +import java.lang.reflect.Method; +import java.util.Set; + public class StubMonitor implements ActionMonitor, BindMonitor, ContextMonitor, ControllerMonitor, RegistrarMonitor, ServletMonitor, ValidationMonitor, ViewMonitor { @@ -117,7 +116,7 @@ public void controllerValidatorNotFound(String controllerValidatorName, String controllerName) { } - public void methodDefinitionNotFound(ControllerDefinition controllerDefinition) { + public void methodDefinitionNotFound(ControllerDefinition controllerDefinition) { } public void validationFailed(Exception cause) {
To unsubscribe from this list please visit:
