java.lang.Object
net.i2p.router.startup.ClientAppConfig
Contains a really simple ClientApp "structure" and some static methods so they can be used both by
LoadClientAppsJob and by the configuration page in the router console.
clients.config format:
Lines are of the form clientApp.x.prop=val, where x is the app number.
App numbers MUST start with 0 and be consecutive.
Properties are as follows:
main: Full class name. Required. The main() method in this
class will be run.
name: Name to be displayed on console.
args: Arguments to the main class, separated by spaces or tabs.
Arguments containing spaces or tabs may be quoted with ' or "
delay: Seconds before starting, default 120
onBoot: {true|false}, default false, forces a delay of 0,
overrides delay setting
startOnLoad: {true|false} Is the client to be run at all?
Default true
The following additional properties are used only by plugins:
stopargs: Arguments to stop the client.
uninstallargs: Arguments to stop the client.
classpath: Additional classpath elements for the client,
separated by commas.
The following substitutions are made in the args, stopargs,
uninstallargs, and classpath lines, for plugins only:
$I2P: The base I2P install directory
$CONFIG: The user's configuration directory (e.g. ~/.i2p)
$PLUGIN: This plugin's directory (e.g. ~/.i2p/plugins/foo)
All properties except "main" are optional.
Lines starting with "#" are comments.
If the delay is less than zero, the client is run immediately,
in the same thread, so that exceptions may be propagated to the console.
In this case, the client should either throw an exception, return quickly,
or spawn its own thread.
If the delay is greater than or equal to zero, it will be run
in a new thread, and exceptions will be logged but not propagated
to the console.
Field Summary
Modifier and TypeFieldDescriptionThe arguments.The main class name.final StringThe classpath.private static final StringDirectory of drop-in client config fragments.The display name.(package private) FileThe config file.private static final StringDefault name of the client config file.private static final longWait 15s before starting up non-boot client apps.final longThe startup delay.booleanWhether disabled.private static final StringPrefix of every client app property.private static final StringProperty naming the client config file.final StringThe stop arguments.final StringThe uninstall arguments.Constructor Summary
Method Summary
Modifier and TypeMethodDescriptionstatic FileconfigDir(I2PAppContext ctx) This is the config dir.static FileconfigFile(I2PAppContext ctx) This is the old config file.static booleanThis works for both split and non-split config.booleanMatches on class, args, and name only.private static ClientAppConfiggetClientApp(Properties clientApps, String prefix) Reads one app config by its key prefix.static List<ClientAppConfig> getClientApps(File cfgFile) Go through the file, and return a List of ClientAppConfig structures.private static List<ClientAppConfig> getClientApps(Properties clientApps) Reads all the app configs from the properties.static List<ClientAppConfig> Go through the files, and return a List of ClientAppConfig structures This is for the router.inthashCode()Hash code based on class name.static booleanOnly valid for the router's clients (not plugins).private static booleanmigrate(I2PAppContext ctx, List<ClientAppConfig> apps, File from, File dir) Copies the app configs from the old file to individual files in the new directory.private static voidwriteClientAppConfig(List<ClientAppConfig> apps, File cfgFile) All to a single file, apps.configFile ignored.static voidwriteClientAppConfig(I2PAppContext ctx, List<ClientAppConfig> apps) Classpath and stopargs not supported.static voidwriteClientAppConfig(I2PAppContext ctx, ClientAppConfig app) Classpath and stopargs not supported.
Field Details
DEFAULT_STARTUP_DELAY
private static final long DEFAULT_STARTUP_DELAYWait 15s before starting up non-boot client apps.- See Also:
PROP_CLIENT_CONFIG_FILENAME
Property naming the client config file.- See Also:
DEFAULT_CLIENT_CONFIG_FILENAME
Default name of the client config file.- See Also:
CLIENT_CONFIG_DIR
Directory of drop-in client config fragments.- See Also:
PREFIX
Prefix of every client app property.- See Also:
className
The main class name. This and the three fields below may be edited in the router console.clientName
The display name.args
The arguments.disabled
public boolean disabledWhether disabled.delay
public final long delayThe startup delay.classpath
The classpath.stopargs
The stop arguments.uninstallargs
The uninstall arguments.configFile
File configFileThe config file.
Constructor Details
ClientAppConfig
ClientAppConfig
public ClientAppConfig(String cl, String client, String a, long d, boolean dis, String cp, String sa, String ua) Create a new ClientAppConfig with all fields.- Parameters:
cl- the class nameclient- the display namea- the startup argument string handed to the clientd- the startup delay in msdis- true to keep the app from starting with the routercp- extra classpath entries for the client's class loader, or nullsa- the stop argumentsua- the uninstall arguments
Method Details
isSplitConfig
Only valid for the router's clients (not plugins). Only valid after getClientApps(ctx) has been called.- Parameters:
ctx- the I2P app context- Returns:
- true if split config
configFile
This is the old config file. Only valid if not a split config.- Parameters:
ctx- the I2P app context- Returns:
- the config file
configDir
This is the config dir. Only valid if a split config.- Parameters:
ctx- the I2P app context- Returns:
- the config directory
getClientApps
Go through the files, and return a List of ClientAppConfig structures This is for the router.- Parameters:
ctx- the router context- Returns:
- the list of client app configs
getClientApps
Go through the file, and return a List of ClientAppConfig structures.- Parameters:
cfgFile- the config file to read- Returns:
- the list of client app configs
- Throws:
IOException- if the file cannot be read
migrate
Copies the app configs from the old file to individual files in the new directory.- Parameters:
ctx- the app contextapps- the apps already loadedfrom- the file to copy fromdir- the directory to copy to- Returns:
- true if any config moved
getClientApps
Reads all the app configs from the properties.- Parameters:
clientApps- the properties to read- Returns:
- the app configs found
getClientApp
Reads one app config by its key prefix.- Parameters:
clientApps- the properties to readprefix- the prefix of the app's keys- Returns:
- the config, null if absent
writeClientAppConfig
Classpath and stopargs not supported. All other apps in the file will be deleted. Do not use if multiple apps in a single file - use writeClientAppConfig(ctx, apps). If app.configFile is null, a new file will be created and assigned.- Parameters:
ctx- the I2P app contextapp- the client app config to write- Throws:
IOException- if the file cannot be written
writeClientAppConfig
public static void writeClientAppConfig(I2PAppContext ctx, List<ClientAppConfig> apps) throws IOException Classpath and stopargs not supported. All other apps in the files will be deleted. Do not add apps with this method - use writeClientAppConfig(ctx, app). Do not delete apps with this method - usedeleteClientAppConfig(ClientAppConfig).- Parameters:
ctx- the I2P app contextapps- the list of client app configs to write- Throws:
IOException- if the file cannot be written
writeClientAppConfig
private static void writeClientAppConfig(List<ClientAppConfig> apps, File cfgFile) throws IOException All to a single file, apps.configFile ignored.- Parameters:
apps- the client app configs to write, in ordercfgFile- the single file to write them all to- Throws:
IllegalArgumentException- if null cfgFileIOException- if the file cannot be written
deleteClientAppConfig
This works for both split and non-split config. If this is the only config in the file, the file will be deleted; otherwise the file will be saved with the remaining configs.- Parameters:
cac- the client app config to delete- Returns:
- true if the config was removed, leaving the file deleted when it was the last one or rewritten with the remainder otherwise
- Throws:
IllegalArgumentException- if cac has a null configfileIOException- if the file cannot be read or written
hashCode
equals