package com.crawljax.di; import java.util.concurrent.atomic.AtomicBoolean; import javax.inject.Inject; import javax.inject.Provider; import javax.inject.Singleton; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.codahale.metrics.MetricRegistry; import com.crawljax.core.CrawlSession; import com.crawljax.core.CrawlSessionNotSetupYetException; import com.crawljax.core.configuration.CrawljaxConfiguration; import com.crawljax.core.state.InMemoryStateFlowGraph; import com.crawljax.core.state.StateVertex; import com.google.common.base.Preconditions; /** * Takes care of the lazy initialization of the {@link CrawlSession}. */ @Singleton public class CrawlSessionProvider implements Provider<CrawlSession> { private static final Logger LOG = LoggerFactory.getLogger(CrawlSessionProvider.class); private final AtomicBoolean isSet = new AtomicBoolean(); private final InMemoryStateFlowGraph stateFlowGraph; private final CrawljaxConfiguration config; private final MetricRegistry registry; private CrawlSession session; @Inject public CrawlSessionProvider(InMemoryStateFlowGraph stateFlowGraph, CrawljaxConfiguration config, MetricRegistry registry) { this.stateFlowGraph = stateFlowGraph; this.config = config; this.registry = registry; } /** * @throws IllegalStateException * when the method is invoked more than once. */ public void setup(StateVertex indexState) { if (!isSet.getAndSet(true)) { LOG.debug("Setting up the crawlsession"); StateVertex added = stateFlowGraph.putIndex(indexState); Preconditions.checkArgument(added == null, "Could not set the initial state"); session = new CrawlSession(config, stateFlowGraph, indexState, registry); } else { throw new IllegalStateException("Session is already set"); } } @Override public CrawlSession get() { if (isSet.get()) { return this.session; } else { throw new CrawlSessionNotSetupYetException(); } } }