/**
*
*/
package ecologylab.bigsemantics.collecting;
import java.io.File;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ecologylab.appframework.ApplicationProperties;
import ecologylab.bigsemantics.gui.InteractiveSpace;
import ecologylab.bigsemantics.gui.WindowSystemBridge;
import ecologylab.bigsemantics.html.dom.IDOMProvider;
import ecologylab.bigsemantics.namesandnums.DocumentParserTagNames;
import ecologylab.bigsemantics.seeding.SemanticsPrefs;
import ecologylab.collections.ConcurrentHashSet;
import ecologylab.generic.Debug;
import ecologylab.net.ParsedURL;
import ecologylab.serialization.SimplTypesScope;
import ecologylab.serialization.formatenums.Format;
/**
* The fundamental Crossroads of the S.IM.PL Semantics session. Contains references to all major
* objects specific to the session, including VisitedLocationsMap, Crawler, Seeding,
* WindowSystemBridge, and InteractiveSpace.
* <p/>
* Also, by inheritance, refers to GlobalCollections, MetaMetadataRepository, and
* SemanticsDownloadMonitors.
* <p/>
* When this was called InfoCollector, all of the functionality of these objects was moshed together
* in this. Now, they are broken out.
*
* @author andruid
*/
public class SemanticsSessionScope extends SemanticsGlobalScope
implements SemanticsPrefs, ApplicationProperties, DocumentParserTagNames
{
static Logger logger;
static
{
logger = LoggerFactory.getLogger(SemanticsSessionScope.class);
}
private final Crawler crawler;
private final Seeding seeding;
private InteractiveSpace interactiveSpace;
private WindowSystemBridge guiBridge;
private ConcurrentHashSet<ParsedURL> visitedLocations;
public SemanticsSessionScope(SimplTypesScope metadataTypesScope,
Class<? extends IDOMProvider> domProviderClass)
{
this(null, metadataTypesScope, domProviderClass);
}
public SemanticsSessionScope(File repositoryLocation,
SimplTypesScope metadataTypesScope,
Class<? extends IDOMProvider> domProviderClass)
{
this(repositoryLocation, metadataTypesScope, null, domProviderClass);
}
public SemanticsSessionScope(File repositoryLocation,
Format repositoryFormat,
SimplTypesScope metadataTypesScope,
Class<? extends IDOMProvider> domProviderClass)
{
this(repositoryLocation, repositoryFormat, metadataTypesScope, null, domProviderClass);
}
public SemanticsSessionScope(SimplTypesScope metadataTypesScope,
Crawler crawler,
Class<? extends IDOMProvider> domProviderClass)
{
this(null,
MetaMetadataRepositoryInit.DEFAULT_REPOSITORY_FORMAT,
metadataTypesScope,
new Seeding(),
crawler,
domProviderClass);
}
public SemanticsSessionScope(File repositoryLocation,
SimplTypesScope metadataTypesScope,
Crawler crawler,
Class<? extends IDOMProvider> domProviderClass)
{
this(repositoryLocation,
MetaMetadataRepositoryInit.DEFAULT_REPOSITORY_FORMAT,
metadataTypesScope,
new Seeding(),
crawler,
domProviderClass);
}
public SemanticsSessionScope(Format repositoryFormat,
SimplTypesScope metadataTypesScope,
Crawler crawler,
Class<? extends IDOMProvider> domProviderClass)
{
this(null, repositoryFormat, metadataTypesScope, new Seeding(), crawler, domProviderClass);
}
public SemanticsSessionScope(File repositoryLocation,
Format repositoryFormat,
SimplTypesScope metadataTypesScope,
Crawler crawler,
Class<? extends IDOMProvider> domProviderClass)
{
this(repositoryLocation,
repositoryFormat,
metadataTypesScope,
new Seeding(),
crawler,
domProviderClass);
}
public SemanticsSessionScope(File repositoryLocation,
Format repositoryFormat,
SimplTypesScope metadataTypesScope,
Seeding seeding,
Crawler crawler,
Class<? extends IDOMProvider> domProviderClass)
{
super(repositoryLocation, repositoryFormat, metadataTypesScope, domProviderClass);
// this.put(SemanticsSessionObjectNames.INFO_COLLECTOR, this);
this.visitedLocations = new ConcurrentHashSet<ParsedURL>(DocumentLocationMap.NUM_DOCUMENTS);
this.crawler = crawler;
this.seeding = seeding;
seeding.setSemanticsSessionScope(this);
if (crawler != null)
{
crawler.semanticsSessionScope = this;
crawler.setSeeding(seeding);
}
Debug.println("");
}
/**
* Accept the purl if there is no crawler, or if the Seeding says to.
*
* @param purl
* @return
*/
public boolean accept(ParsedURL purl)
{
return isAcceptAll() || seeding.accept(purl);
}
/**
* True if all links should be accepted, without checking their traversability. This is true if
* there is no Crawler, or no Seeding,
*
* @return
*/
public boolean isAcceptAll()
{
return crawler == null || seeding == null;
}
/**
* Add element to visitedLocations set if it wasn't there already.
*
* @param location
* Location to test for membership in visitedLocations and add if it was absent.
*
* @return true if the visitedLocations set changed, that is, if the location was new.
*/
public boolean isLocationNew(ParsedURL location)
{
return visitedLocations.add(location);
}
/**
* @return the seeding
*/
public Seeding getSeeding()
{
return seeding;
}
@Override
public int getAppropriateFontIndex()
{
return (guiBridge != null) ? guiBridge.getAppropriateFontIndex() : -1;
}
@Override
public boolean hasCrawler()
{
return crawler != null;
}
/**
* @return the crawler
*/
@Override
public Crawler getCrawler()
{
return crawler;
}
public void stopCrawler(boolean kill)
{
if (hasCrawler())
crawler.stop(kill);
}
/**
* @return the interactiveSpace
*/
public InteractiveSpace getInteractiveSpace()
{
return interactiveSpace;
}
public void setInteractiveSpace(InteractiveSpace interactiveSpace)
{
this.interactiveSpace = interactiveSpace;
}
@Override
public void displayStatus(String message)
{
super.displayStatus(message);
if (guiBridge != null)
guiBridge.displayStatus(message);
}
@Override
public void displayStatus(String message, int ticks)
{
super.displayStatus(message, ticks);
if (guiBridge != null)
guiBridge.displayStatus(message, ticks);
}
public int showOptionsDialog(String message,
String title,
String[] options,
int initialOptionIndex)
{
int result = initialOptionIndex;
if (guiBridge != null)
{
result = guiBridge.showOptionsDialog(message, title, options, initialOptionIndex);
}
else
{
logger.warn("No GuiBridge, so not displaying and returning initial options: " + message);
}
return result;
}
}