001: /*
002: * $Id: ScopesHashModel.java 471756 2006-11-06 15:01:43Z husted $
003: *
004: * Licensed to the Apache Software Foundation (ASF) under one
005: * or more contributor license agreements. See the NOTICE file
006: * distributed with this work for additional information
007: * regarding copyright ownership. The ASF licenses this file
008: * to you under the Apache License, Version 2.0 (the
009: * "License"); you may not use this file except in compliance
010: * with the License. You may obtain a copy of the License at
011: *
012: * http://www.apache.org/licenses/LICENSE-2.0
013: *
014: * Unless required by applicable law or agreed to in writing,
015: * software distributed under the License is distributed on an
016: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017: * KIND, either express or implied. See the License for the
018: * specific language governing permissions and limitations
019: * under the License.
020: */
021: package org.apache.struts2.views.freemarker;
022:
023: import javax.servlet.ServletContext;
024: import javax.servlet.http.HttpServletRequest;
025: import javax.servlet.http.HttpSession;
026:
027: import com.opensymphony.xwork2.util.ValueStack;
028:
029: import freemarker.template.ObjectWrapper;
030: import freemarker.template.SimpleHash;
031: import freemarker.template.TemplateModel;
032: import freemarker.template.TemplateModelException;
033:
034: /**
035: * Simple Hash model that also searches other scopes.
036: * <p/>
037: * If the key doesn't exist in this hash, this template model tries to
038: * resolve the key within the attributes of the following scopes,
039: * in the order stated: Request, Session, Servlet Context
040: */
041: public class ScopesHashModel extends SimpleHash {
042:
043: private static final long serialVersionUID = 5551686380141886764L;
044:
045: private HttpServletRequest request;
046: private ServletContext servletContext;
047: private ValueStack stack;
048:
049: public ScopesHashModel(ObjectWrapper objectWrapper,
050: ServletContext context, HttpServletRequest request,
051: ValueStack stack) {
052: super (objectWrapper);
053: this .servletContext = context;
054: this .request = request;
055: this .stack = stack;
056: }
057:
058: public TemplateModel get(String key) throws TemplateModelException {
059: // Lookup in default scope
060: TemplateModel model = super .get(key);
061:
062: if (model != null) {
063: return model;
064: }
065:
066: if (stack != null) {
067: Object obj = stack.findValue(key);
068:
069: if (obj != null) {
070: return wrap(obj);
071: }
072:
073: // ok, then try the context
074: obj = stack.getContext().get(key);
075: if (obj != null) {
076: return wrap(obj);
077: }
078: }
079:
080: if (request != null) {
081: // Lookup in request scope
082: Object obj = request.getAttribute(key);
083:
084: if (obj != null) {
085: return wrap(obj);
086: }
087:
088: // Lookup in session scope
089: HttpSession session = request.getSession(false);
090:
091: if (session != null) {
092: obj = session.getAttribute(key);
093:
094: if (obj != null) {
095: return wrap(obj);
096: }
097: }
098: }
099:
100: if (servletContext != null) {
101: // Lookup in application scope
102: Object obj = servletContext.getAttribute(key);
103:
104: if (obj != null) {
105: return wrap(obj);
106: }
107: }
108:
109: return null;
110: }
111:
112: public void put(String string, boolean b) {
113: super .put(string, b);
114: }
115:
116: public void put(String string, Object object) {
117: super.put(string, object);
118: }
119: }
|