package Express.services;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
import DisplayProject.binding.beans.ExtendedPropertyChangeSupport;
import DisplayProject.binding.beans.Observable;
import Framework.Constants;
import Framework.HashTable;
import Framework.RuntimeProperties;
/**
* This class appears in the project, but is for internal use only and is not documented.
* <p>
* @author ITerative Consulting
* @since 26-Feb-2008
*/
@RuntimeProperties(isDistributed=false, isAnchored=false, isShared=false, isTransactional=false)
@SuppressWarnings("serial")
public class ConcurrencyKeys
implements Serializable, Observable
{
// ----------
// Attributes
// ----------
public PropertyChangeSupport qq_Listeners = new ExtendedPropertyChangeSupport(this, true);
private HashTable keys;
private int lastClean;
// ------------
// Constructors
// ------------
public ConcurrencyKeys() {
// Explicitly call the superclass constructor to prevent the implicit call
super();
}
// -------
// Methods
// -------
public void addPropertyChangeListener(String property, PropertyChangeListener listener) {
qq_Listeners.addPropertyChangeListener(property, listener);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
qq_Listeners.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(String property, PropertyChangeListener listener) {
qq_Listeners.removePropertyChangeListener(property, listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
qq_Listeners.removePropertyChangeListener(listener);
}
/**
* add<p>
* <p>
* @param keyCB Type: ConcurrencyKeyCB
*/
public void add(ConcurrencyKeyCB keyCB) {
this.keys.enter(keyCB, keyCB.getKey());
}
/**
* drop<p>
* <p>
* @param keyCB Type: ConcurrencyKeyCB
* @param stamp Type: int
*/
@SuppressWarnings("unchecked")
public void drop(ConcurrencyKeyCB keyCB, int stamp) {
keyCB.setCount(keyCB.getCount()-1);
if (keyCB.getCount() <= 0) {
if (keyCB.getCount() < 0) {
throw new Error(Error.CM_NEGATIVE_REF_COUNT, "Drop", this, keyCB.getKey(), Error.qq_Resolver.cERROR_METHODNAME_ORIGINATOR_PARAM1).getException();
}
else if (keyCB.getLocked()) {
throw new Error(Error.CM_DROPPING_LOCKED_KEY, "Drop", this, keyCB.getKey(), Error.qq_Resolver.cERROR_METHODNAME_ORIGINATOR_PARAM1).getException();
}
if (keyCB.getUpdateStamp() == 0) {
this.keys.remove(keyCB.getKey());
}
if (stamp > this.lastClean) {
this.lastClean = stamp;
Array_Of_ConcurrencyKeyCB<ConcurrencyKeyCB> qq_localVector = this.keys.fillArray(Array_Of_ConcurrencyKeyCB.class);
if (qq_localVector != null) {
for (ConcurrencyKeyCB k : qq_localVector) {
if (k.getCount() == 0 && k.getStamp() < stamp) {
this.keys.remove(k.getKey());
}
}
}
}
}
}
/**
* get<p>
* <p>
* @param key Type: BusinessKey
* @return ConcurrencyKeyCB
*/
public ConcurrencyKeyCB get(BusinessKey key) {
return (ConcurrencyKeyCB)this.keys.find(key);
}
/**
* setup<p>
* <p>
* @param size Type: int (Input) (default in Forte: 0)
*/
public void setup(int size) {
int tableSize = size;
if (tableSize == 0) {
tableSize = 1000;
}
this.keys = new HashTable();
this.keys.setup(tableSize, new ConcurrencyKeyHash(Constants.SP_KT_OBJECT));
}
} // end class ConcurrencyKeys
// c Pass 2 Conversion Time: 312 milliseconds