All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.zkoss.zest.sys.impl.ActionContextImpl Maven / Gradle / Ivy

The newest version!
/* ActionContextImpl.java

	Purpose:
		
	Description:
		
	History:
		Mon Mar  7 15:05:27 TST 2011, Created by tomyeh

Copyright (C) 2011 Potix Corporation. All Rights Reserved.

*/
package org.zkoss.zest.sys.impl;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.zkoss.xel.XelContext;
import org.zkoss.xel.FunctionMapper;
import org.zkoss.xel.VariableResolver;
import org.zkoss.xel.Expression;
import org.zkoss.xel.Expressions;
import org.zkoss.xel.ExpressionFactory;
import org.zkoss.xel.XelException;
import org.zkoss.xel.util.SimpleXelContext;

import org.zkoss.zest.ActionContext;

/**
 * The default implementation of {@link ActionContext}.
 * @author tomyeh
 */
public class ActionContextImpl implements ActionContext {
	private ExpressionFactory _expf;
	private final HttpServletRequest _request;
	private final HttpServletResponse _response;
	private final FunctionMapper _mapper;
	private final ActionResolver _resolver;
	private final String _path;

	public ActionContextImpl(
	HttpServletRequest request, HttpServletResponse response,
	VariableResolver resolver, FunctionMapper mapper) {
		_request = request;
		_response = response;
		String path = request.getServletPath();
		if (path == null || path.length() == 0)
			path = "/"; //in case that some container might not follow spec
		String pi = request.getPathInfo();
		if (pi != null && pi.length() > 0) {
			if (pi.charAt(0) == '/')
				path = path.charAt(path.length() - 1) == '/' ?
					path + pi.substring(1): path + pi;
			else
				path = path.charAt(path.length() - 1) == '/' ?
					path + pi: path + '/' + pi;
		}
		_path = path;
		_mapper = mapper;
		_resolver = new ActionResolver(resolver);
	}
	@Override
	public HttpServletRequest getServletRequest() {
		return _request;
	}
	@Override
	public HttpServletResponse getServletResponse() {
		return _response;
	}
	@Override
	public String getRequestPath() {
		return _path;
	}
	@Override
	public Expression parseExpression(String expression, Class expectedType)
	throws XelException {
		return getExpressionFactory()
			.parseExpression(newXelContext(), expression, expectedType);
	}
	@Override
	public Object evaluate(Expression expression)
	throws XelException {
		return expression.evaluate(newXelContext());
	}

	/** Returns the expression factory. */
	protected ExpressionFactory getExpressionFactory() {
		if (_expf == null)
			_expf = Expressions.newExpressionFactory();
		return _expf;
	}
	@Override
	public FunctionMapper getFunctionMapper() {
		return _mapper;
	}
	@Override
	public VariableResolver getVariableResolver() {
		return _resolver;
	}
	/** Instantiate a XEL context.
	 * Don't reuse it since it has attributes (that shall not be kept
	 * after evaluation).
	 */
	private XelContext newXelContext() {
		return new SimpleXelContext(getVariableResolver(), getFunctionMapper());
	}

	private class ActionResolver implements VariableResolver {
		private final VariableResolver _resolver;
		private ActionResolver(VariableResolver resolver) {
			this._resolver = resolver;
		}
		public Object resolveVariable(String name) {
			if ("request".equals(name))
				return _request;
			final Object o =_request.getAttribute(name);
			return o != null ? o:
				this._resolver != null ? this._resolver.resolveVariable(name): null;
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy