Author: dashorst
Date: Tue Apr 26 16:02:55 2011
New Revision: 1096794

URL: http://svn.apache.org/viewvc?rev=1096794&view=rev
Log:
Fixed a regression between Wicket 1.4 and 1.5, where markup ID 
generation/retrieval caused runtime exceptions in cases where the component was 
not added to the Page yet. Improved the semantics of Component#getMarkupId() 
and encased it in a couple unit tests.
Issue: WICKET-3647

Added:
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/ComponentMarkupIdTest.java
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/ComponentMarkupIdTestPage.html
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/ComponentMarkupIdTestPage.java
Modified:
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/Component.java

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/Component.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/Component.java?rev=1096794&r1=1096793&r2=1096794&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/Component.java 
(original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/Component.java Tue 
Apr 26 16:02:55 2011
@@ -1499,18 +1499,20 @@ public abstract class Component
         */
        public final Object getMarkupIdImpl()
        {
-               String id = getMarkupIdFromMarkup();
-               if (id != null)
-               {
-                       return id;
-               }
-
                if (generatedMarkupId != -1)
                {
                        return generatedMarkupId;
                }
 
-               return getMetaData(MARKUP_ID_KEY);
+               String id = getMetaData(MARKUP_ID_KEY);
+
+               // if still no markup id is found, and the component has been 
attached to a page, try to
+               // retrieve the id from the markup file.
+               if (id == null && findPage() != null)
+               {
+                       id = getMarkupIdFromMarkup();
+               }
+               return id;
        }
 
        /**

Added: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/ComponentMarkupIdTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/ComponentMarkupIdTest.java?rev=1096794&view=auto
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/ComponentMarkupIdTest.java
 (added)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/ComponentMarkupIdTest.java
 Tue Apr 26 16:02:55 2011
@@ -0,0 +1,162 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.wicket.markup.html;
+
+import junit.framework.Assert;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.panel.EmptyPanel;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.util.tester.WicketTester;
+import org.junit.Test;
+
+/**
+ * Unit test to ensure that calling {@link Component#getMarkupId()} still 
works as advertised in
+ * Wicket 1.4.
+ */
+public class ComponentMarkupIdTest
+{
+       /** */
+       @Test
+       public void idGeneratedWhenComponentNotAddedToPage()
+       {
+               WicketTester tester = new WicketTester();
+
+               // In wicket 1.4 the following sequence would not cause an 
exception
+               Label label = new Label("bla", "Hello, World!");
+
+               // however in 1.5 the following statement generated a 
MarkupNotFoundException
+               String markupId = label.getMarkupId();
+
+               // instead 1.4 would just generate the missing markup identifier
+               Assert.assertEquals("bla1", markupId);
+       }
+
+       /** */
+       @Test
+       public void idGeneratedWhenPanelNotAddedToPage()
+       {
+               WicketTester tester = new WicketTester();
+
+               // In wicket 1.4 the following sequence would not cause an 
exception
+               Panel panel = new EmptyPanel("bla");
+
+               // however in 1.5 the following statement generated a 
WicketRuntimeException
+               // that the markup type could not be determined
+               String markupId = panel.getMarkupId();
+
+               // instead 1.4 would just generate the missing markup identifier
+               Assert.assertEquals("bla1", markupId);
+       }
+
+       /**
+        * This tests the expected behavior where the DOM id for the component 
is retrieved from the
+        * markup file, when the component has been added to the page.
+        */
+       @Test
+       public void idFromMarkupRetrievedWhenPanelAddedToPage()
+       {
+               WicketTester tester = new WicketTester();
+
+               ComponentMarkupIdTestPage page = new 
ComponentMarkupIdTestPage();
+               tester.startPage(page);
+               tester.assertRenderedPage(ComponentMarkupIdTestPage.class);
+
+               Assert.assertEquals("markupPanel", 
page.markupPanel.getMarkupId());
+       }
+
+       /**
+        * This tests the expected behavior where the DOM id for the component 
is retrieved from the
+        * markup file, when the component has been added to the page.
+        */
+       @Test
+       public void idFromMarkupRetrievedWhenLabelAddedToPage()
+       {
+               WicketTester tester = new WicketTester();
+
+               ComponentMarkupIdTestPage page = new 
ComponentMarkupIdTestPage();
+               tester.startPage(page);
+               tester.assertRenderedPage(ComponentMarkupIdTestPage.class);
+
+               Assert.assertEquals("markupLabel", 
page.markupLabel.getMarkupId());
+       }
+
+       /**
+        * Tests that a generated ID is kept, even if an identifier in the 
markup was set.
+        */
+       @Test
+       public void generatedIdOverridesIdFromMarkupWhenLabelAddedToPage()
+       {
+               WicketTester tester = new WicketTester();
+
+               ComponentMarkupIdTestPage page = new 
ComponentMarkupIdTestPage();
+               tester.startPage(page);
+               tester.assertRenderedPage(ComponentMarkupIdTestPage.class);
+
+               Assert.assertEquals("generatedLabel1", 
page.generatedLabelMarkupId);
+               Assert.assertEquals("generatedLabel1", 
page.generatedLabel.getMarkupId());
+       }
+
+       /**
+        * Tests that a generated ID is kept, even if an identifier in the 
markup was set.
+        */
+       @Test
+       public void generatedIdOverridesIdFromMarkup()
+       {
+               WicketTester tester = new WicketTester();
+
+               ComponentMarkupIdTestPage page = new 
ComponentMarkupIdTestPage();
+               tester.startPage(page);
+               tester.assertRenderedPage(ComponentMarkupIdTestPage.class);
+
+               Assert.assertEquals("generatedPanel2", 
page.generatedPanelMarkupId);
+               Assert.assertEquals("generatedPanel2", 
page.generatedPanel.getMarkupId());
+       }
+
+       /**
+        * Tests that a ID set from Java code using {@link 
Component#setOutputMarkupId(boolean)} is
+        * kept, even if an identifier in the markup was set.
+        */
+       @Test
+       public void fixedIdFromJavaForLabelOverridesIdFromMarkup()
+       {
+               WicketTester tester = new WicketTester();
+
+               ComponentMarkupIdTestPage page = new 
ComponentMarkupIdTestPage();
+               tester.startPage(page);
+               tester.assertRenderedPage(ComponentMarkupIdTestPage.class);
+
+               Assert.assertEquals("javaLabel", page.fixedLabel.getMarkupId());
+       }
+
+       /**
+        * Tests that a ID set from Java code using {@link 
Component#setOutputMarkupId(boolean)} is
+        * kept, even if an identifier in the markup was set.
+        */
+       @Test
+       public void fixedIdFromJavaForPanelOverridesIdFromMarkup()
+       {
+               WicketTester tester = new WicketTester();
+
+               ComponentMarkupIdTestPage page = new 
ComponentMarkupIdTestPage();
+               tester.startPage(page);
+               tester.assertRenderedPage(ComponentMarkupIdTestPage.class);
+
+               Assert.assertEquals("javaPanel", page.fixedPanel.getMarkupId());
+       }
+}

Added: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/ComponentMarkupIdTestPage.html
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/ComponentMarkupIdTestPage.html?rev=1096794&view=auto
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/ComponentMarkupIdTestPage.html
 (added)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/ComponentMarkupIdTestPage.html
 Tue Apr 26 16:02:55 2011
@@ -0,0 +1,13 @@
+<html xmlns:wicket>
+<head><title></title></head>
+<body>
+       <h1 id="markupLabel" wicket:id="markupLabel">Label with markup ID 
defined in markup</h1>
+       <div id="markupPanel" wicket:id="markupPanel">Panel with markup ID 
defined in markup</div>
+
+       <h1 id="generatedLabel" wicket:id="generatedLabel">Label with markup ID 
generated</h1>
+       <div id="generatedLabel" wicket:id="generatedPanel">Panel with markup 
ID generated</div>
+
+       <h1 id="fixedLabel" wicket:id="fixedLabel">Label with markup ID set in 
Java</h1>
+       <div id="fixedLabel" wicket:id="fixedPanel">Panel with markup ID set in 
Java</div>
+</body>
+</html>
\ No newline at end of file

Added: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/ComponentMarkupIdTestPage.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/ComponentMarkupIdTestPage.java?rev=1096794&view=auto
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/ComponentMarkupIdTestPage.java
 (added)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/ComponentMarkupIdTestPage.java
 Tue Apr 26 16:02:55 2011
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.wicket.markup.html;
+
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.panel.EmptyPanel;
+
+/** */
+public class ComponentMarkupIdTestPage extends WebPage
+{
+       private static final long serialVersionUID = 1L;
+
+       final Label markupLabel = new Label("markupLabel", "Hello, World!");
+       final EmptyPanel markupPanel = new EmptyPanel("markupPanel");
+
+       final Label generatedLabel = new Label("generatedLabel", "Hello, 
World!");
+       final EmptyPanel generatedPanel = new EmptyPanel("generatedPanel");
+
+       final String generatedLabelMarkupId;
+       final String generatedPanelMarkupId;
+
+       final Label fixedLabel = new Label("fixedLabel", "Hello, World!");
+       final EmptyPanel fixedPanel = new EmptyPanel("fixedPanel");
+
+       /** */
+       public ComponentMarkupIdTestPage()
+       {
+               add(markupLabel);
+               add(markupPanel);
+
+               generatedLabelMarkupId = generatedLabel.getMarkupId();
+               generatedPanelMarkupId = generatedPanel.getMarkupId();
+
+               add(generatedLabel);
+               add(generatedPanel);
+
+               fixedLabel.setMarkupId("javaLabel");
+               fixedPanel.setMarkupId("javaPanel");
+
+               add(fixedLabel);
+               add(fixedPanel);
+       }
+}


Reply via email to