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 2007/11/21 18:59:25 UTC

svn commit: r597164 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry/internal/services/ main/java/org/apache/tapestry/internal/structure/ test/java/org/apache/tapestry/internal/services/

Author: hlship
Date: Wed Nov 21 09:59:23 2007
New Revision: 597164

URL: http://svn.apache.org/viewvc?rev=597164&view=rev
Log:
TAPESTRY-1922: EJB3 Beans can not be referenced as properties inside JBoss 4.0

Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentEventImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ReflectiveInstantiator.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ComponentEventImplTest.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentEventImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentEventImpl.java?rev=597164&r1=597163&r2=597164&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentEventImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentEventImpl.java Wed Nov 21 09:59:23 2007
@@ -30,6 +30,8 @@
 
     private final TypeCoercer _typeCoercer;
 
+    private final ClassLoader _classLoader;
+
     /**
      * @param eventType              non blank string used to identify the type of event that was triggered
      * @param originatingComponentId the id of the component that triggered the event (this will likely need to change
@@ -38,9 +40,11 @@
      *                               parameters
      * @param handler                invoked when a non-null return value is obtained from an event handler method
      * @param typeCoercer            used when coercing context values to parameter types
+     * @param classLoader            loader used when resolving a class name to a class  (ultimately, this
+     *                               is the class loader used to create the component class; that loader's parent is the Thread's context class loader).
      */
     public ComponentEventImpl(String eventType, String originatingComponentId, Object[] context,
-                              ComponentEventHandler handler, TypeCoercer typeCoercer)
+                              ComponentEventHandler handler, TypeCoercer typeCoercer, ClassLoader classLoader)
     {
         super(handler);
 
@@ -48,13 +52,9 @@
         _originatingComponentId = originatingComponentId;
         _context = context != null ? context : new Object[0];
         _typeCoercer = notNull(typeCoercer, "typeCoercer");
+        _classLoader = classLoader;
     }
 
