blob: 82249ccc90f3bb0276bc345d46905b26b694c8bf [file] [log] [blame]
/*
* 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.tiles;
import com.opensymphony.xwork2.ActionInvocation;
import org.apache.struts2.portlet.PortletConstants;
import org.apache.struts2.portlet.context.PortletActionContext;
import org.apache.struts2.result.ServletDispatcherResult;
import org.apache.tiles.TilesContainer;
import org.apache.tiles.TilesException;
import org.apache.tiles.access.TilesAccess;
import org.apache.tiles.request.ApplicationContext;
import org.apache.tiles.request.Request;
import org.apache.tiles.request.portlet.RenderPortletRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletContext;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import java.util.Map;
/**
* Dedicated Tile result to be used in Portlet environment
*
* WW-2749
*/
public class PortletTilesResult extends ServletDispatcherResult {
public static final String TILES_ACTION_NAME = "tilesDirect";
public PortletTilesResult() {
super();
}
public PortletTilesResult(String location) {
super(location);
}
public void doExecute(String location, ActionInvocation invocation) throws Exception {
if (PortletActionContext.getPhase().isAction() || PortletActionContext.getPhase().isEvent()) {
executeActionResult(location, invocation);
} else {
executeRenderResult(location);
}
}
protected void executeRenderResult(String location) throws TilesException {
setLocation(location);
PortletContext portletContext = PortletActionContext.getPortletContext();
RenderRequest request = PortletActionContext.getRenderRequest();
RenderResponse response = PortletActionContext.getRenderResponse();
TilesContainer container = getCurrentContainer(request, portletContext);
ApplicationContext applicationContext = container.getApplicationContext();
Request currentRequest = new RenderPortletRequest(applicationContext, portletContext, request, response);
container.render(location, currentRequest);
}
protected void executeActionResult(String location, ActionInvocation invocation) {
ActionResponse res = PortletActionContext.getActionResponse();
res.setRenderParameter(PortletConstants.ACTION_PARAM, TILES_ACTION_NAME);
Map<String, Object> sessionMap = invocation.getInvocationContext().getSession();
sessionMap.put(PortletConstants.RENDER_DIRECT_LOCATION, location);
res.setRenderParameter(PortletConstants.MODE_PARAM, PortletActionContext.getRequest().getPortletMode().toString());
}
protected TilesContainer getCurrentContainer(javax.portlet.PortletRequest request, PortletContext context) {
TilesContainer container = (TilesContainer) request.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME);
if (container == null) {
container = getContainer(context);
request.setAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
}
return container;
}
protected TilesContainer getContainer(PortletContext context) {
return getContainer(context, TilesAccess.CONTAINER_ATTRIBUTE);
}
protected TilesContainer getContainer(PortletContext context, String key) {
if (key == null) {
key = TilesAccess.CONTAINER_ATTRIBUTE;
}
return (TilesContainer) context.getAttribute(key);
}
}