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 2008/10/27 18:24:02 UTC

svn commit: r708241 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry5/internal/services/PageLoaderProcessor.java test/java/org/apache/tapestry5/internal/services/PageLoaderImplTest.java

Author: hlship
Date: Mon Oct 27 10:24:01 2008
New Revision: 708241

URL: http://svn.apache.org/viewvc?rev=708241&view=rev
Log:
TAP5-304: Tapestry outputs a warning when a component defined in the Java code (via @Component) does not have a corresponding element in the template; this should be escalated to an exception

Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageLoaderProcessor.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PageLoaderImplTest.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageLoaderProcessor.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageLoaderProcessor.java?rev=708241&r1=708240&r2=708241&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageLoaderProcessor.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageLoaderProcessor.java Mon Oct 27 10:24:01 2008
@@ -22,14 +22,7 @@
 import org.apache.tapestry5.internal.parser.*;
 import org.apache.tapestry5.internal.structure.*;
 import org.apache.tapestry5.ioc.Location;
-import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
-import static org.apache.tapestry5.ioc.internal.util.CollectionFactory.newCaseInsensitiveMap;
-import static org.apache.tapestry5.ioc.internal.util.CollectionFactory.newMap;
-import org.apache.tapestry5.ioc.internal.util.IdAllocator;
-import static org.apache.tapestry5.ioc.internal.util.InternalUtils.isBlank;
-import static org.apache.tapestry5.ioc.internal.util.InternalUtils.isNonBlank;
-import org.apache.tapestry5.ioc.internal.util.OneShotLock;
-import org.apache.tapestry5.ioc.internal.util.TapestryException;
+import org.apache.tapestry5.ioc.internal.util.*;
 import org.apache.tapestry5.ioc.util.Stack;
 import org.apache.tapestry5.model.ComponentModel;
 import org.apache.tapestry5.model.EmbeddedComponentModel;
@@ -84,7 +77,6 @@
     /**
      * Used as a queue of Runnable objects used to handle final setup.
      */
-
     private final List<Runnable> finalization = CollectionFactory.newList();
 
     private final IdAllocator idAllocator = new IdAllocator();
@@ -452,7 +444,7 @@
         Logger logger = loadingComponentModel.getLogger();
 
         // Don't have a case-insensitive Set, so we'll make due with a Map
-        Map<String, Boolean> embeddedIds = newCaseInsensitiveMap();
+        Map<String, Boolean> embeddedIds = CollectionFactory.newCaseInsensitiveMap();
 
         for (String id : loadingComponentModel.getEmbeddedComponentIds())
             embeddedIds.put(id, true);
@@ -647,19 +639,19 @@
         {
             String modelType = embeddedModel.getComponentType();
 
-            if (isNonBlank(modelType) && embeddedType != null)
-            {
-                Logger log = loadingComponentModel.getLogger();
-                log.error(ServicesMessages.compTypeConflict(embeddedId, embeddedType, modelType));
-            }
+            if (InternalUtils.isNonBlank(modelType) && embeddedType != null)
+                throw new TapestryException(ServicesMessages.compTypeConflict(embeddedId, embeddedType, modelType),
+                                            token, null);
 
             embeddedType = modelType;
             embeddedComponentClassName = embeddedModel.getComponentClassName();
         }
 
