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