package org.xmlsh.core;
import java.io.Closeable;
import java.io.IOException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.xmlsh.util.ReferenceCounter;
@SuppressWarnings("serial")
public class ReferenceCountedHandle<T extends IHandleable & Closeable>
implements IReferencedCountedHandle<T> {
private static Logger mLogger = LogManager.getLogger();
private volatile ReferenceCounter mCounter;
private volatile T mObj;
@Override
public String toString() {
return mObj == null ? "null" : mObj.toString() + super.toString();
}
public ReferenceCountedHandle(T obj) {
this(obj, new ReferenceCounter());
}
public ReferenceCountedHandle(T obj, ReferenceCounter counter) {
mLogger.entry(obj, counter);
mCounter = counter;
mLogger.entry(obj);
mObj = obj;
mLogger.exit();
}
/*
* (non-Javadoc)
*
* @see org.xmlsh.core.IManagedHandle#release()
*/
@Override
final public boolean release() throws IOException {
mLogger.entry(this);
assert (!isNull());
if(mCounter.decrement() <= 0) {
mLogger.info("Closing : {} ", mObj);
mObj.close();
mObj = null;
return mLogger.exit(true);
}
return mLogger.exit(false);
}
@Override
public void addRef() {
mLogger.entry();
assert (!isNull());
mLogger.entry(this);
mLogger.exit(mCounter.increment());
}
@Override
final public T get() {
return mObj;
}
@Override
final public boolean isNull() {
return mObj == null;
}
@Override
public int getRefCount() {
return mCounter.getRefCount();
}
}