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