diff --git a/build.gradle b/build.gradle index ac115bb..db53536 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ plugins { } group = 'com.asteroid.duck' -version = '0.0.2' +version = '0.0.3' apply plugin: 'java' apply plugin: 'application' @@ -86,7 +86,7 @@ task createTemplate(type: Zip) { task extractDistribution(type: Copy) { description 'Extracts the distribution ZIP into a temp dir; ready for InnoSetup to consume' group 'distribution' - from(zipTree("${buildDir}/distributions/velociwraptor-0.0.1.zip")) + from(zipTree("${buildDir}/distributions/velociwraptor-${project.version}.zip")) into "${buildDir}/distributions/" } diff --git a/src/main/inno-setup/velociwraptor.iss b/src/main/inno-setup/velociwraptor.iss index 7a2dc27..2fdf89e 100644 --- a/src/main/inno-setup/velociwraptor.iss +++ b/src/main/inno-setup/velociwraptor.iss @@ -1,7 +1,7 @@ [Setup] AppId=Velocipwraptor AppName=velociwraptor -AppVersion=0.0.1 +AppVersion=0.0.3 DefaultDirName={pf}\velociwraptor DefaultGroupName=Velociwraptor SourceDir=..\..\..\ @@ -11,12 +11,12 @@ WizardImageFile=icons\wizard.bmp Compression=lzma2 SolidCompression=yes OutputDir=build\distributions -OutputBaseFilename=velociwraptor-setup +OutputBaseFilename=velociwraptor-0.0.3-setup ChangesEnvironment=yes [Files] -Source: "build\distributions\velociwraptor-0.0.1\bin\*.*"; DestDir: "{app}\bin" -Source: "build\distributions\velociwraptor-0.0.1\lib\*.*"; DestDir: "{app}\lib" +Source: "build\distributions\velociwraptor-0.0.3\bin\*.*"; DestDir: "{app}\bin" +Source: "build\distributions\velociwraptor-0.0.3\lib\*.*"; DestDir: "{app}\lib" [Registry] Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; ValueName: "Path"; ValueData: "{olddata};{app}\bin" diff --git a/src/main/java/com/asteroid/duck/velociwraptor/model/TemplateData.java b/src/main/java/com/asteroid/duck/velociwraptor/model/TemplateData.java index 8769833..5fc840d 100644 --- a/src/main/java/com/asteroid/duck/velociwraptor/model/TemplateData.java +++ b/src/main/java/com/asteroid/duck/velociwraptor/model/TemplateData.java @@ -1,13 +1,27 @@ package com.asteroid.duck.velociwraptor.model; +import com.asteroid.duck.velociwraptor.util.FakeJsonString; +import org.slf4j.Logger; + +import javax.json.*; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; import static java.util.function.Function.identity; +import static org.slf4j.LoggerFactory.getLogger; public class TemplateData implements Map { - + /** + * Logger (SLF4J) + */ + private static final Logger LOG = getLogger(TemplateData.class); /** * A delegate who gets a chance to provide a value if this cannot */ @@ -41,17 +55,50 @@ public static TemplateData wrap(Map data) { @Override public Object get(Object key) { - Object delegateValue = null; + Object value = null; if(delegate != null) { - delegateValue = delegate.get(key); + value = delegate.get(key); + } + + if (value == null) { + value = dataObject.get(key); } - if (delegateValue == null) { - return dataObject.get(key); + if (value != null && value instanceof JsonString) { + String jsValue = ((JsonString) value).getString(); + if (jsValue.startsWith("!")) { + jsValue = jsValue.substring(1); + try { + LOG.trace("! escaped, treating as URI"); + URI uri = new URI(jsValue); + LOG.trace("Requesting data from "+jsValue); + InputStream input = uri.toURL().openStream(); + byte[] bytes = input.readAllBytes(); + jsValue = new String(bytes, StandardCharsets.UTF_8); + LOG.trace("Received "+jsValue); + // is the string actually JSON? + JsonReader reader = Json.createReader(new StringReader(jsValue)); + value = reader.readObject(); + String fragment = uri.getFragment(); + if (fragment != null) + { + JsonValue jsonValue = ((JsonObject) value).get(fragment); + if (jsonValue != null) { + value = jsonValue; + } + } + } + catch(URISyntaxException | IOException e) + { + // maybe it's not a URL, or we can't reach it + LOG.debug("Unable to interpret, request or parse - returning:"+jsValue, e); + value = new FakeJsonString(jsValue); + } + } } - return delegateValue; + return value; } @Override diff --git a/src/main/java/com/asteroid/duck/velociwraptor/user/ConsoleInteractive.java b/src/main/java/com/asteroid/duck/velociwraptor/user/ConsoleInteractive.java index 896b8e4..1bec6a2 100644 --- a/src/main/java/com/asteroid/duck/velociwraptor/user/ConsoleInteractive.java +++ b/src/main/java/com/asteroid/duck/velociwraptor/user/ConsoleInteractive.java @@ -7,7 +7,7 @@ import javax.json.JsonArray; import javax.json.JsonString; import javax.json.JsonValue; -import javax.xml.ws.WebServiceException; +import java.io.IOException; import java.io.PrintStream; import java.util.Scanner; @@ -119,7 +119,7 @@ public String askFor(String key, String current) { } @Override - public void close() throws WebServiceException { + public void close() throws IOException { if (!noColors) { AnsiConsole.systemUninstall(); } diff --git a/src/main/java/com/asteroid/duck/velociwraptor/user/UserInteractive.java b/src/main/java/com/asteroid/duck/velociwraptor/user/UserInteractive.java index e392411..cdff2d9 100644 --- a/src/main/java/com/asteroid/duck/velociwraptor/user/UserInteractive.java +++ b/src/main/java/com/asteroid/duck/velociwraptor/user/UserInteractive.java @@ -2,6 +2,7 @@ import com.asteroid.duck.velociwraptor.model.JsonConverter; import com.asteroid.duck.velociwraptor.model.ValueAdapter; +import com.asteroid.duck.velociwraptor.util.FakeJsonString; import javax.json.*; import java.io.Closeable; @@ -49,7 +50,7 @@ public Object get(String promptKey, JsonValue jsonValue) { } private JsonValue asJsonString(String value) { - return Json.createArrayBuilder().add(value).build().get(0); + return new FakeJsonString(value); } diff --git a/src/main/java/com/asteroid/duck/velociwraptor/util/FakeJsonString.java b/src/main/java/com/asteroid/duck/velociwraptor/util/FakeJsonString.java new file mode 100644 index 0000000..4481190 --- /dev/null +++ b/src/main/java/com/asteroid/duck/velociwraptor/util/FakeJsonString.java @@ -0,0 +1,45 @@ +package com.asteroid.duck.velociwraptor.util; + +import javax.json.JsonString; +import java.util.Objects; + +public class FakeJsonString implements JsonString { + private final String string; + + public FakeJsonString(String string) { + this.string = string; + } + + @Override + public String getString() { + return string; + } + + @Override + public CharSequence getChars() { + return string; + } + + @Override + public ValueType getValueType() { + return ValueType.STRING; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || !(o instanceof JsonString)) return false; + JsonString that = (JsonString) o; + return Objects.equals(string, that.getString()); + } + + @Override + public int hashCode() { + return Objects.hash(string); + } + + @Override + public String toString() { + return string; + } +} diff --git a/src/test/java/com/asteroid/duck/velociwraptor/model/JsonTemplateDataTest.java b/src/test/java/com/asteroid/duck/velociwraptor/model/JsonTemplateDataTest.java new file mode 100644 index 0000000..054e6ca --- /dev/null +++ b/src/test/java/com/asteroid/duck/velociwraptor/model/JsonTemplateDataTest.java @@ -0,0 +1,38 @@ +package com.asteroid.duck.velociwraptor.model; + +import com.asteroid.duck.velociwraptor.user.UserInteractive; +import com.asteroid.duck.velociwraptor.util.FakeJsonString; +import org.junit.Test; + +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.JsonReader; + +import java.io.StringReader; + +import static org.junit.Assert.*; + +public class JsonTemplateDataTest { + + private static final String TEST_FILE = "test.json"; + + public static final JsonObject parseString(String json) + { + JsonReader reader = Json.createReader(new StringReader(json)); + return reader.readObject(); + } + + public static final JsonObject parseResource(String resource) + { + JsonReader reader = Json.createReader(JsonTemplateDataTest.class.getResourceAsStream(resource)); + return reader.readObject(); + } + + @Test + public void get() { + JsonObject test = parseResource(TEST_FILE); + JsonTemplateData subject = new JsonTemplateData(test, UserInteractive.nullInteractive()); + assertEquals(new FakeJsonString("Chris Senior"), subject.get("Author")); + assertEquals(new FakeJsonString("6.0.1"), subject.get("GradleVersion")); + } +} \ No newline at end of file diff --git a/src/test/resources/com/asteroid/duck/velociwraptor/model/test.json b/src/test/resources/com/asteroid/duck/velociwraptor/model/test.json index 9f99f0b..ff083dd 100644 --- a/src/test/resources/com/asteroid/duck/velociwraptor/model/test.json +++ b/src/test/resources/com/asteroid/duck/velociwraptor/model/test.json @@ -3,6 +3,7 @@ "Description": "An example project", "Org": "com.asteroid.duck", "Version": "1.0.0", + "GradleVersion": "!https://services.gradle.org/versions/current#version", "Author": "Chris Senior", "Year": 2018, "Fraction": 3.14, diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml index cb5a6f1..5278bd4 100644 --- a/src/test/resources/logback-test.xml +++ b/src/test/resources/logback-test.xml @@ -7,7 +7,7 @@ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - +