package org.infinispan.query.helper;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertTrue;
import static org.testng.AssertJUnit.fail;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.concurrent.atomic.AtomicReference;
import org.hibernate.search.exception.ErrorContext;
import org.hibernate.search.exception.ErrorHandler;
import org.hibernate.search.spi.SearchIntegrator;
import org.infinispan.Cache;
import org.infinispan.query.Search;
import org.infinispan.query.SearchManager;
import org.infinispan.query.backend.WrappingErrorHandler;
public class StaticTestingErrorHandler implements ErrorHandler {
private final AtomicReference faulty = new AtomicReference();
@Override
public void handle(ErrorContext context) {
faulty.compareAndSet(null, new ThrowableWrapper(context.getOperationAtFault().toString(), context.getThrowable()));
}
@Override
public void handleException(String errorMsg, Throwable exception) {
faulty.compareAndSet(null, new ThrowableWrapper(errorMsg, exception));
}
private Object getAndReset() {
return faulty.getAndSet(null);
}
public static void assertAllGood(Cache cache) {
SearchManager searchManager = Search.getSearchManager(cache);
SearchIntegrator searchFactory = searchManager.unwrap(SearchIntegrator.class);
ErrorHandler errorHandler = searchFactory.getErrorHandler();
assertNotNull(errorHandler);
if (errorHandler instanceof WrappingErrorHandler) {
errorHandler = ((WrappingErrorHandler) errorHandler).unwrap();
}
assertTrue(errorHandler instanceof StaticTestingErrorHandler);
StaticTestingErrorHandler instance = (StaticTestingErrorHandler) errorHandler;
Object fault = instance.getAndReset();
if (fault != null) {
fail(fault.toString());
}
}
public static void assertAllGood(Cache... caches) {
for (Cache cache : caches) {
assertAllGood(cache);
}
}
public static class ThrowableWrapper {
private final String errorMsg;
private final Throwable exception;
public ThrowableWrapper(String errorMsg, Throwable exception) {
this.errorMsg = errorMsg;
this.exception = exception;
}
@Override
public String toString() {
StringWriter w = new StringWriter();
w.append(String.valueOf(errorMsg));
if (exception != null) {
w.append(' ');
exception.printStackTrace(new PrintWriter(w));
}
return w.toString();
}
}
}