136 lines
5.6 KiB
Java
136 lines
5.6 KiB
Java
/*
|
|
* 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.
|
|
*
|
|
* $Header:$
|
|
*/
|
|
package org.apache.beehive.netui.tags.internal;
|
|
|
|
import org.apache.beehive.netui.core.chain.Command;
|
|
import org.apache.beehive.netui.core.chain.Context;
|
|
import org.apache.beehive.netui.core.chain.web.WebChainContext;
|
|
import org.apache.beehive.netui.pageflow.PageFlowConstants;
|
|
import org.apache.beehive.netui.pageflow.interceptor.InterceptorChain;
|
|
import org.apache.beehive.netui.pageflow.interceptor.InterceptorException;
|
|
import org.apache.beehive.netui.pageflow.interceptor.request.RequestInterceptorContext;
|
|
import org.apache.beehive.netui.pageflow.internal.ViewRenderer;
|
|
import org.apache.beehive.netui.tags.AbstractClientRequestInterceptor;
|
|
import org.apache.beehive.netui.util.logging.Logger;
|
|
|
|
import javax.servlet.ServletContext;
|
|
import javax.servlet.ServletResponse;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import java.io.IOException;
|
|
|
|
/**
|
|
* An object to handle a command for rendering framework generated output.
|
|
*/
|
|
public final class ViewRendererCRI
|
|
extends AbstractClientRequestInterceptor
|
|
implements Command
|
|
{
|
|
private static final Logger logger = Logger.getInstance(ViewRendererCRI.class);
|
|
|
|
public boolean execute(Context context)
|
|
throws Exception {
|
|
|
|
assert context != null;
|
|
assert context instanceof WebChainContext;
|
|
assert ((WebChainContext)context).getServletRequest() instanceof HttpServletRequest;
|
|
assert ((WebChainContext)context).getServletResponse() instanceof HttpServletResponse;
|
|
|
|
WebChainContext webChainContext = (WebChainContext)context;
|
|
HttpServletRequest request = (HttpServletRequest)webChainContext.getServletRequest();
|
|
HttpServletResponse response = (HttpServletResponse)webChainContext.getServletResponse();
|
|
|
|
// Create the command by striping off the context path and the extension
|
|
String uri = request.getRequestURI();
|
|
String ctxtPath = request.getContextPath();
|
|
String cmd = getCommand(uri, ctxtPath);
|
|
|
|
return handleCommand(request, response, webChainContext.getServletContext(), cmd);
|
|
}
|
|
|
|
public void preRequest(RequestInterceptorContext ctxt, InterceptorChain chain) throws InterceptorException
|
|
{
|
|
HttpServletRequest request = ctxt.getRequest();
|
|
|
|
// Create the command by striping off the context path and the extension
|
|
String uri = request.getRequestURI();
|
|
String ctxtPath = request.getContextPath();
|
|
String cmd = getCommand(uri, ctxtPath);
|
|
|
|
handleCommand(request, ctxt.getResponse(), ctxt.getServletContext(), cmd);
|
|
|
|
chain.continueChain();
|
|
}
|
|
|
|
public void postRequest(RequestInterceptorContext context, InterceptorChain chain) throws InterceptorException
|
|
{
|
|
chain.continueChain();
|
|
}
|
|
|
|
private boolean handleCommand(HttpServletRequest request,
|
|
HttpServletResponse response,
|
|
ServletContext servletContext,
|
|
String command) {
|
|
if (PageFlowConstants.VIEW_RENDERER_URI_COMMAND.equals(command)) {
|
|
handleViewRendering(request, response, servletContext);
|
|
return true;
|
|
}
|
|
else return false;
|
|
}
|
|
|
|
private void handleViewRendering(HttpServletRequest request,
|
|
ServletResponse response,
|
|
ServletContext servletContext)
|
|
{
|
|
// get the view renderer from the request attribute
|
|
Object obj = request.getAttribute(PageFlowConstants.VIEW_RENDERER_ATTRIBUTE_NAME);
|
|
if (obj == null) {
|
|
logger.error("ViewRenderer was not found in the request attributes");
|
|
return;
|
|
}
|
|
if (!(obj instanceof ViewRenderer)) {
|
|
logger.error("Named view renderer was not an instance of a ViewRenderer");
|
|
return;
|
|
}
|
|
|
|
ViewRenderer vr = (ViewRenderer) obj;
|
|
|
|
// render the response
|
|
try {
|
|
/*
|
|
* Note, this is our own framework response and just javascript
|
|
* that calls a javascript routine in another window, passing
|
|
* Unicode String values in a map.
|
|
* For now, we're setting the content type, but this may be a
|
|
* problem for people who whant to control the encoding and the
|
|
* content type themselves, as with a JSP.
|
|
* If so, then they can implement their own Command to handle the
|
|
* ViewRenderer objects.
|
|
*/
|
|
response.setContentType("text/html; charset=UTF-8");
|
|
|
|
vr.renderView(request, response, servletContext);
|
|
request.removeAttribute(PageFlowConstants.VIEW_RENDERER_ATTRIBUTE_NAME);
|
|
}
|
|
catch (IOException ioe) {
|
|
logger.error("Named view renderer was not able to render. Cause: " + ioe, ioe);
|
|
}
|
|
}
|
|
}
|