From 05dd4bfe8942f435d7f9aaeb3ca965431ab3b38e Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Wed, 17 Jan 2018 14:24:37 -0500 Subject: [PATCH] move ReservedWord enum to ExternalTool #3657 --- .../dataverse/externaltools/ExternalTool.java | 49 +++++++++++++++++ .../externaltools/ExternalToolHandler.java | 2 +- .../ExternalToolServiceBean.java | 53 +------------------ 3 files changed, 52 insertions(+), 52 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalTool.java b/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalTool.java index 53750df36c1..fee92b6c0b9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalTool.java +++ b/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalTool.java @@ -166,4 +166,53 @@ public JsonObjectBuilder toJson() { return jab; } + public enum ReservedWord { + + // TODO: Research if a format like "{reservedWord}" is easily parse-able or if another format would be + // better. The choice of curly braces is somewhat arbitrary, but has been observed in documenation for + // various REST APIs. For example, "Variable substitutions will be made when a variable is named in {brackets}." + // from https://swagger.io/specification/#fixed-fields-29 but that's for URLs. + FILE_ID("fileId"), + SITE_URL("siteUrl"), + API_TOKEN("apiToken"); + + private final String text; + private final String START = "{"; + private final String END = "}"; + + private ReservedWord(final String text) { + this.text = START + text + END; + } + + /** + * This is a centralized method that enforces that only reserved words + * are allowed to be used by external tools. External tool authors + * cannot pass their own query parameters through Dataverse such as + * "mode=mode1". + * + * @throws IllegalArgumentException + */ + public static ReservedWord fromString(String text) throws IllegalArgumentException { + if (text != null) { + for (ReservedWord reservedWord : ReservedWord.values()) { + if (text.equals(reservedWord.text)) { + return reservedWord; + } + } + } + // TODO: Consider switching to a more informative message that enumerates the valid reserved words. + boolean moreInformativeMessage = false; + if (moreInformativeMessage) { + throw new IllegalArgumentException("Unknown reserved word: " + text + ". A reserved word must be one of these values: " + Arrays.asList(ReservedWord.values()) + "."); + } else { + throw new IllegalArgumentException("Unknown reserved word: " + text); + } + } + + @Override + public String toString() { + return text; + } + } + } diff --git a/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolHandler.java b/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolHandler.java index 8bc5036768b..3cc7f5bf567 100644 --- a/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolHandler.java +++ b/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolHandler.java @@ -2,7 +2,7 @@ import edu.harvard.iq.dataverse.DataFile; import edu.harvard.iq.dataverse.authorization.users.ApiToken; -import edu.harvard.iq.dataverse.externaltools.ExternalToolServiceBean.ReservedWord; +import edu.harvard.iq.dataverse.externaltools.ExternalTool.ReservedWord; import edu.harvard.iq.dataverse.util.SystemConfig; import java.io.StringReader; import java.util.ArrayList; diff --git a/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolServiceBean.java index 2d19c02adcb..35406a7f22b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalToolServiceBean.java @@ -1,6 +1,7 @@ package edu.harvard.iq.dataverse.externaltools; import edu.harvard.iq.dataverse.DataFile; +import edu.harvard.iq.dataverse.externaltools.ExternalTool.ReservedWord; import static edu.harvard.iq.dataverse.externaltools.ExternalTool.DESCRIPTION; import static edu.harvard.iq.dataverse.externaltools.ExternalTool.DISPLAY_NAME; import static edu.harvard.iq.dataverse.externaltools.ExternalTool.TOOL_PARAMETERS; @@ -8,7 +9,6 @@ import static edu.harvard.iq.dataverse.externaltools.ExternalTool.TYPE; import java.io.StringReader; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.logging.Logger; @@ -80,55 +80,6 @@ public ExternalTool save(ExternalTool externalTool) { return em.merge(externalTool); } - public enum ReservedWord { - - // TODO: Research if a format like "{reservedWord}" is easily parse-able or if another format would be - // better. The choice of curly braces is somewhat arbitrary, but has been observed in documenation for - // various REST APIs. For example, "Variable substitutions will be made when a variable is named in {brackets}." - // from https://swagger.io/specification/#fixed-fields-29 but that's for URLs. - FILE_ID("fileId"), - SITE_URL("siteUrl"), - API_TOKEN("apiToken"); - - private final String text; - private final String START = "{"; - private final String END = "}"; - - private ReservedWord(final String text) { - this.text = START + text + END; - } - - /** - * This is a centralized method that enforces that only reserved words - * are allowed to be used by external tools. External tool authors - * cannot pass their own query parameters through Dataverse such as - * "mode=mode1". - * - * @throws IllegalArgumentException - */ - public static ReservedWord fromString(String text) throws IllegalArgumentException { - if (text != null) { - for (ReservedWord reservedWord : ReservedWord.values()) { - if (text.equals(reservedWord.text)) { - return reservedWord; - } - } - } - // TODO: Consider switching to a more informative message that enumerates the valid reserved words. - boolean moreInformativeMessage = false; - if (moreInformativeMessage) { - throw new IllegalArgumentException("Unknown reserved word: " + text + ". A reserved word must be one of these values: " + Arrays.asList(ReservedWord.values()) + "."); - } else { - throw new IllegalArgumentException("Unknown reserved word: " + text); - } - } - - @Override - public String toString() { - return text; - } - } - /** * This method takes a list of tools and a file and returns which tools that file supports * The list of tools is passed in so it doesn't hit the database each time @@ -171,7 +122,7 @@ public static ExternalTool parseAddExternalToolManifest(String manifest) { } if (!allRequiredReservedWordsFound) { // Some day there might be more reserved words than just {fileId}. - throw new IllegalArgumentException("Required reserved word not found: " + ReservedWord.FILE_ID.text); + throw new IllegalArgumentException("Required reserved word not found: " + ReservedWord.FILE_ID.toString()); } String toolParameters = toolParametersObj.toString(); return new ExternalTool(displayName, description, type, toolUrl, toolParameters);