package co.codewizards.cloudstore.ls.core.invoke.refjanitor;
import static co.codewizards.cloudstore.core.util.AssertUtil.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.ServiceLoader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import co.codewizards.cloudstore.ls.core.invoke.ObjectManager;
import co.codewizards.cloudstore.ls.core.invoke.filter.ExtMethodInvocationRequest;
public class ReferenceJanitorRegistry {
private static final Logger logger = LoggerFactory.getLogger(ReferenceJanitorRegistry.class);
private final ObjectManager objectManager;
private final List<ReferenceJanitor> referenceJanitors;
public ReferenceJanitorRegistry(final ObjectManager objectManager) {
this.objectManager = assertNotNull(objectManager, "objectManager");
referenceJanitors = loadReferenceJanitors();
}
private List<ReferenceJanitor> loadReferenceJanitors() {
final ArrayList<ReferenceJanitor> result = new ArrayList<>();
final Iterator<ReferenceJanitor> it = ServiceLoader.load(ReferenceJanitor.class).iterator();
while (it.hasNext())
result.add(it.next());
Collections.sort(result, new Comparator<ReferenceJanitor>() {
@Override
public int compare(ReferenceJanitor o1, ReferenceJanitor o2) {
int result = -1 * Integer.compare(o1.getPriority(), o2.getPriority());
if (result != 0)
return result;
return o1.getClass().getName().compareTo(o2.getClass().getName());
}
});
result.trimToSize();
return result;
}
public void cleanUp() {
for (final ReferenceJanitor referenceJanitor : referenceJanitors) {
try {
referenceJanitor.cleanUp();
} catch (Exception x) {
logger.error("cleanUp: " + x, x);
}
}
}
public void preInvoke(final ExtMethodInvocationRequest extMethodInvocationRequest) {
for (final ReferenceJanitor referenceJanitor : referenceJanitors) {
try {
referenceJanitor.preInvoke(extMethodInvocationRequest);
} catch (Exception x) {
logger.error("preInvoke: " + x, x);
}
}
}
public void postInvoke(final ExtMethodInvocationRequest extMethodInvocationRequest, final Object resultObject, final Throwable error) {
for (final ReferenceJanitor referenceJanitor : referenceJanitors) {
try {
referenceJanitor.postInvoke(extMethodInvocationRequest, resultObject, error);
} catch (Exception x) {
logger.error("preInvoke: " + x, x);
}
}
}
}