mirror of
https://github.com/apache/struts.git
synced 2026-08-11 01:27:14 +00:00
Merge pull request #201 from HedjuHor/WW-4891
WW-4891 Debug tag should not display anything when not in dev mode
This commit is contained in:
+30
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* 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.struts2.showcase.tag.nonui.debugtag;
|
||||
|
||||
import com.opensymphony.xwork2.ActionSupport;
|
||||
import org.apache.struts2.dispatcher.PrepareOperations;
|
||||
|
||||
public class DebugTagAction extends ActionSupport {
|
||||
|
||||
public String execute() throws Exception {
|
||||
PrepareOperations.overrideDevMode(true); // Just for Showcase, explicitly switch on for this action only
|
||||
return SUCCESS;
|
||||
}
|
||||
}
|
||||
@@ -151,7 +151,7 @@
|
||||
<action name="date">
|
||||
<result>/WEB-INF/tags/non-ui/date.jsp</result>
|
||||
</action>
|
||||
<action name="debugTagDemo">
|
||||
<action name="debugTagDemo" class="org.apache.struts2.showcase.tag.nonui.debugtag.DebugTagAction">
|
||||
<result>/WEB-INF/tags/non-ui/debug.jsp</result>
|
||||
</action>
|
||||
</package>
|
||||
|
||||
@@ -30,17 +30,17 @@ import java.util.Map;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.struts2.dispatcher.PrepareOperations;
|
||||
import org.apache.struts2.views.annotations.StrutsTag;
|
||||
import org.apache.struts2.StrutsException;
|
||||
|
||||
@StrutsTag(name="debug", tldTagClass="org.apache.struts2.views.jsp.ui.DebugTag",
|
||||
description="Prints debugging information")
|
||||
description="Prints debugging information (Only if 'struts.devMode' is enabled)")
|
||||
public class Debug extends UIBean {
|
||||
public static final String TEMPLATE = "debug";
|
||||
|
||||
|
||||
protected ReflectionProvider reflectionProvider;
|
||||
|
||||
|
||||
|
||||
public Debug(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
|
||||
super(stack, request, response);
|
||||
@@ -50,7 +50,7 @@ public class Debug extends UIBean {
|
||||
public void setReflectionProvider(ReflectionProvider prov) {
|
||||
this.reflectionProvider = prov;
|
||||
}
|
||||
|
||||
|
||||
protected String getDefaultTemplate() {
|
||||
return TEMPLATE;
|
||||
}
|
||||
@@ -58,25 +58,40 @@ public class Debug extends UIBean {
|
||||
public boolean start(Writer writer) {
|
||||
boolean result = super.start(writer);
|
||||
|
||||
ValueStack stack = getStack();
|
||||
Iterator iter = stack.getRoot().iterator();
|
||||
List stackValues = new ArrayList(stack.getRoot().size());
|
||||
while (iter.hasNext()) {
|
||||
Object o = iter.next();
|
||||
Map values;
|
||||
try {
|
||||
values = reflectionProvider.getBeanMap(o);
|
||||
} catch (Exception e) {
|
||||
throw new StrutsException("Caught an exception while getting the property values of " + o, e);
|
||||
if (showDebug()) {
|
||||
ValueStack stack = getStack();
|
||||
Iterator iter = stack.getRoot().iterator();
|
||||
List stackValues = new ArrayList(stack.getRoot().size());
|
||||
while (iter.hasNext()) {
|
||||
Object o = iter.next();
|
||||
Map values;
|
||||
try {
|
||||
values = reflectionProvider.getBeanMap(o);
|
||||
} catch (Exception e) {
|
||||
throw new StrutsException("Caught an exception while getting the property values of " + o, e);
|
||||
}
|
||||
stackValues.add(new DebugMapEntry(o.getClass().getName(), values));
|
||||
}
|
||||
stackValues.add(new DebugMapEntry(o.getClass().getName(), values));
|
||||
|
||||
addParameter("stackValues", stackValues);
|
||||
}
|
||||
|
||||
addParameter("stackValues", stackValues);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean end(Writer writer, String body) {
|
||||
if (showDebug()) {
|
||||
return super.end(writer, body);
|
||||
} else {
|
||||
popComponentStack();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean showDebug() {
|
||||
return (devMode || Boolean.TRUE == PrepareOperations.getDevModeOverride());
|
||||
}
|
||||
|
||||
private static class DebugMapEntry implements Map.Entry {
|
||||
private Object key;
|
||||
private Object value;
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
/*
|
||||
* 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.struts2.views.jsp.ui;
|
||||
|
||||
import com.opensymphony.xwork2.ActionContext;
|
||||
import com.opensymphony.xwork2.config.ConfigurationException;
|
||||
import com.opensymphony.xwork2.inject.ContainerBuilder;
|
||||
import com.opensymphony.xwork2.test.StubConfigurationProvider;
|
||||
import com.opensymphony.xwork2.util.location.LocatableProperties;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.struts2.StrutsConstants;
|
||||
import org.apache.struts2.dispatcher.PrepareOperations;
|
||||
import org.apache.struts2.views.jsp.AbstractUITagTest;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Test case for {@link org.apache.struts2.components.Debug}.
|
||||
*/
|
||||
public class DebugTagTest extends AbstractUITagTest {
|
||||
|
||||
private DebugTag tag;
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
tag = new DebugTag();
|
||||
tag.setPageContext(pageContext);
|
||||
context.put("checkStackProperty", "Hello World");
|
||||
}
|
||||
|
||||
public void testDevModeEnabled() throws Exception {
|
||||
setDevMode(true);
|
||||
|
||||
tag.doStartTag();
|
||||
tag.doEndTag();
|
||||
String result = writer.toString();
|
||||
assertTrue(StringUtils.isNotEmpty(result));
|
||||
assertTrue("Property 'checkStackProperty' should be in Debug Tag output", StringUtils.contains(result, "<td>checkStackProperty</td>"));
|
||||
}
|
||||
|
||||
public void testDevModeDisabled() throws Exception {
|
||||
setDevMode(false);
|
||||
|
||||
tag.doStartTag();
|
||||
tag.doEndTag();
|
||||
assertTrue("nothing to see here, devMode=false", StringUtils.isEmpty(writer.toString()));
|
||||
}
|
||||
|
||||
public void testTagAttributeOverrideDevModeTrue() throws Exception {
|
||||
setDevMode(false);
|
||||
|
||||
PrepareOperations.overrideDevMode(true);
|
||||
tag.doStartTag();
|
||||
tag.doEndTag();
|
||||
String result = writer.toString();
|
||||
assertTrue(StringUtils.isNotEmpty(result));
|
||||
assertTrue("Property 'checkStackProperty' should be in Debug Tag output", StringUtils.contains(result, "<td>checkStackProperty</td>"));
|
||||
}
|
||||
|
||||
public void testTagAttributeOverrideDevModeFalse() throws Exception {
|
||||
setDevMode(false);
|
||||
|
||||
PrepareOperations.overrideDevMode(false);
|
||||
tag.doStartTag();
|
||||
tag.doEndTag();
|
||||
assertTrue("nothing to see here, devMode=false and overrideDevMode=false", StringUtils.isEmpty(writer.toString()));
|
||||
}
|
||||
|
||||
private void setDevMode(final boolean devMode) {
|
||||
setStrutsConstant(new HashMap<String, String>() {{
|
||||
put(StrutsConstants.STRUTS_DEVMODE, Boolean.toString(devMode));
|
||||
}});
|
||||
}
|
||||
|
||||
/**
|
||||
* Overwrite the Struts Constant and reload container
|
||||
*/
|
||||
private void setStrutsConstant(final Map<String, String> overwritePropeties) {
|
||||
configurationManager.addContainerProvider(new StubConfigurationProvider() {
|
||||
@Override
|
||||
public boolean needsReload() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(ContainerBuilder builder, LocatableProperties props) throws ConfigurationException {
|
||||
for (Map.Entry<String, String> stringStringEntry : overwritePropeties.entrySet()) {
|
||||
props.setProperty(stringStringEntry.getKey(), stringStringEntry.getValue(), null);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
configurationManager.reload();
|
||||
container = configurationManager.getConfiguration().getContainer();
|
||||
stack.getContext().put(ActionContext.CONTAINER, container);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user