diff --git a/java/com.sap.sailing.landscape/.classpath b/java/com.sap.sailing.landscape/.classpath
new file mode 100755
index 00000000000..eca7bdba8f0
--- /dev/null
+++ b/java/com.sap.sailing.landscape/.classpath
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/java/com.sap.sailing.landscape/.project b/java/com.sap.sailing.landscape/.project
new file mode 100755
index 00000000000..ccb496f8ed3
--- /dev/null
+++ b/java/com.sap.sailing.landscape/.project
@@ -0,0 +1,28 @@
+
+
+ com.sap.sailing.landscape
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+
+ org.eclipse.pde.PluginNature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/java/com.sap.sailing.landscape/.settings/org.eclipse.jdt.core.prefs b/java/com.sap.sailing.landscape/.settings/org.eclipse.jdt.core.prefs
new file mode 100755
index 00000000000..9f6ece88bdf
--- /dev/null
+++ b/java/com.sap.sailing.landscape/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/java/com.sap.sailing.landscape/.settings/org.eclipse.pde.core.prefs b/java/com.sap.sailing.landscape/.settings/org.eclipse.pde.core.prefs
new file mode 100755
index 00000000000..f29e940a005
--- /dev/null
+++ b/java/com.sap.sailing.landscape/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/java/com.sap.sailing.landscape/META-INF/MANIFEST.MF b/java/com.sap.sailing.landscape/META-INF/MANIFEST.MF
new file mode 100755
index 00000000000..5135b49e381
--- /dev/null
+++ b/java/com.sap.sailing.landscape/META-INF/MANIFEST.MF
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Landscape
+Bundle-SymbolicName: com.sap.sailing.landscape
+Bundle-Version: 1.0.0.qualifier
+Bundle-Vendor: SAP
+Automatic-Module-Name: com.sap.sailing.landscape
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: com.sap.sse.landscape,
+ com.sap.sse.landscape.aws,
+ com.sap.sse.common
diff --git a/java/com.sap.sailing.landscape/build.properties b/java/com.sap.sailing.landscape/build.properties
new file mode 100755
index 00000000000..34d2e4d2dad
--- /dev/null
+++ b/java/com.sap.sailing.landscape/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/java/com.sap.sailing.landscape/pom.xml b/java/com.sap.sailing.landscape/pom.xml
new file mode 100755
index 00000000000..a04434e15bd
--- /dev/null
+++ b/java/com.sap.sailing.landscape/pom.xml
@@ -0,0 +1,12 @@
+
+
+ 4.0.0
+
+ root
+ com.sap.sailing
+ 1.0.0-SNAPSHOT
+
+ com.sap.sailing.landscape
+ eclipse-plugin
+
diff --git a/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/SailingAnalyticsMaster.java b/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/SailingAnalyticsMaster.java
new file mode 100755
index 00000000000..ab098e70660
--- /dev/null
+++ b/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/SailingAnalyticsMaster.java
@@ -0,0 +1,7 @@
+package com.sap.sailing.landscape;
+
+import com.sap.sse.landscape.application.ApplicationProcessMetrics;
+
+public interface SailingAnalyticsMaster extends SailingAnalyticsProcess {
+
+}
diff --git a/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/SailingAnalyticsProcess.java b/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/SailingAnalyticsProcess.java
new file mode 100755
index 00000000000..fffbee90efc
--- /dev/null
+++ b/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/SailingAnalyticsProcess.java
@@ -0,0 +1,9 @@
+package com.sap.sailing.landscape;
+
+import com.sap.sse.landscape.application.ApplicationProcess;
+import com.sap.sse.landscape.application.ApplicationProcessMetrics;
+
+public interface SailingAnalyticsProcess extends ApplicationProcess {
+ int getTelnetPort();
+ int getExpeditionUdpPort();
+}
diff --git a/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/SailingAnalyticsReplica.java b/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/SailingAnalyticsReplica.java
new file mode 100755
index 00000000000..196ce0adb55
--- /dev/null
+++ b/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/SailingAnalyticsReplica.java
@@ -0,0 +1,7 @@
+package com.sap.sailing.landscape;
+
+import com.sap.sse.landscape.application.ApplicationProcessMetrics;
+
+public interface SailingAnalyticsReplica extends SailingAnalyticsProcess {
+
+}
diff --git a/java/com.sap.sse.landscape/src/com/sap/sse/landscape/mongodb/MongoProcess.java b/java/com.sap.sse.landscape/src/com/sap/sse/landscape/mongodb/MongoProcess.java
index 5b7ffa25057..66b7c6aa652 100755
--- a/java/com.sap.sse.landscape/src/com/sap/sse/landscape/mongodb/MongoProcess.java
+++ b/java/com.sap.sse.landscape/src/com/sap/sse/landscape/mongodb/MongoProcess.java
@@ -4,6 +4,7 @@ import com.sap.sse.landscape.Process;
import com.sap.sse.landscape.RotatingFileBasedLog;
public interface MongoProcess extends Process {
+ int DEFAULT_PORT = 27017;
boolean isHidden();
int getPriority();
int getVotes();
diff --git a/java/com.sap.sse.landscape/src/com/sap/sse/landscape/mongodb/MongoReplicaSet.java b/java/com.sap.sse.landscape/src/com/sap/sse/landscape/mongodb/MongoReplicaSet.java
index 70022c63a05..affe5b6150b 100755
--- a/java/com.sap.sse.landscape/src/com/sap/sse/landscape/mongodb/MongoReplicaSet.java
+++ b/java/com.sap.sse.landscape/src/com/sap/sse/landscape/mongodb/MongoReplicaSet.java
@@ -1,15 +1,48 @@
package com.sap.sse.landscape.mongodb;
import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
-public interface MongoReplicaSet {
+import com.sap.sse.common.Named;
+
+public interface MongoReplicaSet extends Named {
Iterable getInstances();
/**
* The {@code "mongodb://..."} URI that application use to connect to this replica set; not specific
* to any particular database managed by this replica set; see also {@link Database#getConnectionURI()}.
*/
- URI getConnectionURI();
+ default URI getConnectionURI(Optional optionalDb) throws URISyntaxException {
+ final StringBuilder result = new StringBuilder("mongodb://");
+ final List hostSpecs = new ArrayList<>();
+ for (final MongoProcess mongoProcess : getInstances()) {
+ final StringBuilder hostSpec = new StringBuilder();
+ hostSpec.append(mongoProcess.getHost().getPublicAddress().getCanonicalHostName());
+ if (mongoProcess.getPort() != MongoProcess.DEFAULT_PORT) {
+ hostSpec.append(":");
+ hostSpec.append(mongoProcess.getPort());
+ }
+ hostSpecs.add(hostSpec.toString());
+ }
+ result.append(String.join(",", hostSpecs));
+ result.append("/");
+ optionalDb.ifPresent(db->result.append(db.getName()));
+ result.append("?replicaSet=");
+ result.append(getName());
+ result.append("&retryWrites=true");
+ return new URI(result.toString());
+ }
+
+ void addReplica(MongoProcess newReplica);
+
+ void removeReplica(MongoProcess replicaToRemove);
+
+ Iterable getDatabases();
+
+ Database getDatabase(String dbName);
/**
* Imports a {@link Database} from another {@link MongoReplicaSet} which must be different from {@code this}
diff --git a/java/pom.xml b/java/pom.xml
index 24d4d93f0c2..fd1ed403088 100644
--- a/java/pom.xml
+++ b/java/pom.xml
@@ -83,6 +83,7 @@
com.sap.sse.landscape.aws
com.sap.sse.landscape.aws.test
com.sap.sse.landscape.aws.persistence
+ com.sap.sailing.landscape
com.sap.sse.jersey.jaxbdependencyfragment
com.sap.sse.jettyextensions
com.sap.sailing.routeconverterjava11extension