/* * Copyright 2004-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.webflow.execution.repository.snapshot; import java.io.Serializable; import org.springframework.util.Assert; import org.springframework.webflow.conversation.Conversation; import org.springframework.webflow.conversation.ConversationManager; import org.springframework.webflow.core.collection.MutableAttributeMap; import org.springframework.webflow.execution.FlowExecution; import org.springframework.webflow.execution.FlowExecutionKey; import org.springframework.webflow.execution.repository.support.AbstractFlowExecutionRepository; import org.springframework.webflow.execution.repository.support.CompositeFlowExecutionKey; /** * Base class for repositories that take flow execution snapshots using a {@link FlowExecutionSnapshotFactory}. * * @author Keith Donald */ public abstract class AbstractSnapshottingFlowExecutionRepository extends AbstractFlowExecutionRepository { /** * The factory to use to take flow execution snapshots. */ private FlowExecutionSnapshotFactory snapshotFactory; /** * Creates a new snapshotting flow execution repository. * @param conversationManager the conversation manager * @param snapshotFactory the execution snapshot factory */ public AbstractSnapshottingFlowExecutionRepository(ConversationManager conversationManager, FlowExecutionSnapshotFactory snapshotFactory) { super(conversationManager); Assert.notNull(snapshotFactory, "The flow execution snapshot factory is required"); this.snapshotFactory = snapshotFactory; } /** * Returns the configured flow execution snapshot factory. * @return the snapshot factory */ public FlowExecutionSnapshotFactory getSnapshotFactory() { return snapshotFactory; } /** * Returns the snapshotId portion of the flow execution key. * @param key the execution key */ protected Serializable getSnapshotId(FlowExecutionKey key) { return ((CompositeFlowExecutionKey) key).getSnapshotId(); } /** * Take a new flow execution snapshot. * @param flowExecution the execution to snapshot * @return the snapshot */ protected FlowExecutionSnapshot snapshot(FlowExecution flowExecution) { return snapshotFactory.createSnapshot(flowExecution); } /** * Restore a flow execution from a snapshot. * @param snapshot the snapshot * @param key the flow execution snapshot key * @param conversation the governing conversation * @return the restored flow execution */ @SuppressWarnings("unchecked") protected FlowExecution restoreFlowExecution(FlowExecutionSnapshot snapshot, FlowExecutionKey key, Conversation conversation) { MutableAttributeMap<Object> conversationScope = (MutableAttributeMap<Object>) conversation .getAttribute("scope"); String flowId = (String) conversation.getAttribute("name"); return snapshotFactory.restoreExecution(snapshot, flowId, key, conversationScope, this); } /** * Puts the value of conversation scope in the conversation object. * @param flowExecution the flow execution holding a reference to conversation scope * @param conversation the conversation where conversation scope is stored */ protected void putConversationScope(FlowExecution flowExecution, Conversation conversation) { conversation.putAttribute("scope", flowExecution.getConversationScope()); } }