package org.apache.strutsexamples.web;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.Result;
import com.opensymphony.xwork2.UnknownHandler;
import com.opensymphony.xwork2.XWorkException;
import com.opensymphony.xwork2.config.entities.ActionConfig;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.views.tiles.TilesResult;
import org.apache.tiles.TilesContainer;
import org.apache.tiles.access.TilesAccess;
import org.apache.tiles.request.servlet.ServletApplicationContext;
import org.apache.tiles.request.servlet.ServletRequest;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.Set;
public class TilesUnknownHandler implements UnknownHandler {
private static Logger LOG = LogManager.getLogger(TilesUnknownHandler.class);
public ActionConfig handleUnknownAction(String namespace, String actionName) throws XWorkException {
return null;
}
public Result handleUnknownResult(ActionContext actionContext, String actionName, ActionConfig actionConfig, String resultCode) throws XWorkException {
ServletContext servletContext = ServletActionContext.getServletContext();
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
ServletApplicationContext context = new ServletApplicationContext(servletContext);
TilesContainer container = TilesAccess.getContainer(context);
String namespace = ServletActionContext.getActionMapping().getNamespace();
Set<String> definitions = buildDefinitionNames(namespace, actionName, resultCode);
for (String definition : definitions) {
LOG.debug("Looking for tiles definition: {}", definition);
if (container.isValidDefinition(definition, new ServletRequest(context, request, response))) {
return new TilesResult(definition);
}
}
LOG.warn("Couldn't find tiles definition for namespace {}, action name {} and result code {}", namespace, actionName, resultCode);
return null;
}
protected Set<String> buildDefinitionNames(String namespace, String actionName, String resultCode) {
Set<String> definitions = new LinkedHashSet<String>();
if (namespace.startsWith("/")) {
namespace = namespace.substring(1);
}
if (!Objects.equals(namespace, "") && !Objects.equals(namespace, "/")){
if (namespace.endsWith("/")) {
definitions.add(namespace + actionName);
definitions.add(namespace + actionName + "-" + resultCode);
definitions.add(namespace + resultCode);
} else {
definitions.add(namespace + "/" + actionName);
definitions.add(namespace + "/" + actionName + "-" + resultCode);
definitions.add(namespace + "/" + resultCode);
}
}
definitions.add(actionName);
definitions.add(actionName + "-" + resultCode);
LOG.debug("Possible definition's names {}", definitions);
return definitions;
}
public Object handleUnknownActionMethod(Object action, String methodName) {
return null;
}
}