-    /**
-     * TODO: This implementation is broken, but will get the job done for simple cases. It just
-     * doesn't do quite the right think when an event bubbles up past its originating component's
-     * container (can lead to false matches).
-     */
     public boolean matchesByComponentId(String componentId)
     {
         return _originatingComponentId.equalsIgnoreCase(componentId);
@@ -73,22 +73,18 @@
     @SuppressWarnings("unchecked")
     public Object coerceContext(int index, String desiredTypeName)
     {
-        if (index >= _context.length)
-            throw new IllegalArgumentException(ServicesMessages
-                    .contextIndexOutOfRange(getMethodDescription()));
-
+        if (index >= _context.length) throw new IllegalArgumentException(ServicesMessages
+                .contextIndexOutOfRange(getMethodDescription()));
         try
         {
-            Class desiredType = Class.forName(desiredTypeName);
+            Class desiredType = Class.forName(desiredTypeName, true, _classLoader);
 
             return _typeCoercer.coerce(_context[index], desiredType);
         }
         catch (Exception ex)
         {
-            throw new IllegalArgumentException(ServicesMessages.exceptionInMethodParameter(
-                    getMethodDescription(),
-                    index,
-                    ex), ex);
+            throw new IllegalArgumentException(
+                    ServicesMessages.exceptionInMethodParameter(getMethodDescription(), index, ex), ex);
         }
     }
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ReflectiveInstantiator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ReflectiveInstantiator.java?rev=597164&r1=597163&r2=597164&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ReflectiveInstantiator.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ReflectiveInstantiator.java Wed Nov 21 09:59:23 2007
@@ -1,17 +1,17 @@
-// Copyright 2006 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.
-
+// Copyright 2006, 2007 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.internal.services;
 
 import org.apache.tapestry.internal.InternalComponentResources;
@@ -34,12 +34,12 @@
     private final Object[] _constructorParameters;
 
     /**
-     * Creates a new instance that will instantiate the given class. The
+     * Creates a new instance that will instantiate the given class.
      *
-     * @param componentModel model defining the behavior of the component
-     * @param instanceClass  class to instantiate
-     * @param parameters     passed to the constructor; the first instance is ignored (and overriden) as the
-     *                       {@link org.apache.tapestry.internal.InternalComponentResources} instance.
+     * @param componentModel        model defining the behavior of the component
+     * @param instanceClass         class to instantiate
+     * @param constructorParameters passed to the constructor; the first instance is ignored (and overriden) as the
+     *                              {@link org.apache.tapestry.internal.InternalComponentResources} instance.
      */
     ReflectiveInstantiator(ComponentModel componentModel, Class instanceClass, Object[] constructorParameters)
     {

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java?rev=597164&r1=597163&r2=597164&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java Wed Nov 21 09:59:23 2007
@@ -53,8 +53,7 @@
  * {@link org.apache.tapestry.internal.services.PageElementFactoryImpl}.
  * <p/>
  */
-public class ComponentPageElementImpl extends BaseLocatable implements ComponentPageElement,
-                                                                       PageLifecycleListener
+public class ComponentPageElementImpl extends BaseLocatable implements ComponentPageElement, PageLifecycleListener
 {
     private static final ComponentCallback CONTAINING_PAGE_DID_ATTACH = new ComponentCallback()
     {
@@ -148,9 +147,8 @@
                 return false;
             }
 
-            throw new TapestryException(StructureMessages.wrongEventResultType(
-                    methodDescription,
-                    Boolean.class), component, null);
+            throw new TapestryException(StructureMessages.wrongEventResultType(methodDescription, Boolean.class),
+                                        component, null);
         }
 
         private void add(RenderCommand command)
@@ -387,8 +385,7 @@
                 Element current = writer.getElement();
 
                 if (current != _elementAtSetup)
-                    throw new TapestryException(StructureMessages.unbalancedElements(_completeId),
-                                                getLocation(), null);
+                    throw new TapestryException(StructureMessages.unbalancedElements(_completeId), getLocation(), null);
 
                 _elementAtSetup = null;
 
@@ -496,6 +493,8 @@
 
     private final TypeCoercer _typeCoercer;
 
+    private final ClassLoader _classLoader;
+
     /**
      * Constructor for other components embedded within the root component or at deeper levels of
      * the hierarchy.
@@ -512,8 +511,8 @@
      * @param location       location of the element (within a template), used as part of exception reporting
      */
 
-    public ComponentPageElementImpl(Page page, ComponentPageElement container, String id,
-                                    String elementName, Instantiator instantiator, TypeCoercer typeCoercer,
+    public ComponentPageElementImpl(Page page, ComponentPageElement container, String id, String elementName,
+                                    Instantiator instantiator, TypeCoercer typeCoercer,
                                     ComponentMessagesSource messagesSource, Location location)
     {
         super(location);
@@ -528,11 +527,13 @@
         ComponentResources containerResources = container == null ? null : container
                 .getComponentResources();
 
-        _coreResources = new InternalComponentResourcesImpl(this, containerResources, instantiator,
-                                                            _typeCoercer, _messagesSource);
+        _coreResources = new InternalComponentResourcesImpl(this, containerResources, instantiator, _typeCoercer,
+                                                            _messagesSource);
 
         _coreComponent = _coreResources.getComponent();
 
+        _classLoader = _coreComponent.getClass().getClassLoader();
+
         String pageName = _page.getLogicalName();
 
         // A page (really, the root component of a page) does not have a container.
@@ -581,8 +582,7 @@
 
         ComponentPageElement existing = _children.get(childId);
         if (existing != null)
-            throw new TapestryException(StructureMessages.duplicateChildComponent(this, childId),
-                                        child, null);
+            throw new TapestryException(StructureMessages.duplicateChildComponent(this, childId), child, null);
 
         _children.put(childId, child);
     }
@@ -598,9 +598,9 @@
         String mixinClassName = instantiator.getModel().getComponentClassName();
         String mixinName = TapestryInternalUtils.lastTerm(mixinClassName);
 
-        InternalComponentResourcesImpl resources = new InternalComponentResourcesImpl(this,
-                                                                                      _coreResources, instantiator,
-                                                                                      _typeCoercer, _messagesSource);
+        InternalComponentResourcesImpl resources = new InternalComponentResourcesImpl(this, _coreResources,
+                                                                                      instantiator, _typeCoercer,
+                                                                                      _messagesSource);
 
         // TODO: Check for name collision?
 
@@ -618,15 +618,10 @@
         if (dotx > 0)
         {
             String mixinName = parameterName.substring(0, dotx);
-            InternalComponentResources mixinResources = InternalUtils.get(
-                    _mixinsByShortName,
-                    mixinName);
-
-            if (mixinResources == null)
-                throw new TapestryException(StructureMessages.missingMixinForParameter(
-                        _completeId,
-                        mixinName,
-                        parameterName), binding, null);
+            InternalComponentResources mixinResources = InternalUtils.get(_mixinsByShortName, mixinName);
+
+            if (mixinResources == null) throw new TapestryException(
+                    StructureMessages.missingMixinForParameter(_completeId, mixinName, parameterName), binding, null);
 
             String simpleName = parameterName.substring(dotx + 1);
 
@@ -653,22 +648,19 @@
                 return;
             }
 
-            if (informalParameterResources == null
-                    && resources.getComponentModel().getSupportsInformalParameters())
+            if (informalParameterResources == null && resources.getComponentModel().getSupportsInformalParameters())
                 informalParameterResources = resources;
         }
 
         // An informal parameter
 
-        if (informalParameterResources == null
-                && _coreResources.getComponentModel().getSupportsInformalParameters())
+        if (informalParameterResources == null && _coreResources.getComponentModel().getSupportsInformalParameters())
             informalParameterResources = _coreResources;
 
         // For the moment, informal parameters accumulate in the core component's resources, but
         // that will likely change.
 
-        if (informalParameterResources != null)
-            informalParameterResources.bindParameter(parameterName, binding);
+        if (informalParameterResources != null) informalParameterResources.bindParameter(parameterName, binding);
     }
 
     public void addToBody(PageElement element)
@@ -683,8 +675,7 @@
         _template.add(element);
     }
 
