package org.sef4j.core.util.factorydef;
import java.io.Closeable;
import org.sef4j.core.util.Handle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SharedRef<T> implements Closeable {
private static final Logger LOG = LoggerFactory.getLogger(SharedRef.class);
private SharedObjectByDefRepository<?,?> repository;
private Handle handle;
private T object;
// ------------------------------------------------------------------------
public SharedRef(SharedObjectByDefRepository<?,?> repository, Handle handle, T object) {
this.handle = handle;
this.object = object;
}
// ------------------------------------------------------------------------
@Override
protected void finalize() {
if (handle != null) {
LOG.warn("detected missing close() for shared object ref while garbage collecting ... close it!");
close();
}
}
@Override
public void close() {
Handle tmpHandle = handle;
if (tmpHandle != null) {
SharedObjectByDefRepository<?,?> tmpRepository = repository;
handle = null;
repository = null;
object = null;
try {
tmpRepository.unregister(tmpHandle);
} catch(Exception ex) {
LOG.warn("Failed to unregister shared ref handle: " + ex.getMessage() + " ...ignore, no retrhow!");
// no rethrow
}
}
}
public T getObject() {
return object;
}
// ------------------------------------------------------------------------
@Override
public String toString() {
return "SharedRef[" + object + "]";
}
}