1 16 package org.springframework.webflow.execution.repository.continuation; 17 18 import java.io.Serializable ; 19 20 import org.springframework.util.Assert; 21 import org.springframework.webflow.conversation.Conversation; 22 import org.springframework.webflow.conversation.ConversationManager; 23 import org.springframework.webflow.execution.FlowExecution; 24 import org.springframework.webflow.execution.repository.FlowExecutionKey; 25 import org.springframework.webflow.execution.repository.FlowExecutionRestorationFailureException; 26 import org.springframework.webflow.execution.repository.support.AbstractConversationFlowExecutionRepository; 27 import org.springframework.webflow.execution.repository.support.FlowExecutionStateRestorer; 28 import org.springframework.webflow.util.RandomGuidUidGenerator; 29 import org.springframework.webflow.util.UidGenerator; 30 31 70 public class ContinuationFlowExecutionRepository extends AbstractConversationFlowExecutionRepository { 71 72 75 private static final String CONTINUATION_GROUP_ATTRIBUTE = "continuationGroup"; 76 77 81 private FlowExecutionContinuationFactory continuationFactory = new SerializedFlowExecutionContinuationFactory(); 82 83 86 private UidGenerator continuationIdGenerator = new RandomGuidUidGenerator(); 87 88 91 private int maxContinuations; 92 93 99 public ContinuationFlowExecutionRepository(FlowExecutionStateRestorer executionStateRestorer, 100 ConversationManager conversationManager) { 101 super(executionStateRestorer, conversationManager); 102 } 103 104 109 public FlowExecutionContinuationFactory getContinuationFactory() { 110 return continuationFactory; 111 } 112 113 117 public void setContinuationFactory(FlowExecutionContinuationFactory continuationFactory) { 118 Assert.notNull(continuationFactory, "The continuation factory is required"); 119 this.continuationFactory = continuationFactory; 120 } 121 122 126 public UidGenerator getContinuationIdGenerator() { 127 return continuationIdGenerator; 128 } 129 130 134 public void setContinuationIdGenerator(UidGenerator continuationIdGenerator) { 135 Assert.notNull(continuationIdGenerator, "The continuation id generator is required"); 136 this.continuationIdGenerator = continuationIdGenerator; 137 } 138 139 143 public int getMaxContinuations() { 144 return maxContinuations; 145 } 146 147 151 public void setMaxContinuations(int maxContinuations) { 152 this.maxContinuations = maxContinuations; 153 } 154 155 public FlowExecution getFlowExecution(FlowExecutionKey key) { 156 FlowExecutionContinuation continuation = getContinuation(key); 157 try { 158 FlowExecution execution = continuation.unmarshal(); 159 return getExecutionStateRestorer().restoreState(execution, getConversationScope(key)); 161 } 162 catch (ContinuationUnmarshalException e) { 163 throw new FlowExecutionRestorationFailureException(key, e); 164 } 165 } 166 167 public void putFlowExecution(FlowExecutionKey key, FlowExecution flowExecution) { 168 FlowExecutionContinuationGroup continuationGroup = getContinuationGroup(key); 169 FlowExecutionContinuation continuation = continuationFactory.createContinuation(flowExecution); 170 continuationGroup.add(getContinuationId(key), continuation); 171 putConversationScope(key, flowExecution.getConversationScope()); 172 } 173 174 protected void onBegin(Conversation conversation) { 175 FlowExecutionContinuationGroup continuationGroup = new FlowExecutionContinuationGroup(maxContinuations); 177 conversation.putAttribute(CONTINUATION_GROUP_ATTRIBUTE, continuationGroup); 178 } 179 180 protected Serializable generateContinuationId(FlowExecution flowExecution) { 181 return continuationIdGenerator.generateUid(); 182 } 183 184 protected Serializable parseContinuationId(String encodedId) { 185 return continuationIdGenerator.parseUid(encodedId); 186 } 187 188 194 FlowExecutionContinuationGroup getContinuationGroup(FlowExecutionKey key) { 195 FlowExecutionContinuationGroup group = 196 (FlowExecutionContinuationGroup)getConversation(key).getAttribute(CONTINUATION_GROUP_ATTRIBUTE); 197 return group; 198 } 199 200 205 protected FlowExecutionContinuation getContinuation(FlowExecutionKey key) 206 throws FlowExecutionRestorationFailureException { 207 try { 208 return getContinuationGroup(key).get(getContinuationId(key)); 209 } 210 catch (ContinuationNotFoundException e) { 211 throw new FlowExecutionRestorationFailureException(key, e); 212 } 213 } 214 } | Popular Tags |