package com.pugh.sockso.inject;
import com.pugh.sockso.Console;
import com.pugh.sockso.DBProperties;
import com.pugh.sockso.Manager;
import com.pugh.sockso.Options;
import com.pugh.sockso.Properties;
import com.pugh.sockso.resources.Locale;
import com.pugh.sockso.auth.Authenticator;
import com.pugh.sockso.auth.DBAuthenticator;
import com.pugh.sockso.db.Database;
import com.pugh.sockso.db.MySQLDatabase;
import com.pugh.sockso.db.HSQLDatabase;
import com.pugh.sockso.db.SQLiteDatabase;
import com.pugh.sockso.gui.AppFrame;
import com.pugh.sockso.music.CollectionManager;
import com.pugh.sockso.music.DBCollectionManager;
import com.pugh.sockso.music.indexing.Indexer;
import com.pugh.sockso.music.indexing.TrackIndexer;
import com.pugh.sockso.resources.FileResources;
import com.pugh.sockso.resources.JarResources;
import com.pugh.sockso.resources.Resources;
import com.pugh.sockso.web.action.AmazonCoverSearch;
import com.pugh.sockso.web.action.CoverSearch;
import com.pugh.sockso.web.HttpServer;
import com.pugh.sockso.web.HttpsServer;
import com.pugh.sockso.web.Server;
import joptsimple.OptionSet;
import org.apache.log4j.Logger;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
public class SocksoModule extends AbstractModule {
private static final Logger log = Logger.getLogger( SocksoModule.class );
private final OptionSet options;
public SocksoModule( final OptionSet options ) {
this.options = options;
}
@Override
protected void configure() {
bind( Database.class ).to( getDatabaseClass() );
bind( Resources.class ).to( getResourcesClass() );
bind( Properties.class ).to( DBProperties.class );
bind( Indexer.class ).to( TrackIndexer.class );
bind( CollectionManager.class ).to( DBCollectionManager.class );
bind( Authenticator.class ).to( DBAuthenticator.class );
bind( Server.class ).to( getWebServerClass() );
bind( Manager.class ).to( getManagerClass() );
bind( Locale.class ).toProvider( LocaleProvider.class );
bind( CoverSearch.class ).to( AmazonCoverSearch.class );
}
protected Class<? extends Database> getDatabaseClass() {
final String dbtype = options.has( Options.OPT_DBTYPE )
? options.valueOf(Options.OPT_DBTYPE).toString()
: "";
if ( dbtype.equals("mysql") ) {
log.info( "Using MySQL Database" );
return MySQLDatabase.class;
}
if ( dbtype.equals("sqlite") ) {
log.info( "Using sqlite Database" );
return SQLiteDatabase.class;
}
else {
log.info( "Using HSQL Database" );
return HSQLDatabase.class;
}
}
protected Class<? extends Resources> getResourcesClass() {
final String resourceType = options.has( Options.OPT_RESOURCESTYPE )
? options.valueOf(Options.OPT_RESOURCESTYPE).toString() : "";
log.debug( "Resources type: " +resourceType );
return resourceType.equals( "jar" )
? JarResources.class
: FileResources.class;
}
protected Class<? extends Server> getWebServerClass() {
return options.has( Options.OPT_SSL )
? HttpsServer.class
: HttpServer.class;
}
protected Class<? extends Manager> getManagerClass() {
return options.has( Options.OPT_NOGUI )
? Console.class
: AppFrame.class;
}
@Provides
protected OptionSet getOptions() {
return options;
}
}