package restx.jongo.specs.tests; import com.google.common.collect.ImmutableMap; import com.mongodb.MongoClient; import com.mongodb.MongoClientURI; import org.joda.time.DateTime; import restx.factory.*; import restx.mongo.MongoModule; import restx.mongo.MongoSettings; import restx.specs.mongo.GivenJongoCollection; import restx.tests.GivenSpecRule; import restx.tests.GivenSpecRuleSupplier; import javax.inject.Inject; import java.net.UnknownHostException; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; /** * User: xavierhanin * Date: 3/31/13 * Time: 8:25 AM */ @Component public class GivenJongoCollectionSpecRuleSupplier implements GivenSpecRuleSupplier { private String db; private String uri; @Inject public GivenJongoCollectionSpecRuleSupplier(MongoSettings mongoSettings) { this.db = mongoSettings.dbName(); this.uri = mongoSettings.uri(); } @Override public GivenSpecRule get() { return new GivenJongoCollectionSpecRule(db, uri); } public static class GivenJongoCollectionSpecRule implements GivenSpecRule { private static final AtomicLong counter = new AtomicLong(); private final String db; private final String uri; public GivenJongoCollectionSpecRule(String db, String uri) { this.db = db + "-test-" + DateTime.now().getMillis() + "-" + counter.incrementAndGet(); this.uri = uri; } @Override public Map<String, String> getRunParams() { return ImmutableMap.of(GivenJongoCollection.DB_URI, uri + "/" + db); } @Override public void onSetup(Factory.LocalMachines localMachines) { System.out.println("using db " + uri + "/" + db); localMachines .addMachine(new SingletonFactoryMachine<>( -10, new NamedComponent<>(Name.of(String.class, MongoModule.MONGO_DB_NAME), db))); } @Override public void onTearDown(Factory.LocalMachines localMachines) { System.out.println("dropping database " + uri + "/" + db); try { new MongoClient(new MongoClientURI(uri)).dropDatabase(db); } catch (UnknownHostException e) { throw new IllegalStateException("got unknown host exception while contacting mongo db on localhost", e); } } } }