blob: 212badfabd8238f6f7f0450161d65d68d8451952 [file] [log] [blame]
/*
* $Id$
*
* 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.tiles.request.freemarker;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.tiles.request.AbstractViewRequest;
import org.apache.tiles.request.ApplicationContext;
import org.apache.tiles.request.DispatchRequest;
import org.apache.tiles.request.servlet.ServletRequest;
import freemarker.core.Environment;
import freemarker.ext.servlet.HttpRequestHashModel;
/**
* The FreeMarker-specific request context.
*
* @version $Rev$ $Date$
*/
public class FreemarkerRequest extends AbstractViewRequest {
/**
* The natively available scopes. In fact, only "page".
*/
private List<String> scopes;
/**
* The FreeMarker current environment.
*/
private Environment env;
/**
* The page scope map.
*/
private Map<String, Object> pageScope;
/**
* Creates a new Freemarker request.
*
* @param applicationContext The application context.
* @param env The Freemarker's environment object.
* @return A new request.
*/
public static FreemarkerRequest createServletFreemarkerRequest(
ApplicationContext applicationContext, Environment env) {
HttpRequestHashModel requestModel = FreemarkerRequestUtil
.getRequestHashModel(env);
HttpServletRequest request = requestModel.getRequest();
HttpServletResponse response = requestModel.getResponse();
DispatchRequest enclosedRequest = new ServletRequest(
applicationContext, request, response);
return new FreemarkerRequest(enclosedRequest, env);
}
/**
* Constructor.
*
* @param enclosedRequest
* The request that exposes non-FreeMarker specific properties
* @param env
* The FreeMarker environment.
*/
public FreemarkerRequest(DispatchRequest enclosedRequest,
Environment env) {
super(enclosedRequest);
List<String> scopes = new ArrayList<String>();
scopes.addAll(enclosedRequest.getAvailableScopes());
scopes.add("page");
this.scopes = Collections.unmodifiableList(scopes);
this.env = env;
}
/**
* Returns the environment object.
*
* @return The environment.
*/
public Environment getEnvironment() {
return env;
}
/** {@inheritDoc} */
@Override
public Locale getRequestLocale() {
return env.getLocale();
}
/**
* Returns the page scope.
*
* @return The page scope.
*/
public Map<String, Object> getPageScope() {
if (pageScope == null) {
pageScope = new EnvironmentScopeMap(env);
}
return pageScope;
}
@Override
public List<String> getAvailableScopes() {
return scopes;
}
/** {@inheritDoc} */
@Override
public PrintWriter getPrintWriter() {
Writer writer = env.getOut();
if (writer instanceof PrintWriter) {
return (PrintWriter) writer;
}
return new PrintWriter(writer);
}
/** {@inheritDoc} */
@Override
public Writer getWriter() {
return env.getOut();
}
@Override
public Map<String, Object> getContext(String scope) {
return "page".equals(scope) ? getPageScope() : super.getContext(scope);
}
}