package net.i2p.app;
/**
* If a class started via clients.config implements this interface,
* it will be used to manage the client, instead of starting with main()
*
* Clients implementing this interface MUST provide the following constructor:
*
* public MyClientApp(I2PAppContext context, ClientAppManager listener, String[] args) {...}
*
* All parameters are non-null.
* This constructor is for instantiation only.
* Do not take a long time. Do not block. Never start threads or processes in it.
* The ClientAppState of the returned object must be INITIALIZED,
* or else throw something.
* The startup() method will be called next.
*
* Never ever hold a static reference to the context or anything derived from it.
*
* @since 0.9.4
*/
public interface ClientApp {
/**
* Do not take a long time. Do not block. Start threads here if necessary.
* Client must call ClientAppManager.notify() at least once within this
* method to change the state from INITIALIZED to something else.
* Will not be called multiple times on the same object.
*/
public void startup() throws Throwable;
/**
* Do not take a long time. Do not block. Use a thread if necessary.
* If previously running, client must call ClientAppManager.notify() at least once within this
* method to change the state to STOPPING or STOPPED.
* May be called multiple times on the same object, in any state.
*
* @param args generally null but could be stopArgs from clients.config
*/
public void shutdown(String[] args) throws Throwable;
/**
* The current state of the ClientApp.
* @return non-null
*/
public ClientAppState getState();
/**
* The generic name of the ClientApp, used for registration,
* e.g. "console". Do not translate.
* @return non-null
*/
public String getName();
/**
* The display name of the ClientApp, used in user interfaces.
* The app must translate.
* @return non-null
*/
public String getDisplayName();
}