package data.filters;
import data.*;
import data.events.*;
import util.*;
import java.util.*;
import java.beans.*;
import java.io.*;
public abstract class AbstractStockFilter extends Object implements ListenableStock,
StockChangeListener {
protected Stock m_stSource;
protected ListenerHelper m_lhListeners = new ListenerHelper();
private void readObject (ObjectInputStream ois) throws IOException, ClassNotFoundException {
ois.defaultReadObject();
if (m_stSource instanceof ListenableStock) {
((ListenableStock) m_stSource).addStockChangeListener (this);
}
}
protected AbstractStockFilter (Stock stSource) {
super();
m_stSource = stSource;
if (stSource instanceof ListenableStock) {
((ListenableStock) stSource).addStockChangeListener (this);
}
}
public void add (StockItem si, DataBasket db) {
m_stSource.add (si, db);
}
public void addStock (Stock st, DataBasket db, boolean fRemove) {
m_stSource.addStock (st, db, fRemove);
}
public boolean contains (String sKey, DataBasket db) {
return (countItems (sKey, db) >= 0);
}
public StockItem remove (String sKey, DataBasket db)
throws VetoException {
if (contains (sKey, db)) {
return m_stSource.remove (sKey, db);
}
else {
return null;
}
}
public StockItem remove (StockItem si, DataBasket db)
throws VetoException {
if (contains (si, db)) {
return m_stSource.remove (si, db);
}
else {
return null;
}
}
public Iterator iterator (final DataBasket db, final boolean fForEdit) {
class I implements Iterator {
private Iterator m_iKeys;
private Iterator m_iItems;
public I() {
super();
m_iKeys = keySet (db).iterator();
}
public boolean hasNext() {
return findNext();
}
public Object next() {
if (!findNext()) {
throw new NoSuchElementException ("No more elements in Stock.");
}
return m_iItems.next();
}
public void remove() {
if (m_iItems == null) {
throw new IllegalStateException();
}
m_iItems.remove();
}
private boolean findNext() {
if (m_iItems == null) {
if (m_iKeys.hasNext()) {
m_iItems = get ((String) m_iKeys.next(), db, fForEdit);
}
else {
return false;
}
}
while ((m_iItems.hasNext()) ||
(m_iKeys.hasNext())) {
if (m_iItems.hasNext()) {
return true;
}
m_iItems = get ((String) m_iKeys.next(), db, fForEdit);
}
return false;
}
}
return new I();
}
public Set keySet (DataBasket db) {
Set stKeys = m_stSource.keySet (db);
for (Iterator i = stKeys.iterator(); i.hasNext();) {
String sKey = (String) i.next();
if (!contains (sKey, db)) {
stKeys.remove (sKey);
}
}
return stKeys;
}
public Value sumStock (DataBasket db, CatalogItemValue civ, Value vInit) {
Set stKeys = keySet (db);
for (Iterator i = stKeys.iterator(); i.hasNext();) {
String sKey = (String) i.next();
try {
vInit.addAccumulating (civ.getValue (getCatalog (db).get (sKey, db, false)).multiply (countItems (sKey, db)));
}
catch (VetoException ex) {}
}
return vInit;
}
public Value fillStockWithValue (DataBasket db, Value vTarget, StockFromValueCreator sfvc) {
return m_stSource.fillStockWithValue (db, vTarget, sfvc);
}
public int size (DataBasket db) {
Set stKeys = keySet (db);
int nSize = 0;
for (Iterator i = stKeys.iterator(); i.hasNext();) {
nSize += countItems ((String) i.next(), db);
}
return nSize;
}
public Catalog getCatalog (DataBasket db) {
return m_stSource.getCatalog (db);
}
public Stock getStock() {
return m_stSource.getStock();
}
public CatalogItem getAssociatedItem (DataBasket db) {
return m_stSource.getAssociatedItem (db);
}
public NameContext attach (NameContext nc) {
return m_stSource.attach (nc);
}
public NameContext detachNC() {
return m_stSource.detachNC();
}
public void setName (String sName, DataBasket db)
throws NameContextException {
m_stSource.setName (sName, db);
}
public String getName() {
return m_stSource.getName();
}
public void addPropertyChangeListener (PropertyChangeListener pcl) {
m_stSource.addPropertyChangeListener (pcl);
}
public void removePropertyChangeListener (PropertyChangeListener pcl) {
m_stSource.removePropertyChangeListener (pcl);
}
public void addNameListener (PropertyChangeListener pcl) {
m_stSource.addNameListener (pcl);
}
public void removeNameListener (PropertyChangeListener pcl) {
m_stSource.removeNameListener (pcl);
}
public int compareTo (Object o) {
return m_stSource.compareTo (o);
}
public abstract Object clone();
public void addStockChangeListener (StockChangeListener scl) {
m_lhListeners.add (StockChangeListener.class, scl);
}
public void removeStockChangeListener (StockChangeListener scl) {
m_lhListeners.remove (StockChangeListener.class, scl);
}
public void addedStockItems (StockChangeEvent e) {
Set stItems = new HashSet();
for (Iterator i = e.getAffectedItems(); i.hasNext();) {
StockItem si = (StockItem) i.next();
if (contains (si, e.getBasket())) {
stItems.add (si);
}
}
fireStockItemsAdded (new StockFilterEvent (this, e.getAffectedKey(), stItems, e.getBasket()));
}
public void commitAddStockItems (StockChangeEvent e) {
Set stItems = new HashSet();
for (Iterator i = e.getAffectedItems(); i.hasNext();) {
StockItem si = (StockItem) i.next();
if (contains (si, e.getBasket())) {
stItems.add (si);
}
}
fireStockItemsAddCommit (new StockFilterEvent (this, e.getAffectedKey(), stItems, e.getBasket()));
}
public void rollbackAddStockItems (StockChangeEvent e) {
Set stItems = new HashSet();
for (Iterator i = e.getAffectedItems(); i.hasNext();) {
stItems.add (i.next());
}
fireStockItemsAddRollback (new StockFilterEvent (this, e.getAffectedKey(), stItems, e.getBasket()));
}
public void canRemoveStockItems (StockChangeEvent e)
throws VetoException {
Set stItems = new HashSet();
for (Iterator i = e.getAffectedItems(); i.hasNext();) {
StockItem si = (StockItem) i.next();
if (contains (si, e.getBasket())) {
stItems.add (si);
}
}
fireCanRemoveStockItems (new StockFilterEvent (this, e.getAffectedKey(), stItems, e.getBasket()));
}
public void noRemoveStockItems (StockChangeEvent e) {
Set stItems = new HashSet();
for (Iterator i = e.getAffectedItems(); i.hasNext();) {
StockItem si = (StockItem) i.next();
if (contains (si, e.getBasket())) {
stItems.add (si);
}
}
fireStockItemsNoRemove (new StockFilterEvent (this, e.getAffectedKey(), stItems, e.getBasket()));
}
public void removedStockItems (StockChangeEvent e) {
Set stItems = new HashSet();
for (Iterator i = e.getAffectedItems(); i.hasNext();) {
stItems.add (i.next());
}
fireStockItemsRemoved (new StockFilterEvent (this, e.getAffectedKey(), stItems, e.getBasket()));
}
public void commitRemoveStockItems (StockChangeEvent e) {
Set stItems = new HashSet();
for (Iterator i = e.getAffectedItems(); i.hasNext();) {
stItems.add (i.next());
}
fireStockItemsRemoveCommit (new StockFilterEvent (this, e.getAffectedKey(), stItems, e.getBasket()));
}
public void rollbackRemoveStockItems (StockChangeEvent e) {
Set stItems = new HashSet();
for (Iterator i = e.getAffectedItems(); i.hasNext();) {
StockItem si = (StockItem) i.next();
if (contains (si, e.getBasket())) {
stItems.add (si);
}
}
fireStockItemsRemoveRollback (new StockFilterEvent (this, e.getAffectedKey(), stItems, e.getBasket()));
}
public void canEditStockItems (StockChangeEvent e) throws VetoException {
Set stItems = new HashSet();
for (Iterator i = e.getAffectedItems(); i.hasNext();) {
StockItem si = (StockItem) i.next();
if (contains (si, e.getBasket())) {
stItems.add (si);
}
}
fireCanEditStockItems (new StockFilterEvent (this, e.getAffectedKey(), stItems, e.getBasket()));
}
public void noEditStockItems (StockChangeEvent e) {
Set stItems = new HashSet();
for (Iterator i = e.getAffectedItems(); i.hasNext();) {
StockItem si = (StockItem) i.next();
if (contains (si, e.getBasket())) {
stItems.add (si);
}
}
fireStockItemsNoEdit (new StockFilterEvent (this, e.getAffectedKey(), stItems, e.getBasket()));
}
public void editingStockItems (StockChangeEvent e) {
Set stItems = new HashSet();
for (Iterator i = e.getAffectedItems(); i.hasNext();) {
StockItem si = (StockItem) i.next();
if (contains (si, e.getBasket())) {
stItems.add (si);
}
}
fireEditingStockItems (new StockFilterEvent (this, e.getAffectedKey(), stItems, e.getBasket()));
}
public void commitEditStockItems (StockChangeEvent e) {
Set stItems = new HashSet();
for (Iterator i = e.getAffectedItems(); i.hasNext();) {
StockItem si = (StockItem) i.next();
if (contains (si, e.getBasket())) {
stItems.add (si);
}
}
fireStockItemsEditCommit (new StockFilterEvent (this, e.getAffectedKey(), stItems, e.getBasket()));
}
public void rollbackEditStockItems (StockChangeEvent e) {
Set stItems = new HashSet();
for (Iterator i = e.getAffectedItems(); i.hasNext();) {
StockItem si = (StockItem) i.next();
if (contains (si, e.getBasket())) {
stItems.add (si);
}
}
fireStockItemsEditRollback (new StockFilterEvent (this, e.getAffectedKey(), stItems, e.getBasket()));
}
protected void fireStockItemsAdded (StockChangeEvent e) {
Object[] listeners = m_lhListeners.getListenerList();
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == StockChangeListener.class) {
((StockChangeListener) listeners[i+1]).addedStockItems (e);
}
}
}
protected void fireStockItemsAddCommit (StockChangeEvent e) {
Object[] listeners = m_lhListeners.getListenerList();
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == StockChangeListener.class) {
((StockChangeListener) listeners[i+1]).commitAddStockItems (e);
}
}
}
protected void fireStockItemsAddRollback (StockChangeEvent e) {
Object[] listeners = m_lhListeners.getListenerList();
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == StockChangeListener.class) {
((StockChangeListener) listeners[i+1]).rollbackAddStockItems (e);
}
}
}
protected void fireStockItemsNoRemove (StockChangeEvent e) {
Object[] listeners = m_lhListeners.getListenerList();
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == StockChangeListener.class) {
((StockChangeListener) listeners[i+1]).noRemoveStockItems (e);
}
}
}
protected void fireStockItemsRemoved (StockChangeEvent e) {
Object[] listeners = m_lhListeners.getListenerList();
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == StockChangeListener.class) {
((StockChangeListener) listeners[i+1]).removedStockItems (e);
}
}
}
protected void fireStockItemsRemoveCommit (StockChangeEvent e) {
Object[] listeners = m_lhListeners.getListenerList();
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == StockChangeListener.class) {
((StockChangeListener) listeners[i+1]).commitRemoveStockItems (e);
}
}
}
protected void fireStockItemsRemoveRollback (StockChangeEvent e) {
Object[] listeners = m_lhListeners.getListenerList();
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == StockChangeListener.class) {
((StockChangeListener) listeners[i+1]).rollbackRemoveStockItems (e);
}
}
}
protected void fireCanRemoveStockItems (StockChangeEvent e)
throws VetoException {
Object[] listeners = m_lhListeners.getListenerList();
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == StockChangeListener.class) {
((StockChangeListener) listeners[i+1]).canRemoveStockItems (e);
}
}
}
protected void fireCanEditStockItems (StockChangeEvent e)
throws VetoException {
Object[] listeners = m_lhListeners.getListenerList();
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == StockChangeListener.class) {
((StockChangeListener) listeners[i+1]).canEditStockItems (e);
}
}
}
protected void fireStockItemsNoEdit (StockChangeEvent e) {
Object[] listeners = m_lhListeners.getListenerList();
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == StockChangeListener.class) {
((StockChangeListener) listeners[i+1]).noEditStockItems (e);
}
}
}
protected void fireEditingStockItems (StockChangeEvent e) {
Object[] listeners = m_lhListeners.getListenerList();
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == StockChangeListener.class) {
((StockChangeListener) listeners[i+1]).editingStockItems (e);
}
}
}
protected void fireStockItemsEditCommit (StockChangeEvent e) {
Object[] listeners = m_lhListeners.getListenerList();
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == StockChangeListener.class) {
((StockChangeListener) listeners[i+1]).commitEditStockItems (e);
}
}
}
protected void fireStockItemsEditRollback (StockChangeEvent e) {
Object[] listeners = m_lhListeners.getListenerList();
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == StockChangeListener.class) {
((StockChangeListener) listeners[i+1]).rollbackEditStockItems (e);
}
}
}
}