001: /*
002: * $Id: InvocationSessionStore.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.util;
022:
023: import java.io.Serializable;
024: import java.util.HashMap;
025: import java.util.Map;
026:
027: import com.opensymphony.xwork2.ActionContext;
028: import com.opensymphony.xwork2.ActionInvocation;
029: import com.opensymphony.xwork2.util.ValueStack;
030:
031: /**
032: * InvocationSessionStore
033: *
034: */
035: public class InvocationSessionStore {
036:
037: private static final String INVOCATION_MAP_KEY = "org.apache.struts2.util.InvocationSessionStore.invocationMap";
038:
039: private InvocationSessionStore() {
040: }
041:
042: /**
043: * Checks the Map in the Session for the key and the token. If the
044: * ActionInvocation is saved in the Session, the ValueStack from the
045: * ActionProxy associated with the ActionInvocation is set into the
046: * ActionContext and the ActionInvocation is returned.
047: *
048: * @param key the name the DefaultActionInvocation and ActionContext were saved as
049: * @return the DefaultActionInvocation saved using the key, or null if none was found
050: */
051: public static ActionInvocation loadInvocation(String key,
052: String token) {
053: InvocationContext invocationContext = (InvocationContext) getInvocationMap()
054: .get(key);
055:
056: if ((invocationContext == null)
057: || !invocationContext.token.equals(token)) {
058: return null;
059: }
060:
061: ValueStack stack = invocationContext.invocation.getStack();
062: ActionContext.getContext().setValueStack(stack);
063:
064: return invocationContext.invocation;
065: }
066:
067: /**
068: * Stores the DefaultActionInvocation and ActionContext into the Session using the provided key for loading later using
069: * {@link #loadInvocation}
070: *
071: * @param key
072: * @param invocation
073: */
074: public static void storeInvocation(String key, String token,
075: ActionInvocation invocation) {
076: InvocationContext invocationContext = new InvocationContext(
077: invocation, token);
078: Map invocationMap = getInvocationMap();
079: invocationMap.put(key, invocationContext);
080: setInvocationMap(invocationMap);
081: }
082:
083: static void setInvocationMap(Map invocationMap) {
084: Map session = ActionContext.getContext().getSession();
085:
086: if (session == null) {
087: throw new IllegalStateException(
088: "Unable to access the session.");
089: }
090:
091: session.put(INVOCATION_MAP_KEY, invocationMap);
092: }
093:
094: static Map getInvocationMap() {
095: Map session = ActionContext.getContext().getSession();
096:
097: if (session == null) {
098: throw new IllegalStateException(
099: "Unable to access the session.");
100: }
101:
102: Map invocationMap = (Map) session.get(INVOCATION_MAP_KEY);
103:
104: if (invocationMap == null) {
105: invocationMap = new HashMap();
106: setInvocationMap(invocationMap);
107: }
108:
109: return invocationMap;
110: }
111:
112: private static class InvocationContext implements Serializable {
113:
114: private static final long serialVersionUID = -286697666275777888L;
115:
116: ActionInvocation invocation;
117: String token;
118:
119: public InvocationContext(ActionInvocation invocation,
120: String token) {
121: this.invocation = invocation;
122: this.token = token;
123: }
124: }
125: }
|