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();
+
+ }
+}