-    private void addUnboundParameterNames(String prefix, List<String> unbound,
-                                          InternalComponentResources resource)
+    private void addUnboundParameterNames(String prefix, List<String> unbound, InternalComponentResources resource)
     {
         ComponentModel model = resource.getComponentModel();
 
@@ -812,8 +803,7 @@
                 .toLowerCase());
 
         if (embeddedElement == null)
-            throw new TapestryException(StructureMessages.noSuchComponent(this, embeddedId), this,
-                                        null);
+            throw new TapestryException(StructureMessages.noSuchComponent(this, embeddedId), this, null);
 
         return embeddedElement;
     }
@@ -849,10 +839,8 @@
             }
         }
 
-        if (result == null)
-            throw new TapestryException(
-                    StructureMessages.unknownMixin(_completeId, mixinClassName), getLocation(),
-                    null);
+        if (result == null) throw new TapestryException(StructureMessages.unknownMixin(_completeId, mixinClassName),
+                                                        getLocation(), null);
 
         return result;
     }
@@ -906,11 +894,9 @@
                 return;
             }
 
-            Iterator<Component> i = reverse ? InternalUtils.reverseIterator(_components)
-                                    : _components.iterator();
+            Iterator<Component> i = reverse ? InternalUtils.reverseIterator(_components) : _components.iterator();
 
-            while (i.hasNext())
-                callback.run(i.next());
+            while (i.hasNext()) callback.run(i.next());
         }
         catch (Exception ex)
         {
@@ -978,8 +964,8 @@
 
         while (component != null)
         {
-            ComponentEvent event = new ComponentEventImpl(eventType, componentId, context, handler,
-                                                          _typeCoercer);
+            ComponentEvent event = new ComponentEventImpl(eventType, componentId, context, handler, _typeCoercer,
+                                                          _classLoader);
 
             result |= component.handleEvent(event);
 
@@ -1030,8 +1016,7 @@
         Block result = findBlock(id);
 
         if (result == null)
-            throw new BlockNotFoundException(StructureMessages.blockNotFound(_completeId, id),
-                                             getLocation());
+            throw new BlockNotFoundException(StructureMessages.blockNotFound(_completeId, id), getLocation());
 
         return result;
     }
@@ -1048,8 +1033,7 @@
         if (_blocks == null) _blocks = newCaseInsensitiveMap();
 
         if (_blocks.containsKey(blockId))
-            throw new TapestryException(StructureMessages.duplicateBlock(this, blockId), block,
-                                        null);
+            throw new TapestryException(StructureMessages.duplicateBlock(this, blockId), block, null);
 
         _blocks.put(blockId, block);
     }
