You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2005/09/08 20:25:45 UTC

svn commit: r279597 - in /jakarta/tapestry/trunk: ./ framework/src/java/org/apache/tapestry/bean/ framework/src/test/org/apache/tapestry/ framework/src/test/org/apache/tapestry/bean/ framework/src/test/org/apache/tapestry/components/

Author: hlship
Date: Thu Sep  8 11:25:38 2005
New Revision: 279597

URL: http://svn.apache.org/viewcvs?rev=279597&view=rev
Log:
TAPESTRY-341: Report location of errors initializing managed beans

Added:
    jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/bean/TestBeanProvider.java
Removed:
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/bean/StaticBeanInitializer.java
Modified:
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/bean/BeanMessages.java
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/bean/BeanProvider.java
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/bean/BeanStrings.properties
    jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/BaseComponentTestCase.java
    jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/components/TestBlock.java
    jakarta/tapestry/trunk/status.xml

Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/bean/BeanMessages.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/bean/BeanMessages.java?rev=279597&r1=279596&r2=279597&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/bean/BeanMessages.java (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/bean/BeanMessages.java Thu Sep  8 11:25:38 2005
@@ -41,4 +41,11 @@
         return _formatter.format("instantiation-error", new Object[]
         { name, component.getExtendedId(), className, cause });
     }
+
+    static String initializationError(IComponent component, String beanName, String propertyName,
+            Throwable cause)
+    {
+        return _formatter.format("initialization-error", new Object[]
+        { propertyName, beanName, component.getExtendedId(), cause });
+    }
 }

Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/bean/BeanProvider.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/bean/BeanProvider.java?rev=279597&r1=279596&r2=279597&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/bean/BeanProvider.java (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/bean/BeanProvider.java Thu Sep  8 11:25:38 2005
@@ -176,7 +176,7 @@
         return bean;
     }
 
-    private Object instantiateBean(String beanName, IBeanSpecification spec)
+    Object instantiateBean(String beanName, IBeanSpecification spec)
     {
         String className = spec.getClassName();
         Object bean = null;
@@ -198,7 +198,7 @@
                     beanName,
                     _component,
                     className,
-                    ex), spec.getLocation(), ex);
+                    ex), _component, spec.getLocation(), ex);
         }
 
         // OK, have the bean, have to initialize it.
@@ -216,7 +216,19 @@
             if (LOG.isDebugEnabled())
                 LOG.debug("Initializing property " + iz.getPropertyName());
 
-            iz.setBeanProperty(this, bean);
+            try
+            {
+                iz.setBeanProperty(this, bean);
+            }
+            catch (Exception ex)
+            {
+                throw new ApplicationRuntimeException(BeanMessages.initializationError(
+                        _component,
+                        beanName,
+                        iz.getPropertyName(),
+                        ex), bean, iz.getLocation(), ex);
+
+            }
         }
 
         return bean;

Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/bean/BeanStrings.properties
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/bean/BeanStrings.properties?rev=279597&r1=279596&r2=279597&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/bean/BeanStrings.properties (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/bean/BeanStrings.properties Thu Sep  8 11:25:38 2005
@@ -15,3 +15,4 @@
 property-initializer-name=initializer of property {0}
 bean-not-defined=Component {0} does not define a bean name {1}.
 instantiation-error=Unable to instantiate bean ''{0}'' (for component {1}) as class {2}: {3}
+initialization-error=Error initializing property {0} of bean ''{1}'' (of component {2}): {3}
\ No newline at end of file

Modified: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/BaseComponentTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/BaseComponentTestCase.java?rev=279597&r1=279596&r2=279597&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/BaseComponentTestCase.java (original)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/BaseComponentTestCase.java Thu Sep  8 11:25:38 2005
@@ -17,6 +17,8 @@
 import java.io.CharArrayWriter;
 import java.io.PrintWriter;
 
+import org.apache.hivemind.ClassResolver;
+import org.apache.hivemind.Locatable;
 import org.apache.hivemind.Location;
 import org.apache.hivemind.test.HiveMindTestCase;
 import org.apache.tapestry.markup.AsciiMarkupFilter;
@@ -285,6 +287,46 @@
     protected IAsset newAsset()
     {
         return (IAsset) newMock(IAsset.class);
+    }
+
+    protected IEngine newEngine(ClassResolver resolver)
+    {
+        IEngine engine = (IEngine) newMock(IEngine.class);
+
+        engine.getClassResolver();
+        getControl(engine).setReturnValue(resolver);
+
+        return engine;
+    }
+
+    protected void trainGetEngine(IPage page, IEngine engine)
+    {
+        page.getEngine();
+
+        getControl(page).setReturnValue(engine);
+    }
+
+    protected IComponent newComponent()
+    {
+        return (IComponent) newMock(IComponent.class);
+    }
+
+    protected void trainGetPage(IComponent component, IPage page)
+    {
+        component.getPage();
+        getControl(component).setReturnValue(page);
+    }
+
+    protected void trainGetExtendedId(IComponent component, String extendedId)
+    {
+        component.getExtendedId();
+        getControl(component).setReturnValue(extendedId);
+    }
+
+    protected void trainGetLocation(Locatable locatable, Location location)
+    {
+        locatable.getLocation();
+        getControl(locatable).setReturnValue(location);
     }
 
 }

