001 package sale;
002
003 import users.User;
004
005 /**
006 * A {@link Gate gate} at which a {@link FormSheet} and/or a {@link MenuSheet} can be displayed. The
007 * {@link Transition transition} that leaves the gate will depend on the users interaction with the Form-
008 * and/or MenuSheet.
009 *
010 * @author Steffen Zschaler
011 * @version 2.0 17/08/1999
012 * @since v2.0
013 */
014 public class UIGate extends Object implements Gate {
015
016 /**
017 * ID for serialization.
018 */
019 private static final long serialVersionUID = -7238925184403757729L;
020
021 /**
022 * The FormSheet to be displayed.
023 *
024 * @serial
025 */
026 protected FormSheet m_fsFormSheet;
027
028 /**
029 * The MenuSheet to be displayed.
030 *
031 * @serial
032 */
033 protected MenuSheet m_msMenuSheet;
034
035 /**
036 * The transition that will leave this gate.
037 */
038 private transient Transition m_tTransition;
039
040 /**
041 * The monitor synchronizing access to the elements as well as a communications channel.
042 */
043 private transient Object m_oLock;
044
045 /**
046 * Return the monitor synchronizing access to the elements as well as a communications channel.
047 *
048 * @override Never
049 */
050 private final Object getLock() {
051 if (m_oLock == null) {
052 m_oLock = new Object();
053 }
054
055 return m_oLock;
056 }
057
058 /**
059 * Bit field indicating the last change.
060 */
061 private transient int m_nChanged = NOTHING;
062 /**
063 * Nothing changed.
064 */
065 private static final int NOTHING = 0;
066 /**
067 * The FormSheet changed.
068 */
069 private static final int FORMSHEET = 1;
070 /**
071 * The MenuSheet changed.
072 */
073 private static final int MENUSHEET = 2;
074 /**
075 * The transition was set.
076 */
077 private static final int TRANSITION = 8;
078
079 /**
080 * Create a new UIGate.
081 *
082 * @param fs the FormSheet to be displayed. Can be <code> null</code>.
083 * @param ms the MenuSheet to be displayed. Can be <code> null</code>.
084 */
085 public UIGate(FormSheet fs, MenuSheet ms) {
086 super();
087
088 m_fsFormSheet = fs;
089 m_msMenuSheet = ms;
090 }
091
092 /**
093 * Returns the next Transition to jump to.
094 * @override Never
095 */
096 public Transition getNextTransition(SaleProcess pOwner, User usr) throws InterruptedException {
097
098 synchronized (getLock()) {
099 m_tTransition = null;
100 m_nChanged = FORMSHEET | MENUSHEET;
101 // e.g. 0011 & 1000 == 0000 => something changed, but no transition found yet
102 while ((m_nChanged & TRANSITION) == 0) {
103 // e.g. 0011 & 0010 == 0010 => MenuSheet changed
104 if ((m_nChanged & MENUSHEET) != 0) {
105 pOwner.getContext().setMenuSheet(pOwner, m_msMenuSheet);
106 }
107 // e.g. 0011 & 0001 == 0001 => FormSheet changed
108 if ((m_nChanged & FORMSHEET) != 0) {
109 if (m_fsFormSheet != null) {
110 m_fsFormSheet.setWaitResponse(false);
111 }
112 pOwner.getContext().setFormSheet(pOwner, m_fsFormSheet);
113 }
114
115 m_nChanged = NOTHING;
116
117 getLock().wait();
118 }
119 }
120 return m_tTransition;
121 }
122
123 /**
124 * Set the FormSheet that is being displayed at this Gate.
125 *
126 * @override Never
127 *
128 * @param fs the new FormSheet
129 */
130 public void setFormSheet(FormSheet fs) {
131 synchronized (getLock()) {
132 m_fsFormSheet = fs;
133 m_nChanged |= FORMSHEET;
134
135 getLock().notifyAll();
136 }
137 }
138
139 /**
140 * Set the MenuSheet that is being displayed at this gate.
141 *
142 * @override Never
143 *
144 * @param ms the MenuSheet.
145 */
146 public void setMenuSheet(MenuSheet ms) {
147 synchronized (getLock()) {
148 m_msMenuSheet = ms;
149 m_nChanged |= MENUSHEET;
150
151 getLock().notifyAll();
152 }
153 }
154
155 /**
156 * Set the transition that will leave this gate. This will leave the gate at once and enter the Transition.
157 * The transition may return to the gate.
158 *
159 * @override Never
160 *
161 * @param tNext the transition. Must not be <code>null</code>.
162 */
163 public void setNextTransition(Transition tNext) {
164 if (tNext == null) {
165 throw new NullPointerException();
166 }
167
168 synchronized (getLock()) {
169 m_tTransition = tNext;
170 m_nChanged |= TRANSITION;
171
172 getLock().notifyAll();
173 }
174 }
175 }