/*
* Copyright 2004-2012 the Seasar Foundation and the Others.
*
* Licensed 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.seasar.mayaa.impl.cycle.jsp;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.el.ExpressionEvaluator;
import javax.servlet.jsp.el.VariableResolver;
import javax.servlet.jsp.tagext.BodyContent;
import org.seasar.mayaa.cycle.Response;
import org.seasar.mayaa.cycle.ServiceCycle;
import org.seasar.mayaa.cycle.scope.ApplicationScope;
import org.seasar.mayaa.cycle.scope.AttributeScope;
import org.seasar.mayaa.cycle.scope.RequestScope;
import org.seasar.mayaa.cycle.scope.SessionScope;
import org.seasar.mayaa.impl.cycle.CycleUtil;
import org.seasar.mayaa.impl.cycle.StandardScope;
import org.seasar.mayaa.impl.util.StringUtil;
import org.seasar.mayaa.impl.util.collection.IteratorEnumeration;
/**
* @author Masataka Kurihara (Gluegent, Inc.)
*/
public class PageContextImpl extends PageContext {
private ServletConfig _config;
public void initialize(Servlet servlet, ServletRequest request,
ServletResponse response, String errorPageURL,
boolean needsSession, int bufferSize, boolean autoFlush) {
// Can't call.
throw new IllegalStateException();
}
public void release() {
// Can't call.
throw new IllegalStateException();
}
public JspWriter getOut() {
ServiceCycle cycle = CycleUtil.getServiceCycle();
Response response = cycle.getResponse();
return new JspWriterImpl(response.getWriter());
}
public JspWriter popBody() {
ServiceCycle cycle = CycleUtil.getServiceCycle();
Response response = cycle.getResponse();
return new JspWriterImpl(response.getWriter());
}
public BodyContent pushBody() {
ServiceCycle cycle = CycleUtil.getServiceCycle();
Response response = cycle.getResponse();
return new BodyContentImpl(response.pushWriter());
}
public void forward(String relativeUrlPath) {
ServiceCycle cycle = CycleUtil.getServiceCycle();
cycle.forward(relativeUrlPath);
}
public void include(String relativeUrlPath)
throws ServletException, IOException {
include(relativeUrlPath, false);
}
protected String getContextRelativePath(
ServletRequest request, String relativePath) {
if (relativePath.startsWith("/")
|| request instanceof HttpServletRequest == false) {
return relativePath;
}
HttpServletRequest httpRequest = (HttpServletRequest) request;
String uri = httpRequest.getServletPath();
if (StringUtil.hasValue(uri)) {
int pos = uri.lastIndexOf('/');
if (pos >= 0) {
uri = uri.substring(0, pos);
}
} else {
uri = "";
}
return uri + '/' + relativePath;
}
public void include(String relativeUrlPath, boolean flush)
throws ServletException, IOException {
if (flush) {
Response response = CycleUtil.getResponse();
response.getWriter().flush();
}
ServletRequest request = getRequest();
String contextRelativePath =
getContextRelativePath(request, relativeUrlPath);
RequestDispatcher dispatcher =
request.getRequestDispatcher(contextRelativePath);
dispatcher.include(request, getResponse());
}
public void handlePageException(Exception e) {
handlePageException((Throwable) e);
}
public void handlePageException(Throwable t) {
if (t instanceof RuntimeException) {
throw (RuntimeException) t;
}
throw new RuntimeException(t);
}
public Exception getException() {
ServiceCycle cycle = CycleUtil.getServiceCycle();
Throwable t = cycle.getHandledError();
if (t instanceof Exception) {
return (Exception) t;
}
return null;
}
// getting underlying object ---------------------------------------
public ServletContext getServletContext() {
ServiceCycle cycle = CycleUtil.getServiceCycle();
ApplicationScope application = cycle.getApplicationScope();
Object obj = application.getUnderlyingContext();
if (obj instanceof ServletContext) {
return (ServletContext) obj;
}
throw new IllegalStateException();
}
public HttpSession getSession() {
ServiceCycle cycle = CycleUtil.getServiceCycle();
SessionScope session = cycle.getSessionScope();
Object obj = session.getUnderlyingContext();
if (obj instanceof HttpSession) {
return (HttpSession) obj;
}
return null;
}
public ServletRequest getRequest() {
ServiceCycle cycle = CycleUtil.getServiceCycle();
RequestScope request = cycle.getRequestScope();
Object obj = request.getUnderlyingContext();
if (obj instanceof ServletRequest) {
return (ServletRequest) obj;
}
throw new IllegalStateException();
}
public ServletResponse getResponse() {
ServiceCycle cycle = CycleUtil.getServiceCycle();
Response response = cycle.getResponse();
Object obj = response.getUnderlyingContext();
if (obj instanceof ServletResponse) {
return (ServletResponse) obj;
}
throw new IllegalStateException();
}
public ServletConfig getServletConfig() {
if (_config == null) {
_config = new CycleServletConfig();
}
return _config;
}
public Object getPage() {
throw new UnsupportedOperationException();
}
// since 2.0 -------------------------------------------------
public ExpressionEvaluator getExpressionEvaluator() {
return ExpressionEvaluatorImpl.getInstance();
}
public VariableResolver getVariableResolver() {
return VariableResolverImpl.getInstance();
}
// Attributes --------------------------------------------------
private int toJspScope(String name) {
if (ServiceCycle.SCOPE_PAGE.equals(name)) {
return PageContext.PAGE_SCOPE;
} else if (ServiceCycle.SCOPE_REQUEST.equals(name)) {
return PageContext.REQUEST_SCOPE;
} else if (ServiceCycle.SCOPE_SESSION.equals(name)) {
return PageContext.SESSION_SCOPE;
} else if (ServiceCycle.SCOPE_APPLICATION.equals(name)) {
return PageContext.APPLICATION_SCOPE;
}
return 0;
}
private String toServiceScope(int scope) {
if (scope == PageContext.APPLICATION_SCOPE) {
return ServiceCycle.SCOPE_APPLICATION;
} else if (scope == PageContext.SESSION_SCOPE) {
return ServiceCycle.SCOPE_SESSION;
} else if (scope == PageContext.REQUEST_SCOPE) {
return ServiceCycle.SCOPE_REQUEST;
} else if (scope == PageContext.PAGE_SCOPE) {
return ServiceCycle.SCOPE_PAGE;
}
throw new IllegalArgumentException();
}
protected AttributeScope findAttributeScope(String name) {
AttributeScope pageScope =
CycleUtil.getServiceCycle().getPageScope();
if (pageScope.hasAttribute(name)) {
return pageScope;
}
AttributeScope scope = CycleUtil.findStandardAttributeScope(name);
if (scope != null) {
return scope;
}
return pageScope;
}
public Object findAttribute(String name) {
return findAttributeScope(name).getAttribute(name);
}
public Object getAttribute(String name, int scope) {
if (name == null) {
throw new IllegalArgumentException();
}
if (scope != PageContext.PAGE_SCOPE) {
String scopeName = toServiceScope(scope);
return CycleUtil.getAttribute(name, scopeName);
}
return findAttributeScope(name).getAttribute(name);
}
public void removeAttribute(String name, int scope) {
if (name == null) {
throw new IllegalArgumentException();
}
if (scope != PageContext.PAGE_SCOPE) {
String scopeName = toServiceScope(scope);
CycleUtil.removeAttribute(name, scopeName);
} else {
findAttributeScope(name).removeAttribute(name);
}
}
public void setAttribute(String name, Object value, int scope) {
if (name == null) {
throw new IllegalArgumentException();
}
if (scope != PageContext.PAGE_SCOPE) {
String scopeName = toServiceScope(scope);
CycleUtil.setAttribute(name, value, scopeName);
} else {
findAttributeScope(name).setAttribute(name, value);
}
}
public Object getAttribute(String name) {
return getAttribute(name, PAGE_SCOPE);
}
public void removeAttribute(String name) {
/* removeAttribute(name, scope)があるのにこれをやると
* 想定外の動作になってしまう。
if (name == null) {
throw new IllegalArgumentException();
}
StandardScope standardScope = CycleUtil.getStandardScope();
for (int i = 0; i < standardScope.size(); i++) {
CycleUtil.removeAttribute(name, standardScope.get(i));
}
*/
removeAttribute(name, PAGE_SCOPE);
}
public void setAttribute(String name, Object value) {
setAttribute(name, value, PAGE_SCOPE);
}
public Enumeration getAttributeNamesInScope(int scope) {
String scopeName = toServiceScope(scope);
ServiceCycle cycle = CycleUtil.getServiceCycle();
AttributeScope attrScope = cycle.getAttributeScope(scopeName);
return IteratorEnumeration.getInstance(
attrScope.iterateAttributeNames());
}
public int getAttributesScope(String name) {
StandardScope standardScope = CycleUtil.getStandardScope();
int size = standardScope.size();
for (int i = 0; i < size; i++) {
String scopeName = standardScope.get(i);
Object ret = CycleUtil.getAttribute(name, scopeName);
if (ret != null) {
int scope = toJspScope(scopeName);
if (scope > 0) {
return scope;
}
}
}
return 0;
}
// support class -------------------------------------------------
private class CycleServletConfig implements ServletConfig {
protected CycleServletConfig() {
// do nothing.
}
public String getInitParameter(String name) {
return getServletContext().getInitParameter(name);
}
public Enumeration getInitParameterNames() {
return getServletContext().getInitParameterNames();
}
public ServletContext getServletContext() {
return PageContextImpl.this.getServletContext();
}
public String getServletName() {
return "Mayaa Servlet";
}
}
}