From 87e3ca43fe00781b26475ff29a18ace27e850c45 Mon Sep 17 00:00:00 2001 From: Terence Parr Date: Mon, 21 Nov 2022 14:14:59 -0800 Subject: [PATCH 1/3] * add fake HASH as valid hash for testing purposes * add servlet to handle /load/HASH URL and set a cookie then redirect to index.html * Pull out the various servlets to the outer class level Signed-off-by: Terence Parr --- src/org/antlr/v4/server/ANTLRHttpServer.java | 133 +----------------- src/org/antlr/v4/server/GrammarProcessor.java | 2 +- src/org/antlr/v4/server/LoadServlet.java | 60 ++++++++ src/org/antlr/v4/server/ParseServlet.java | 84 +++++++++++ src/org/antlr/v4/server/ShareServlet.java | 56 ++++++++ .../CloudStoragePersistenceLayer.java | 5 +- 6 files changed, 206 insertions(+), 134 deletions(-) create mode 100644 src/org/antlr/v4/server/LoadServlet.java create mode 100644 src/org/antlr/v4/server/ParseServlet.java create mode 100644 src/org/antlr/v4/server/ShareServlet.java diff --git a/src/org/antlr/v4/server/ANTLRHttpServer.java b/src/org/antlr/v4/server/ANTLRHttpServer.java index 351668d..5e159ca 100644 --- a/src/org/antlr/v4/server/ANTLRHttpServer.java +++ b/src/org/antlr/v4/server/ANTLRHttpServer.java @@ -1,152 +1,20 @@ package org.antlr.v4.server; -import com.google.gson.Gson; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.google.gson.stream.JsonReader; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import org.antlr.v4.server.persistent.PersistenceLayer; -import org.antlr.v4.server.persistent.cloudstorage.CloudStoragePersistenceLayer; -import org.antlr.v4.server.unique.DummyUniqueKeyGenerator; -import org.antlr.v4.server.unique.UniqueKeyGenerator; -import org.antlr.v4.runtime.misc.ParseCancellationException; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.util.thread.QueuedThreadPool; -import org.slf4j.LoggerFactory; - import java.io.*; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Optional; - -import static org.antlr.v4.server.GrammarProcessor.interp; public class ANTLRHttpServer { public static final String IMAGES_DIR = "/tmp/antlr-images"; - public static class ParseServlet extends DefaultServlet { - static final ch.qos.logback.classic.Logger LOGGER = - (ch.qos.logback.classic.Logger)LoggerFactory.getLogger(ANTLRHttpServer.class); - - @Override - public void doPost(HttpServletRequest request, HttpServletResponse response) - throws IOException - { - - JsonObject jsonResponse = new JsonObject(); - try { - response.setContentType("text/plain;charset=utf-8"); - response.setContentType("text/html;"); - response.addHeader("Access-Control-Allow-Origin", "*"); - - JsonObject jsonObj = JsonParser.parseReader(request.getReader()).getAsJsonObject(); -// System.out.println(jsonObj); - - String grammar = jsonObj.get("grammar").getAsString(); - String lexGrammar = jsonObj.get("lexgrammar").getAsString(); // can be null - String input = jsonObj.get("input").getAsString(); - String startRule = jsonObj.get("start").getAsString(); - - StringBuilder logMsg = new StringBuilder(); - logMsg.append("GRAMMAR:\n"); - logMsg.append(grammar); - logMsg.append("\nLEX GRAMMAR:\n"); - logMsg.append(lexGrammar); - logMsg.append("\nINPUT:\n\"\"\""); - logMsg.append(input); - logMsg.append("\"\"\"\n"); - logMsg.append("STARTRULE: "); - logMsg.append(startRule); - logMsg.append('\n'); - LOGGER.info(logMsg.toString()); - - if (grammar.strip().length() == 0 && lexGrammar.strip().length() == 0) { - jsonResponse.addProperty("arg_error", "missing either combined grammar or lexer and " + - "parser both"); - } - else if (grammar.strip().length() == 0 && lexGrammar.strip().length() > 0) { - jsonResponse.addProperty("arg_error", "missing parser grammar"); - } - else if (startRule.strip().length() == 0) { - jsonResponse.addProperty("arg_error", "missing start rule"); - } - else if (input.length() == 0) { - jsonResponse.addProperty("arg_error", "missing input"); - } - else { - try { - jsonResponse = interp(grammar, lexGrammar, input, startRule); - } - catch (ParseCancellationException pce) { - jsonResponse.addProperty("exception_trace", "parser timeout ("+GrammarProcessor.MAX_PARSE_TIME_MS+"ms)"); - } - catch (Throwable e) { - e.printStackTrace(System.err); - } - } - } - catch (Exception e) { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - e.printStackTrace(pw); - jsonResponse.addProperty("exception_trace", sw.toString()); - jsonResponse.addProperty("exception", e.getMessage()); - } - LOGGER.info("RESULT:\n"+jsonResponse); - response.setStatus(HttpServletResponse.SC_OK); - PrintWriter w = response.getWriter(); - w.write(new Gson().toJson(jsonResponse)); - w.flush(); - } - } - - public static class ShareServlet extends DefaultServlet { - static final ch.qos.logback.classic.Logger LOGGER = - (ch.qos.logback.classic.Logger)LoggerFactory.getLogger(ANTLRHttpServer.class); - - @Override - public void doPost(HttpServletRequest request, HttpServletResponse response) - throws IOException - { - final JsonObject jsonResponse = new JsonObject(); - try { - response.setContentType("text/plain;charset=utf-8"); - response.setContentType("text/html;"); - response.addHeader("Access-Control-Allow-Origin", "*"); - - JsonObject jsonObj = JsonParser.parseReader(request.getReader()).getAsJsonObject(); - PersistenceLayer persistenceLayer = new CloudStoragePersistenceLayer(); - UniqueKeyGenerator keyGen = new DummyUniqueKeyGenerator(); - Optional uniqueKey = keyGen.generateKey(); - persistenceLayer.persist(new Gson().toJson(jsonResponse).getBytes(StandardCharsets.UTF_8), - uniqueKey.orElseThrow()); - - jsonResponse.addProperty("resource_id", uniqueKey.orElseThrow()); - } - catch (Exception e) { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - e.printStackTrace(pw); - jsonResponse.addProperty("exception_trace", sw.toString()); - jsonResponse.addProperty("exception", e.getMessage()); - - } - LOGGER.info("RESULT:\n"+jsonResponse); - response.setStatus(HttpServletResponse.SC_OK); - PrintWriter w = response.getWriter(); - w.write(new Gson().toJson(jsonResponse)); - w.flush(); - } - } - public static void main(String[] args) throws Exception { new File(IMAGES_DIR).mkdirs(); @@ -168,6 +36,7 @@ public static void main(String[] args) throws Exception { context.setContextPath("/"); context.addServlet(new ServletHolder(new ParseServlet()), "/parse/*"); context.addServlet(new ServletHolder(new ShareServlet()), "/share/*"); + context.addServlet(new ServletHolder(new LoadServlet()), "/load/*"); ServletHolder holderHome = new ServletHolder("static-home", DefaultServlet.class); holderHome.setInitParameter("resourceBase", "static"); diff --git a/src/org/antlr/v4/server/GrammarProcessor.java b/src/org/antlr/v4/server/GrammarProcessor.java index f7d76e2..5b1a8bf 100644 --- a/src/org/antlr/v4/server/GrammarProcessor.java +++ b/src/org/antlr/v4/server/GrammarProcessor.java @@ -16,7 +16,7 @@ import static org.antlr.v4.gui.Interpreter.profilerColumnNames; import static org.antlr.v4.server.ANTLRHttpServer.IMAGES_DIR; -import static org.antlr.v4.server.ANTLRHttpServer.ParseServlet.LOGGER; +import static org.antlr.v4.server.ParseServlet.LOGGER; import static us.parr.lib.ParrtSys.execInDir; import java.io.*; diff --git a/src/org/antlr/v4/server/LoadServlet.java b/src/org/antlr/v4/server/LoadServlet.java new file mode 100644 index 0000000..dc975c2 --- /dev/null +++ b/src/org/antlr/v4/server/LoadServlet.java @@ -0,0 +1,60 @@ +package org.antlr.v4.server; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.antlr.v4.server.persistent.PersistenceLayer; +import org.antlr.v4.server.persistent.cloudstorage.CloudStoragePersistenceLayer; +import org.antlr.v4.server.unique.DummyUniqueKeyGenerator; +import org.antlr.v4.server.unique.UniqueKeyGenerator; +import org.eclipse.jetty.server.ResourceService; +import org.eclipse.jetty.servlet.DefaultServlet; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.nio.charset.StandardCharsets; +import java.security.InvalidKeyException; +import java.util.Optional; + +public class LoadServlet extends DefaultServlet { + static final ch.qos.logback.classic.Logger LOGGER = + (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(ANTLRHttpServer.class); + + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws IOException { + try { + response.setContentType("text/plain;charset=utf-8"); + response.setContentType("text/html;"); + response.addHeader("Access-Control-Allow-Origin", "*"); + + String path = request.getPathInfo(); + String hash = path.substring(path.indexOf('/') + 1); + PersistenceLayer persistenceLayer = new CloudStoragePersistenceLayer(); + byte[] jsonBytes = persistenceLayer.retrieve(hash); + String json = new String(jsonBytes, StandardCharsets.UTF_8); + System.out.println(json); + + Cookie hashCookie = new Cookie("resource_id", hash); + hashCookie.setPath("/"); + hashCookie.setComment("__SAME_SITE_LAX__"); // Chrome apparently needs this or cookies disappear + response.addCookie(hashCookie); + response.sendRedirect("/index.html"); + } + catch (InvalidKeyException ike) { + System.err.println("Invalid key"); + response.setStatus(HttpServletResponse.SC_NOT_FOUND); + } + catch (Exception e) { + PrintWriter pw = response.getWriter(); + e.printStackTrace(pw); + pw.flush(); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + } +} diff --git a/src/org/antlr/v4/server/ParseServlet.java b/src/org/antlr/v4/server/ParseServlet.java new file mode 100644 index 0000000..19736d3 --- /dev/null +++ b/src/org/antlr/v4/server/ParseServlet.java @@ -0,0 +1,84 @@ +package org.antlr.v4.server; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.antlr.v4.runtime.misc.ParseCancellationException; +import org.eclipse.jetty.servlet.DefaultServlet; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; + +import static org.antlr.v4.server.GrammarProcessor.interp; + +public class ParseServlet extends DefaultServlet { + static final ch.qos.logback.classic.Logger LOGGER = + (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(ANTLRHttpServer.class); + + @Override + public void doPost(HttpServletRequest request, HttpServletResponse response) + throws IOException { + + JsonObject jsonResponse = new JsonObject(); + try { + response.setContentType("text/plain;charset=utf-8"); + response.setContentType("text/html;"); + response.addHeader("Access-Control-Allow-Origin", "*"); + + JsonObject jsonObj = JsonParser.parseReader(request.getReader()).getAsJsonObject(); +// System.out.println(jsonObj); + + String grammar = jsonObj.get("grammar").getAsString(); + String lexGrammar = jsonObj.get("lexgrammar").getAsString(); // can be null + String input = jsonObj.get("input").getAsString(); + String startRule = jsonObj.get("start").getAsString(); + + StringBuilder logMsg = new StringBuilder(); + logMsg.append("GRAMMAR:\n"); + logMsg.append(grammar); + logMsg.append("\nLEX GRAMMAR:\n"); + logMsg.append(lexGrammar); + logMsg.append("\nINPUT:\n\"\"\""); + logMsg.append(input); + logMsg.append("\"\"\"\n"); + logMsg.append("STARTRULE: "); + logMsg.append(startRule); + logMsg.append('\n'); + LOGGER.info(logMsg.toString()); + + if (grammar.strip().length() == 0 && lexGrammar.strip().length() == 0) { + jsonResponse.addProperty("arg_error", "missing either combined grammar or lexer and " + + "parser both"); + } else if (grammar.strip().length() == 0 && lexGrammar.strip().length() > 0) { + jsonResponse.addProperty("arg_error", "missing parser grammar"); + } else if (startRule.strip().length() == 0) { + jsonResponse.addProperty("arg_error", "missing start rule"); + } else if (input.length() == 0) { + jsonResponse.addProperty("arg_error", "missing input"); + } else { + try { + jsonResponse = interp(grammar, lexGrammar, input, startRule); + } catch (ParseCancellationException pce) { + jsonResponse.addProperty("exception_trace", "parser timeout (" + GrammarProcessor.MAX_PARSE_TIME_MS + "ms)"); + } catch (Throwable e) { + e.printStackTrace(System.err); + } + } + } catch (Exception e) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + e.printStackTrace(pw); + jsonResponse.addProperty("exception_trace", sw.toString()); + jsonResponse.addProperty("exception", e.getMessage()); + } + LOGGER.info("RESULT:\n" + jsonResponse); + response.setStatus(HttpServletResponse.SC_OK); + PrintWriter w = response.getWriter(); + w.write(new Gson().toJson(jsonResponse)); + w.flush(); + } +} diff --git a/src/org/antlr/v4/server/ShareServlet.java b/src/org/antlr/v4/server/ShareServlet.java new file mode 100644 index 0000000..ab32242 --- /dev/null +++ b/src/org/antlr/v4/server/ShareServlet.java @@ -0,0 +1,56 @@ +package org.antlr.v4.server; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.antlr.v4.server.persistent.PersistenceLayer; +import org.antlr.v4.server.persistent.cloudstorage.CloudStoragePersistenceLayer; +import org.antlr.v4.server.unique.DummyUniqueKeyGenerator; +import org.antlr.v4.server.unique.UniqueKeyGenerator; +import org.eclipse.jetty.servlet.DefaultServlet; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.nio.charset.StandardCharsets; +import java.util.Optional; + +public class ShareServlet extends DefaultServlet { + static final ch.qos.logback.classic.Logger LOGGER = + (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(ANTLRHttpServer.class); + + @Override + public void doPost(HttpServletRequest request, HttpServletResponse response) + throws IOException { + final JsonObject jsonResponse = new JsonObject(); + try { + response.setContentType("text/plain;charset=utf-8"); + response.setContentType("text/html;"); + response.addHeader("Access-Control-Allow-Origin", "*"); + + JsonObject jsonObj = JsonParser.parseReader(request.getReader()).getAsJsonObject(); + PersistenceLayer persistenceLayer = new CloudStoragePersistenceLayer(); + UniqueKeyGenerator keyGen = new DummyUniqueKeyGenerator(); + Optional uniqueKey = keyGen.generateKey(); + persistenceLayer.persist(new Gson().toJson(jsonResponse).getBytes(StandardCharsets.UTF_8), + uniqueKey.orElseThrow()); + + jsonResponse.addProperty("resource_id", uniqueKey.orElseThrow()); + } catch (Exception e) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + e.printStackTrace(pw); + jsonResponse.addProperty("exception_trace", sw.toString()); + jsonResponse.addProperty("exception", e.getMessage()); + + } + LOGGER.info("RESULT:\n" + jsonResponse); + response.setStatus(HttpServletResponse.SC_OK); + PrintWriter w = response.getWriter(); + w.write(new Gson().toJson(jsonResponse)); + w.flush(); + } +} diff --git a/src/org/antlr/v4/server/persistent/cloudstorage/CloudStoragePersistenceLayer.java b/src/org/antlr/v4/server/persistent/cloudstorage/CloudStoragePersistenceLayer.java index 7822599..9acdd25 100644 --- a/src/org/antlr/v4/server/persistent/cloudstorage/CloudStoragePersistenceLayer.java +++ b/src/org/antlr/v4/server/persistent/cloudstorage/CloudStoragePersistenceLayer.java @@ -38,6 +38,9 @@ public void persist(byte[] byteBuffer, String identifier) throws IOException { @Override public byte[] retrieve(String identifier) throws IOException, InvalidKeyException { - return new byte[0]; + if ( identifier.equals("HASH") ) { + return "{\"fake\":999}".getBytes(); + } + throw new InvalidKeyException("Invalid key"); } } From db57672f2719ec03be06b38d49fed8cc1bd72259 Mon Sep 17 00:00:00 2001 From: Terence Parr Date: Mon, 21 Nov 2022 14:16:51 -0800 Subject: [PATCH 2/3] clean up load servlet Signed-off-by: Terence Parr --- src/org/antlr/v4/server/LoadServlet.java | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/src/org/antlr/v4/server/LoadServlet.java b/src/org/antlr/v4/server/LoadServlet.java index dc975c2..ad0e881 100644 --- a/src/org/antlr/v4/server/LoadServlet.java +++ b/src/org/antlr/v4/server/LoadServlet.java @@ -1,25 +1,17 @@ package org.antlr.v4.server; -import com.google.gson.Gson; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.antlr.v4.server.persistent.PersistenceLayer; import org.antlr.v4.server.persistent.cloudstorage.CloudStoragePersistenceLayer; -import org.antlr.v4.server.unique.DummyUniqueKeyGenerator; -import org.antlr.v4.server.unique.UniqueKeyGenerator; -import org.eclipse.jetty.server.ResourceService; import org.eclipse.jetty.servlet.DefaultServlet; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.PrintWriter; -import java.io.StringWriter; import java.nio.charset.StandardCharsets; import java.security.InvalidKeyException; -import java.util.Optional; public class LoadServlet extends DefaultServlet { static final ch.qos.logback.classic.Logger LOGGER = @@ -29,10 +21,6 @@ public class LoadServlet extends DefaultServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { try { - response.setContentType("text/plain;charset=utf-8"); - response.setContentType("text/html;"); - response.addHeader("Access-Control-Allow-Origin", "*"); - String path = request.getPathInfo(); String hash = path.substring(path.indexOf('/') + 1); PersistenceLayer persistenceLayer = new CloudStoragePersistenceLayer(); @@ -47,13 +35,15 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) response.sendRedirect("/index.html"); } catch (InvalidKeyException ike) { - System.err.println("Invalid key"); response.setStatus(HttpServletResponse.SC_NOT_FOUND); } catch (Exception e) { PrintWriter pw = response.getWriter(); e.printStackTrace(pw); pw.flush(); + response.setContentType("text/plain;charset=utf-8"); + response.setContentType("text/html;"); + response.addHeader("Access-Control-Allow-Origin", "*"); response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } } From f5726ffdf46e082d95b46f6c14851e15b95ec69c Mon Sep 17 00:00:00 2001 From: Terence Parr Date: Wed, 23 Nov 2022 10:46:40 -0800 Subject: [PATCH 3/3] snapshot... The seems mostly OK but I'd like to change how we do routing of URL so I'm going back to the main branchTo work on a new branch Signed-off-by: Terence Parr --- src/org/antlr/v4/server/LoadServlet.java | 12 +++--- src/org/antlr/v4/server/ShareServlet.java | 1 + .../server/persistent/PersistenceLayer.java | 3 ++ .../CloudStoragePersistenceLayer.java | 37 +++++++++++++------ 4 files changed, 35 insertions(+), 18 deletions(-) diff --git a/src/org/antlr/v4/server/LoadServlet.java b/src/org/antlr/v4/server/LoadServlet.java index ad0e881..260818b 100644 --- a/src/org/antlr/v4/server/LoadServlet.java +++ b/src/org/antlr/v4/server/LoadServlet.java @@ -24,19 +24,19 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) String path = request.getPathInfo(); String hash = path.substring(path.indexOf('/') + 1); PersistenceLayer persistenceLayer = new CloudStoragePersistenceLayer(); - byte[] jsonBytes = persistenceLayer.retrieve(hash); - String json = new String(jsonBytes, StandardCharsets.UTF_8); - System.out.println(json); + if ( !persistenceLayer.exists(hash) ) { + LOGGER.info("Load: Unknown " + hash); + response.setStatus(HttpServletResponse.SC_NOT_FOUND); + return; + } + LOGGER.info("Load: " + hash); Cookie hashCookie = new Cookie("resource_id", hash); hashCookie.setPath("/"); hashCookie.setComment("__SAME_SITE_LAX__"); // Chrome apparently needs this or cookies disappear response.addCookie(hashCookie); response.sendRedirect("/index.html"); } - catch (InvalidKeyException ike) { - response.setStatus(HttpServletResponse.SC_NOT_FOUND); - } catch (Exception e) { PrintWriter pw = response.getWriter(); e.printStackTrace(pw); diff --git a/src/org/antlr/v4/server/ShareServlet.java b/src/org/antlr/v4/server/ShareServlet.java index ab32242..2b4fc6e 100644 --- a/src/org/antlr/v4/server/ShareServlet.java +++ b/src/org/antlr/v4/server/ShareServlet.java @@ -34,6 +34,7 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) JsonObject jsonObj = JsonParser.parseReader(request.getReader()).getAsJsonObject(); PersistenceLayer persistenceLayer = new CloudStoragePersistenceLayer(); UniqueKeyGenerator keyGen = new DummyUniqueKeyGenerator(); + // TODO: store jsonObj Optional uniqueKey = keyGen.generateKey(); persistenceLayer.persist(new Gson().toJson(jsonResponse).getBytes(StandardCharsets.UTF_8), uniqueKey.orElseThrow()); diff --git a/src/org/antlr/v4/server/persistent/PersistenceLayer.java b/src/org/antlr/v4/server/persistent/PersistenceLayer.java index 74f8673..e246319 100644 --- a/src/org/antlr/v4/server/persistent/PersistenceLayer.java +++ b/src/org/antlr/v4/server/persistent/PersistenceLayer.java @@ -12,6 +12,9 @@ public interface PersistenceLayer { */ void persist(byte[] buffer, K identifier) throws IOException; + /** Return true if the identifier exists in the underlying storage system. */ + boolean exists(String identifier); + /** * Retrieves the content from * @param identifier identifier for the persisted content diff --git a/src/org/antlr/v4/server/persistent/cloudstorage/CloudStoragePersistenceLayer.java b/src/org/antlr/v4/server/persistent/cloudstorage/CloudStoragePersistenceLayer.java index 9acdd25..ecace27 100644 --- a/src/org/antlr/v4/server/persistent/cloudstorage/CloudStoragePersistenceLayer.java +++ b/src/org/antlr/v4/server/persistent/cloudstorage/CloudStoragePersistenceLayer.java @@ -1,9 +1,6 @@ package org.antlr.v4.server.persistent.cloudstorage; -import com.google.cloud.storage.BlobId; -import com.google.cloud.storage.BlobInfo; -import com.google.cloud.storage.Storage; -import com.google.cloud.storage.StorageOptions; +import com.google.cloud.storage.*; import org.antlr.v4.server.ANTLRHttpServer; import org.antlr.v4.server.persistent.PersistenceLayer; import org.slf4j.LoggerFactory; @@ -15,32 +12,48 @@ public class CloudStoragePersistenceLayer implements PersistenceLayer { static final ch.qos.logback.classic.Logger LOGGER = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(ANTLRHttpServer.class); + // The ID of your GCP project + public static final String projectId = "antlr4lab"; + + // The ID of your GCS bucket + public static final String bucketName = "antlr4-lab-us"; + public void persist(byte[] byteBuffer, String identifier) throws IOException { for (String key: System.getenv().keySet()) { LOGGER.info(key + " " + System.getenv(key)); } - // The ID of your GCP project - String projectId = "antlr4lab"; - // The ID of your GCS bucket - String bucketName = "antlr4-lab-us"; - - // The ID of your GCS object - String objectName = identifier + ".json"; + String objectName = identifier + ".json"; // The ID of your GCS object // The path to your file to upload Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService(); BlobId blobId = BlobId.of(bucketName, objectName); BlobInfo blobInfo = BlobInfo.newBuilder(blobId).build(); + storage.create(blobInfo, byteBuffer); LOGGER.info("Successfully stored " + objectName); } + @Override + public boolean exists(String identifier) { + String objectName = identifier + ".json"; + Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService(); + BlobId blobId = BlobId.of(bucketName, objectName); + return storage.get(blobId) != null; + } + @Override public byte[] retrieve(String identifier) throws IOException, InvalidKeyException { if ( identifier.equals("HASH") ) { return "{\"fake\":999}".getBytes(); } - throw new InvalidKeyException("Invalid key"); + String objectName = identifier + ".json"; + Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService(); + BlobId blobId = BlobId.of(bucketName, objectName); + Blob blob = storage.get(blobId); + if ( blob == null ) { + throw new InvalidKeyException("Invalid key"); + } + return blob.getContent(); } }