diff --git a/0-Plugin/src/main/java/tag/matcherImplementations/GitHubTagMatcher.java b/0-Plugin/src/main/java/tag/matcherImplementations/GitHubTagMatcher.java new file mode 100644 index 0000000..a3ae2b3 --- /dev/null +++ b/0-Plugin/src/main/java/tag/matcherImplementations/GitHubTagMatcher.java @@ -0,0 +1,77 @@ +package tag.matcherImplementations; + +import datastructures.json.JSONParser; +import link.LinkUrl; +import tag.OptionalTag; +import tag.Tag; +import tag.TagMatcher; +import tag.TagName; + +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.ProtocolException; +import java.net.URL; +import java.util.Map; +import java.util.Scanner; + +import static java.nio.charset.StandardCharsets.UTF_8; + +public class GitHubTagMatcher extends TagMatcher { + + public GitHubTagMatcher() { + tagName = new TagName("github"); + } + + public TagName getName() { + return tagName; + } + + public String getAdditionInfo(String urlPath) { + + try { + URL url = new URL("https://api.github.com/repos" + urlPath); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("GET"); + + con.setRequestProperty("accept", "application/vnd.github.v3+json"); + + // This line makes the request + InputStream responseStream = con.getInputStream(); + + String text = new String(responseStream.readAllBytes(), UTF_8); + + var parsedJSON = (Map) JSONParser.parseJSON(text); + + return (String) parsedJSON.get("description"); + + } + catch (JSONParser.JSONParseException e) { + e.printStackTrace(); + } + catch (ProtocolException e) { + return ""; + } + catch (MalformedURLException e) { + return ""; + } + catch (IOException e) { + return ""; + } + catch (ClassCastException e) { + return ""; + } + return ""; + } + + @Override + public OptionalTag ifMatches(LinkUrl linkUrl) { + if (linkUrl.getUrl().getHost().equals("github.com")) { + + String additionInfo = getAdditionInfo(linkUrl.getUrl().getPath()); + return OptionalTag.of(new Tag(getName()).addAdditionalData(additionInfo)); + } + return OptionalTag.empty(); + } +} diff --git a/0-Plugin/src/test/java/tag/matcherImplementations/GitHubTagMatcherTest.java b/0-Plugin/src/test/java/tag/matcherImplementations/GitHubTagMatcherTest.java new file mode 100644 index 0000000..11a2b74 --- /dev/null +++ b/0-Plugin/src/test/java/tag/matcherImplementations/GitHubTagMatcherTest.java @@ -0,0 +1,20 @@ +package tag.matcherImplementations; + +import link.LinkUrl; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class GitHubTagMatcherTest { + + @Test + void gettingDescriptionWorks() { + + var sut = new GitHubTagMatcher(); + + var tag = sut.ifMatches(new LinkUrl("https://github.com/filefighter/Webapp")).getTag().orElseThrow(); + + assertEquals("Frontend Service for FileFighter", tag.getAdditionalData().orElseThrow()); + + } +} diff --git a/3-Domain/src/main/java/tag/matcherImplementations/GitHubTagMatcher.java b/3-Domain/src/main/java/tag/matcherImplementations/GitHubTagMatcher.java deleted file mode 100644 index d45793b..0000000 --- a/3-Domain/src/main/java/tag/matcherImplementations/GitHubTagMatcher.java +++ /dev/null @@ -1,30 +0,0 @@ -package tag.matcherImplementations; - -import link.LinkUrl; -import tag.OptionalTag; -import tag.Tag; -import tag.TagMatcher; -import tag.TagName; - -public class GitHubTagMatcher extends TagMatcher { - - public GitHubTagMatcher() { - tagName = new TagName("github"); - } - - public TagName getName() { - return tagName; - } - - public String getAdditionInfo() { - return "";//TODO - } - - @Override - public OptionalTag ifMatches(LinkUrl linkUrl) { - if (linkUrl.getUrl().getHost().equals("github.com")) { - return OptionalTag.of(new Tag(getName()).addAdditionalData(getAdditionInfo())); - } - return OptionalTag.empty(); - } -} diff --git a/4-Abstraction/src/main/java/datastructures/json/JSONParser.java b/4-Abstraction/src/main/java/datastructures/json/JSONParser.java new file mode 100644 index 0000000..91bd283 --- /dev/null +++ b/4-Abstraction/src/main/java/datastructures/json/JSONParser.java @@ -0,0 +1,128 @@ +package datastructures.json; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Scanner; + +/** + * Totally not stolen from https://github.com/KasparNagu/plain-java-json + * + */ +public class JSONParser { + + public static Object parseJSONFile(String file) throws JSONParseException, IOException { + return parseJSON(Paths.get(file)); + } + + public static Object parseJSON(String text) throws JSONParseException { + return parseJSON(new Scanner(text)); + } + + public static Object parseJSON(Path file) throws JSONParseException, IOException { + return parseJSON(new Scanner(file)); + } + + public static Object parseJSON(Scanner s) throws JSONParseException { + Object ret = null; + skipWhitespace(s); + if (s.findWithinHorizon("\\{", 1) != null) { + HashMap retMap = new HashMap<>(); + ret = retMap; + skipWhitespace(s); + if (s.findWithinHorizon("\\}", 1) == null) { + while (s.hasNext()) { + Object key = parseJSON(s); + skipWhitespace(s); + if (s.findWithinHorizon(":", 1) == null) { + fail(s, ":"); + } + Object value = parseJSON(s); + retMap.put(key, value); + skipWhitespace(s); + if (s.findWithinHorizon(",", 1) == null) { + break; + } + } + if (s.findWithinHorizon("\\}", 1) == null) { + fail(s, "}"); + } + } + } + else if (s.findWithinHorizon("\"", 1) != null) { + ret = s.findWithinHorizon("(\\\\\\\\|\\\\\"|[^\"])*", 0) + .replace("\\\\", "\\") + .replace("\\\"", "\""); + if (s.findWithinHorizon("\"", 1) == null) { + fail(s, "quote"); + } + } + else if (s.findWithinHorizon("'", 1) != null) { + ret = s.findWithinHorizon("(\\\\\\\\|\\\\'|[^'])*", 0); + if (s.findWithinHorizon("'", 1) == null) { + fail(s, "quote"); + } + } + else if (s.findWithinHorizon("\\[", 1) != null) { + ArrayList retList = new ArrayList<>(); + ret = retList; + skipWhitespace(s); + if (s.findWithinHorizon("\\]", 1) == null) { + while (s.hasNext()) { + retList.add(parseJSON(s)); + skipWhitespace(s); + if (s.findWithinHorizon(",", 1) == null) { + break; + } + } + if (s.findWithinHorizon("\\]", 1) == null) { + fail(s, ", or ]"); + } + } + } + else if (s.findWithinHorizon("true", 4) != null) { + ret = true; + } + else if (s.findWithinHorizon("false", 5) != null) { + ret = false; + } + else if (s.findWithinHorizon("null", 4) != null) { + ret = null; + } + else { + String numberStart = s.findWithinHorizon("[-0-9+eE]", 1); + if (numberStart != null) { + String numStr = numberStart + s.findWithinHorizon("[-0-9+eE.]*", 0); + if (numStr.contains(".") | numStr.contains("e")) { + ret = Double.valueOf(numStr); + } + else { + ret = Long.valueOf(numStr); + } + } + else { + throw new JSONParseException("No JSON value found. Found: " + s.findWithinHorizon(".{0,5}", 5)); + } + } + return ret; + } + + private static void fail(Scanner scanner, String expected) throws JSONParseException { + throw new JSONParseException("Expected " + expected + " but found:" + scanner.findWithinHorizon(".{0,5}", 5)); + } + + private static void skipWhitespace(Scanner s) { + s.findWithinHorizon("\\s*", 0); + } + + public static class JSONParseException extends Exception { + + private static final long serialVersionUID = 7078320816065460L; + + public JSONParseException(String cause) { + super(cause); + } + } +}