-        if (isBlank(embeddedType) && isBlank(embeddedComponentClassName)) throw new TapestryException(
-                ServicesMessages.noTypeForEmbeddedComponent(embeddedId, loadingComponentModel.getComponentClassName()),
-                token, null);
+        if (InternalUtils.isBlank(embeddedType) && InternalUtils.isBlank(embeddedComponentClassName))
+            throw new TapestryException(
+                    ServicesMessages.noTypeForEmbeddedComponent(embeddedId,
+                                                                loadingComponentModel.getComponentClassName()),
+                    token, null);
 
         final ComponentPageElement newComponent = pageElementFactory.newComponentElement(page, loadingElement,
                                                                                          embeddedId, embeddedType,
@@ -669,7 +661,7 @@
 
         addMixinsToComponent(newComponent, embeddedModel, token.getMixins());
 
-        final Map<String, Binding> newComponentBindings = newMap();
+        final Map<String, Binding> newComponentBindings = CollectionFactory.newMap();
         componentIdToBindingMap.put(newComponent.getCompleteId(), newComponentBindings);
 
         if (embeddedModel != null)

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PageLoaderImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PageLoaderImplTest.java?rev=708241&r1=708240&r2=708241&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PageLoaderImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PageLoaderImplTest.java Mon Oct 27 10:24:01 2008
@@ -20,13 +20,12 @@
 import org.apache.tapestry5.internal.parser.StartComponentToken;
 import org.apache.tapestry5.internal.structure.ComponentPageElement;
 import org.apache.tapestry5.internal.structure.Page;
-import org.apache.tapestry5.internal.structure.PageElement;
 import org.apache.tapestry5.internal.test.InternalBaseTestCase;
 import org.apache.tapestry5.ioc.Location;
+import org.apache.tapestry5.ioc.internal.util.TapestryException;
 import org.apache.tapestry5.model.ComponentModel;
 import org.apache.tapestry5.model.EmbeddedComponentModel;
 import org.apache.tapestry5.services.ComponentClassResolver;
-import org.easymock.EasyMock;
 import org.slf4j.Logger;
 import org.testng.annotations.Test;
 
@@ -97,15 +96,10 @@
         ComponentPageElement rootElement = mockComponentPageElement();
         InternalComponentResources resources = mockInternalComponentResources();
         ComponentModel model = mockComponentModel();
-        ComponentModel childModel = mockComponentModel();
         ComponentTemplate template = mockComponentTemplate();
         Logger logger = mockLogger();
         EmbeddedComponentModel emodel = mockEmbeddedComponentModel();
-        ComponentPageElement childElement = mockComponentPageElement();
-        InternalComponentResources childResources = mockInternalComponentResources();
         Location l = mockLocation();
-        PageElement body = mockPageElement();
-        ComponentTemplate childTemplate = mockComponentTemplate();
         ComponentClassResolver resolver = mockComponentClassResolver();
 
         train_resolvePageNameToClassName(resolver, LOGICAL_PAGE_NAME, PAGE_CLASS_NAME);
@@ -118,7 +112,6 @@
 
         train_getTemplate(templateSource, model, LOCALE, template);
 
-
         train_isMissing(template, false);
 
         train_getLogger(model, logger);
@@ -133,42 +126,22 @@
 
         train_getComponentType(emodel, "Barney");
 
-        train_getMixinClassNames(emodel);
-
-        logger.error(ServicesMessages.compTypeConflict("foo", "Fred", "Barney"));
-
-        train_getComponentClassName(emodel, "foo.components.Barney");
-
-        train_newComponentElement(elementFactory, rootElement, "foo", "Barney", "foo.components.Barney", null, l,
-                                  childElement);
-
-        train_getCompleteId(childElement, PAGE_CLASS_NAME + "/Barney");
-
-        train_getInheritInformalParameters(emodel, false);
-
-        rootElement.addToTemplate(childElement);
-
-        train_getParameterNames(emodel);
-
-        // Alas, what comes next is the recursive call to load the child element
-
-        train_getComponentResources(childElement, childResources);
-        train_getComponentModel(childResources, childModel);
-        train_getComponentClassName(childModel, CHILD_CLASS_NAME);
-        train_getTemplate(templateSource, childModel, LOCALE, childTemplate);
-        train_isMissing(childTemplate, true);
-
-        // This will be the RenderBody element ...
-
-        childElement.addToTemplate(EasyMock.isA(PageElement.class));
-
         replay();
 
         PageLoader loader = new PageLoaderImpl(templateSource, elementFactory, null, null, resolver);
 
-        loader.loadPage(LOGICAL_PAGE_NAME, LOCALE);
+        try
+        {
+            loader.loadPage(LOGICAL_PAGE_NAME, LOCALE);
+            unreachable();
+        }
+        catch (TapestryException ex)
+        {
+            assertEquals(ex.getMessage(),
+                         "Embedded component 'foo' provides a type attribute in the template ('Fred') as well as in the component class ('Barney'). You should not provide a type attribute in the template when defining an embedded component within the component class.");
+            assertSame(ex.getLocation(), l);
+        }
 
         verify();
     }
-
 }