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/09/12 19:19:31 UTC

svn commit: r694745 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry5/ main/java/org/apache/tapestry5/internal/services/ main/java/org/apache/tapestry5/internal/structure/ test/app1/ test/java/org/apache/tapestry5/integra...

Author: hlship
Date: Fri Sep 12 10:19:30 2008
New Revision: 694745

URL: http://svn.apache.org/viewvc?rev=694745&view=rev
Log:
TAPESTRY-2644: Add a ComponentResources.createPageLink(...) method that uses page class instead of page name

Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/ComponentResources.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageLoaderImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageLoaderProcessor.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPageCache.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/Page.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/PageImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/app1/Start.tml
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Start.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/structure/PageImplTest.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/ComponentResources.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/ComponentResources.java?rev=694745&r1=694744&r2=694745&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/ComponentResources.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/ComponentResources.java Fri Sep 12 10:19:30 2008
@@ -212,10 +212,24 @@
      *                 providing a context, when the provided context is empty)
      * @param context  the activation context for the page. If omitted, the activation context is obtained from the
      *                 target page
+     * @return link for a render request to the targetted page
      */
     Link createPageLink(String pageName, boolean override, Object... context);
 
     /**
+     * Creates a page render request link to render a specific page. Using a page class, rather than a page name, is
+     * more refactoring safe (in the even the page is renamed or moved).
+     *
+     * @param pageClass identifies the page to link to
+     * @param override  if true, the context is used even if empty (normally, the target page is allowed to passivate,
+     *                  providing a context, when the provided context is empty)
+     * @param context   the activation context for the page. If omitted, the activation context is obtained from the
+     *                  target page
+     * @return link for a render request to the targetted page
+     */
+    Link createPageLink(Class pageClass, boolean override, Object... context);
+
+    /**
      * Discards all persistent field changes for the page containing the component.  Changes are eliminated from
      * persistent storage (such as the {@link org.apache.tapestry5.services.Session}) which will take effect in the
      * <em>next</em> request (the attached page instance is not affected).

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageLoaderImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageLoaderImpl.java?rev=694745&r1=694744&r2=694745&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageLoaderImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageLoaderImpl.java Fri Sep 12 10:19:30 2008
@@ -32,17 +32,17 @@
 
     private final PersistentFieldManager persistentFieldManager;
 
-    private final ComponentClassResolver resolver;
+    private final ComponentClassResolver componentClassResolver;
 
     public PageLoaderImpl(ComponentTemplateSource templateSource,
                           PageElementFactory pageElementFactory, LinkFactory linkFactory,
-                          PersistentFieldManager persistentFieldManager, ComponentClassResolver resolver)
+                          PersistentFieldManager persistentFieldManager, ComponentClassResolver componentClassResolver)
     {
         this.templateSource = templateSource;
         this.pageElementFactory = pageElementFactory;
         this.linkFactory = linkFactory;
         this.persistentFieldManager = persistentFieldManager;
-        this.resolver = resolver;
+        this.componentClassResolver = componentClassResolver;
     }
 
     public Page loadPage(String logicalPageName, Locale locale)
@@ -52,9 +52,9 @@
 
         PageLoaderProcessor processor = new PageLoaderProcessor(templateSource,
                                                                 pageElementFactory, linkFactory,
-                                                                persistentFieldManager);
+                                                                persistentFieldManager, componentClassResolver);
 
-        String pageClassName = resolver.resolvePageNameToClassName(logicalPageName);
+        String pageClassName = componentClassResolver.resolvePageNameToClassName(logicalPageName);
 
         return processor.loadPage(logicalPageName, pageClassName, locale);
     }
@@ -67,5 +67,4 @@
     {
         fireInvalidationEvent();
     }
-
 }

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=694745&r1=694744&r2=694745&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 Fri Sep 12 10:19:30 2008
@@ -35,6 +35,7 @@
 import org.apache.tapestry5.model.EmbeddedComponentModel;
 import org.apache.tapestry5.runtime.RenderQueue;
 import org.apache.tapestry5.services.BindingSource;
+import org.apache.tapestry5.services.ComponentClassResolver;
 import org.slf4j.Logger;
 
 import java.util.List;
@@ -90,6 +91,8 @@
 
     private final LinkFactory linkFactory;
 
+    private final ComponentClassResolver componentClassResolver;
+
     private ComponentModel loadingComponentModel;
 
     private ComponentPageElement loadingElement;
@@ -144,12 +147,14 @@
     }
 
     PageLoaderProcessor(ComponentTemplateSource templateSource, PageElementFactory pageElementFactory,
-                        LinkFactory linkFactory, PersistentFieldManager persistentFieldManager)
+                        LinkFactory linkFactory, PersistentFieldManager persistentFieldManager,
+                        ComponentClassResolver componentClassResolver)
     {
         this.templateSource = templateSource;
         this.pageElementFactory = pageElementFactory;
         this.linkFactory = linkFactory;
         this.persistentFieldManager = persistentFieldManager;
+        this.componentClassResolver = componentClassResolver;
     }
 
     private void bindParameterFromTemplate(ComponentPageElement component, AttributeToken token)
@@ -386,7 +391,10 @@
 
         this.locale = locale;
 
-        page = new PageImpl(logicalPageName, this.locale, linkFactory, persistentFieldManager);
+        // Todo: Need a resources object for Pages, not just ComponentPageElement ... too many
+        // parameters here.
+
+        page = new PageImpl(logicalPageName, this.locale, linkFactory, persistentFieldManager, componentClassResolver);
 
         loadRootComponent(pageClassName);
 
@@ -705,7 +713,6 @@
                 {
                     handleInformalParameters(loadingElement, embeddedModel, newComponent, newComponentModel,
                                              newComponentBindings);
-
                 }
             };
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPageCache.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPageCache.java?rev=694745&r1=694744&r2=694745&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPageCache.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPageCache.java Fri Sep 12 10:19:30 2008
@@ -20,7 +20,6 @@
  * Per-thread service that caches page instances for the duration of the request, and is also responsible for tracking
  * the active page (the page which will ultimately render the response).
  * <p/>
- * <p/>
  * Since {@link org.apache.tapestry5.internal.structure.Page} is internal, most user-code should use the {@link
  * org.apache.tapestry5.services.ComponentSource} service instead.
  */

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java?rev=694745&r1=694744&r2=694745&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java Fri Sep 12 10:19:30 2008
@@ -145,6 +145,11 @@
         return page.createPageRenderLink(pageName, override, context);
     }
 
