diff --git a/.travis.yml b/.travis.yml index 4bbf5a0..1c5d7b2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,5 +5,6 @@ script: jdk: - oraclejdk8 + - openjdk7 sudo: false diff --git a/build.gradle b/build.gradle index 9858f02..8135ae0 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ description = 'A Java client to communicate with a taskwarrior server (= taskd). group = 'de.aaschmid' version = '1.0-SNAPSHOT' -sourceCompatibility = targetCompatibility = JavaVersion.VERSION_1_8 +sourceCompatibility = targetCompatibility = JavaVersion.VERSION_1_7 repositories { mavenCentral() diff --git a/src/main/java/de/aaschmid/taskwarrior/TaskwarriorClient.java b/src/main/java/de/aaschmid/taskwarrior/TaskwarriorClient.java index ee9ed4b..44fdb90 100644 --- a/src/main/java/de/aaschmid/taskwarrior/TaskwarriorClient.java +++ b/src/main/java/de/aaschmid/taskwarrior/TaskwarriorClient.java @@ -11,11 +11,9 @@ import java.security.KeyStore; import java.util.HashMap; import java.util.Map; -import java.util.Set; +import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.Stream; import javax.net.ssl.SSLContext; @@ -77,17 +75,16 @@ private TaskwarriorMessage receive(InputStream in) throws IOException { } private byte[] createByteArraysFor(TaskwarriorMessage message) { - // @formatter:off - String messageData = Stream.concat( - Stream.of( - createHeadersFor(config.getAuthentication()), - message.getHeaders() - ).map(Map::entrySet).flatMap(Set::stream).map(e -> e.getKey() + SEPARATOR_HEADER_NAME_VALUE + e.getValue()), - Stream.of("", message.getPayload().orElse("")) - ).collect(Collectors.joining("\n")); - // @formatter:on + Map headers = createHeadersFor(config.getAuthentication()); + headers.putAll(message.getHeaders()); + + StringBuilder messageData = new StringBuilder(); + for (Entry e : headers.entrySet()) { + messageData.append(e.getKey() + SEPARATOR_HEADER_NAME_VALUE + e.getValue()).append("\n"); + } + messageData.append("\n").append(message.getPayload()); - byte[] bytes = messageData.getBytes(CHARSET_TRANSFER_MESSAGE); + byte[] bytes = messageData.toString().getBytes(CHARSET_TRANSFER_MESSAGE); return addFourByteBigEndianBinaryByteCountMessageLengthPrefix(bytes); } @@ -128,7 +125,7 @@ private TaskwarriorMessage parseResponse(String message) { Map headers = parseHeaders(header); if (payload.isEmpty() || "\n".equals(payload)) { - return new TaskwarriorMessage(headers); + payload = ""; } return new TaskwarriorMessage(headers, payload); } diff --git a/src/main/java/de/aaschmid/taskwarrior/internal/ManifestHelper.java b/src/main/java/de/aaschmid/taskwarrior/internal/ManifestHelper.java index 2275c7b..3611062 100644 --- a/src/main/java/de/aaschmid/taskwarrior/internal/ManifestHelper.java +++ b/src/main/java/de/aaschmid/taskwarrior/internal/ManifestHelper.java @@ -2,41 +2,47 @@ import java.io.IOException; import java.net.URL; -import java.util.Optional; import java.util.jar.Manifest; public class ManifestHelper { - public static Optional getResourceUrlForClass(Class clazz) { + public static URL getResourceUrlForClass(Class clazz) { String className = clazz.getSimpleName() + ".class"; - return Optional.ofNullable(clazz.getResource(className)); + return clazz.getResource(className); } - public static Optional getJarUrlForClass(Class clazz) { - // @formatter:off - return getResourceUrlForClass(clazz) - .map(URL::toString) - .filter(p -> p.startsWith("jar:")) - .map(p -> p.substring(0, p.lastIndexOf("!") + 1)); - // @formatter:on + public static String getJarUrlForClass(Class clazz) { + URL resource = getResourceUrlForClass(clazz); + if (resource == null) { + return null; + } + String classPath = resource.toString(); + if (classPath.startsWith("jar:")) { + return classPath.substring(0, classPath.lastIndexOf("!") + 1); + } + return null; } - public static Optional getManifestAttributeValue(String jarUrl, String manifestAttributeKey) { + public static String getManifestAttributeValue(String jarUrl, String manifestAttributeKey) { try { Manifest manifest = new Manifest(new URL(jarUrl + "/META-INF/MANIFEST.MF").openStream()); - return Optional.of(manifest.getMainAttributes().getValue(manifestAttributeKey)); + return manifest.getMainAttributes().getValue(manifestAttributeKey); } catch (IOException e) { - return Optional.empty(); + // TODO log this + return null; } } public static String getImplementationVersionFromManifest(String fallbackVersion) { - // @formatter:off - return Optional.of(ManifestHelper.class) - .flatMap(c -> getJarUrlForClass(c)) - .flatMap(u -> getManifestAttributeValue(u, "Implementation-Version")) - .orElse(fallbackVersion); - // @formatter:on + String jarUrl = getJarUrlForClass(ManifestHelper.class); + if (jarUrl == null) { + return fallbackVersion; + } + String result = getManifestAttributeValue(jarUrl, "Implementation-Version"); + if (result == null) { + return fallbackVersion; + } + return result; } } diff --git a/src/main/java/de/aaschmid/taskwarrior/message/TaskwarriorMessage.java b/src/main/java/de/aaschmid/taskwarrior/message/TaskwarriorMessage.java index efdc1e9..7749816 100644 --- a/src/main/java/de/aaschmid/taskwarrior/message/TaskwarriorMessage.java +++ b/src/main/java/de/aaschmid/taskwarrior/message/TaskwarriorMessage.java @@ -5,8 +5,6 @@ import java.util.HashMap; import java.util.Map; -import java.util.Objects; -import java.util.Optional; public class TaskwarriorMessage { @@ -15,26 +13,22 @@ public class TaskwarriorMessage { public static final String HEADER_CLIENT = "client"; private final Map headers; - private final Optional payload; - - public TaskwarriorMessage(Map headers, Optional payload) { - this.headers = new HashMap<>(Objects.requireNonNull(headers, "'headers' must not be null.")); - this.payload = payload; - } + private final String payload; public TaskwarriorMessage(Map headers, String payload) { - this(headers, Optional.of(requireNonNull(payload, "'payload' must not be null."))); + this.headers = new HashMap<>(requireNonNull(headers, "'headers' must not be null.")); + this.payload = requireNonNull(payload, "'payload' must not be null"); } public TaskwarriorMessage(Map headers) { - this(headers, Optional.empty()); + this(headers, ""); } public Map getHeaders() { return unmodifiableMap(headers); } - public Optional getPayload() { + public String getPayload() { return payload; } diff --git a/src/main/java/de/aaschmid/taskwarrior/ssl/KeyStoreBuilder.java b/src/main/java/de/aaschmid/taskwarrior/ssl/KeyStoreBuilder.java index 88db37c..3a2058d 100644 --- a/src/main/java/de/aaschmid/taskwarrior/ssl/KeyStoreBuilder.java +++ b/src/main/java/de/aaschmid/taskwarrior/ssl/KeyStoreBuilder.java @@ -88,13 +88,13 @@ public KeyStore build() { } AtomicInteger idx = new AtomicInteger(0); - createCertificatesFor(caCertFile).forEach(c -> { + for (Certificate cert : createCertificatesFor(caCertFile)) { try { - result.setCertificateEntry("ca_" + idx.getAndIncrement(), c); + result.setCertificateEntry("ca_" + idx.getAndIncrement(), cert); } catch (KeyStoreException e) { throw new TaskwarriorKeyStoreException(e, "Could not add CA certificate '%s' to keystore: %s", caCertFile, e.getMessage()); } - }); + } Certificate[] privateKeyCertsChain = createCertificatesFor(privateKeyCertFile).toArray(new Certificate[0]); PrivateKey privateKey = createPrivateKeyFor(privateKeyFile);