@@ -1061,15 +1045,10 @@
         if (dotx > 0)
         {
             String mixinName = parameterName.substring(0, dotx);
-            InternalComponentResources mixinResources = InternalUtils.get(
-                    _mixinsByShortName,
-                    mixinName);
-
-            if (mixinResources == null)
-                throw new TapestryException(StructureMessages.missingMixinForParameter(
-                        _completeId,
-                        mixinName,
-                        parameterName), null, null);
+            InternalComponentResources mixinResources = InternalUtils.get(_mixinsByShortName, mixinName);
+
+            if (mixinResources == null) throw new TapestryException(
+                    StructureMessages.missingMixinForParameter(_completeId, mixinName, parameterName), null, null);
 
             String simpleName = parameterName.substring(dotx + 1);
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ComponentEventImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ComponentEventImplTest.java?rev=597164&r1=597163&r2=597164&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ComponentEventImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ComponentEventImplTest.java Wed Nov 21 09:59:23 2007
@@ -46,8 +46,7 @@
 
         replay();
 
-        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler,
-                                                      _coercer);
+        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler, _coercer, null);
 
         assertTrue(event.matchesByEventType("eventType"));
         assertFalse(event.matchesByEventType("foo"));
@@ -62,8 +61,7 @@
 
         replay();
 
-        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler,
-                                                      _coercer);
+        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler, _coercer, null);
 
         assertTrue(event.matchesByEventType("EVENTTYPE"));
 
@@ -77,8 +75,7 @@
 
         replay();
 
-        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler,
-                                                      _coercer);
+        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler, _coercer, null);
 
         assertTrue(event.matchesByComponentId("someId"));
 
@@ -93,8 +90,7 @@
         ComponentEventHandler handler = mockComponentEventHandler();
 
         replay();
-        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler,
-                                                      _coercer);
+        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler, _coercer, null);
 
         assertTrue(event.matchesByComponentId("SOMEID"));
 
@@ -108,8 +104,8 @@
 
         replay();
 
-        ComponentEvent event = new ComponentEventImpl("eventType", "someId", new String[]
-                {"27"}, handler, _coercer);
+        ComponentEvent event = new ComponentEventImpl("eventType", "someId", new String[]{"27"}, handler, _coercer,
+                                                      null);
 
         assertEquals(event.coerceContext(0, "java.lang.Integer"), new Integer(27));
 
@@ -124,8 +120,8 @@
 
         replay();
 
-        ComponentEvent event = new ComponentEventImpl("eventType", "someId", new String[]
-                {"27"}, handler, _coercer);
+        ComponentEvent event = new ComponentEventImpl("eventType", "someId", new String[]{"27"}, handler, _coercer,
+                                                      null);
 
         event.setSource(component, "foo.Bar.baz()");
 
@@ -135,9 +131,8 @@
         }
         catch (IllegalArgumentException ex)
         {
-            assertEquals(
-                    ex.getMessage(),
-                    "Method foo.Bar.baz() has more parameters than there are context values for this component event.");
+            assertEquals(ex.getMessage(),
+                         "Method foo.Bar.baz() has more parameters than there are context values for this component event.");
         }
 
         verify();
@@ -151,8 +146,8 @@
 
         replay();
 
-        ComponentEvent event = new ComponentEventImpl("eventType", "someId", new String[]
-                {"abc"}, handler, _coercer);
+        ComponentEvent event = new ComponentEventImpl("eventType", "someId", new String[]{"abc"}, handler, _coercer,
+                                                      null);
 
         event.setSource(component, "foo.Bar.baz()");
 
@@ -166,8 +161,7 @@
             // Different JVMs will report the conversion error slightly differently,
             // so we don't try to check that part of the error message.
 
-            assertTrue(ex.getMessage().startsWith(
-                    "Exception in method foo.Bar.baz(), parameter #1:"));
+            assertTrue(ex.getMessage().startsWith("Exception in method foo.Bar.baz(), parameter #1:"));
         }
 
         verify();
@@ -186,8 +180,7 @@
 
         replay();
 
-        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler,
-                                                      _coercer);
+        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler, _coercer, null);
 
         event.setSource(component, methodDescription);
 
@@ -212,8 +205,7 @@
 
         replay();
 
-        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler,
-                                                      _coercer);
+        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler, _coercer, null);
 
         event.setSource(component, methodDescription);
 
@@ -232,8 +224,7 @@
 
         replay();
 
-        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler,
-                                                      _coercer);
+        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler, _coercer, null);
 
         event.setSource(component, "foo.Bar.baz()");
 
@@ -256,8 +247,7 @@
 
         replay();
 
-        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler,
-                                                      _coercer);
+        ComponentEvent event = new ComponentEventImpl("eventType", "someId", null, handler, _coercer, null);
 
         event.setSource(component, "foo.Bar.baz()");
         event.storeResult(result);