Apply suggestions from code review
Co-authored-by: CyB3RC0nN0R <kske@outlook.de>
This commit is contained in:
		@@ -11,10 +11,15 @@ import envoy.util.EnvoyLog;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Manages all application settings that are set during application startup by
 | 
			
		||||
 * either loading them from the {@link Properties} file
 | 
			
		||||
 * either loading them from the {@link Properties} file (default values)
 | 
			
		||||
 * {@code client.properties} or parsing them from the command line arguments of
 | 
			
		||||
 * the application.<br>
 | 
			
		||||
 * <br>
 | 
			
		||||
 * the application.
 | 
			
		||||
 * <p>
 | 
			
		||||
 * All items inside the {@code Config} are supposed to either be supplied over
 | 
			
		||||
 * default value or over command line argument. Developers that fail to provide
 | 
			
		||||
 * default values will be greeted with an error message the next time they try
 | 
			
		||||
 * to start Envoy...
 | 
			
		||||
 * <p>
 | 
			
		||||
 * Project: <strong>envoy-client</strong><br>
 | 
			
		||||
 * File: <strong>Config.java</strong><br>
 | 
			
		||||
 * Created: <strong>12 Oct 2019</strong><br>
 | 
			
		||||
@@ -30,10 +35,10 @@ public class Config {
 | 
			
		||||
 | 
			
		||||
	protected Config(String folderName) {
 | 
			
		||||
		final var rootDirectory = new File(System.getProperty("user.home"), folderName);
 | 
			
		||||
		put("homeDirectory", "home", File::new, true);
 | 
			
		||||
		put("homeDirectory", "home", File::new);
 | 
			
		||||
		((ConfigItem<File>) get("homeDirectory")).setValue(rootDirectory);
 | 
			
		||||
		put("fileLevelBarrier", "fb", Level::parse, true);
 | 
			
		||||
		put("consoleLevelBarrier", "cb", Level::parse, true);
 | 
			
		||||
		put("fileLevelBarrier", "fb", Level::parse);
 | 
			
		||||
		put("consoleLevelBarrier", "cb", Level::parse);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -43,10 +48,8 @@ public class Config {
 | 
			
		||||
	 * @since Envoy Common v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	private void load(Properties properties) {
 | 
			
		||||
		items.entrySet()
 | 
			
		||||
			.stream()
 | 
			
		||||
			.filter(e -> properties.containsKey(e.getKey()))
 | 
			
		||||
			.forEach(e -> e.getValue().parse(properties.getProperty(e.getKey())));
 | 
			
		||||
		items.entrySet().stream().filter(e -> properties.containsKey(e.getKey()))
 | 
			
		||||
				.forEach(e -> e.getValue().parse(properties.getProperty(e.getKey())));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -61,25 +64,31 @@ public class Config {
 | 
			
		||||
		for (int i = 0; i < args.length; i++)
 | 
			
		||||
			for (final ConfigItem<?> item : items.values())
 | 
			
		||||
				if (args[i].startsWith("--")) {
 | 
			
		||||
					if (args[i].length() == 2) throw new IllegalStateException("Malformed command line argument at position " + i + ": " + args[i]);
 | 
			
		||||
					if (args[i].length() == 2)
 | 
			
		||||
						throw new IllegalStateException(
 | 
			
		||||
								"Malformed command line argument at position " + i + ": " + args[i]);
 | 
			
		||||
					final String commandLong = args[i].substring(2);
 | 
			
		||||
					if (item.getCommandLong().equals(commandLong)) {
 | 
			
		||||
						item.parse(args[++i]);
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
				} else if (args[i].startsWith("-")) {
 | 
			
		||||
					if (args[i].length() == 1) throw new IllegalStateException("Malformed command line argument at position " + i + ": " + args[i]);
 | 
			
		||||
					if (args[i].length() == 1)
 | 
			
		||||
						throw new IllegalStateException(
 | 
			
		||||
								"Malformed command line argument at position " + i + ": " + args[i]);
 | 
			
		||||
					final String commandShort = args[i].substring(1);
 | 
			
		||||
					if (item.getCommandShort().equals(commandShort)) {
 | 
			
		||||
						item.parse(args[++i]);
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
				} else throw new IllegalStateException("Malformed command line argument at position " + i + ": " + args[i]);
 | 
			
		||||
				} else
 | 
			
		||||
					throw new IllegalStateException(
 | 
			
		||||
							"Malformed command line argument at position " + i + ": " + args[i]);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Supplies default values from the given .properties file and
 | 
			
		||||
	 * parses the configuration from an array of command line arguments.
 | 
			
		||||
	 * Supplies default values from the given .properties file and parses the
 | 
			
		||||
	 * configuration from an array of command line arguments.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param declaringClass     the class calling this method
 | 
			
		||||
	 * @param propertiesFilePath the path to where the .properties file can be found
 | 
			
		||||
@@ -93,37 +102,38 @@ public class Config {
 | 
			
		||||
	 * @since Envoy Common v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public void loadAll(Class<?> declaringClass, String propertiesFilePath, String[] args) {
 | 
			
		||||
		if (modificationDisabled) throw new IllegalStateException("Cannot change config after isInitialized has been called");
 | 
			
		||||
		if (modificationDisabled)
 | 
			
		||||
			throw new IllegalStateException("Cannot change config after isInitialized has been called");
 | 
			
		||||
		// Load the defaults from the given .properties file first
 | 
			
		||||
		final var properties = new Properties();
 | 
			
		||||
		try {
 | 
			
		||||
			properties.load(declaringClass.getClassLoader().getResourceAsStream(propertiesFilePath));
 | 
			
		||||
		} catch (final IOException e) {
 | 
			
		||||
			EnvoyLog.getLogger(Config.class).log(Level.SEVERE, "An error occurred when reading in the configuration: ", e);
 | 
			
		||||
			EnvoyLog.getLogger(Config.class).log(Level.SEVERE, "An error occurred when reading in the configuration: ",
 | 
			
		||||
					e);
 | 
			
		||||
		}
 | 
			
		||||
		load(properties);
 | 
			
		||||
 | 
			
		||||
		// Override configuration values with command line arguments
 | 
			
		||||
		if (args.length > 0) load(args);
 | 
			
		||||
		if (args.length > 0)
 | 
			
		||||
			load(args);
 | 
			
		||||
 | 
			
		||||
		// Check if all mandatory configuration values have been initialized
 | 
			
		||||
		// Check if all configuration values have been initialized
 | 
			
		||||
		isInitialized();
 | 
			
		||||
		// Disable further editing of the config
 | 
			
		||||
		modificationDisabled = true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @throws IllegalStateException if a mandatory {@link ConfigItem} has not been
 | 
			
		||||
	 * @throws IllegalStateException if a {@link ConfigItem} has not been
 | 
			
		||||
	 *                               initialized
 | 
			
		||||
	 * @since Envoy Common v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	private void isInitialized() {
 | 
			
		||||
		if (items.values().stream().filter(ConfigItem::isMandatory).map(ConfigItem::get).anyMatch(Objects::isNull))
 | 
			
		||||
			throw new IllegalStateException("config item(s) has/ have not been initialized:" + items.values()
 | 
			
		||||
				.stream()
 | 
			
		||||
				.filter(configItem -> configItem.isMandatory() && configItem.get() == null)
 | 
			
		||||
				.map(ConfigItem::getCommandLong)
 | 
			
		||||
				.collect(Collectors.toSet()));
 | 
			
		||||
		if (items.values().stream().map(ConfigItem::get).anyMatch(Objects::isNull))
 | 
			
		||||
			throw new IllegalStateException("config item(s) has/ have not been initialized:"
 | 
			
		||||
					+ items.values().stream().filter(configItem -> configItem.get() == null)
 | 
			
		||||
							.map(ConfigItem::getCommandLong).collect(Collectors.toSet()));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -131,28 +141,13 @@ public class Config {
 | 
			
		||||
	 * @return the config item with the specified name
 | 
			
		||||
	 * @since Envoy Common v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public ConfigItem<?> get(String name) { return items.get(name); }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Shorthand for <br>
 | 
			
		||||
	 * {@code items.put(commandName, new ConfigItem<>(commandName, commandShort, parseFunction, defaultValue, mandatory))}.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param <T>           the type of the {@link ConfigItem}
 | 
			
		||||
	 * @param commandName   the key for this config item as well as its long name
 | 
			
		||||
	 * @param commandShort  the abbreviation of this config item
 | 
			
		||||
	 * @param parseFunction the {@code Function<String, T>} that parses the value
 | 
			
		||||
	 *                      from a string
 | 
			
		||||
	 * @param mandatory     indicated that this config item must be initialized with
 | 
			
		||||
	 *                      a non-null value
 | 
			
		||||
	 * @since Envoy Common v0.2-beta
 | 
			
		||||
	 */
 | 
			
		||||
	protected <T> void put(String commandName, String commandShort, Function<String, T> parseFunction, boolean mandatory) {
 | 
			
		||||
		items.put(commandName, new ConfigItem<>(commandName, commandShort, parseFunction, mandatory));
 | 
			
		||||
	public ConfigItem<?> get(String name) {
 | 
			
		||||
		return items.get(name);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Shorthand for <br>
 | 
			
		||||
	 * {@code put(commandName, commandShort, parseFunction, false)}.
 | 
			
		||||
	 * {@code items.put(commandName, new ConfigItem<>(commandName, commandShort, parseFunction, defaultValue))}.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param <T>           the type of the {@link ConfigItem}
 | 
			
		||||
	 * @param commandName   the key for this config item as well as its long name
 | 
			
		||||
@@ -162,25 +157,30 @@ public class Config {
 | 
			
		||||
	 * @since Envoy Common v0.2-beta
 | 
			
		||||
	 */
 | 
			
		||||
	protected <T> void put(String commandName, String commandShort, Function<String, T> parseFunction) {
 | 
			
		||||
		put(commandName, commandShort, parseFunction, false);
 | 
			
		||||
		items.put(commandName, new ConfigItem<>(commandName, commandShort, parseFunction));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return the directory in which all local files are saves
 | 
			
		||||
	 * @since Envoy Client v0.2-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public File getHomeDirectory() { return (File) items.get("homeDirectory").get(); }
 | 
			
		||||
	public File getHomeDirectory() {
 | 
			
		||||
		return (File) items.get("homeDirectory").get();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return the minimal {@link Level} to log inside the log file
 | 
			
		||||
	 * @since Envoy Client v0.2-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public Level getFileLevelBarrier() { return (Level) items.get("fileLevelBarrier").get(); }
 | 
			
		||||
	public Level getFileLevelBarrier() {
 | 
			
		||||
		return (Level) items.get("fileLevelBarrier").get();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return the minimal {@link Level} to log inside the console
 | 
			
		||||
	 * @since Envoy Client v0.2-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public Level getConsoleLevelBarrier() { return (Level) items.get("consoleLevelBarrier").get(); }
 | 
			
		||||
 | 
			
		||||
	public Level getConsoleLevelBarrier() {
 | 
			
		||||
		return (Level) items.get("consoleLevelBarrier").get();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,8 +4,10 @@ import java.util.function.Function;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Contains a single {@link Config} value as well as the corresponding command
 | 
			
		||||
 * line arguments and its default value.<br>
 | 
			
		||||
 * <br>
 | 
			
		||||
 * line arguments and its default value.
 | 
			
		||||
 * <p>
 | 
			
		||||
 * All {@code ConfigItem}s are automatically mandatory.
 | 
			
		||||
 * <p>
 | 
			
		||||
 * Project: <strong>envoy-clientChess</strong><br>
 | 
			
		||||
 * File: <strong>ConfigItem.javaEvent.java</strong><br>
 | 
			
		||||
 * Created: <strong>21.12.2019</strong><br>
 | 
			
		||||
@@ -18,7 +20,6 @@ public final class ConfigItem<T> {
 | 
			
		||||
 | 
			
		||||
	private final String				commandLong, commandShort;
 | 
			
		||||
	private final Function<String, T>	parseFunction;
 | 
			
		||||
	private final boolean				mandatory;
 | 
			
		||||
 | 
			
		||||
	private T value;
 | 
			
		||||
 | 
			
		||||
@@ -29,28 +30,12 @@ public final class ConfigItem<T> {
 | 
			
		||||
	 * @param commandShort  the short command line argument to set this value
 | 
			
		||||
	 * @param parseFunction the {@code Function<String, T>} that parses the value
 | 
			
		||||
	 *                      from a string
 | 
			
		||||
	 * @param mandatory     indicated that this config item must be initialized with
 | 
			
		||||
	 *                      a non-null value
 | 
			
		||||
	 * @since Envoy Common v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public ConfigItem(String commandLong, String commandShort, Function<String, T> parseFunction, boolean mandatory) {
 | 
			
		||||
		this.commandLong	= commandLong;
 | 
			
		||||
		this.commandShort	= commandShort;
 | 
			
		||||
		this.parseFunction	= parseFunction;
 | 
			
		||||
		this.mandatory		= mandatory;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Initializes an optional {@link ConfigItem} without a default value.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param commandLong   the long command line argument to set this value
 | 
			
		||||
	 * @param commandShort  the short command line argument to set this value
 | 
			
		||||
	 * @param parseFunction the {@code Function<String, T>} that parses the value
 | 
			
		||||
	 *                      from a string
 | 
			
		||||
	 * @since Envoy Common v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public ConfigItem(String commandLong, String commandShort, Function<String, T> parseFunction) {
 | 
			
		||||
		this(commandLong, commandShort, parseFunction, false);
 | 
			
		||||
		this.commandLong	= commandLong;
 | 
			
		||||
		this.commandShort	= commandShort;
 | 
			
		||||
		this.parseFunction	= parseFunction;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -86,11 +71,4 @@ public final class ConfigItem<T> {
 | 
			
		||||
	 * @since Envoy Common v0.2-beta
 | 
			
		||||
	 */
 | 
			
		||||
	protected void setValue(T value) { this.value = value; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return {@code true} if this {@link ConfigItem} is mandatory for successful
 | 
			
		||||
	 *         application initialization
 | 
			
		||||
	 * @since Envoy Common v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public boolean isMandatory() { return mandatory; }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -11,15 +11,7 @@ package envoy.event;
 | 
			
		||||
 * @author Leon Hofmeister
 | 
			
		||||
 * @since Envoy Common v0.2-beta
 | 
			
		||||
 */
 | 
			
		||||
public class NoAttachments extends Event<Void> {
 | 
			
		||||
public class NoAttachments extends Event.Valueless {
 | 
			
		||||
 | 
			
		||||
	private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Creates a new {@code NoAttachments}.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @since Envoy Common v0.2-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public NoAttachments() { super(null); }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user