diff --git a/src/net/persei/oracle/Application.java b/src/net/persei/oracle/Application.java new file mode 100644 index 0000000..874c195 --- /dev/null +++ b/src/net/persei/oracle/Application.java @@ -0,0 +1,5 @@ +package net.persei.oracle; + +public interface Application { + void execute(); +} diff --git a/src/net/persei/oracle/ApplicationContext.java b/src/net/persei/oracle/ApplicationContext.java new file mode 100644 index 0000000..53a1941 --- /dev/null +++ b/src/net/persei/oracle/ApplicationContext.java @@ -0,0 +1,27 @@ +package net.persei.oracle; + +import net.persei.oracle.exceptions.PropertyAlreadySetException; +import net.persei.oracle.exceptions.SetupException; +import net.persei.oracle.setup.Settings; + +public class ApplicationContext { + private ApplicationContext() { + } + + private static ApplicationContext instance; + + public static ApplicationContext getInstance() { + if (instance == null) + instance = new ApplicationContext(); + return instance; + } + + private Settings settings; + + public void setSettings(Settings settings) throws SetupException { + if (this.settings != null) + throw new PropertyAlreadySetException("settings"); + + this.settings = settings; + } +} diff --git a/src/net/persei/oracle/Oracle.java b/src/net/persei/oracle/Oracle.java new file mode 100644 index 0000000..07d194d --- /dev/null +++ b/src/net/persei/oracle/Oracle.java @@ -0,0 +1,57 @@ +package net.persei.oracle; + +import net.persei.oracle.client.OracleClient; +import net.persei.oracle.exceptions.SetupException; +import net.persei.oracle.exceptions.ShutdownException; +import net.persei.oracle.network.objects.Version; +import net.persei.oracle.network.objects.VersionMode; +import net.persei.oracle.server.OracleServer; +import net.persei.oracle.setup.ArgumentParser; +import net.persei.oracle.setup.ConfigParser; +import net.persei.oracle.setup.ExecutionType; +import net.persei.oracle.setup.Settings; + +public class Oracle { + + public static final String APPLICATION_NAME = "ServiceOracle"; + public static final Version CURRENT_VERSION = new Version(0, 1, VersionMode.PRE_ALPHA); + public static final String COPYRIGHT = "overflow"; + public static final String LICENCE = "Released under the MIT licence."; + + public static void main(String[] args) throws SetupException { + + try { + Settings settings = getSettings(args); + + ApplicationContext context = ApplicationContext.getInstance(); + context.setSettings(settings); + + Application application; + + if (settings.getType() == ExecutionType.SERVER) { + application = new OracleServer(); + } else { + application = new OracleClient(); + } + + application.execute(); + + } catch (ShutdownException e) { + System.exit(e.getExitCode()); + } + } + + private static Settings getSettings(String[] args) throws SetupException { + Settings settings = new Settings(); + + ArgumentParser argumentParser = new ArgumentParser(settings); + argumentParser.parse(args); + + ConfigParser configParser = new ConfigParser(settings); + configParser.parse(); + + settings.checkValidity(); + + return settings; + } +} diff --git a/src/net/persei/oracle/client/OracleClient.java b/src/net/persei/oracle/client/OracleClient.java new file mode 100644 index 0000000..a2480b4 --- /dev/null +++ b/src/net/persei/oracle/client/OracleClient.java @@ -0,0 +1,13 @@ +package net.persei.oracle.client; + +import net.persei.oracle.Application; + +public class OracleClient implements Application { + + @Override + public void execute() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/net/persei/oracle/exceptions/ArgumentParsingException.java b/src/net/persei/oracle/exceptions/ArgumentParsingException.java new file mode 100644 index 0000000..2993861 --- /dev/null +++ b/src/net/persei/oracle/exceptions/ArgumentParsingException.java @@ -0,0 +1,10 @@ +package net.persei.oracle.exceptions; + +public class ArgumentParsingException extends SetupException { + public ArgumentParsingException(String message) { + super(message); + } + + private static final long serialVersionUID = -433854290723809252L; + +} diff --git a/src/net/persei/oracle/exceptions/ConfigParsingException.java b/src/net/persei/oracle/exceptions/ConfigParsingException.java new file mode 100644 index 0000000..e72d86c --- /dev/null +++ b/src/net/persei/oracle/exceptions/ConfigParsingException.java @@ -0,0 +1,11 @@ +package net.persei.oracle.exceptions; + +public class ConfigParsingException extends SetupException { + public ConfigParsingException(String message) { + super(message); + } + + private static final long serialVersionUID = -7011858104070362180L; + + +} diff --git a/src/net/persei/oracle/exceptions/PropertyAlreadySetException.java b/src/net/persei/oracle/exceptions/PropertyAlreadySetException.java new file mode 100644 index 0000000..6f86ba1 --- /dev/null +++ b/src/net/persei/oracle/exceptions/PropertyAlreadySetException.java @@ -0,0 +1,10 @@ +package net.persei.oracle.exceptions; + +public class PropertyAlreadySetException extends SetupException { + public PropertyAlreadySetException(String string) { + super(string); + } + + private static final long serialVersionUID = -4052346277556698491L; + +} diff --git a/src/net/persei/oracle/exceptions/SettingsNotValidException.java b/src/net/persei/oracle/exceptions/SettingsNotValidException.java new file mode 100644 index 0000000..45719a7 --- /dev/null +++ b/src/net/persei/oracle/exceptions/SettingsNotValidException.java @@ -0,0 +1,10 @@ +package net.persei.oracle.exceptions; + +public class SettingsNotValidException extends SetupException { + public SettingsNotValidException(String message) { + super(message); + } + + private static final long serialVersionUID = 1418784120827764515L; + +} diff --git a/src/net/persei/oracle/exceptions/SetupException.java b/src/net/persei/oracle/exceptions/SetupException.java new file mode 100644 index 0000000..6bafe2f --- /dev/null +++ b/src/net/persei/oracle/exceptions/SetupException.java @@ -0,0 +1,13 @@ +package net.persei.oracle.exceptions; + +public class SetupException extends Exception { + public SetupException(String message) { + super(message); + } + public SetupException(Throwable cause) { + super(cause); + } + + private static final long serialVersionUID = 5791250500083364858L; + +} diff --git a/src/net/persei/oracle/exceptions/ShutdownException.java b/src/net/persei/oracle/exceptions/ShutdownException.java new file mode 100644 index 0000000..98bbdd4 --- /dev/null +++ b/src/net/persei/oracle/exceptions/ShutdownException.java @@ -0,0 +1,21 @@ +package net.persei.oracle.exceptions; + +public class ShutdownException extends SetupException { + + private static final long serialVersionUID = -3829264217427478192L; + + public static final int ERROR = 1; + public static final int SUCCESS = 0; + + private int exitCode; + + public ShutdownException(int exitCode) { + super("Exitcode: " + exitCode); + this.exitCode = exitCode; + } + + public int getExitCode() { + return exitCode; + } + +} diff --git a/src/net/persei/oracle/network/objects/Contact.java b/src/net/persei/oracle/network/objects/Contact.java new file mode 100644 index 0000000..ac1f0c5 --- /dev/null +++ b/src/net/persei/oracle/network/objects/Contact.java @@ -0,0 +1,10 @@ +package net.persei.oracle.network.objects; + +import java.io.Serializable; + +public class Contact implements Serializable { + private static final long serialVersionUID = 2506758055297999502L; + + private String name; + private String email; +} diff --git a/src/net/persei/oracle/network/objects/HeartBeat.java b/src/net/persei/oracle/network/objects/HeartBeat.java new file mode 100644 index 0000000..5e1c109 --- /dev/null +++ b/src/net/persei/oracle/network/objects/HeartBeat.java @@ -0,0 +1,18 @@ +package net.persei.oracle.network.objects; + +import java.io.Serializable; +import java.time.Instant; + +public class HeartBeat implements Serializable { + private static final long serialVersionUID = -9072594881334560762L; + + private Instant time; + + public HeartBeat() { + time = Instant.now(); + } + + public Instant getTime() { + return time; + } +} diff --git a/src/net/persei/oracle/network/objects/Hello.java b/src/net/persei/oracle/network/objects/Hello.java new file mode 100644 index 0000000..f02c8af --- /dev/null +++ b/src/net/persei/oracle/network/objects/Hello.java @@ -0,0 +1,9 @@ +package net.persei.oracle.network.objects; + +import java.io.Serializable; + +public class Hello implements Serializable { + private static final long serialVersionUID = 5393259647355889964L; + + private Version version; +} diff --git a/src/net/persei/oracle/network/objects/Host.java b/src/net/persei/oracle/network/objects/Host.java new file mode 100644 index 0000000..fddfbe3 --- /dev/null +++ b/src/net/persei/oracle/network/objects/Host.java @@ -0,0 +1,16 @@ +package net.persei.oracle.network.objects; + +import java.io.Serializable; +import java.net.InetAddress; +import java.time.Instant; +import java.util.List; + +public class Host implements Serializable { + private static final long serialVersionUID = 5533783857823198187L; + + private HostAuthKey key; + private Instant started; + private String hostname; + private List addresses; + private List services; +} diff --git a/src/net/persei/oracle/network/objects/HostAuthKey.java b/src/net/persei/oracle/network/objects/HostAuthKey.java new file mode 100644 index 0000000..810731d --- /dev/null +++ b/src/net/persei/oracle/network/objects/HostAuthKey.java @@ -0,0 +1,44 @@ +package net.persei.oracle.network.objects; + +import java.io.Serializable; +import java.util.Arrays; + +import net.persei.tools.Base62; + +public class HostAuthKey implements Serializable { + private static final long serialVersionUID = 5365701218557758110L; + + private byte key[]; + + public HostAuthKey(String key) { + this.key = Base62.decode(key); + } + + @Override + public String toString() { + return Base62.encode(key); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + Arrays.hashCode(key); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + HostAuthKey other = (HostAuthKey) obj; + if (!Arrays.equals(key, other.key)) + return false; + return true; + } + +} diff --git a/src/net/persei/oracle/network/objects/Port.java b/src/net/persei/oracle/network/objects/Port.java new file mode 100644 index 0000000..344b2d4 --- /dev/null +++ b/src/net/persei/oracle/network/objects/Port.java @@ -0,0 +1,10 @@ +package net.persei.oracle.network.objects; + +import java.io.Serializable; + +public class Port implements Serializable { + private static final long serialVersionUID = 8058028964271809291L; + + private int port; + private PortProtocol protocol; +} diff --git a/src/net/persei/oracle/network/objects/PortProtocol.java b/src/net/persei/oracle/network/objects/PortProtocol.java new file mode 100644 index 0000000..a26fa30 --- /dev/null +++ b/src/net/persei/oracle/network/objects/PortProtocol.java @@ -0,0 +1,5 @@ +package net.persei.oracle.network.objects; + +public enum PortProtocol { + TCP, UDP +} diff --git a/src/net/persei/oracle/network/objects/Service.java b/src/net/persei/oracle/network/objects/Service.java new file mode 100644 index 0000000..7cf064e --- /dev/null +++ b/src/net/persei/oracle/network/objects/Service.java @@ -0,0 +1,14 @@ +package net.persei.oracle.network.objects; + +import java.io.Serializable; +import java.util.List; + +public class Service implements Serializable { + private static final long serialVersionUID = -5125680499936971528L; + + private String name; + private String description; + private boolean enabled; + private List ports; + private Contact contact; +} diff --git a/src/net/persei/oracle/network/objects/Update.java b/src/net/persei/oracle/network/objects/Update.java new file mode 100644 index 0000000..ddfc11b --- /dev/null +++ b/src/net/persei/oracle/network/objects/Update.java @@ -0,0 +1,10 @@ +package net.persei.oracle.network.objects; + +import java.io.Serializable; +import java.util.List; + +public class Update implements Serializable { + long serialVersionUID = 1966048120690745996L; + + private List services; +} diff --git a/src/net/persei/oracle/network/objects/Version.java b/src/net/persei/oracle/network/objects/Version.java new file mode 100644 index 0000000..507688e --- /dev/null +++ b/src/net/persei/oracle/network/objects/Version.java @@ -0,0 +1,94 @@ +package net.persei.oracle.network.objects; + +import java.io.Serializable; + +public class Version implements Serializable, Comparable { + private static final long serialVersionUID = -287445485984060288L; + + private int major; + private int minor; + private int patch; + private VersionMode mode; + + public Version(int major, int minor, int patch, VersionMode mode) { + this.major = major; + this.minor = minor; + this.patch = patch; + this.mode = mode; + } + + public Version(int major, int minor, int patch) { + this(major, minor, patch, VersionMode.RELEASE); + } + + public Version(int major, int minor) { + this(major, minor, 0); + } + + public Version(int major) { + this(major, 0); + } + + public Version(int major, int minor, VersionMode mode) { + this(major, minor, 0, mode); + } + + public Version(int major, VersionMode mode) { + this(major, 0, 0, mode); + } + + @Override + public int compareTo(Version o) { + if (this.major > o.major) + return 1; + if (this.major < o.major) + return -1; + if (this.minor > o.minor) + return 1; + if (this.minor < o.minor) + return -1; + if (this.patch > o.patch) + return 1; + if (this.patch < o.patch) + return -1; + return this.mode.compareTo(o.mode); + } + + @Override + public String toString() { + return "V " + major + "." + minor + "." + patch + "." + mode; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + major; + result = prime * result + minor; + result = prime * result + ((mode == null) ? 0 : mode.hashCode()); + result = prime * result + patch; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Version other = (Version) obj; + if (major != other.major) + return false; + if (minor != other.minor) + return false; + if (mode != other.mode) + return false; + if (patch != other.patch) + return false; + return true; + } + + +} diff --git a/src/net/persei/oracle/network/objects/VersionMode.java b/src/net/persei/oracle/network/objects/VersionMode.java new file mode 100644 index 0000000..8daf5c0 --- /dev/null +++ b/src/net/persei/oracle/network/objects/VersionMode.java @@ -0,0 +1,15 @@ +package net.persei.oracle.network.objects; + + +public enum VersionMode { + PRE_ALPHA, ALPHA, BETA, PRERELEASE, RELEASE; + + @Override + public String toString() { + if (this == PRE_ALPHA) + return "PRE ALPHA"; + if (this == VersionMode.RELEASE) + return ""; + return this.name(); + } +} diff --git a/src/net/persei/oracle/server/OracleServer.java b/src/net/persei/oracle/server/OracleServer.java new file mode 100644 index 0000000..ef66bb8 --- /dev/null +++ b/src/net/persei/oracle/server/OracleServer.java @@ -0,0 +1,13 @@ +package net.persei.oracle.server; + +import net.persei.oracle.Application; + +public class OracleServer implements Application { + + @Override + public void execute() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/net/persei/oracle/setup/ArgumentParser.java b/src/net/persei/oracle/setup/ArgumentParser.java new file mode 100644 index 0000000..9048b75 --- /dev/null +++ b/src/net/persei/oracle/setup/ArgumentParser.java @@ -0,0 +1,83 @@ +package net.persei.oracle.setup; + +import java.io.File; +import java.io.FileNotFoundException; + +import net.persei.oracle.Oracle; +import net.persei.oracle.exceptions.SetupException; +import net.persei.oracle.exceptions.ShutdownException; +import net.persei.tools.getopt.ArgumentType; +import net.persei.tools.getopt.Option; +import net.persei.tools.getopt.OptionParser; +import net.persei.tools.getopt.OptionType; +import net.persei.tools.getopt.exceptions.OptionAlreadyGivenException; +import net.persei.tools.getopt.exceptions.OptionDoesNotHaveArgumentException; +import net.persei.tools.getopt.exceptions.OptionException; +import net.persei.tools.getopt.exceptions.OptionNeedsArgumentException; +import net.persei.tools.getopt.exceptions.SilentShutdownException; +import net.persei.tools.getopt.exceptions.UnknownOptionException; + +public class ArgumentParser { + private static final String HELP_TEXT = "[help text]"; + + private OptionParser optionParser; + + public ArgumentParser(Settings settings) { + + optionParser = new OptionParser(); + + try { + optionParser.addOption(new Option().setShortOption('c').setLongOption("config") + .setOptionType(OptionType.NECESSARY).setArgumentType(ArgumentType.NECESSARY).setSingleton(true) + .setSynopsis("set config file").setHandler((argument) -> { + File file = new File(argument); + if (!file.exists()) + throw new OptionException(new FileNotFoundException(argument)); + settings.setConfigFile(file); + })); + + optionParser.addOption(new Option().setLongOption("client").setArgumentType(ArgumentType.NONE) + .setOptionType(OptionType.OPTIONAL).setSingleton(true).setSynopsis("client mode") + .setHandler((argument) -> { + settings.setType(ExecutionType.CLIENT); + })); + + optionParser.addOption(new Option().setLongOption("server").setArgumentType(ArgumentType.NONE) + .setOptionType(OptionType.OPTIONAL).setSingleton(true).setSynopsis("client mode") + .setHandler((argument) -> { + settings.setType(ExecutionType.SERVER); + })); + + optionParser.setHelp( + new Option().setShortOption('h').setLongOption("help").setSynopsis("display this help"), + Oracle.APPLICATION_NAME, Oracle.CURRENT_VERSION.toString(), Oracle.COPYRIGHT, Oracle.LICENCE, + HELP_TEXT, ""); + + } catch (OptionException e) { + e.printStackTrace(); + } + } + + public void parse(String[] args) throws SetupException { + try { + args = optionParser.parse(args); + } catch (SilentShutdownException e) { + throw new ShutdownException(e.getErrorCode()); + } catch (OptionNeedsArgumentException e) { + System.err.println("The option " + e.getMessage() + " needs an argument."); + throw new ShutdownException(ShutdownException.ERROR); + } catch (OptionAlreadyGivenException e) { + System.err.println("The option " + e.getMessage() + " was already given."); + throw new ShutdownException(ShutdownException.ERROR); + } catch (UnknownOptionException e) { + System.err.println("The option " + e.getMessage() + " is unknown."); + throw new ShutdownException(ShutdownException.ERROR); + } catch (OptionDoesNotHaveArgumentException e) { + System.err.println("The option " + e.getMessage() + " does not have an argument."); + throw new ShutdownException(ShutdownException.ERROR); + } catch (OptionException e) { + throw new SetupException(e); + } + } + +} diff --git a/src/net/persei/oracle/setup/ConfigParser.java b/src/net/persei/oracle/setup/ConfigParser.java new file mode 100644 index 0000000..09bd90d --- /dev/null +++ b/src/net/persei/oracle/setup/ConfigParser.java @@ -0,0 +1,14 @@ +package net.persei.oracle.setup; + +public class ConfigParser { + + public ConfigParser(Settings settings) { + // TODO Auto-generated constructor stub + } + + public void parse() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/net/persei/oracle/setup/DefaultSettings.java b/src/net/persei/oracle/setup/DefaultSettings.java new file mode 100644 index 0000000..6e6f90c --- /dev/null +++ b/src/net/persei/oracle/setup/DefaultSettings.java @@ -0,0 +1,6 @@ +package net.persei.oracle.setup; + +public class DefaultSettings { + public static final ExecutionType DEFAULT_EXECUTION_TYPE = ExecutionType.CLIENT; + +} diff --git a/src/net/persei/oracle/setup/ExecutionType.java b/src/net/persei/oracle/setup/ExecutionType.java new file mode 100644 index 0000000..3257c16 --- /dev/null +++ b/src/net/persei/oracle/setup/ExecutionType.java @@ -0,0 +1,5 @@ +package net.persei.oracle.setup; + +public enum ExecutionType { + SERVER, CLIENT +} diff --git a/src/net/persei/oracle/setup/Settings.java b/src/net/persei/oracle/setup/Settings.java new file mode 100644 index 0000000..7b534f4 --- /dev/null +++ b/src/net/persei/oracle/setup/Settings.java @@ -0,0 +1,37 @@ +package net.persei.oracle.setup; + +import java.io.File; + +import net.persei.oracle.exceptions.SettingsNotValidException; + +public class Settings { + private ExecutionType type = DefaultSettings.DEFAULT_EXECUTION_TYPE; + + private File configFile = null; + + public void checkValidity() throws SettingsNotValidException { + if (type == null) + throw new SettingsNotValidException("No execution type set."); + if (configFile == null) + throw new SettingsNotValidException("No config file set."); + } + + public ExecutionType getType() { + return type; + } + + public void setType(ExecutionType type) { + this.type = type; + } + + public File getConfigFile() { + return configFile; + } + + public void setConfigFile(File configFile) { + this.configFile = configFile; + } + + + +}