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