Skip to content

Commit

Permalink
tweak json read/write, getString, cleanup, logging
Browse files Browse the repository at this point in the history
  • Loading branch information
qqmyers committed Jul 20, 2022
1 parent 0c22b18 commit 1b31e6c
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Transient;

/**
* A specification or definition for how an external tool is intended to
Expand All @@ -30,8 +29,6 @@
@Entity
public class ExternalTool implements Serializable {

private static final Logger logger = Logger.getLogger(ExternalToolServiceBean.class.getCanonicalName());

public static final String DISPLAY_NAME = "displayName";
public static final String DESCRIPTION = "description";
public static final String LEGACY_SINGLE_TYPE = "type";
Expand Down Expand Up @@ -99,8 +96,9 @@ public class ExternalTool implements Serializable {
private String contentType;

/**
* Path for retrieving data through the REST api. Used to build signedUrls
* for POST headers, as in DPCreator
* Set of API calls the tool would like to be able to use (e,.g. for retrieving
* data through the Dataverse REST api). Used to build signedUrls for POST
* headers, as in DPCreator
*/
@Column(nullable = true, columnDefinition = "TEXT")
private String allowedApiCalls;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import edu.harvard.iq.dataverse.util.URLTokenUtil;

import edu.harvard.iq.dataverse.util.UrlSignerUtil;
import edu.harvard.iq.dataverse.util.json.JsonUtil;

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
Expand Down Expand Up @@ -35,19 +37,6 @@
* such as constructing a URL to access that file.
*/
public class ExternalToolHandler extends URLTokenUtil {
/**
* @return the allowedApiCalls
*/
public String getAllowedApiCalls() {
return allowedApiCalls;
}

/**
* @param allowedApiCalls the allowedApiCalls to set
*/
public void setAllowedApiCalls(String allowedApiCalls) {
this.allowedApiCalls = allowedApiCalls;
}

/**
* @param user the user to set
Expand All @@ -61,8 +50,7 @@ public void setUser(String user) {
private String requestMethod;
private String toolContext;
private String user;
private String siteUrl;
private String allowedApiCalls;


/**
* File level tool
Expand Down Expand Up @@ -98,9 +86,7 @@ public String handleRequest() {

// TODO: rename to handleRequest() to someday handle sending headers as well as query parameters.
public String handleRequest(boolean preview) {
String toolParameters = externalTool.getToolParameters();
JsonReader jsonReader = Json.createReader(new StringReader(toolParameters));
JsonObject obj = jsonReader.readObject();
JsonObject obj = JsonUtil.getJsonObject(externalTool.getToolParameters());
JsonString method = obj.getJsonString("httpMethod");
requestMethod = method!=null?method.getString():HttpMethod.GET;
JsonArray queryParams = obj.getJsonArray("queryParameters");
Expand All @@ -118,36 +104,32 @@ public String handleRequest(boolean preview) {
});
});

StringWriter allowedApiCallsStringWriter = new StringWriter();
String allowedApis;
try (JsonWriter jsonWriter = Json.createWriter(allowedApiCallsStringWriter)) {
JsonArrayBuilder jsonArrayBuilder = Json.createArrayBuilder();
allowedApiCalls = externalTool.getAllowedApiCalls();
JsonReader jsonReaderApis = Json.createReader(new StringReader(allowedApiCalls));
JsonObject objApis = jsonReaderApis.readObject();
JsonArray apis = objApis.getJsonArray("apis");
apis.getValuesAs(JsonObject.class).forEach(((apiObj) -> {
String name = apiObj.getJsonString("name").toString();
String httpmethod = apiObj.getJsonString("method").toString();
int timeout = apiObj.getInt("timeOut");
String apiPath = replaceTokensWithValues(apiObj.getJsonString("urlTemplate").toString());
String url = UrlSignerUtil.signUrl(apiPath, timeout, user,httpmethod, getApiToken().getTokenString());
jsonArrayBuilder.add(
Json.createObjectBuilder().add("name", name)
.add("httpMethod", httpmethod)
.add("signedUrl", url)
.add("timeOut", timeout));
}));
JsonArray allowedApiCallsArray = jsonArrayBuilder.build();
jsonWriter.writeArray(allowedApiCallsArray);
allowedApis = allowedApiCallsStringWriter.toString();
try {
allowedApiCallsStringWriter.close();
} catch (IOException ex) {
Logger.getLogger(ExternalToolHandler.class.getName()).log(Level.SEVERE, null, ex);
}
}
if (requestMethod.equals(HttpMethod.POST)){
JsonArrayBuilder jsonArrayBuilder = Json.createArrayBuilder();

JsonObject objApis = JsonUtil.getJsonObject(externalTool.getAllowedApiCalls());

JsonArray apis = objApis.getJsonArray("apis");
apis.getValuesAs(JsonObject.class).forEach(((apiObj) -> {
String name = apiObj.getJsonString("name").getString();
String httpmethod = apiObj.getJsonString("method").getString();
int timeout = apiObj.getInt("timeOut");
String urlTemplate = apiObj.getJsonString("urlTemplate").getString();
logger.fine("URL Template: " + urlTemplate);
String apiPath = replaceTokensWithValues(urlTemplate);
logger.fine("URL WithTokens: " + apiPath);
String url = UrlSignerUtil.signUrl(apiPath, timeout, user, httpmethod, getApiToken().getTokenString());
logger.fine("Signed URL: " + url);
jsonArrayBuilder.add(Json.createObjectBuilder().add("name", name).add("httpMethod", httpmethod)
.add("signedUrl", url).add("timeOut", timeout));
}));
JsonArray allowedApiCallsArray = jsonArrayBuilder.build();
allowedApis = JsonUtil.prettyPrint(allowedApiCallsArray);
logger.fine("Sending these signed URLS: " + allowedApis);

//ToDo - if the allowedApiCalls() are defined, could/should we send them to tools using GET as well?

if (requestMethod.equals(HttpMethod.POST)) {
try {
return postFormData(allowedApis);
} catch (IOException | InterruptedException ex) {
Expand All @@ -167,7 +149,7 @@ private String postFormData(String allowedApis ) throws IOException, Interrupted
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().POST(HttpRequest.BodyPublishers.ofString(allowedApis)).uri(URI.create(externalTool.getToolUrl()))
.header("Content-Type", "application/json")
.build();
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
boolean redirect=false;
int status = response.statusCode();
Expand All @@ -178,7 +160,7 @@ private String postFormData(String allowedApis ) throws IOException, Interrupted
redirect = true;
}
}
if (redirect=true){
if (redirect==true){
String newUrl = response.headers().firstValue("location").get();
toolContext = "http://" + response.uri().getAuthority();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import edu.harvard.iq.dataverse.externaltools.ExternalTool.Type;
import edu.harvard.iq.dataverse.util.URLTokenUtil;
import edu.harvard.iq.dataverse.util.URLTokenUtil.ReservedWord;
import edu.harvard.iq.dataverse.util.json.JsonUtil;
import edu.harvard.iq.dataverse.externaltools.ExternalTool.Scope;

import java.io.StringReader;
Expand Down Expand Up @@ -151,8 +152,7 @@ public static ExternalTool parseAddExternalToolManifest(String manifest) {
if (manifest == null || manifest.isEmpty()) {
throw new IllegalArgumentException("External tool manifest was null or empty!");
}
JsonReader jsonReader = Json.createReader(new StringReader(manifest));
JsonObject jsonObject = jsonReader.readObject();
JsonObject jsonObject = JsonUtil.getJsonObject(manifest);
//Note: ExternalToolServiceBeanTest tests are dependent on the order of these retrievals
String displayName = getRequiredTopLevelField(jsonObject, DISPLAY_NAME);
String toolName = getOptionalTopLevelField(jsonObject, TOOL_NAME);
Expand Down

0 comments on commit 1b31e6c

Please sign in to comment.