package org.orienteer.junit;
import org.apache.wicket.guice.GuiceComponentInjector;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.util.tester.WicketTester;
import org.orienteer.core.OrienteerWebApplication;
import org.orienteer.core.service.InstanceOfMatcher;
import org.orienteer.core.service.OrienteerModule;
import org.orienteer.core.service.OrienteerInitModule;
import org.orienteer.core.service.OverrideModule;
import ru.ydn.wicket.wicketorientdb.DefaultODatabaseThreadLocalFactory;
import ru.ydn.wicket.wicketorientdb.junit.WicketOrientDbTester;
import com.google.inject.AbstractModule;
import com.google.inject.Injector;
import com.google.inject.Provider;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import com.google.inject.TypeLiteral;
import com.google.inject.name.Names;
import com.google.inject.spi.InjectionListener;
import com.google.inject.spi.TypeEncounter;
import com.google.inject.spi.TypeListener;
import com.orientechnologies.orient.core.db.ODatabaseRecordThreadLocal;
import com.orientechnologies.orient.core.db.document.ODatabaseDocument;
@OverrideModule
public class OrienteerTestModule extends AbstractModule
{
@Override
protected void configure() {
bind(Boolean.class).annotatedWith(Names.named("testing")).toInstance(true);
bindListener(InstanceOfMatcher.createFor(WebApplication.class), new TypeListener() {
@Override
public <I> void hear(TypeLiteral<I> type, final TypeEncounter<I> encounter) {
final Provider<Injector> injectorProvider = encounter.getProvider(Injector.class);
encounter.register(new InjectionListener<Object>() {
@Override
public void afterInjection(Object injectee) {
WebApplication app = (WebApplication)injectee;
app.getComponentInstantiationListeners().add(new GuiceComponentInjector(app, injectorProvider.get()));
}
});
}
});
bind(OrienteerTester.class).asEagerSingleton();
Provider<OrienteerTester> provider = binder().getProvider(OrienteerTester.class);
bind(WicketTester.class).toProvider(provider);
bind(WicketOrientDbTester.class).toProvider(provider);
}
@Provides
public ODatabaseDocument getDatabaseRecord()
{
ODatabaseDocument db = DefaultODatabaseThreadLocalFactory.castToODatabaseDocument(ODatabaseRecordThreadLocal.INSTANCE.get().getDatabaseOwner());
if(db.isClosed())
{
ODatabaseRecordThreadLocal.INSTANCE.remove();
db = DefaultODatabaseThreadLocalFactory.castToODatabaseDocument(ODatabaseRecordThreadLocal.INSTANCE.get().getDatabaseOwner());
}
return db;
}
}