001: /*
002: * Copyright (c) 2002-2003 by OpenSymphony
003: * All rights reserved.
004: */
005: package com.opensymphony.webwork.views.freemarker;
006:
007: import com.opensymphony.xwork.util.OgnlValueStack;
008: import freemarker.template.ObjectWrapper;
009: import freemarker.template.SimpleHash;
010: import freemarker.template.TemplateModel;
011: import freemarker.template.TemplateModelException;
012:
013: import javax.servlet.ServletContext;
014: import javax.servlet.http.HttpServletRequest;
015: import javax.servlet.http.HttpSession;
016:
017: /**
018: * Simple Hash model that also searches other scopes.
019: * <p/>
020: * If the key doesn't exist in this hash, this template model tries to
021: * resolve the key within the attributes of the following scopes,
022: * in the order stated: Request, Session, Servlet Context
023: */
024: public class ScopesHashModel extends SimpleHash {
025:
026: private HttpServletRequest request;
027: private ObjectWrapper objectWraper;
028: private ServletContext servletContext;
029: private OgnlValueStack stack;
030:
031: public ScopesHashModel(ObjectWrapper objectWrapper,
032: ServletContext context, HttpServletRequest request,
033: OgnlValueStack stack) {
034: super (objectWrapper);
035: this .servletContext = context;
036: this .request = request;
037: this .stack = stack;
038: }
039:
040: public TemplateModel get(String key) throws TemplateModelException {
041: // Lookup in default scope
042: TemplateModel model = super .get(key);
043:
044: if (model != null) {
045: return model;
046: }
047:
048: if (stack != null) {
049: Object obj = stack.findValue(key);
050:
051: if (obj != null) {
052: return wrap(obj);
053: }
054:
055: // ok, then try the context
056: obj = stack.getContext().get(key);
057: if (obj != null) {
058: return wrap(obj);
059: }
060: }
061:
062: if (request != null) {
063: // Lookup in request scope
064: Object obj = request.getAttribute(key);
065:
066: if (obj != null) {
067: return wrap(obj);
068: }
069:
070: // Lookup in session scope
071: HttpSession session = request.getSession(false);
072:
073: if (session != null) {
074: obj = session.getAttribute(key);
075:
076: if (obj != null) {
077: return wrap(obj);
078: }
079: }
080: }
081:
082: if (servletContext != null) {
083: // Lookup in application scope
084: Object obj = servletContext.getAttribute(key);
085:
086: if (obj != null) {
087: return wrap(obj);
088: }
089: }
090:
091: return null;
092: }
093:
094: public void put(String string, boolean b) {
095: super .put(string, b);
096: }
097:
098: public void put(String string, Object object) {
099: super.put(string, object);
100: }
101: }
|