Added: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/bean/TestBeanProvider.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/bean/TestBeanProvider.java?rev=279597&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/bean/TestBeanProvider.java (added)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/bean/TestBeanProvider.java Thu Sep  8 11:25:38 2005
@@ -0,0 +1,170 @@
+// Copyright 2005 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.bean;
+
+import org.apache.hivemind.ApplicationRuntimeException;
+import org.apache.hivemind.ClassResolver;
+import org.apache.hivemind.Location;
+import org.apache.hivemind.impl.DefaultClassResolver;
+import org.apache.tapestry.BaseComponentTestCase;
+import org.apache.tapestry.IBeanProvider;
+import org.apache.tapestry.IComponent;
+import org.apache.tapestry.IEngine;
+import org.apache.tapestry.IPage;
+import org.apache.tapestry.spec.BeanSpecification;
+import org.apache.tapestry.spec.IBeanSpecification;
+
+/**
+ * Tests for {@link org.apache.tapestry.bean.BeanProvider} (mostly new features added in release
+ * 4.0).
+ * 
+ * @author Howard M. Lewis Ship
+ * @since 4.0
+ */
+public class TestBeanProvider extends BaseComponentTestCase
+{
+    public static class BeanInitializerFixture extends AbstractBeanInitializer
+    {
+        private final RuntimeException _exception;
+
+        public BeanInitializerFixture(String propertyName, RuntimeException exception)
+        {
+            setPropertyName(propertyName);
+            _exception = exception;
+        }
+
+        public void setBeanProperty(IBeanProvider provider, Object bean)
+        {
+            throw _exception;
+        }
+
+    }
+
+    protected IBeanSpecification newBeanSpec()
+    {
+        return (IBeanSpecification) newMock(IBeanSpecification.class);
+    }
+
+    protected void trainGetClassName(IBeanSpecification spec, String className)
+    {
+        spec.getClassName();
+        getControl(spec).setReturnValue(className);
+    }
+
+    public void testInstantiateFailure()
+    {
+        ClassResolver resolver = newResolver();
+        IEngine engine = newEngine(resolver);
+        IPage page = newPage();
+        IComponent component = newComponent();
+
+        trainGetPage(component, page);
+        trainGetEngine(page, engine);
+
+        replayControls();
+
+        BeanProvider bp = new BeanProvider(component);
+
+        verifyControls();
+
+        IBeanSpecification bs = newBeanSpec();
+
+        trainGetClassName(bs, "org.foo.Bar");
+
+        Throwable t = new RuntimeException("Poof!");
+
+        resolver.findClass("org.foo.Bar");
+        getControl(resolver).setThrowable(t);
+
+        trainGetExtendedId(component, "Fred/barney");
+
+        Location l = newLocation();
+
+        trainGetLocation(bs, l);
+
+        replayControls();
+
+        try
+        {
+            bp.instantiateBean("wilma", bs);
+            unreachable();
+        }
+        catch (ApplicationRuntimeException ex)
+        {
+            assertEquals(
+                    "Unable to instantiate bean 'wilma' (for component Fred/barney) as class org.foo.Bar: Poof!",
+                    ex.getMessage());
+            assertSame(component, ex.getComponent());
+            assertSame(l, ex.getLocation());
+            assertSame(t, ex.getRootCause());
+        }
+
+        verifyControls();
+    }
+
+    private ClassResolver newResolver()
+    {
+        return (ClassResolver) newMock(ClassResolver.class);
+    }
+
+    public void testInitializeFailure()
+    {
+        ClassResolver resolver = new DefaultClassResolver();
+        IEngine engine = newEngine(resolver);
+        IPage page = newPage();
+        IComponent component = newComponent();
+
+        trainGetPage(component, page);
+        trainGetEngine(page, engine);
+
+        replayControls();
+
+        BeanProvider bp = new BeanProvider(component);
+
+        verifyControls();
+
+        IBeanSpecification spec = new BeanSpecification();
+        spec.setClassName(TargetBean.class.getName());
+
+        RuntimeException t = new RuntimeException("Blat!");
+
+        Location l = newLocation();
+
+        IBeanInitializer bi = new BeanInitializerFixture("foo", t);
+        bi.setLocation(l);
+
+        spec.addInitializer(bi);
+
+        trainGetExtendedId(component, "Fred/barney");
+
+        replayControls();
+
+        try
+        {
+            bp.instantiateBean("wilma", spec);
+            unreachable();
+        }
+        catch (ApplicationRuntimeException ex)
+        {
+            assertEquals(
+                    "Error initializing property foo of bean 'wilma' (of component Fred/barney): Blat!",
+                    ex.getMessage());
+            assertSame(TargetBean.class, ex.getComponent().getClass());
+            assertSame(l, ex.getLocation());
+            assertSame(t, ex.getRootCause());
+        }
+
+    }
+}

Modified: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/components/TestBlock.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/components/TestBlock.java?rev=279597&r1=279596&r2=279597&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/components/TestBlock.java (original)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/components/TestBlock.java Thu Sep  8 11:25:38 2005
@@ -84,9 +84,4 @@
         verifyControls();
     }
 
-    private IComponent newComponent()
-    {
-        return (IComponent) newMock(IComponent.class);
-    }
-
 }

Modified: jakarta/tapestry/trunk/status.xml
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/status.xml?rev=279597&r1=279596&r2=279597&view=diff
==============================================================================
--- jakarta/tapestry/trunk/status.xml (original)
+++ jakarta/tapestry/trunk/status.xml Thu Sep  8 11:25:38 2005
@@ -51,7 +51,7 @@
   </todo>
   <changes>
     <release version="4.0-beta-7" date="unreleased">
-      
+      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-341">Report location of errors initializing managed beans</action>   
     </release>
     <release version="4.0-beta-6" date="Sep 7 2005">
       <action type="update" dev="HLS" due-to="Henri Yandell">Convert Tapestry repository from CVS to SVN</action>



---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-dev-help@jakarta.apache.org