You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2008/05/14 03:19:03 UTC

svn commit: r656073 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry/corelib/components/Any.java test/java/org/apache/tapestry/corelib/components/AnyTest.java

Author: hlship
Date: Tue May 13 18:19:02 2008
New Revision: 656073

URL: http://svn.apache.org/viewvc?rev=656073&view=rev
Log:
TAPESTRY-2388: The Any component should be a ClientElement

Added:
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/corelib/components/AnyTest.java
Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/Any.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/Any.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/Any.java?rev=656073&r1=656072&r2=656073&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/Any.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/Any.java Tue May 13 18:19:02 2008
@@ -14,25 +14,37 @@
 
 package org.apache.tapestry.corelib.components;
 
-import org.apache.tapestry.ComponentResources;
-import org.apache.tapestry.MarkupWriter;
-import org.apache.tapestry.TapestryConstants;
+import org.apache.tapestry.*;
 import org.apache.tapestry.annotations.Parameter;
 import org.apache.tapestry.annotations.SupportsInformalParameters;
+import org.apache.tapestry.dom.Element;
 import org.apache.tapestry.ioc.annotations.Inject;
 
 /**
  * Renders an arbitrary element including informal parameters.
  */
 @SupportsInformalParameters
-public class Any
+public class Any implements ClientElement
 {
     @Parameter(defaultPrefix = TapestryConstants.LITERAL_BINDING_PREFIX)
     private String element;
 
+    /**
+     * The desired client id, which defaults to the components id.
+     */
+    @Parameter(value = "prop:componentResources.id", defaultPrefix = TapestryConstants.LITERAL_BINDING_PREFIX)
+    private String clientId;
+
+    private Element anyElement;
+
+    private String uniqueId;
+
     @Inject
     private ComponentResources resources;
 
+    @Inject
+    private PageRenderSupport pageRenderSupport;
+
     String defaultElement()
     {
         return resources.getElementName("div");
@@ -40,13 +52,42 @@
 
     void beginRender(MarkupWriter writer)
     {
-        writer.element(element);
+        anyElement = writer.element(element);
+
+        uniqueId = null;
 
         resources.renderInformalParameters(writer);
     }
 
+    /**
+     * Returns the client id.  This has side effects: this first time this is called (after the Any component renders
+     * its start tag), a unique id is allocated (based on, and typically the same as, the clientId parameter, which
+     * defaults to the component's id). The rendered element is updated, with its id attribute set to the unique client
+     * id, which is then returned.
+     *
+     * @return unique client id for this component
+     */
+    public String getClientId()
+    {
+        if (uniqueId == null)
+        {
+            uniqueId = pageRenderSupport.allocateClientId(clientId);
+            anyElement.forceAttributes("id", clientId);
+        }
+
+        return uniqueId;
+    }
+
     void afterRender(MarkupWriter writer)
     {
         writer.end(); // the element
     }
+
+    void inject(PageRenderSupport support, ComponentResources resources, String element, String clientId)
+    {
+        this.pageRenderSupport = support;
+        this.resources = resources;
+        this.element = element;
+        this.clientId = clientId;
+    }
 }

Added: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/corelib/components/AnyTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/corelib/components/AnyTest.java?rev=656073&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/corelib/components/AnyTest.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/corelib/components/AnyTest.java Tue May 13 18:19:02 2008
@@ -0,0 +1,86 @@
+// 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.components;
+
+import org.apache.tapestry.ComponentResources;
+import org.apache.tapestry.MarkupWriter;
+import org.apache.tapestry.PageRenderSupport;
+import org.apache.tapestry.dom.DefaultMarkupModel;
+import org.apache.tapestry.internal.services.MarkupWriterImpl;
+import org.apache.tapestry.test.TapestryTestCase;
+import org.testng.annotations.Test;
+
+public class AnyTest extends TapestryTestCase
+{
+    @Test
+    public void render_simple()
+    {
+        ComponentResources resources = mockComponentResources();
+        PageRenderSupport support = mockPageRenderSupport();
+
+        MarkupWriter writer = new MarkupWriterImpl(new DefaultMarkupModel());
+
+        resources.renderInformalParameters(writer);
+
+        replay();
+
+        Any component = new Any();
+        component.inject(support, resources, "span", "foo");
+
+        component.beginRender(writer);
+        writer.write("content");
+        component.afterRender(writer);
+
+        assertEquals(writer.toString(), "<span>content</span>");
+
+        verify();
+    }
+
+    @Test
+    public void render_with_id()
+    {
+        ComponentResources resources = mockComponentResources();
+        PageRenderSupport support = mockPageRenderSupport();
+
+        MarkupWriter writer = new MarkupWriterImpl(new DefaultMarkupModel());
+
+        resources.renderInformalParameters(writer);
+
+        String clientId = "bar";
+        String uniqueId = "bar_0";
+
+        expect(support.allocateClientId(clientId)).andReturn(uniqueId);
+
+        replay();
+
+        Any component = new Any();
+        component.inject(support, resources, "div", clientId);
+
+        component.beginRender(writer);
+        writer.write("content");
+        component.afterRender(writer);
+
+        assertEquals(writer.toString(), "<div>content</div>");
+
+        assertEquals(component.getClientId(), uniqueId);
+
+        assertEquals(writer.toString(), "<div id=\"bar\">content</div>");
+
+        assertEquals(component.getClientId(), uniqueId);
+
+        verify();
+
+    }
+}