001 package data.stdforms.twotableformsheet;
002
003 import data.*;
004 import data.stdforms.*;
005
006 import sale.*;
007
008 import users.*;
009
010 /**
011 * MoveStrategy for a Catalog source and destination.
012 *
013 * @author Steffen Zschaler
014 * @version 2.0 20/08/1999
015 * @since v2.0
016 */
017 public class CCStrategy extends MoveStrategy {
018
019 /**
020 * ID for serialization.
021 */
022 private static final long serialVersionUID = -2933078468538022404L;
023
024 /**
025 * Get the sub-process that will move items from the source to the destination.
026 *
027 * @param p the process into which the sub-process wil be embedded.
028 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
029 * @param cSource the source Catalog.
030 * @param cDest the destination Catalog.
031 * @param db the DataBasket relative to which to perform the operation.
032 * @param ci the CatalogItem that is selected in the source.
033 * @param ttfs the FormSheet that triggers the process.
034 *
035 * @override Never
036 */
037 public Transition getMoveToDestProcess(SaleProcess p, SalesPoint sp, Catalog cSource, Catalog cDest,
038 DataBasket db, CatalogItem ci, TwoTableFormSheet ttfs) {
039 return new GateChangeTransition(getCheckMoveToDestGate(p, sp, cSource, cDest, db, ci, ttfs));
040 }
041
042 /**
043 * Get the first gate of the sub-process that will move items from the source to the destination.
044 *
045 * <p>This Gate will check whether the move is allowable, and if so, will trigger a Transition that
046 * performs it.</p>
047 *
048 * @return {@link #getCheckMoveGate}.
049 *
050 * @param p the process into which the sub-process wil be embedded.
051 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
052 * @param cSource the source Catalog.
053 * @param cDest the destination Catalog.
054 * @param db the DataBasket relative to which to perform the operation.
055 * @param ci the CatalogItem that is selected in the source.
056 * @param ttfs the FormSheet that triggers the process.
057 *
058 * @override Never Instead, override {@link #checkMove} and/or {@link #moveImpl}.
059 */
060 protected Gate getCheckMoveToDestGate(SaleProcess p, SalesPoint sp, Catalog cSource, Catalog cDest,
061 DataBasket db, CatalogItem ci, TwoTableFormSheet ttfs) {
062 return getCheckMoveGate(p, sp, cSource, cDest, db, ci, ttfs);
063 }
064
065 /**
066 * Get the sub-process that will move items from the destination to the source.
067 *
068 * @param p the process into which the sub-process wil be embedded.
069 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
070 * @param cSource the source Catalog.
071 * @param cDest the destination Catalog.
072 * @param db the DataBasket relative to which to perform the operation.
073 * @param ci the CatalogItem that is selected in the destination.
074 * @param ttfs the FormSheet that triggers the process.
075 *
076 * @override Never
077 */
078 public Transition getMoveToSourceProcess(SaleProcess p, SalesPoint sp, Catalog cSource, Catalog cDest,
079 DataBasket db, CatalogItem ci, TwoTableFormSheet ttfs) {
080 return new GateChangeTransition(getCheckMoveToSourceGate(p, sp, cSource, cDest, db, ci, ttfs));
081 }
082
083 /**
084 * Get the first gate of the sub-process that will move items from the destination to the source.
085 *
086 * <p>This Gate will check whether the move is allowable, and if so, will trigger a Transition that
087 * performs it.</p>
088 *
089 * @return {@link #getCheckMoveGate}.
090 *
091 * @param p the process into which the sub-process wil be embedded.
092 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
093 * @param cSource the source Catalog.
094 * @param cDest the destination Catalog.
095 * @param db the DataBasket relative to which to perform the operation.
096 * @param ci the CatalogItem that is selected in the destination.
097 * @param ttfs the FormSheet that triggers the process.
098 *
099 * @override Never Instead, override {@link #checkMove} and/or {@link #moveImpl}.
100 */
101 protected Gate getCheckMoveToSourceGate(SaleProcess p, SalesPoint sp, Catalog cSource, Catalog cDest,
102 DataBasket db, CatalogItem ci, TwoTableFormSheet ttfs) {
103 return getCheckMoveGate(p, sp, cDest, cSource, db, ci, ttfs);
104 }
105
106 /**
107 * Get the first gate of a sub-process that will move items from one Catalog into another.
108 *
109 * <p>This Gate will check whether the move is allowable, and if so, will trigger a Transition that
110 * performs it.</p>
111 *
112 * @param p the process into which the sub-process wil be embedded.
113 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
114 * @param cSource the source Catalog.
115 * @param cDest the destination Catalog.
116 * @param db the DataBasket relative to which to perform the operation.
117 * @param ci the CatalogItem that is to be moved from the source into the destination Catalog.
118 * @param ttfs the FormSheet that triggers the process.
119 *
120 * @override Never Instead, override {@link #checkMove} and/or {@link #moveImpl}.
121 */
122 protected Gate getCheckMoveGate(SaleProcess p, final SalesPoint sp, final Catalog cSource,
123 final Catalog cDest, final DataBasket db, final CatalogItem ci, final TwoTableFormSheet ttfs) {
124 return new Gate() {
125 private static final long serialVersionUID = -7885510790768088268L;
126
127 public Transition getNextTransition(SaleProcess p, User u) throws InterruptedException {
128 int nCheckReturn = checkMove(p, sp, cSource, cDest, db, ci);
129
130 if (nCheckReturn == 0) {
131 return new Transition() {
132 private static final long serialVersionUID = -5819789838546069359L;
133
134 public Gate perform(SaleProcess p, User u) {
135 moveImpl(p, sp, cSource, cDest, db, ci);
136
137 return ttfs.getGate();
138 }
139 };
140 } else {
141 error(p, nCheckReturn);
142
143 return new GateChangeTransition(ttfs.getGate());
144 }
145 }
146 };
147 }
148
149 /**
150 * Move the indicated item from the source Catalog into the destination Catalog. You can assume that you are
151 * in a {@link Transition}.
152 *
153 * @param p the process into which the sub-process wil be embedded.
154 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
155 * @param cSource the source Catalog.
156 * @param cDest the destination Catalog.
157 * @param db the DataBasket relative to which to perform the operation.
158 * @param ci the CatalogItem that is to be moved.
159 *
160 * @override Sometimes
161 */
162 protected void moveImpl(SaleProcess p, SalesPoint sp, Catalog cSource, Catalog cDest, DataBasket db,
163 CatalogItem ci) {
164 try {
165 cSource.remove(ci, db);
166 cDest.add(ci, db);
167 }
168 catch (data.events.VetoException ve) {
169 error(p, REMOVE_VETO_EXCEPTION);
170 }
171 catch (DuplicateKeyException dke) {
172 error(p, DUPLICATE_KEY_EXCEPTION);
173 }
174 catch (DataBasketConflictException dbce) {
175 error(p, DATABASKET_CONFLICT_ERROR);
176 }
177 }
178
179 /**
180 * Check whether the indicated move is allowable. If so, return 0, otherwise return a non-zero error value
181 * that can be passed on to {@link sale.stdforms.FormSheetStrategy#error}. You can assume that you are at a {@link Gate}.
182 *
183 * @param p the process into which the sub-process wil be embedded.
184 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
185 * @param cSource the source Catalog.
186 * @param cDest the destination Catalog.
187 * @param db the DataBasket relative to which to perform the operation.
188 * @param ci the CatalogItem that is to be moved.
189 *
190 * @override Sometimes The default implementation returns 0.
191 */
192 protected int checkMove(SaleProcess p, SalesPoint sp, Catalog cSource, Catalog cDest, DataBasket db,
193 CatalogItem ci) throws InterruptedException {
194 return 0;
195 }
196 }