diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..f5f2fc39
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+mvnw.cmd eol=crlf
+gradlew.bat eol=crlf
diff --git a/.gitignore b/.gitignore
index 73978d53..02e89a85 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,4 +9,5 @@ ais-lib-communication/aisbus.xml
.idea
*.iml
.DS_Store
-
+.gradle
+build/
diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 00000000..c6feb8bb
Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 00000000..6637cedb
--- /dev/null
+++ b/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1 @@
+distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 00000000..9bcf9994
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,3 @@
+language: java
+jdk:
+ - oraclejdk8
diff --git a/ais-lib-cli/build.gradle b/ais-lib-cli/build.gradle
new file mode 100644
index 00000000..29d79534
--- /dev/null
+++ b/ais-lib-cli/build.gradle
@@ -0,0 +1,8 @@
+
+description = 'AisLib CLI'
+dependencies {
+ compile project(':ais-lib-communication')
+ compile project(':ais-lib-utils')
+ compile group: 'dk.dma.commons', name: 'dma-commons-app', version:'0.5-SNAPSHOT'
+ compile group: 'commons-io', name: 'commons-io', version:'2.4'
+}
diff --git a/ais-lib-cli/pom.xml b/ais-lib-cli/pom.xml
index 2ac889bd..c61325de 100644
--- a/ais-lib-cli/pom.xml
+++ b/ais-lib-cli/pom.xml
@@ -4,7 +4,8 @@
dk.dma.ais.lib
ais-parent
- 2.4-SNAPSHOT
+ 2.4-CCG-SNAPSHOT
+ ../pom.xml
jar
diff --git a/ais-lib-communication/build.gradle b/ais-lib-communication/build.gradle
new file mode 100644
index 00000000..eaeb625f
--- /dev/null
+++ b/ais-lib-communication/build.gradle
@@ -0,0 +1,15 @@
+
+description = 'AIS Communication'
+dependencies {
+ compile project(':ais-lib-messages')
+ compile group: 'dk.dma.commons', name: 'dma-commons-util', version:'0.5-SNAPSHOT'
+ compile group: 'dk.dma.enav', name: 'enav-util', version:'0.5'
+ compile group: 'com.beust', name: 'jcommander', version:'1.30'
+ compile group: 'javax.xml.bind', name: 'jaxb-api', version:'2.2.7'
+ compile group: 'org.antlr', name: 'antlr4-runtime', version:'4.2'
+ compile group: 'de.micromata.jak', name: 'JavaAPIforKml', version:'2.2.0'
+ compile group: 'org.apache.commons', name: 'commons-csv', version:'1.1'
+ compile group: 'org.apache.commons', name: 'commons-collections4', version:'4.1'
+ testCompile group: 'net.maritimecloud', name: 'mc-util', version:'0.1'
+ testCompile group: 'org.hamcrest', name: 'hamcrest-library', version:'1.3'
+}
diff --git a/ais-lib-communication/pom.xml b/ais-lib-communication/pom.xml
index 88b9cfd9..a8d8de42 100755
--- a/ais-lib-communication/pom.xml
+++ b/ais-lib-communication/pom.xml
@@ -5,7 +5,7 @@
dk.dma.ais.lib
ais-parent
- 2.4-SNAPSHOT
+ 2.4-CCG-SNAPSHOT
../pom.xml
@@ -15,6 +15,30 @@
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+
+
+ attach-javadocs
+
+ jar
+
+
+
+
com.sun.tools.jxc.maven2
maven-jaxb-schemagen-plugin
@@ -97,5 +121,16 @@
commons-csv
1.1
+
+ org.apache.commons
+ commons-collections4
+ 4.1
+
+
+ org.hamcrest
+ hamcrest-library
+ 1.3
+ test
+
-
\ No newline at end of file
+
diff --git a/ais-lib-communication/src/main/java/dk/dma/ais/packet/AisPacket.java b/ais-lib-communication/src/main/java/dk/dma/ais/packet/AisPacket.java
index 579cb9dc..897dcae5 100644
--- a/ais-lib-communication/src/main/java/dk/dma/ais/packet/AisPacket.java
+++ b/ais-lib-communication/src/main/java/dk/dma/ais/packet/AisPacket.java
@@ -14,15 +14,6 @@
*/
package dk.dma.ais.packet;
-import static java.util.Objects.requireNonNull;
-
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-
-import net.jcip.annotations.NotThreadSafe;
import dk.dma.ais.binary.SixbitException;
import dk.dma.ais.message.AisMessage;
import dk.dma.ais.message.AisMessageException;
@@ -31,6 +22,15 @@
import dk.dma.ais.sentence.Vdm;
import dk.dma.enav.model.geometry.Position;
import dk.dma.enav.model.geometry.PositionTime;
+import net.jcip.annotations.NotThreadSafe;
+
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+import static java.util.Objects.requireNonNull;
/**
* Encapsulation of the VDM lines containing a single AIS message including leading proprietary tags and comment/tag
@@ -43,6 +43,7 @@ public class AisPacket implements Comparable {
private final String rawMessage;
private transient Vdm vdm;
+ private transient Vsi vsi;
private transient AisPacketTags tags;
private AisMessage message;
private volatile long timestamp = Long.MIN_VALUE;
@@ -56,6 +57,12 @@ private AisPacket(String stringMessage) {
this.vdm = vdm;
}
+ public AisPacket(Vdm correlatedVdm, Vsi vsi, String stringMessage) {
+ this(stringMessage);
+ this.vdm = correlatedVdm;
+ this.vsi = vsi;
+ }
+
public static AisPacket fromByteBuffer(ByteBuffer buffer) {
int cap = buffer.remaining();
byte[] buf = new byte[cap];
@@ -156,7 +163,7 @@ public AisMessage getAisMessage() throws AisMessageException, SixbitException {
* @return
*/
public boolean isValidMessage() {
- return tryGetAisMessage() != null;
+ return isVsi() || tryGetAisMessage() != null;
}
/**
@@ -189,8 +196,7 @@ public static AisPacket from(String stringMessage) {
* Construct AisPacket from raw packet string
*
* @param messageString
- * @param optional
- * factory
+ *
* @return
* @throws SentenceException
*/
@@ -213,4 +219,12 @@ public static AisPacket readFromString(String messageString) throws SentenceExce
public int compareTo(AisPacket p) {
return Long.compare(getBestTimestamp(), p.getBestTimestamp());
}
+
+ public boolean isVsi() {
+ return vsi != null;
+ }
+
+ public Vsi getVsi() {
+ return vsi;
+ }
}
diff --git a/ais-lib-communication/src/main/java/dk/dma/ais/packet/AisPacketParser.java b/ais-lib-communication/src/main/java/dk/dma/ais/packet/AisPacketParser.java
index 4d18539a..377b9842 100644
--- a/ais-lib-communication/src/main/java/dk/dma/ais/packet/AisPacketParser.java
+++ b/ais-lib-communication/src/main/java/dk/dma/ais/packet/AisPacketParser.java
@@ -21,13 +21,18 @@
import dk.dma.ais.sentence.SentenceLine;
import dk.dma.ais.sentence.Vdm;
import net.jcip.annotations.NotThreadSafe;
+import org.apache.commons.collections4.map.PassiveExpiringMap;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayDeque;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
import java.util.LinkedList;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
/**
* Class to parse lines in a stream containing VDM sentences. The class will deliver packets containing complete VDM and
@@ -51,6 +56,8 @@ public class AisPacketParser {
/** A received VDO/VDM */
private Vdm vdm = new Vdm();
+
+ private Map vdmMessagesInTheLast2Seconds = Collections.synchronizedMap(new PassiveExpiringMap<>(2, TimeUnit.SECONDS, new HashMap<>()));
/**
* Sentence line parser
@@ -91,7 +98,7 @@ private AisPacket readLine(String line, boolean retry) throws SentenceException
}
sentenceTrace.addLast(line);
}
-
+
sentenceLine.parse(line);
// Ignore everything else than sentences
@@ -119,7 +126,9 @@ private AisPacket readLine(String line, boolean retry) throws SentenceException
}
// Add line to raw packet
- packetLines.add(line);
+ if (!sentenceLine.isFormatter("VSI")) {
+ packetLines.add(line);
+ }
// Check if proprietary line
if (sentenceLine.isProprietary()) {
@@ -133,42 +142,68 @@ private AisPacket readLine(String line, boolean retry) throws SentenceException
}
// Check if VDM. If not the possible current VDM is broken.
- if (!sentenceLine.isFormatter("VDM", "VDO")) {
+ if (!sentenceLine.isFormatter("VDM", "VDO", "VSI")) {
newVdm();
return null;
}
- // Parse VDM
- int result;
- try {
- result = vdm.parse(sentenceLine);
- } catch (SentenceException e) {
- newVdm();
- // Do a single retry with the current line. The faulty sentence may be the last, not this one.
- if (!retry) {
- LOG.debug("Discarding current sentence group. New start: " + e.getMessage());
- return readLine(line, true);
+ AisPacket packet;
+ if (sentenceLine.isFormatter("VDM", "VDO")) {
+ int result;
+ try {
+ result = vdm.parse(sentenceLine);
+ } catch (SentenceException e) {
+ newVdm();
+ // Do a single retry with the current line. The faulty sentence may be the last, not this one.
+ if (!retry) {
+ LOG.debug("Discarding current sentence group. New start: " + e.getMessage());
+ return readLine(line, true);
+ }
+ throw new SentenceException(e, sentenceTrace);
}
- throw new SentenceException(e, sentenceTrace);
- }
- // If not complete package wait for more
- if (result != 0) {
- return null;
- }
+ // If not complete package wait for more
+ if (result != 0) {
+ return null;
+ }
- // Complete package have been read
+ // Complete package have been read
- // Put proprietary tags on vdm
- if (tags.size() > 0) {
- vdm.setTags(new LinkedList<>(tags));
- }
+ // Put proprietary tags on vdm
+ if (tags.size() > 0) {
+ vdm.setTags(new LinkedList<>(tags));
+ }
+
+ packet = new AisPacket(vdm, StringUtils.join(packetLines, "\r\n"));
+
+ keepPacketForVsiCorrelation(packet);
+ } else { // VSI
+ Vsi vsi = new Vsi();
+ vsi.parse(sentenceLine);
- // Make packet
- AisPacket packet = new AisPacket(vdm, StringUtils.join(packetLines, "\r\n"));
+ String messageKey = sentenceLine.getFields().get(1) + sentenceLine.getFields().get(2);
+ AisPacket correlatedVdmPacket = vdmMessagesInTheLast2Seconds.remove(messageKey);
+
+ if (correlatedVdmPacket != null) {
+ Vdm vdm = correlatedVdmPacket.getVdm();
+
+ packet = new AisPacket(vdm, vsi, correlatedVdmPacket.getStringMessage());
+ } else {
+ packet = null;
+ }
+ }
newVdm();
return packet;
}
+
+ private void keepPacketForVsiCorrelation(AisPacket packet) {
+ if (packet.getVdm().getCommentBlock() != null) {
+ SentenceLine sentenceLine = new SentenceLine(packet.getVdm().getRawSentencesJoined());
+ String stationId = packet.getVdm().getCommentBlock().getString("s");
+ String messageSequenceNumber = sentenceLine.getFields().get(3);
+ vdmMessagesInTheLast2Seconds.put(stationId + messageSequenceNumber, AisPacket.from(packet.getStringMessage()));
+ }
+ }
}
diff --git a/ais-lib-communication/src/main/java/dk/dma/ais/packet/AisPacketReader.java b/ais-lib-communication/src/main/java/dk/dma/ais/packet/AisPacketReader.java
index a6995022..f350a8d4 100644
--- a/ais-lib-communication/src/main/java/dk/dma/ais/packet/AisPacketReader.java
+++ b/ais-lib-communication/src/main/java/dk/dma/ais/packet/AisPacketReader.java
@@ -171,15 +171,15 @@ private AisPacket handleLine(String line) throws IOException {
if (throwExceptions) {
throw new IOException(se);
}
- LOG.error("Sentence error: " + line + " (possible related proptag: " + se.getPossibleProprietaryTag() + ")");
- LOG.debug("Sentence trace: " + se.getMessage());
+ LOG.error("Sentence error: " + line + " (possible related proptag: " + se.getPossibleProprietaryTag() + ")", se);
+ LOG.debug("Sentence trace: " + se.getMessage(), se);
return null;
} catch (Exception e) {
if (throwExceptions) {
throw new IOException(e);
}
- LOG.error("Sentence line error: " + line);
- LOG.debug("Sentence line error: " + e.getMessage());
+ LOG.error("Sentence line error: " + line, e);
+ LOG.debug("Sentence line error: " + e.getMessage(), e);
return null;
}
}
diff --git a/ais-lib-communication/src/main/java/dk/dma/ais/packet/Vsi.java b/ais-lib-communication/src/main/java/dk/dma/ais/packet/Vsi.java
new file mode 100644
index 00000000..cafbf3e0
--- /dev/null
+++ b/ais-lib-communication/src/main/java/dk/dma/ais/packet/Vsi.java
@@ -0,0 +1,61 @@
+package dk.dma.ais.packet;
+
+import dk.dma.ais.sentence.CommentBlock;
+import dk.dma.ais.sentence.EncapsulatedSentence;
+import dk.dma.ais.sentence.SentenceException;
+import dk.dma.ais.sentence.SentenceLine;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Represents a VSI sentence.
+ */
+public class Vsi extends EncapsulatedSentence {
+ private static final Logger LOG = LoggerFactory.getLogger(Vsi.class);
+ private static final int SIGNAL_STRENGTH_DEFAULT_VALUE = -10000;
+
+ private int signalStrength;
+ private double latitude;
+ private double longitude;
+
+ @Override
+ public int parse(SentenceLine sentenceLine) throws SentenceException {
+ if (sentenceLine.getPrefix().length() > 0 && CommentBlock.hasCommentBlock(sentenceLine.getPrefix())) {
+ addSingleCommentBlock(sentenceLine.getPrefix());
+ }
+
+ try {
+ signalStrength = Integer.valueOf(sentenceLine.getFields().get(5));
+ } catch (NumberFormatException e) {
+ signalStrength = SIGNAL_STRENGTH_DEFAULT_VALUE;
+ LOG.error("Invalid value for signal strength in VSI sentence: [{}]. Using default value [{}]", sentenceLine, SIGNAL_STRENGTH_DEFAULT_VALUE);
+ }
+
+ return 0;
+ }
+
+ @Override
+ public String getEncoded() {
+ return null;
+ }
+
+ public int getSignalStrength() {
+ return signalStrength;
+ }
+
+ public void setLatitude(double latitude) {
+ this.latitude = latitude;
+ }
+
+ public double getLatitude() {
+ return latitude;
+ }
+
+ public void setLongitude(double longitude) {
+ this.longitude = longitude;
+ }
+
+ public double getLongitude() {
+ return longitude;
+ }
+}
diff --git a/ais-lib-communication/src/test/java/dk/dma/ais/packet/AisPacketParserTest.java b/ais-lib-communication/src/test/java/dk/dma/ais/packet/AisPacketParserTest.java
new file mode 100644
index 00000000..94a662c8
--- /dev/null
+++ b/ais-lib-communication/src/test/java/dk/dma/ais/packet/AisPacketParserTest.java
@@ -0,0 +1,46 @@
+package dk.dma.ais.packet;
+
+import dk.dma.ais.sentence.SentenceException;
+import org.junit.Test;
+
+import java.util.Date;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.hamcrest.Matchers.closeTo;
+import static org.junit.Assert.assertThat;
+
+public class AisPacketParserTest {
+ private static final String VSI_SENTENCE = "\\c:1490398110,C:1133,s:P-Helmcken*35\\$AIVSI,P-Helmcken,6,232830,1133,-79,34*0C";
+ private static final String VDM_SENTENCE = "\\c:1490398110,C:1133,s:P-Helmcken*35\\!AIVDM,1,1,6,B,15NCn?0P00o:pljKRG57Hgvt26qh,0*64";
+
+ @Test
+ public void givenAVsiSentenceWithNoCorrespondingVdm_whenReadLine_thenNullIsReturned() throws SentenceException {
+ AisPacketParser packetParser = new AisPacketParser();
+
+ AisPacket aisPacket = packetParser.readLine(VSI_SENTENCE);
+
+ assertThat(aisPacket, is(nullValue()));
+ }
+
+ @Test
+ public void givenAVsiSentence_whenReadLine_thenAisPacketContainingVsiDetailsIsReturned() throws SentenceException {
+ AisPacketParser packetParser = new AisPacketParser();
+
+ packetParser.readLine(VDM_SENTENCE);
+ AisPacket aisPacket = packetParser.readLine(VSI_SENTENCE);
+
+ assertThat(aisPacket.isVsi(), is(true));
+ assertThat(aisPacket.isValidMessage(), is(true));
+ assertThat(aisPacket.getVsi(), is(not(nullValue())));
+ assertThat(aisPacket.getVsi().getCommentBlock(), is(not(nullValue())));
+ assertThat(aisPacket.getVsi().getCommentBlock().getString("C"), is(equalTo("1133")));
+ assertThat(aisPacket.getVsi().getCommentBlock().getString("s"), is(equalTo("P-Helmcken")));
+ assertThat(aisPacket.getVsi().getSignalStrength(), is(equalTo(-79)));
+ assertThat(aisPacket.tryGetPositionTime().getLatitude(), is(closeTo(48.124193, 0.000001)));
+ assertThat(aisPacket.tryGetPositionTime().getLongitude(), is(closeTo(-123.450625, 0.00001)));
+ assertThat(aisPacket.getVsi().getTimestamp(), is(equalTo(new Date(1490398110000L))));
+ }
+}
diff --git a/ais-lib-communication/src/test/java/dk/dma/ais/packet/VsiTest.java b/ais-lib-communication/src/test/java/dk/dma/ais/packet/VsiTest.java
new file mode 100644
index 00000000..448750a3
--- /dev/null
+++ b/ais-lib-communication/src/test/java/dk/dma/ais/packet/VsiTest.java
@@ -0,0 +1,48 @@
+package dk.dma.ais.packet;
+
+import dk.dma.ais.sentence.SentenceException;
+import dk.dma.ais.sentence.SentenceLine;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+public class VsiTest {
+ private static final String VSI_SENTENCE = "\\c:1490398110,C:1133,s:M-Kingsburg*5D\\$AIVSI,M-Kingsburg,4,232830,1133,-111,8*66";
+
+ private SentenceLine sentenceLine;
+ private Vsi vsi;
+
+ @Before
+ public void setUp() throws Exception {
+ sentenceLine = new SentenceLine(VSI_SENTENCE);
+ vsi = new Vsi();
+ }
+
+ @Test
+ public void whenParse_thenCommentBlockIsParsed() throws SentenceException {
+ vsi.parse(sentenceLine);
+
+ assertThat(vsi.getCommentBlock(), is(not(nullValue())));
+ assertThat(vsi.getCommentBlock().getString("C"), is(equalTo("1133")));
+ assertThat(vsi.getCommentBlock().getString("s"), is(equalTo("M-Kingsburg")));
+ }
+
+ @Test
+ public void whenParse_thenSignalStrengthIsParsed() throws SentenceException {
+ vsi.parse(sentenceLine);
+
+ assertThat(vsi.getSignalStrength(), is(equalTo(-111)));
+ }
+
+ @Test
+ public void givenASentenceWithAnInvalidSignalStrength_whenParse_thenDefaultValueIsUsed() throws SentenceException {
+ vsi.parse(new SentenceLine("\\c:1497228032,C:1206,s:M-Chebucto*2F\\$AIVSI,M-Chebucto,4,,,,*31"));
+
+ assertThat(vsi.getSignalStrength(), is(equalTo(-10000)));
+ }
+}
diff --git a/ais-lib-messages/build.gradle b/ais-lib-messages/build.gradle
new file mode 100644
index 00000000..b94e9354
--- /dev/null
+++ b/ais-lib-messages/build.gradle
@@ -0,0 +1,6 @@
+
+description = 'AIS Messages'
+dependencies {
+ compile group: 'dk.dma.enav', name: 'enav-model', version:'0.5'
+ compile group: 'dk.dma.commons', name: 'dma-commons-util', version:'0.5-SNAPSHOT'
+}
diff --git a/ais-lib-messages/pom.xml b/ais-lib-messages/pom.xml
index 7f0c7b97..349984e1 100755
--- a/ais-lib-messages/pom.xml
+++ b/ais-lib-messages/pom.xml
@@ -5,7 +5,7 @@
dk.dma.ais.lib
ais-parent
- 2.4-SNAPSHOT
+ 2.4-CCG-SNAPSHOT
../pom.xml
@@ -25,4 +25,4 @@
-
\ No newline at end of file
+
diff --git a/ais-lib-utils/build.gradle b/ais-lib-utils/build.gradle
new file mode 100644
index 00000000..219054db
--- /dev/null
+++ b/ais-lib-utils/build.gradle
@@ -0,0 +1,7 @@
+
+description = 'AIS utils'
+dependencies {
+ compile project(':ais-lib-messages')
+ compile project(':ais-lib-communication')
+ compile group: 'dk.dma.commons', name: 'dma-commons-app', version:'0.5-SNAPSHOT'
+}
diff --git a/ais-lib-utils/pom.xml b/ais-lib-utils/pom.xml
index 7a65a8c7..ee0d8715 100644
--- a/ais-lib-utils/pom.xml
+++ b/ais-lib-utils/pom.xml
@@ -5,7 +5,7 @@
dk.dma.ais.lib
ais-parent
- 2.4-SNAPSHOT
+ 2.4-CCG-SNAPSHOT
../pom.xml
@@ -35,4 +35,4 @@
-
\ No newline at end of file
+
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 00000000..6ccacad8
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,34 @@
+allprojects {
+ apply plugin: 'maven'
+
+ group = 'dk.dma.ais.lib'
+version = '2.4-CCG-SNAPSHOT'
+}
+
+subprojects {
+ apply plugin: 'java'
+ sourceCompatibility = 1.8
+ targetCompatibility = 1.8
+ tasks.withType(JavaCompile) {
+ options.encoding = 'UTF-8'
+ }
+
+
+ repositories {
+ mavenLocal()
+
+ maven { url "http://repository-dma.forge.cloudbees.com/snapshot/" }
+ maven { url "http://repository-dma.forge.cloudbees.com/release/" }
+ maven { url "http://repo.maven.apache.org/maven2" }
+ }
+
+
+ dependencies {
+ compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.23'
+ compile group: 'net.jcip', name: 'jcip-annotations', version:'1.0'
+ testCompile group: 'org.slf4j', name: 'slf4j-log4j12', version:'1.7.23'
+ testCompile group: 'junit', name: 'junit', version:'4.12'
+}
+
+
+}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..ed88a042
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..c583957d
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.2.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100755
index 00000000..cccdd3d5
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 00000000..f9553162
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/mvnw b/mvnw
new file mode 100755
index 00000000..6ecc150a
--- /dev/null
+++ b/mvnw
@@ -0,0 +1,236 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven2 Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+# JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+# M2_HOME - location of maven2's installed home dir
+# MAVEN_OPTS - parameters passed to the Java VM when running Maven
+# e.g. to debug Maven itself, use
+# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+ if [ -f /etc/mavenrc ] ; then
+ . /etc/mavenrc
+ fi
+
+ if [ -f "$HOME/.mavenrc" ] ; then
+ . "$HOME/.mavenrc"
+ fi
+
+fi
+
+# OS specific support. $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+ CYGWIN*) cygwin=true ;;
+ MINGW*) mingw=true;;
+ Darwin*) darwin=true
+ #
+ # Look for the Apple JDKs first to preserve the existing behaviour, and then look
+ # for the new JDKs provided by Oracle.
+ #
+ if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then
+ #
+ # Apple JDKs
+ #
+ export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home
+ fi
+
+ if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then
+ #
+ # Apple JDKs
+ #
+ export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home
+ fi
+
+ if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then
+ #
+ # Oracle JDKs
+ #
+ export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home
+ fi
+
+ if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then
+ #
+ # Apple JDKs
+ #
+ export JAVA_HOME=`/usr/libexec/java_home`
+ fi
+ ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+ if [ -r /etc/gentoo-release ] ; then
+ JAVA_HOME=`java-config --jre-home`
+ fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+ ## resolve links - $0 may be a link to maven's home
+ PRG="$0"
+
+ # need this for relative symlinks
+ while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG="`dirname "$PRG"`/$link"
+ fi
+ done
+
+ saveddir=`pwd`
+
+ M2_HOME=`dirname "$PRG"`/..
+
+ # make it fully qualified
+ M2_HOME=`cd "$M2_HOME" && pwd`
+
+ cd "$saveddir"
+ # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --unix "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Migwn, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME="`(cd "$M2_HOME"; pwd)`"
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+ # TODO classpath?
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+ javaExecutable="`which javac`"
+ if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+ # readlink(1) is not available as standard on Solaris 10.
+ readLink=`which readlink`
+ if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+ if $darwin ; then
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+ else
+ javaExecutable="`readlink -f \"$javaExecutable\"`"
+ fi
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+ JAVA_HOME="$javaHome"
+ export JAVA_HOME
+ fi
+ fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+ if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ else
+ JAVACMD="`which java`"
+ fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+ echo "Error: JAVA_HOME is not defined correctly." >&2
+ echo " We cannot execute $JAVACMD" >&2
+ exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+ echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+ local basedir=$(pwd)
+ local wdir=$(pwd)
+ while [ "$wdir" != '/' ] ; do
+ if [ -d "$wdir"/.mvn ] ; then
+ basedir=$wdir
+ break
+ fi
+ wdir=$(cd "$wdir/.."; pwd)
+ done
+ echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+ if [ -f "$1" ]; then
+ echo "$(tr -s '\n' ' ' < "$1")"
+ fi
+}
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)}
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --path --windows "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+ [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+ MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+# avoid using MAVEN_CMD_LINE_ARGS below since that would loose parameter escaping in $@
+exec "$JAVACMD" \
+ $MAVEN_OPTS \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/mvnw.cmd b/mvnw.cmd
new file mode 100644
index 00000000..8bb82754
--- /dev/null
+++ b/mvnw.cmd
@@ -0,0 +1,146 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven2 Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+set MAVEN_CMD_LINE_ARGS=%MAVEN_CONFIG% %*
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+
+set WRAPPER_JAR=""%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar""
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+# avoid using MAVEN_CMD_LINE_ARGS below since that would loose parameter escaping in %*
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/pom.xml b/pom.xml
index ff990f39..676c85f5 100755
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
dk.dma.ais.lib
ais-parent
- 2.4-SNAPSHOT
+ 2.4-CCG-SNAPSHOT
AIS Parent
pom
This parent pom for AIS
@@ -57,6 +57,30 @@
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+
+
+ attach-javadocs
+
+ jar
+
+
+
+
org.apache.maven.plugins
maven-gpg-plugin
@@ -117,6 +141,17 @@
+
+ dma-snapshots
+ Dma Snapshots Repository
+ http://repository-dma.forge.cloudbees.com/snapshot/
+
+ false
+
+
+ true
+
+
dma-releases
Dma Release Repository
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 00000000..8b20ec4e
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,10 @@
+rootProject.name = 'ais-parent'
+include ':ais-lib-messages'
+include ':ais-lib-communication'
+include ':ais-lib-utils'
+include ':ais-lib-cli'
+
+project(':ais-lib-messages').projectDir = "$rootDir/ais-lib-messages" as File
+project(':ais-lib-communication').projectDir = "$rootDir/ais-lib-communication" as File
+project(':ais-lib-utils').projectDir = "$rootDir/ais-lib-utils" as File
+project(':ais-lib-cli').projectDir = "$rootDir/ais-lib-cli" as File
\ No newline at end of file