mirror of
https://github.com/sigmasternchen/ServiceOracle
synced 2025-03-15 07:58:59 +00:00
basic project structure + some argument handling
This commit is contained in:
parent
0a9877b2a6
commit
1282abd4d7
27 changed files with 580 additions and 0 deletions
5
src/net/persei/oracle/Application.java
Normal file
5
src/net/persei/oracle/Application.java
Normal file
|
@ -0,0 +1,5 @@
|
|||
package net.persei.oracle;
|
||||
|
||||
public interface Application {
|
||||
void execute();
|
||||
}
|
27
src/net/persei/oracle/ApplicationContext.java
Normal file
27
src/net/persei/oracle/ApplicationContext.java
Normal file
|
@ -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;
|
||||
}
|
||||
}
|
57
src/net/persei/oracle/Oracle.java
Normal file
57
src/net/persei/oracle/Oracle.java
Normal file
|
@ -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;
|
||||
}
|
||||
}
|
13
src/net/persei/oracle/client/OracleClient.java
Normal file
13
src/net/persei/oracle/client/OracleClient.java
Normal file
|
@ -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
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
|
||||
}
|
11
src/net/persei/oracle/exceptions/ConfigParsingException.java
Normal file
11
src/net/persei/oracle/exceptions/ConfigParsingException.java
Normal file
|
@ -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;
|
||||
|
||||
|
||||
}
|
|
@ -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;
|
||||
|
||||
}
|
|
@ -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;
|
||||
|
||||
}
|
13
src/net/persei/oracle/exceptions/SetupException.java
Normal file
13
src/net/persei/oracle/exceptions/SetupException.java
Normal file
|
@ -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;
|
||||
|
||||
}
|
21
src/net/persei/oracle/exceptions/ShutdownException.java
Normal file
21
src/net/persei/oracle/exceptions/ShutdownException.java
Normal file
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
10
src/net/persei/oracle/network/objects/Contact.java
Normal file
10
src/net/persei/oracle/network/objects/Contact.java
Normal file
|
@ -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;
|
||||
}
|
18
src/net/persei/oracle/network/objects/HeartBeat.java
Normal file
18
src/net/persei/oracle/network/objects/HeartBeat.java
Normal file
|
@ -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;
|
||||
}
|
||||
}
|
9
src/net/persei/oracle/network/objects/Hello.java
Normal file
9
src/net/persei/oracle/network/objects/Hello.java
Normal file
|
@ -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;
|
||||
}
|
16
src/net/persei/oracle/network/objects/Host.java
Normal file
16
src/net/persei/oracle/network/objects/Host.java
Normal file
|
@ -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<InetAddress> addresses;
|
||||
private List<Service> services;
|
||||
}
|
44
src/net/persei/oracle/network/objects/HostAuthKey.java
Normal file
44
src/net/persei/oracle/network/objects/HostAuthKey.java
Normal file
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
10
src/net/persei/oracle/network/objects/Port.java
Normal file
10
src/net/persei/oracle/network/objects/Port.java
Normal file
|
@ -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;
|
||||
}
|
5
src/net/persei/oracle/network/objects/PortProtocol.java
Normal file
5
src/net/persei/oracle/network/objects/PortProtocol.java
Normal file
|
@ -0,0 +1,5 @@
|
|||
package net.persei.oracle.network.objects;
|
||||
|
||||
public enum PortProtocol {
|
||||
TCP, UDP
|
||||
}
|
14
src/net/persei/oracle/network/objects/Service.java
Normal file
14
src/net/persei/oracle/network/objects/Service.java
Normal file
|
@ -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<Port> ports;
|
||||
private Contact contact;
|
||||
}
|
10
src/net/persei/oracle/network/objects/Update.java
Normal file
10
src/net/persei/oracle/network/objects/Update.java
Normal file
|
@ -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<Service> services;
|
||||
}
|
94
src/net/persei/oracle/network/objects/Version.java
Normal file
94
src/net/persei/oracle/network/objects/Version.java
Normal file
|
@ -0,0 +1,94 @@
|
|||
package net.persei.oracle.network.objects;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
public class Version implements Serializable, Comparable<Version> {
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
}
|
15
src/net/persei/oracle/network/objects/VersionMode.java
Normal file
15
src/net/persei/oracle/network/objects/VersionMode.java
Normal file
|
@ -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();
|
||||
}
|
||||
}
|
13
src/net/persei/oracle/server/OracleServer.java
Normal file
13
src/net/persei/oracle/server/OracleServer.java
Normal file
|
@ -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
|
||||
|
||||
}
|
||||
|
||||
}
|
83
src/net/persei/oracle/setup/ArgumentParser.java
Normal file
83
src/net/persei/oracle/setup/ArgumentParser.java
Normal file
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
14
src/net/persei/oracle/setup/ConfigParser.java
Normal file
14
src/net/persei/oracle/setup/ConfigParser.java
Normal file
|
@ -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
|
||||
|
||||
}
|
||||
|
||||
}
|
6
src/net/persei/oracle/setup/DefaultSettings.java
Normal file
6
src/net/persei/oracle/setup/DefaultSettings.java
Normal file
|
@ -0,0 +1,6 @@
|
|||
package net.persei.oracle.setup;
|
||||
|
||||
public class DefaultSettings {
|
||||
public static final ExecutionType DEFAULT_EXECUTION_TYPE = ExecutionType.CLIENT;
|
||||
|
||||
}
|
5
src/net/persei/oracle/setup/ExecutionType.java
Normal file
5
src/net/persei/oracle/setup/ExecutionType.java
Normal file
|
@ -0,0 +1,5 @@
|
|||
package net.persei.oracle.setup;
|
||||
|
||||
public enum ExecutionType {
|
||||
SERVER, CLIENT
|
||||
}
|
37
src/net/persei/oracle/setup/Settings.java
Normal file
37
src/net/persei/oracle/setup/Settings.java
Normal file
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
Loading…
Reference in a new issue