/*
* Console.java
*
* Created on Jul 25, 2007, 11:18:07 AM
*
* This class creates a shell console for the user to
* interact with sockso.
*
*/
package com.pugh.sockso;
import com.pugh.sockso.commands.CommandExecuter;
import com.pugh.sockso.commands.CommandParser;
import com.pugh.sockso.db.Database;
import com.pugh.sockso.events.LatestVersionEvent;
import com.pugh.sockso.resources.Locale;
import com.pugh.sockso.music.CollectionManager;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.PrintStream;
import org.apache.log4j.Logger;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class Console implements Manager {
private static final Logger log = Logger.getLogger( Console.class );
protected static final String CMD_COLADD = "coladd";
protected static final String CMD_COLDEL = "coldel";
protected static final String CMD_COLLIST = "collist";
protected static final String CMD_COLSCAN = "colscan";
protected static final String CMD_EXIT = "exit";
protected static final String CMD_PROPSET = "propset";
protected static final String CMD_PROPLIST = "proplist";
protected static final String CMD_PROPDEL = "propdel";
protected static final String CMD_USERLIST = "userlist";
protected static final String CMD_USERADD = "useradd";
protected static final String CMD_USERDEL = "userdel";
protected static final String CMD_USERADMIN = "useradmin";
protected static final String CMD_VERSION = "version";
private final Database db;
private final Properties p;
private final CollectionManager cm;
private final Locale locale;
private final PrintStream out;
private final InputStream is;
private static final String PROMPT = "#SoCkSo#> ";
@Inject
public Console( final Database db, final Properties p, final CollectionManager cm, final Locale locale ) {
this( db, p, cm, System.out, System.in, locale );
}
public Console( final Database db, final Properties p, final CollectionManager cm, final PrintStream out, final InputStream is, final Locale locale ) {
this.db = db;
this.p = p;
this.cm = cm;
this.out = out;
this.is = is;
this.locale = locale;
}
/**
* checks for a newer version
*
*/
public void latestVersionReceived( final LatestVersionEvent evt ) {
final String latestVersion = evt.getVersion();
if ( latestVersion != null && !latestVersion.equals(Sockso.VERSION) ) {
out.println( locale.getString(
"misc.msg.updateAvailable",
new String[] { latestVersion }
));
}
}
/**
* opens the console, presenting the user with a shell
*
*/
public void open() {
final CommandExecuter cmd = new CommandExecuter(db, p, cm, locale, new CommandParser());
BufferedReader in = null;
try {
in = new BufferedReader( new InputStreamReader(is) );
do {
out.print( PROMPT );
final String command = in.readLine();
// if we've been started in the background then we won't
// be attached to any input stream, so can't use console...
if ( command == null ) {
return;
}
out.println( cmd.execute(command) );
}
while ( true );
}
catch ( final Exception e ) {
log.error( e );
}
finally { Utils.close(in); }
}
/**
* closes the console
*
*/
public void close() {
// nothing to do...?
}
}