package data;
import java.util.*;
public class StockFromStockCreatorBT extends StockFromStockCreator {
protected List m_lSortedCI;
protected Map m_mplsiItemsAdded = new HashMap();
public StockFromStockCreatorBT (Stock stSource,
CatalogItemValue civ) {
super (stSource, civ);
}
public Value fillStock (Stock st, Value v, DataBasket db) {
Catalog c = st.getCatalog (db);
if (c != m_stSource.getCatalog (db)) {
throw new CatalogConflictException();
}
m_lSortedCI = new LinkedList();
for (Iterator i = c.iterator (db, false); i.hasNext();) {
m_lSortedCI.add (i.next());
}
if (m_lSortedCI.size() == 0) {
return v;
}
Collections.sort (m_lSortedCI,
DefaultCountingStockFromValueCreator.invertedCIValueOrder (m_civEvaluator));
return doFill (0, v, st, db);
}
protected Value doFill (int nIdx, Value v, Stock st, DataBasket db) {
if (v.isAddZero()) {
return v;
}
if (nIdx >= m_lSortedCI.size()) {
return v;
}
CatalogItem ci = (CatalogItem) m_lSortedCI.get (nIdx);
Value vItemValue = m_civEvaluator.getValue (ci);
LinkedList lAddedItems = new LinkedList();
m_mplsiItemsAdded.put (ci.getName(), lAddedItems);
for (Iterator i = m_stSource.get (ci.getName(), db, false); i.hasNext();) {
if (vItemValue.compareTo (v) <= 0) {
StockItem si = (StockItem) i.next();
try {
i.remove();
st.add (si, db);
v.subtractAccumulating (vItemValue);
lAddedItems.add (si);
}
catch (UnsupportedOperationException uoe) {}
}
else {
break;
}
}
if (!v.isAddZero()) {
Value vTemp = doFill (nIdx + 1, v, st, db);
while ((!vTemp.isAddZero()) &&
(lAddedItems.size() > 0)) {
undoFill (nIdx + 1, v, st, db);
try {
StockItem si = (StockItem) lAddedItems.removeLast();
st.remove (si, db);
m_stSource.add (si, db);
v.addAccumulating (m_civEvaluator.getValue (ci));
}
catch (data.events.VetoException ve) {}
vTemp = doFill (nIdx + 1, v, st, db);
}
return vTemp;
}
else {
return v;
}
}
protected void undoFill (int nIdx, Value v, Stock st, DataBasket db) {
for (; nIdx < m_lSortedCI.size(); nIdx++) {
CatalogItem ci = (CatalogItem) m_lSortedCI.get (nIdx);
List lItems = (List) m_mplsiItemsAdded.get (ci.getName());
if (lItems != null) {
for (Iterator i = lItems.iterator(); i.hasNext();) {
try {
StockItem si = (StockItem) i.next();
i.remove();
st.remove (si, db);
m_stSource.add (si, db);
v.addAccumulating (m_civEvaluator.getValue (ci));
}
catch (data.events.VetoException ex) {}
}
}
}
}
}