01: /*
02: * Copyright 2001-2007 Geert Bevin <gbevin[remove] at uwyn dot com>
03: * Distributed under the terms of either:
04: * - the common development and distribution license (CDDL), v1.0; or
05: * - the GNU Lesser General Public License, v2.1 or later
06: * $Id: StepBackException.java 3813 2007-06-25 18:22:03Z gbevin $
07: */
08: package com.uwyn.rife.continuations.exceptions;
09:
10: import com.uwyn.rife.continuations.ContinuationContext;
11: import com.uwyn.rife.continuations.ContinuationManager;
12: import com.uwyn.rife.tools.exceptions.ControlFlowRuntimeException;
13: import com.uwyn.rife.tools.exceptions.LightweightError;
14:
15: /**
16: * This exception will be thrown when a stepback continuation is triggered.
17: *
18: * @author Geert Bevin (gbevin[remove] at uwyn dot com)
19: * @version $Revision: 3813 $
20: * @since 1.6
21: */
22: public class StepBackException extends LightweightError implements
23: ControlFlowRuntimeException {
24: private static final long serialVersionUID = -5005676849123442618L;
25:
26: private ContinuationContext mContext = null;
27:
28: /**
29: * [PRIVATE AND UNSUPPORTED] Instantiates a new stepback exception.
30: * <p>This is used by the instrumented bytecode that provides
31: * continuations support, it's not intended for general use.
32: * @param context the active continuation context
33: * @since 1.6
34: */
35: public StepBackException(ContinuationContext context) {
36: context.setPaused(true);
37:
38: mContext = context;
39: }
40:
41: /**
42: * Retrieves the context of this stepback continuation.
43: *
44: * @return this stepback continuation's context
45: * @since 1.6
46: */
47: public ContinuationContext getContext() {
48: return mContext;
49: }
50:
51: /**
52: * Looks up the ID of the target continuation of the stepback.
53: *
54: * @return the target continuation ID of the stepback; or
55: * <p>{@code null} if the target continuation couldn't be found
56: * @since 1.6
57: */
58: public String lookupStepBackId() {
59: ContinuationManager manager = mContext.getManager();
60:
61: // try to obtain the label of the previous continuation,
62: // if there is no previous continuation, simply start from the beginning again
63: String parent_id = mContext.getParentId();
64: ContinuationContext parent_context = manager
65: .getContext(parent_id);
66: if (parent_context != null) {
67: String grandparent_id = parent_context.getParentId();
68: ContinuationContext grandparent_context = manager
69: .getContext(grandparent_id);
70:
71: // if the parent context exists, set up this context to resume execution
72: // where the parent context resumed it
73: if (grandparent_context != null) {
74: mContext.setLabel(grandparent_context.getLabel());
75: mContext.setParentId(grandparent_context.getParentId());
76: mContext.addRelatedId(parent_id);
77: return mContext.getId();
78: }
79: }
80:
81: return null;
82: }
83: }
|