package data.ooimpl;
import java.util.*;
import java.io.*;
import data.*;
import data.events.*;
import util.*;
public class CatalogImpl extends CatalogItemImpl implements Catalog,
ListenableCatalog,
NameContext,
SelfManagingDBESource,
SelfManagingDBEDestination {
protected ListenerHelper m_lhListeners = new ListenerHelper();
protected int m_nModCount = Integer.MIN_VALUE;
private Map m_mpciItems = new HashMap();
private Map m_mpciTemporaryRemovedItems = new HashMap();
private Map m_mpciTemporaryAddedItems = new HashMap();
private Map m_mpciEditingItems = new HashMap();
private transient java.lang.ref.SoftReference m_srciEditCreator = null;
private final CatalogChangeListener m_cclEditingListener = new CatalogChangeAdapter() {
public void commitEditCatalogItem (CatalogChangeEvent e) {
if (e.getAffectedItem() == CatalogImpl.this) {
((CatalogImpl) e.getSource()).removeCatalogChangeListener (this);
}
}
public void rollbackEditCatalogItem (CatalogChangeEvent e) {
if (e.getAffectedItem() == CatalogImpl.this) {
((CatalogImpl) e.getSource()).removeCatalogChangeListener (this);
((CatalogImpl) m_srciEditCreator.get()).removeCatalogChangeListener (m_cclEditCreatorListener);
m_srciEditCreator = null;
}
}
};
private final CatalogChangeListener m_cclEditCreatorListener = new CatalogChangeAdapter() {
public void commitedAddCatalogItem (CatalogChangeEvent e) {
synchronized (getItemsLock()) {
if (getTemporaryAddedItemsContainer().containsKey (e.getAffectedItem().getName())) {
getTemporaryAddedItemsContainer().remove (e.getAffectedItem().getName());
getItemsContainer().put (e.getAffectedItem().getName(), e.getAffectedItem());
m_nModCount++;
((CatalogItemImpl) e.getAffectedItem()).setCatalog (CatalogImpl.this);
fireCatalogItemAddCommit (e.getAffectedItem(), e.getBasket());
}
}
}
public void rolledbackAddCatalogItem (CatalogChangeEvent e) {
synchronized (getItemsLock()) {
if (getTemporaryAddedItemsContainer().containsKey (e.getAffectedItem().getName())) {
getTemporaryAddedItemsContainer().remove (e.getAffectedItem().getName());
m_nModCount++;
((CatalogItemImpl) e.getAffectedItem()).setCatalog (null);
fireCatalogItemAddRollback (e.getAffectedItem(), e.getBasket());
}
}
}
public void canRemoveCatalogItem (CatalogChangeEvent e) throws VetoException {
throw new VetoException ("Please use the editable version of the Catalog for that.");
}
public void commitedRemoveCatalogItem (CatalogChangeEvent e) {
synchronized (getItemsLock()) {
if (getTemporaryRemovedItemsContainer().containsKey (e.getAffectedItem().getName())) {
getTemporaryRemovedItemsContainer().remove (e.getAffectedItem().getName());
m_nModCount++;
((CatalogItemImpl) e.getAffectedItem()).setCatalog (null);
fireCatalogItemRemoveCommit (e.getAffectedItem(), e.getBasket());
}
}
}
public void rolledbackRemoveCatalogItem (CatalogChangeEvent e) {
synchronized (getItemsLock()) {
if (getTemporaryRemovedItemsContainer().containsKey (e.getAffectedItem().getName())) {
getTemporaryRemovedItemsContainer().remove (e.getAffectedItem().getName());
getItemsContainer().put (e.getAffectedItem().getName(), e.getAffectedItem());
m_nModCount++;
((CatalogItemImpl) e.getAffectedItem()).setCatalog (CatalogImpl.this);
fireCatalogItemRemoveRollback (e.getAffectedItem(), e.getBasket());
}
}
}
public void canEditCatalogItem (CatalogChangeEvent e) throws VetoException {
throw new VetoException ("Please use the editable version of the Catalog for that.");
}
public void commitEditCatalogItem (CatalogChangeEvent e) {
synchronized (getItemsLock()) {
if (getEditingItemsContainer().get (e.getAffectedItem().getName()) == e.getAffectedItem()) {
getEditingItemsContainer().remove (e.getAffectedItem().getName());
fireCommitEditCatalogItem (e.getAffectedItem(), e.getBasket());
}
}
}
public void rollbackEditCatalogItem (CatalogChangeEvent e) {
synchronized (getItemsLock()) {
if (getEditingItemsContainer().get (e.getAffectedItem().getName()) == e.getAffectedItem()) {
getEditingItemsContainer().remove (e.getAffectedItem().getName());
fireRollbackEditCatalogItem (e.getAffectedItem(), e.getBasket());
}
}
}
};
private transient Object m_oItemsLock;
protected final Object getItemsLock() {
if (m_oItemsLock == null) {
m_oItemsLock = new Object();
}
return m_oItemsLock;
}
private void writeObject (ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
if (m_srciEditCreator != null) {
oos.writeObject (m_srciEditCreator.get());
}
else {
oos.writeObject (null);
}
}
private void readObject (ObjectInputStream ois) throws IOException, ClassNotFoundException {
ois.defaultReadObject();
Object oEditCreator = ois.readObject();
if (oEditCreator != null) {
m_srciEditCreator = new java.lang.ref.SoftReference (oEditCreator);
}
}
public CatalogImpl (String sName) {
super (sName);
}
protected Map getItemsContainer() {
return m_mpciItems;
}
protected Map getTemporaryRemovedItemsContainer() {
return m_mpciTemporaryRemovedItems;
}
protected Map getTemporaryAddedItemsContainer() {
return m_mpciTemporaryAddedItems;
}
protected Map getEditingItemsContainer() {
return m_mpciEditingItems;
}
private void setItemsContainer (Map mpNew) {
m_mpciItems = mpNew;
}
private void setTemporaryRemovedItemsContainer (Map mpNew) {
m_mpciTemporaryRemovedItems = mpNew;
}
private void setTemporaryAddedItemsContainer (Map mpNew) {
m_mpciTemporaryAddedItems = mpNew;
}
private void setEditingItemsContainer (Map mpNew) {
m_mpciEditingItems = mpNew;
}
public void add (final CatalogItem ci, DataBasket db) {
if (!isEditable()) {
throw new NotEditableException();
}
CatalogItemImpl cii = (CatalogItemImpl) ci;
Object oLock = (db == null)?(new Object()):(((DataBasketImpl) db).getDBIMonitor());
synchronized (oLock) {
synchronized (getItemsLock()) {
if (getItemsContainer().containsKey (ci.getName())) {
throw new DuplicateKeyException ("Key " + ci.getName() + " already existent in Catalog " + getName() + ".");
}
if (getTemporaryAddedItemsContainer().containsKey (ci.getName())) {
if ((db != null) &&
(db.contains (new DataBasketConditionImpl (CATALOG_ITEM_MAIN_KEY,
ci.getName(),
null,
this,
ci)))) {
throw new DuplicateKeyException ("Key " + ci.getName() + " already existent in Catalog " + getName() + ".");
}
else {
throw new DataBasketConflictException ("CatalogItem with key " + ci.getName() + " already added to Catalog " + getName() + " using a different DataBasket.");
}
}
if (getTemporaryRemovedItemsContainer().containsKey (ci.getName())) {
DataBasketCondition dbc = new DataBasketConditionImpl (CATALOG_ITEM_MAIN_KEY,
ci.getName(),
this,
null,
ci);
if ((db != null) &&
(db.contains (dbc))) {
CatalogItemDataBasketEntry cidbe = (CatalogItemDataBasketEntry) db.get (dbc);
if (cidbe.getDestination() == null) {
db.rollback (dbc);
m_nModCount++;
}
else {
throw new DataBasketConflictException ("CatalogItem with key " + ci.getName() + " already removed from Catalog " + getName() + " and added to another Catalog.");
}
return;
}
else {
throw new DataBasketConflictException ("CatalogItem with key " + ci.getName() + " already removed from Catalog " + getName() + " using a different DataBasket.");
}
}
if (db != null) {
getTemporaryAddedItemsContainer().put (ci.getName(), ci);
DataBasketCondition dbc = new DataBasketConditionImpl (CATALOG_ITEM_MAIN_KEY,
ci.getName(),
null,
null,
null) {
public boolean match (DataBasketEntry dbe) {
return ((dbe.getDestination() == null) &&
(dbe.getSource() != null) &&
(dbe.getValue() == ci));
}
};
if (db.contains (dbc)) {
CatalogItemDataBasketEntry cidbe = (CatalogItemDataBasketEntry) db.get (dbc);
cidbe.setDestination (this);
if (db instanceof ListenableDataBasket) {
((ListenableDataBasket) db).fireDataBasketChanged();
}
}
else {
db.put (new CatalogItemDataBasketEntry (null, this, cii));
}
}
else {
getItemsContainer().put (ci.getName(), ci);
}
m_nModCount++;
cii.setCatalog (this);
fireCatalogItemAdded (cii, db);
}
}
}
public CatalogItem remove (final CatalogItem ci, DataBasket db)
throws VetoException {
if (!isEditable()) {
throw new NotEditableException();
}
CatalogItemImpl cii = (CatalogItemImpl) ci;
Object oLock = (db == null)?(new Object()):(((DataBasketImpl) db).getDBIMonitor());
synchronized (oLock) {
synchronized (getItemsLock()) {
if (getTemporaryAddedItemsContainer().containsKey (ci.getName())) {
DataBasketCondition dbc = new DataBasketConditionImpl (CATALOG_ITEM_MAIN_KEY,
ci.getName(),
null,
this,
ci);
if ((db != null) &&
(db.contains (dbc))) {
CatalogItemDataBasketEntry cidbe = (CatalogItemDataBasketEntry) db.get (dbc);
fireCanRemoveCatalogItem (ci, db);
if (cidbe.getSource() == null) {
db.rollback (dbc);
}
else {
cidbe.setDestination (null);
getTemporaryAddedItemsContainer().remove (ci.getName());
m_nModCount++;
fireCatalogItemAddRollback (ci, db);
if (db instanceof ListenableDataBasket) {
((ListenableDataBasket) db).fireDataBasketChanged();
}
}
cii.setCatalog (null);
return ci;
}
else {
throw new DataBasketConflictException ("CatalogItem " + ci.getName() + " has only been temporaryly added to Catalog " + getName() + " using a different DataBasket, and can therefore not be removed.");
}
}
if (getTemporaryRemovedItemsContainer().containsKey (ci.getName())) {
throw new DataBasketConflictException ("CatalogItem " + ci.getName() + " already removed from Catalog " + getName() + ".");
}
if (!getItemsContainer().containsKey (ci.getName())) {
return null;
}
fireCanRemoveCatalogItem (ci, db);
if (db != null) {
getItemsContainer().remove (ci.getName());
getTemporaryRemovedItemsContainer().put (ci.getName(), ci);
DataBasketCondition dbc = new DataBasketConditionImpl (CATALOG_ITEM_MAIN_KEY,
ci.getName(),
null,
null,
null) {
public boolean match (DataBasketEntry dbe) {
return ((dbe.getSource() == null) &&
(dbe.getValue() == ci));
}
};
if (db.contains (dbc)) {
((CatalogItemDataBasketEntry) db.get (dbc)).setSource (this);
if (db instanceof ListenableDataBasket) {
((ListenableDataBasket) db).fireDataBasketChanged();
}
}
else {
db.put (new CatalogItemDataBasketEntry (this, null, (CatalogItemImpl) ci));
}
}
else {
getItemsContainer().remove (ci.getName());
}
m_nModCount++;
cii.setCatalog (null);
fireCatalogItemRemoved (ci, db);
return ci;
}
}
}
public CatalogItem remove (String sKey, DataBasket db)
throws VetoException {
if (!isEditable()) {
throw new NotEditableException();
}
Object oLock = (db == null)?(new Object()):(((DataBasketImpl) db).getDBIMonitor());
synchronized (oLock) {
synchronized (getItemsLock()) {
CatalogItem ci = null;
if (getItemsContainer().containsKey (sKey)) {
ci = (CatalogItem) getItemsContainer().get (sKey);
}
else {
if (getTemporaryAddedItemsContainer().containsKey (sKey)) {
ci = (CatalogItem) getTemporaryAddedItemsContainer().get (sKey);
}
else {
if (getTemporaryRemovedItemsContainer().containsKey (sKey)) {
throw new DataBasketConflictException ("CatalogItem " + sKey + " already removed from Catalog " + getName() + ".");
}
else {
return null;
}
}
}
return remove (ci, db);
}
}
}
public CatalogItem get (String sKey, DataBasket db, boolean fForEdit)
throws VetoException {
if ((!isEditable()) &&
(fForEdit)) {
throw new NotEditableException();
}
Object oLock = (db == null)?(new Object()):(((DataBasketImpl) db).getDBIMonitor());
synchronized (oLock) {
synchronized (getItemsLock()) {
if (getTemporaryAddedItemsContainer().containsKey (sKey)) {
CatalogItem ci = (CatalogItem) getTemporaryAddedItemsContainer().get (sKey);
if (db != null) {
DataBasketCondition dbc = new DataBasketConditionImpl (CATALOG_ITEM_MAIN_KEY,
sKey,
null,
this,
ci);
DataBasketEntry dbe = db.get (dbc);
if (dbe != null) {
if (fForEdit) {
if (dbe.getSource() != null) {
throw new DataBasketConflictException ("Cannot edit a catalogitem that was removed temporarily from its Catalog.");
}
else {
if (!getEditingItemsContainer().containsKey (sKey)) {
fireCanEditCatalogItem (ci, db);
getEditingItemsContainer().put (sKey, ci);
fireEditingCatalogItem (ci, db);
}
return ci;
}
}
else {
return ci;
}
}
else {
return null;
}
}
else {
return null;
}
}
if (getItemsContainer().containsKey (sKey)) {
CatalogItem ci = (CatalogItem) getItemsContainer().get (sKey);
if ((db != null) &&
(fForEdit)) {
fireCanEditCatalogItem (ci, db);
CatalogItemImpl cci = ((CatalogItemImpl) ci).getShallowClone();
getItemsContainer().remove (sKey);
getTemporaryRemovedItemsContainer().put (sKey, ci);
getTemporaryAddedItemsContainer().put (sKey, cci);
getEditingItemsContainer().put (sKey, cci);
db.put (new CatalogItemDataBasketEntry (this, null, (CatalogItemImpl) ci));
db.put (new CatalogItemDataBasketEntry (null, this, cci));
((CatalogItemImpl) ci).setCatalog (null);
((CatalogItemImpl) cci).setCatalog (this);
fireEditingCatalogItem (cci, db);
fireCatalogItemRemoved (ci, db);
fireCatalogItemAdded (cci, db);
m_nModCount++;
return cci;
}
else {
return ci;
}
}
}
}
return null;
}
public boolean contains (String sKey, DataBasket db) {
Object oLock = (db == null)?(new Object()):(((DataBasketImpl) db).getDBIMonitor());
synchronized (oLock) {
synchronized (getItemsLock()) {
if (getItemsContainer().containsKey (sKey)) {
return true;
}
if ((db != null) &&
(getTemporaryAddedItemsContainer().containsKey (sKey))) {
CatalogItem ci = (CatalogItem) getTemporaryAddedItemsContainer().get (sKey);
DataBasketCondition dbc = new DataBasketConditionImpl (CATALOG_ITEM_MAIN_KEY,
sKey,
null,
this,
ci);
return (db.contains (dbc));
}
return false;
}
}
}
public Iterator iterator (final DataBasket db, final boolean fForEdit) {
final Object oLock = ((db != null)?(((DataBasketImpl) db).getDBIMonitor()):(new Object()));
return new Iterator() {
private Iterator m_iItems;
private int m_nExpectedModCount;
private CatalogItem m_ciCurrent;
{
synchronized (oLock) {
synchronized (getItemsLock()) {
m_iItems = keySet (db).iterator();
m_nExpectedModCount = m_nModCount;
}
}
}
public boolean hasNext() {
return m_iItems.hasNext();
}
public Object next() {
synchronized (oLock) {
synchronized (getItemsLock()) {
if (m_nModCount != m_nExpectedModCount) {
throw new ConcurrentModificationException();
}
String sKey = (String) m_iItems.next();
try {
m_ciCurrent = CatalogImpl.this.get (sKey, db, fForEdit);
if (fForEdit) {
m_nExpectedModCount = m_nModCount;
}
}
catch (VetoException ve) {
throw new UnsupportedOperationException ("VETO: " + ve);
}
return m_ciCurrent;
}
}
}
public void remove() {
synchronized (oLock) {
synchronized (getItemsLock()) {
if (m_nModCount != m_nExpectedModCount) {
throw new ConcurrentModificationException();
}
if (m_ciCurrent == null) {
throw new IllegalStateException();
}
try {
CatalogImpl.this.remove (m_ciCurrent, db);
m_nExpectedModCount = m_nModCount;
m_ciCurrent = null;
}
catch (VetoException ve) {
m_ciCurrent = null;
throw new UnsupportedOperationException();
}
}
}
}
};
}
public Set keySet (DataBasket db) {
Object oLock = (db == null)?(new Object()):(((DataBasketImpl) db).getDBIMonitor());
synchronized (oLock) {
synchronized (getItemsLock()) {
Set stReturn = new TreeSet (getItemsContainer().keySet());
if (db != null) {
for (Iterator i = getTemporaryAddedItemsContainer().values().iterator(); i.hasNext();) {
final CatalogItem ci = (CatalogItem) i.next();
if (!stReturn.contains (ci.getName())) {
DataBasketCondition dbc = new DataBasketConditionImpl (CATALOG_ITEM_MAIN_KEY,
ci.getName(),
null,
this,
ci);
if (db.contains (dbc)) {
stReturn.add (ci.getName());
}
}
}
}
return stReturn;
}
}
}
public int size (DataBasket db) {
return keySet (db).size();
}
void setCatalog (CatalogImpl ci) {
super.setCatalog (ci);
if (ci != null) {
for (Iterator i = getItemsContainer().values().iterator(); i.hasNext();) {
((CatalogItemImpl) i.next()).setCatalog (this);
}
for (Iterator i = getTemporaryAddedItemsContainer().values().iterator(); i.hasNext();) {
((CatalogItemImpl) i.next()).setCatalog (this);
}
}
}
protected CatalogItemImpl getShallowClone() {
CatalogImpl ci = createPeer();
synchronized (getItemsLock()) {
synchronized (ci.getItemsLock()) {
ci.setItemsContainer (new HashMap (getItemsContainer()));
ci.setEditingItemsContainer (new HashMap (getEditingItemsContainer()));
ci.setTemporaryAddedItemsContainer (new HashMap (getTemporaryAddedItemsContainer()));
ci.setTemporaryRemovedItemsContainer (new HashMap (getTemporaryRemovedItemsContainer()));
}
}
ci.m_srciEditCreator = new java.lang.ref.SoftReference (this);
addCatalogChangeListener (ci.m_cclEditCreatorListener);
if (getCatalog() != null) {
((CatalogImpl) getCatalog()).addCatalogChangeListener (ci.m_cclEditingListener);
}
return ci;
}
protected CatalogImpl createPeer() {
return new CatalogImpl (getName());
}
public String toString() {
synchronized (getItemsLock()) {
String sReturn = "Catalog \"" + getName() + "\" [";
boolean fFirst = true;
for (Iterator i = iterator (null, false); i.hasNext();) {
sReturn += ((fFirst)?(""):(", ")) + i.next();
fFirst = false;
}
return sReturn + "]";
}
}
public void commitRemove (DataBasket db, DataBasketEntry dbe) {
synchronized (getItemsLock()) {
if (dbe.getSource() == this) {
CatalogItemImpl cii = (CatalogItemImpl) dbe.getValue();
getTemporaryRemovedItemsContainer().remove (cii.getName());
if (cii.getCatalog() == this) {
cii.setCatalog (null);
}
((CatalogItemDataBasketEntry) dbe).setSource (null);
fireCatalogItemRemoveCommit (cii, db);
}
}
}
public void rollbackRemove (DataBasket db, DataBasketEntry dbe) {
synchronized (getItemsLock()) {
if (dbe.getSource() == this) {
CatalogItemImpl cii = (CatalogItemImpl) dbe.getValue();
if (getTemporaryRemovedItemsContainer().get (cii.getName()) == cii) {
getTemporaryRemovedItemsContainer().remove (cii.getName());
getItemsContainer().put (cii.getName(), cii);
cii.setCatalog (this);
m_nModCount++;
fireCatalogItemRemoveRollback (cii, db);
}
((CatalogItemDataBasketEntry) dbe).setSource (null);
}
}
}
public void commitAdd (DataBasket db, DataBasketEntry dbe) {
synchronized (getItemsLock()) {
if (dbe.getDestination() == this) {
CatalogItemImpl cii = (CatalogItemImpl) dbe.getValue();
if (getTemporaryAddedItemsContainer().get (cii.getName()) == cii) {
getTemporaryAddedItemsContainer().remove (cii.getName());
getItemsContainer().put (cii.getName(), cii);
cii.setCatalog (this);
m_nModCount++;
fireCatalogItemAddCommit (cii, db);
if (getEditingItemsContainer().remove (cii.getName()) != null) {
fireCommitEditCatalogItem (cii, db);
}
}
((CatalogItemDataBasketEntry) dbe).setDestination (null);
}
}
}
public void rollbackAdd (DataBasket db, DataBasketEntry dbe) {
synchronized (getItemsLock()) {
if (dbe.getDestination() == this) {
CatalogItemImpl cii = (CatalogItemImpl) dbe.getValue();
getTemporaryAddedItemsContainer().remove (cii.getName());
if (cii.getCatalog() == this) {
cii.setCatalog (null);
}
((CatalogItemDataBasketEntry) dbe).setDestination (null);
m_nModCount++;
fireCatalogItemAddRollback (cii, db);
if (getEditingItemsContainer().remove (cii.getName()) != null) {
fireRollbackEditCatalogItem (cii, db);
}
}
}
}
public void checkNameChange (DataBasket db, String sOldName, String sNewName)
throws NameContextException {
if (sOldName == sNewName) return;
Object oLock = (db == null)?(new Object()):(((DataBasketImpl) db).getDBIMonitor());
synchronized (oLock) {
synchronized (getItemsLock()) {
if (!getEditingItemsContainer().containsKey (sOldName)) {
throw new NameContextException ("Item must be made editable before you can change its name!");
}
if ((getTemporaryRemovedItemsContainer().containsKey (sNewName)) ||
(getItemsContainer().containsKey (sNewName)) ||
(getTemporaryAddedItemsContainer().containsKey (sNewName))) {
throw new NameContextException ("Name conflict: name \"" + sNewName + "\" already existent (though maybe temproarily removed!)");
}
DataBasketCondition dbc = new DataBasketConditionImpl (CATALOG_ITEM_MAIN_KEY,
sOldName,
null,
this,
null);
if ((db == null) ||
(!db.contains (dbc))) {
throw new NameContextException ("DataBasket conflict: No corresponding item with name \"" + sOldName + "\" in the given DataBasket.");
}
}
}
}
public void nameHasChanged (DataBasket db, String sOldName, String sNewName) {
if (sOldName == sNewName) return;
Object oLock = (db == null)?(new Object()):(((DataBasketImpl) db).getDBIMonitor());
synchronized (oLock) {
synchronized (getItemsLock()) {
getEditingItemsContainer().put (sNewName, getEditingItemsContainer().remove (sOldName));
getTemporaryAddedItemsContainer().put (sNewName, getTemporaryAddedItemsContainer().remove (sOldName));
DataBasketCondition dbc = new DataBasketConditionImpl (CATALOG_ITEM_MAIN_KEY,
sOldName,
null,
this,
null);
DataBasketEntry dbe = db.get (dbc);
db.exchange (dbe, new CatalogItemDataBasketEntry (null, this, (CatalogItemImpl) dbe.getValue()));
m_nModCount++;
}
}
}
public final Object getNCMonitor() { return getItemsLock(); }
public void addCatalogChangeListener (CatalogChangeListener ccl) {
m_lhListeners.add (CatalogChangeListener.class, ccl);
}
public void removeCatalogChangeListener(CatalogChangeListener ccl) {
m_lhListeners.remove (CatalogChangeListener.class, ccl);
}
protected void fireCatalogItemAdded (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).addedCatalogItem (cce);
}
}
}
protected void fireCatalogItemAddCommit (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).commitedAddCatalogItem (cce);
}
}
}
protected void fireCatalogItemAddRollback (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).rolledbackAddCatalogItem (cce);
}
}
}
protected void fireCatalogItemRemoved (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).removedCatalogItem (cce);
}
}
}
protected void fireCatalogItemRemoveCommit (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).commitedRemoveCatalogItem (cce);
}
}
}
protected void fireCatalogItemRemoveRollback (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).rolledbackRemoveCatalogItem (cce);
}
}
}
protected void fireCanRemoveCatalogItem (CatalogItem ci, DataBasket db)
throws VetoException {
Object[] temp = m_lhListeners.getListenerList();
Object[] listeners = new Object[temp.length];
System.arraycopy (temp, 0, listeners, 0, temp.length);
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
try {
((CatalogChangeListener) listeners[i+1]).canRemoveCatalogItem (cce);
}
catch (VetoException e) {
for (int j = i; j < listeners.length; j += 2) {
if (listeners[j] == CatalogChangeListener.class) {
((CatalogChangeListener) listeners[j + 1]).noRemoveCatalogItem (cce);
}
}
throw e;
}
}
}
}
protected void fireCanEditCatalogItem (CatalogItem ci, DataBasket db)
throws VetoException {
Object[] temp = m_lhListeners.getListenerList();
Object[] listeners = new Object[temp.length];
System.arraycopy (temp, 0, listeners, 0, temp.length);
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
try {
((CatalogChangeListener) listeners[i+1]).canEditCatalogItem (cce);
}
catch (VetoException e) {
for (int j = i; j < listeners.length; j += 2) {
if (listeners[j] == CatalogChangeListener.class) {
((CatalogChangeListener) listeners[j + 1]).noEditCatalogItem (cce);
}
}
throw e;
}
}
}
}
protected void fireEditingCatalogItem (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).editingCatalogItem (cce);
}
}
}
protected void fireCommitEditCatalogItem (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).commitEditCatalogItem (cce);
}
}
}
protected void fireRollbackEditCatalogItem (CatalogItem ci, DataBasket db) {
Object[] listeners = m_lhListeners.getListenerList();
CatalogChangeEvent cce = null;
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CatalogChangeListener.class) {
if (cce == null) {
cce = new CatalogChangeEvent (this, ci, db);
}
((CatalogChangeListener) listeners[i+1]).rollbackEditCatalogItem (cce);
}
}
}
}