package org.seasar.ymir.zpt; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; import javax.servlet.http.HttpServletRequest; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.seasar.framework.container.S2Container; import org.seasar.ymir.Globals; import org.seasar.ymir.Request; import org.seasar.ymir.RequestProcessor; import org.seasar.ymir.annotation.handler.AnnotationHandler; import org.seasar.ymir.impl.RequestProcessorImpl; import org.seasar.ymir.message.Messages; import org.seasar.ymir.message.Notes; import org.seasar.ymir.token.Token; import org.seasar.ymir.token.TokenManager; import org.seasar.ymir.zpt.annotation.ParameterHolder; import org.seasar.ymir.zpt.util.YmirUtils; import net.skirnir.freyja.TemplateContext; import net.skirnir.freyja.VariableResolver; import net.skirnir.freyja.impl.VariableResolverImpl; public class YmirVariableResolver extends VariableResolverImpl { public static final String NAME_YMIRREQUEST = "ymirRequest"; public static final String NAME_CONTAINER = "container"; public static final String NAME_MESSAGES = "messages"; public static final String NAME_TOKEN = "token"; public static final String NAME_VARIABLES = "variables"; public static final String NAME_PARAM_SELF = "param-self"; private Request ymirRequest_; private HttpServletRequest request_; private S2Container container_; private VariableResolver parent_; private Messages messages_; private TokenManager tokenManager_; private AnnotationHandler annotationHandler_; private Token token_; private boolean selfLoaded_; private Object self_; private ParamSelf paramSelf_; private boolean parameterHolderLoaded_; private Object parameterHolder_; private static final Log log_ = LogFactory .getLog(YmirVariableResolver.class); public YmirVariableResolver(Request ymirRequest, HttpServletRequest request, S2Container container) { this(ymirRequest, request, container, null); } public YmirVariableResolver(Request ymirRequest, HttpServletRequest request, S2Container container, VariableResolver parent) { ymirRequest_ = ymirRequest; request_ = request; container_ = container; messages_ = (Messages) container.getComponent(Globals.NAME_MESSAGES); tokenManager_ = (TokenManager) container .getComponent(TokenManager.class); annotationHandler_ = (AnnotationHandler) container .getComponent(AnnotationHandler.class); parent_ = parent; } public Object getVariable(TemplateContext context, String name) { if (NAME_YMIRREQUEST.equals(name)) { return ymirRequest_; } else if (NAME_CONTAINER.equals(name)) { return container_; } else if (NAME_MESSAGES.equals(name)) { return messages_; } else if (RequestProcessor.ATTR_NOTES.equals(name)) { // notesがリクエストにない場合はそこでトラバースを打ち切った方が都合が良いため // こうしている。リクエストパラメータ等をトラバースされると意図しない動作をする // ことがある。例えば /hoe.html?notes=aaa とされると //