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