Author: kmenard
Date: Fri Feb 22 18:17:09 2008
New Revision: 630376
URL: http://svn.apache.org/viewvc?rev=630376&view=rev
Log:
Fixed TAPESTRY-2182: NullPointerExceptions, due to reading nested properties
that do not suppress null values, do not indicate problematic expression for
AbstractPropertyOutput derivatives.
Added:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/base/BaseMessages.java
tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry/corelib/base/
tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry/corelib/base/BaseStrings.properties
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/corelib/base/AbstractPropertyOutputTest.java
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/base/AbstractPropertyOutput.java
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/base/AbstractPropertyOutput.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/base/AbstractPropertyOutput.java?rev=630376&r1=630375&r2=630376&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/base/AbstractPropertyOutput.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/base/AbstractPropertyOutput.java
Fri Feb 22 18:17:09 2008
@@ -37,7 +37,7 @@
*
* @see BeanBlockSource
*/
-public class AbstractPropertyOutput
+public abstract class AbstractPropertyOutput
{
/**
* Model for property displayed by the cell.
@@ -130,11 +130,18 @@
return false;
}
- private Object readPropertyForObject()
+ Object readPropertyForObject()
{
PropertyConduit conduit = _model.getConduit();
- return conduit == null ? null : conduit.get(_object);
+ try
+ {
+ return conduit == null ? null : conduit.get(_object);
+ }
+ catch (final NullPointerException ex)
+ {
+ throw new
NullPointerException(BaseMessages.nullValueInPath(_model.getPropertyName()));
+ }
}
private Messages getOverrideMessages()
@@ -159,4 +166,10 @@
}
}
+ // Used for testing.
+ void inject(final PropertyModel model, final Object object)
+ {
+ _model = model;
+ _object = object;
+ }
}
Added:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/base/BaseMessages.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/base/BaseMessages.java?rev=630376&view=auto
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/base/BaseMessages.java
(added)
+++
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/base/BaseMessages.java
Fri Feb 22 18:17:09 2008
@@ -0,0 +1,28 @@
+// Copyright 2008 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.corelib.base;
+
+import org.apache.tapestry.ioc.Messages;
+import org.apache.tapestry.ioc.internal.util.MessagesImpl;
+
+public final class BaseMessages
+{
+ private static final Messages MESSAGES =
MessagesImpl.forClass(BaseMessages.class);
+
+ public static String nullValueInPath(final String path)
+ {
+ return MESSAGES.format("null-value-in-path", path);
+ }
+}
Added:
tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry/corelib/base/BaseStrings.properties
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry/corelib/base/BaseStrings.properties?rev=630376&view=auto
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry/corelib/base/BaseStrings.properties
(added)
+++
tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry/corelib/base/BaseStrings.properties
Fri Feb 22 18:17:09 2008
@@ -0,0 +1,15 @@
+# Copyright 2008 The Apache Software Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+null-value-in-path=Property '%s' contains a null value in the path.
\ No newline at end of file
Added:
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/corelib/base/AbstractPropertyOutputTest.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/corelib/base/AbstractPropertyOutputTest.java?rev=630376&view=auto
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/corelib/base/AbstractPropertyOutputTest.java
(added)
+++
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/corelib/base/AbstractPropertyOutputTest.java
Fri Feb 22 18:17:09 2008
@@ -0,0 +1,57 @@
+// Copyright 2008 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.corelib.base;
+
+import org.testng.annotations.Test;
+import org.apache.tapestry.beaneditor.PropertyModel;
+import org.apache.tapestry.internal.test.InternalBaseTestCase;
+import org.apache.tapestry.PropertyConduit;
+
+public class AbstractPropertyOutputTest extends InternalBaseTestCase
+{
+ private final AbstractPropertyOutput propertyOutputFixture = new
AbstractPropertyOutput()
+ {
+ };
+
+ @Test
+ // Tests TAPESTRY-2182.
+ public void test_null_pointer_exception_message()
+ {
+ final PropertyConduit conduit = mockPropertyConduit();
+ final PropertyModel model = mockPropertyModel();
+ final Object object = new Object();
+
+ propertyOutputFixture.inject(model, object);
+
+ expect(model.getConduit()).andReturn(conduit);
+ expect(conduit.get(object)).andThrow(new NullPointerException());
+ expect(model.getPropertyName()).andReturn("wilma.occupation.address");
+
+ replay();
+
+ try
+ {
+ propertyOutputFixture.readPropertyForObject();
+
+ fail("Expected a NullPointerException to be thrown.");
+ }
+ catch (final NullPointerException ex)
+ {
+ assertEquals(ex.getMessage(), "Property 'wilma.occupation.address'
contains a null value in the path.");
+ }
+
+ verify();
+ }
+}