+    public Link createPageLink(Class pageClass, boolean override, Object... context)
+    {
+        return page.createPageRenderLink(pageClass, override, context);
+    }
+
     public void discardPersistentFieldChanges()
     {
         page.discardPersistentFieldChanges();

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/Page.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/Page.java?rev=694745&r1=694744&r2=694745&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/Page.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/Page.java Fri Sep 12 10:19:30 2008
@@ -127,6 +127,13 @@
     Link createPageRenderLink(String pageName, boolean override, Object... context);
 
     /**
+     * Creates a link to the named page.
+     *
+     * @see org.apache.tapestry5.ComponentResources#createPageLink(Class, boolean, Object[])
+     */
+    Link createPageRenderLink(Class pageClass, boolean override, Object... context);
+
+    /**
      * Posts a change to a persistent field.
      *
      * @param resources the component resources for the component or mixin containing the field whose value changed

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/PageImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/PageImpl.java?rev=694745&r1=694744&r2=694745&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/PageImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/PageImpl.java Fri Sep 12 10:19:30 2008
@@ -19,10 +19,12 @@
 import org.apache.tapestry5.internal.services.LinkFactory;
 import org.apache.tapestry5.internal.services.PersistentFieldManager;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
+import org.apache.tapestry5.ioc.internal.util.Defense;
 import static org.apache.tapestry5.ioc.internal.util.Defense.notNull;
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
 import org.apache.tapestry5.runtime.Component;
 import org.apache.tapestry5.runtime.PageLifecycleListener;
+import org.apache.tapestry5.services.ComponentClassResolver;
 import org.apache.tapestry5.services.PersistentFieldBundle;
 import org.slf4j.Logger;
 
@@ -39,6 +41,8 @@
 
     private final PersistentFieldManager persistentFieldManager;
 
+    private final ComponentClassResolver componentClassResolver;
+
     private ComponentPageElement rootElement;
 
     private final List<PageLifecycleListener> listeners = CollectionFactory.newList();
@@ -52,12 +56,13 @@
     private PersistentFieldBundle fieldBundle;
 
     public PageImpl(String logicalPageName, Locale locale, LinkFactory linkFactory,
-                    PersistentFieldManager persistentFieldManager)
+                    PersistentFieldManager persistentFieldManager, ComponentClassResolver componentClassResolver)
     {
         this.logicalPageName = logicalPageName;
         this.locale = locale;
         this.linkFactory = linkFactory;
         this.persistentFieldManager = persistentFieldManager;
+        this.componentClassResolver = componentClassResolver;
     }
 
     @Override
@@ -161,6 +166,15 @@
         return linkFactory.createPageLink(pageName, override, context);
     }
 
+    public Link createPageRenderLink(Class pageClass, boolean override, Object... context)
+    {
+        Defense.notNull(pageClass, "pageClass");
+
+        String pageName = componentClassResolver.resolvePageClassNameToPageName(pageClass.getName());
+
+        return linkFactory.createPageLink(pageName, override, context);
+    }
+
     public void persistFieldChange(ComponentResources resources, String fieldName, Object newValue)
     {
         persistentFieldManager.postChange(logicalPageName, resources, fieldName, newValue);

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/app1/Start.tml
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/app1/Start.tml?rev=694745&r1=694744&r2=694745&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/app1/Start.tml (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/app1/Start.tml Fri Sep 12 10:19:30 2008
@@ -17,6 +17,12 @@
 
     <ul>
         <li>
+            <a href="${injectDemoLink}">PageLink via Class Demo</a>
+            -- use ComponentResources to generate a link to a page using target
+            page class, not logical page name
+        </li>
+
+        <li>
             <a href="BadTemplate">BadTemplate Page</a>
             -- More exception reporting
         </li>

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java?rev=694745&r1=694744&r2=694745&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/IntegrationTests.java Fri Sep 12 10:19:30 2008
@@ -2256,4 +2256,14 @@
         assertTextPresent(
                 "Error obtaining injected value for field org.apache.tapestry5.integration.app1.pages.FailedInjectDemo.buffer: No service implements the interface java.lang.StringBuffer.");
     }
+
+    /**
+     * TAPESTRTY-2644
+     */
+    public void create_page_link_via_page_class()
+    {
+        start("PageLink via Class Demo");
+
+        assertTextPresent("Demonstrates the use of the @Inject annotation.");
+    }
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Start.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Start.java?rev=694745&r1=694744&r2=694745&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Start.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Start.java Fri Sep 12 10:19:30 2008
@@ -14,7 +14,10 @@
 
 package org.apache.tapestry5.integration.app1.pages;
 
+import org.apache.tapestry5.ComponentResources;
+import org.apache.tapestry5.Link;
 import org.apache.tapestry5.annotations.InjectPage;
+import org.apache.tapestry5.ioc.annotations.Inject;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 
 import java.util.Arrays;
@@ -25,7 +28,7 @@
  * Have to start somewhere!
  */
 public class Start
-{    
+{
     public static class Item implements Comparable<Item>
     {
         private final String pageName;
@@ -293,6 +296,9 @@
     @InjectPage
     private SecurePage securePage;
 
+    @Inject
+    private ComponentResources resources;
+
     public List<Item> getItems()
     {
         return ITEMS;
@@ -313,6 +319,11 @@
         return securePage.initialize("Triggered from Start");
     }
 
+    public Link getInjectDemoLink()
+    {
+        return resources.createPageLink(InjectDemo.class, false);
+    }
+
     public List getDemoContext()
     {
         return Arrays.asList(1, 2, 3);

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/structure/PageImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/structure/PageImplTest.java?rev=694745&r1=694744&r2=694745&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/structure/PageImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/structure/PageImplTest.java Fri Sep 12 10:19:30 2008
@@ -36,7 +36,7 @@
 
         replay();
 
-        Page page = new PageImpl(LOGICAL_PAGE_NAME, locale, null, null);
+        Page page = new PageImpl(LOGICAL_PAGE_NAME, locale, null, null, null);
 
         assertNull(page.getRootElement());
 
@@ -60,7 +60,7 @@
 
         replay();
 
-        Page page = new PageImpl(null, locale, null, null);
+        Page page = new PageImpl(null, locale, null, null, null);
 
         page.addLifecycleListener(listener1);
         page.addLifecycleListener(listener2);
@@ -82,7 +82,7 @@
 
         replay();
 
-        Page page = new PageImpl(null, locale, null, null);
+        Page page = new PageImpl(null, locale, null, null, null);
 
         page.addLifecycleListener(listener);
 
@@ -116,7 +116,7 @@
 
         replay();
 
-        Page page = new PageImpl(null, locale, null, null);
+        Page page = new PageImpl(null, locale, null, null, null);
         page.setRootElement(element);
 
         page.addLifecycleListener(listener1);
@@ -125,7 +125,6 @@
         assertTrue(page.detached());
 
         verify();
-
     }
 
     protected final void train_getLogger(ComponentPageElement element, Logger logger)
@@ -145,7 +144,7 @@
 
         replay();
 
-        Page page = new PageImpl(null, locale, null, null);
+        Page page = new PageImpl(null, locale, null, null, null);
 
         page.addLifecycleListener(listener1);
         page.addLifecycleListener(listener2);
@@ -171,7 +170,7 @@
 
         replay();
 
-        Page page = new PageImpl(LOGICAL_PAGE_NAME, locale, null, null);
+        Page page = new PageImpl(LOGICAL_PAGE_NAME, locale, null, null, null);
 
         page.addLifecycleListener(listener1);
         page.addLifecycleListener(listener2);
@@ -188,7 +187,7 @@
 
         replay();
 
-        Page page = new PageImpl(LOGICAL_PAGE_NAME, locale, null, null);
+        Page page = new PageImpl(LOGICAL_PAGE_NAME, locale, null, null, null);
 
         page.setRootElement(root);