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