You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by th...@apache.org on 2024/03/04 19:04:09 UTC

(wicket) branch master updated: WICKET-6890 Introduce strategy for class name debug output (#781)

This is an automated email from the ASF dual-hosted git repository.

theigl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/wicket.git


The following commit(s) were added to refs/heads/master by this push:
     new c42afcd1de WICKET-6890 Introduce strategy for class name debug output (#781)
c42afcd1de is described below

commit c42afcd1dedf9ffb99f3aa7628768b5c79743a23
Author: Thomas Heigl <th...@gmail.com>
AuthorDate: Mon Mar 4 20:04:03 2024 +0100

    WICKET-6890 Introduce strategy for class name debug output (#781)
    
    * WICKET-6890 Introduce strategy for class name debug output
    
    * WICKET-6890 Support setting class output strategy via JMX
    
    * WICKET-6890 JavaDoc
    
    ---------
    
    Co-authored-by: Martin Grigorov <ma...@users.noreply.github.com>
---
 ...OutputMarkupContainerClassNameBehaviorTest.java | 26 ++++++--
 .../java/org/apache/wicket/MarkupContainer.java    | 23 ++++++-
 .../src/main/java/org/apache/wicket/Page.java      |  2 +-
 .../OutputMarkupContainerClassNameBehavior.java    |  4 +-
 .../org/apache/wicket/settings/DebugSettings.java  | 71 ++++++++++++++++++++--
 .../org/apache/wicket/jmx/DebugSettingsMBean.java  | 14 ++++-
 .../apache/wicket/jmx/wrapper/DebugSettings.java   |  6 ++
 7 files changed, 127 insertions(+), 19 deletions(-)

diff --git a/wicket-core-tests/src/test/java/org/apache/wicket/behavior/OutputMarkupContainerClassNameBehaviorTest.java b/wicket-core-tests/src/test/java/org/apache/wicket/behavior/OutputMarkupContainerClassNameBehaviorTest.java
index 77de9af69c..782ff1186d 100644
--- a/wicket-core-tests/src/test/java/org/apache/wicket/behavior/OutputMarkupContainerClassNameBehaviorTest.java
+++ b/wicket-core-tests/src/test/java/org/apache/wicket/behavior/OutputMarkupContainerClassNameBehaviorTest.java
@@ -21,15 +21,16 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.apache.wicket.MockPanelWithLink;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.settings.DebugSettings;
 import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.Test;
 
 class OutputMarkupContainerClassNameBehaviorTest extends WicketTestCase {
 
     @Test
-    void whenDebugIsEnabled_thenRenderAttribute()
+    void whenDebugIsEnabledWithAttribute_thenRenderAttribute()
     {
-        tester.getApplication().getDebugSettings().setOutputMarkupContainerClassName(true);
+        tester.getApplication().getDebugSettings().setOutputMarkupContainerClassNameStrategy(DebugSettings.ClassOutputStrategy.TAG_ATTRIBUTE);
 
         MockPanelWithLink component = new MockPanelWithLink("test") {
             @Override
@@ -43,9 +44,25 @@ class OutputMarkupContainerClassNameBehaviorTest extends WicketTestCase {
     }
 
     @Test
-    void whenDebugIsDisabled_thenDontRenderAttribute()
+    void whenDebugIsEnabledWithComment_thenRenderComment()
     {
-        tester.getApplication().getDebugSettings().setOutputMarkupContainerClassName(false);
+        tester.getApplication().getDebugSettings().setOutputMarkupContainerClassNameStrategy(DebugSettings.ClassOutputStrategy.HTML_COMMENT);
+
+        MockPanelWithLink component = new MockPanelWithLink("test") {
+            @Override
+            protected void onLinkClick(AjaxRequestTarget target) {
+
+            }
+        };
+        tester.startComponentInPage(component);
+
+        assertTrue(tester.getLastResponseAsString().contains("<!-- MARKUP FOR org.apache.wicket.MockPanelWithLink BEGIN -->"));
+    }
+
+    @Test
+    void whenDebugIsDisabled_thenDontRenderAttributeOrComment()
+    {
+        tester.getApplication().getDebugSettings().setOutputMarkupContainerClassNameStrategy(DebugSettings.ClassOutputStrategy.NONE);
 
         MockPanelWithLink component = new MockPanelWithLink("test") {
             @Override
@@ -56,5 +73,6 @@ class OutputMarkupContainerClassNameBehaviorTest extends WicketTestCase {
         tester.startComponentInPage(component);
 
         assertFalse(tester.getLastResponseAsString().contains("<wicket:panel wicket:className=\"org.apache.wicket.MockPanelWithLink\">"));
+        assertFalse(tester.getLastResponseAsString().contains("<!-- MARKUP FOR org.apache.wicket.MockPanelWithLink BEGIN -->"));
     }
 }
diff --git a/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
index 8703c61635..fbd83ea012 100644
--- a/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
+++ b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
@@ -787,9 +787,10 @@ public abstract class MarkupContainer extends Component implements Iterable<Comp
 		try
 		{
 			setIgnoreAttributeModifier(true);
-			final boolean outputClassName = getApplication().getDebugSettings()
-					.isOutputMarkupContainerClassName();
-			if (outputClassName)
+			
+			final DebugSettings.ClassOutputStrategy outputClassName = getApplication().getDebugSettings()
+					.getOutputMarkupContainerClassNameStrategy();
+			if (outputClassName == DebugSettings.ClassOutputStrategy.TAG_ATTRIBUTE)
 			{
 				associatedMarkupOpenTag.addBehavior(OutputMarkupContainerClassNameBehavior.INSTANCE);
 			}
@@ -797,8 +798,24 @@ public abstract class MarkupContainer extends Component implements Iterable<Comp
 			renderComponentTag(associatedMarkupOpenTag);
 			associatedMarkupStream.next();
 
+			String className = null;
+			if (outputClassName == DebugSettings.ClassOutputStrategy.HTML_COMMENT)
+			{
+				className = Classes.name(getClass());
+				getResponse().write("<!-- MARKUP FOR ");
+				getResponse().write(className);
+				getResponse().write(" BEGIN -->");
+			}
+
 			renderComponentTagBody(associatedMarkupStream, associatedMarkupOpenTag);
 
+			if (outputClassName == DebugSettings.ClassOutputStrategy.HTML_COMMENT)
+			{
+				getResponse().write("<!-- MARKUP FOR ");
+				getResponse().write(className);
+				getResponse().write(" END -->");
+			}
+
 			renderClosingComponentTag(associatedMarkupStream, associatedMarkupOpenTag, false);
 		}
 		finally
diff --git a/wicket-core/src/main/java/org/apache/wicket/Page.java b/wicket-core/src/main/java/org/apache/wicket/Page.java
index 956b9b59af..bf758ab815 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Page.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Page.java
@@ -829,7 +829,7 @@ public abstract class Page extends MarkupContainer
 
 		if (getApplication().getDebugSettings().isOutputMarkupContainerClassName())
 		{
-			String className = Classes.name(getClass());
+			final String className = Classes.name(getClass());
 			getResponse().write("<!-- Page Class ");
 			getResponse().write(className);
 			getResponse().write(" END -->\n");
diff --git a/wicket-core/src/main/java/org/apache/wicket/behavior/OutputMarkupContainerClassNameBehavior.java b/wicket-core/src/main/java/org/apache/wicket/behavior/OutputMarkupContainerClassNameBehavior.java
index 8783d01533..3ffa2da88e 100644
--- a/wicket-core/src/main/java/org/apache/wicket/behavior/OutputMarkupContainerClassNameBehavior.java
+++ b/wicket-core/src/main/java/org/apache/wicket/behavior/OutputMarkupContainerClassNameBehavior.java
@@ -28,9 +28,9 @@ import org.apache.wicket.util.lang.Classes;
  * the markup element of {@link ComponentTag} with value the fully
  * qualified class name of the markup container.</p>
  *
- * <p>It is used internally by Wicket when {@link DebugSettings#isOutputMarkupContainerClassName()} is active.</p>
+ * <p>It is used internally by Wicket when {@link org.apache.wicket.settings.DebugSettings.ClassOutputStrategy#TAG_ATTRIBUTE} is active.</p>
  *
- * @see DebugSettings#setOutputMarkupContainerClassName(boolean) 
+ * @see DebugSettings#setOutputMarkupContainerClassNameStrategy(DebugSettings.ClassOutputStrategy)  
  */
 public class OutputMarkupContainerClassNameBehavior extends Behavior {
 
diff --git a/wicket-core/src/main/java/org/apache/wicket/settings/DebugSettings.java b/wicket-core/src/main/java/org/apache/wicket/settings/DebugSettings.java
index 92d393ea3a..8d2883fca1 100644
--- a/wicket-core/src/main/java/org/apache/wicket/settings/DebugSettings.java
+++ b/wicket-core/src/main/java/org/apache/wicket/settings/DebugSettings.java
@@ -16,6 +16,8 @@
  */
 package org.apache.wicket.settings;
 
+import org.apache.wicket.util.lang.Args;
+
 /**
  * Settings class for various debug settings
  * <p>
@@ -54,7 +56,7 @@ public class DebugSettings
 	/**
 	 * Whether the container's class name should be printed to response (in a html comment).
 	 */
-	private boolean outputMarkupContainerClassName = false;
+	private ClassOutputStrategy outputMarkupContainerClassNameStrategy = ClassOutputStrategy.NONE;
 
 	private String componentPathAttributeName = null;
 
@@ -104,14 +106,26 @@ public class DebugSettings
 	}
 
 	/**
-	 * Returns whether the output of markup container's should be wrapped by comments containing the
-	 * container's class name.
+	 * Returns whether the output of markup container's should contain the
+	 * container's Java class name.
 	 *
-	 * @return true if the markup container's class name should be written to response
+	 * @return true if the markup container's Java class name should be written to response
+	 * @deprecated use {@link #getOutputMarkupContainerClassNameStrategy()} instead
 	 */
+	@Deprecated(forRemoval = true)
 	public boolean isOutputMarkupContainerClassName()
 	{
-		return outputMarkupContainerClassName;
+		return outputMarkupContainerClassNameStrategy != ClassOutputStrategy.NONE;
+	}
+
+	/**
+	 * Returns the strategy for outputting the Java class name of a markup container
+	 * 
+	 * @return the strategy for outputting the Java class name of a markup container
+	 */
+	public ClassOutputStrategy getOutputMarkupContainerClassNameStrategy() 
+	{
+		return outputMarkupContainerClassNameStrategy;
 	}
 
 	/**
@@ -173,13 +187,39 @@ public class DebugSettings
 	 *
 	 * @param enable
 	 * @return {@code this} object for chaining
+	 * @deprecated use {@link #setOutputMarkupContainerClassNameStrategy(ClassOutputStrategy)} instead
 	 */
+	@Deprecated(forRemoval = true)
 	public DebugSettings setOutputMarkupContainerClassName(boolean enable)
 	{
-		outputMarkupContainerClassName = enable;
+		outputMarkupContainerClassNameStrategy = enable ? ClassOutputStrategy.HTML_COMMENT : ClassOutputStrategy.NONE;
+		return this;
+	}
+
+	/**
+	 * Sets the strategy for outputting the Java class name of a markup container in the HTML output.
+	 * 
+	 * @param strategy
+	 * @return {@code this} object for chaining
+	 */
+	public DebugSettings setOutputMarkupContainerClassNameStrategy(ClassOutputStrategy strategy) 
+	{
+		outputMarkupContainerClassNameStrategy = Args.notNull(strategy, "strategy");
 		return this;
 	}
 
+	/**
+	 * Sets the strategy for outputting the Java class name of a markup container in the HTML output.
+	 *
+	 * @param strategyName the enum name of the {@link ClassOutputStrategy} to use
+	 * @return {@code this} object for chaining
+	 */
+	public DebugSettings setOutputMarkupContainerClassNameStrategy(String strategyName)
+	{
+		final ClassOutputStrategy strategy = Enum.valueOf(ClassOutputStrategy.class, strategyName);
+		return setOutputMarkupContainerClassNameStrategy(strategy);
+	}
+
 	/**
 	 * If the parameter value is non-empty then Wicket will use it as the name of an attribute of the
 	 * component tag to print the {@link org.apache.wicket.Component}'s path.
@@ -233,4 +273,23 @@ public class DebugSettings
 	{
 		return developmentUtilitiesEnabled;
 	}
+	
+	/**
+	 * Strategy for outputting the Java class name of a markup container
+	 */
+	public enum ClassOutputStrategy 
+	{
+		/**
+		 * Output the container's class name in an HTML comment
+		 */
+		HTML_COMMENT, 
+		/**
+		 * Output the container's class name in a tag attribute
+		 */
+		TAG_ATTRIBUTE, 
+		/**
+		 * Do not output the container's class name
+		 */
+		NONE
+	}
 }
diff --git a/wicket-jmx/src/main/java/org/apache/wicket/jmx/DebugSettingsMBean.java b/wicket-jmx/src/main/java/org/apache/wicket/jmx/DebugSettingsMBean.java
index 283f5ed6e4..1374ea2185 100644
--- a/wicket-jmx/src/main/java/org/apache/wicket/jmx/DebugSettingsMBean.java
+++ b/wicket-jmx/src/main/java/org/apache/wicket/jmx/DebugSettingsMBean.java
@@ -72,14 +72,22 @@ public interface DebugSettingsMBean
 	 * class name. (Useful for determining which part of page belongs to which markup file).
 	 * 
 	 * @param enable
+	 * @deprecated use {@link #setOutputMarkupContainerClassNameStrategy(String)} instead
 	 */
 	void setOutputMarkupContainerClassName(boolean enable);
 
 	/**
-	 * Returns whether the output of markup container's should be wrapped by comments containing the
-	 * container's class name.
+	 * Sets the strategy for outputting the Java class name of a markup container in the HTML output.
+	 * (Useful for determining which part of page belongs to which markup file).
+	 *
+	 * @param strategyName the enum name of the class output strategy to use
+	 */
+	void setOutputMarkupContainerClassNameStrategy(String strategyName);
+
+	/**
+	 * Returns whether the markup container's Java class name should be written to the response.
 	 * 
-	 * @return true if the markup container's class name should be written to response
+	 * @return true if the markup container's Java class name should be written to response
 	 */
 	boolean isOutputMarkupContainerClassName();
 
diff --git a/wicket-jmx/src/main/java/org/apache/wicket/jmx/wrapper/DebugSettings.java b/wicket-jmx/src/main/java/org/apache/wicket/jmx/wrapper/DebugSettings.java
index f4cdea5139..e30c561126 100644
--- a/wicket-jmx/src/main/java/org/apache/wicket/jmx/wrapper/DebugSettings.java
+++ b/wicket-jmx/src/main/java/org/apache/wicket/jmx/wrapper/DebugSettings.java
@@ -86,6 +86,12 @@ public class DebugSettings implements DebugSettingsMBean
 		application.getDebugSettings().setOutputMarkupContainerClassName(enable);
 	}
 
+	@Override
+	public void setOutputMarkupContainerClassNameStrategy(final String strategyName) {
+		application.getDebugSettings().setOutputMarkupContainerClassNameStrategy(strategyName);
+	
+	}
+
 	@Override
 	public boolean isOutputMarkupContainerClassName()
 	{