diff --git a/java/src/main/java/com/genexus/internet/GXRestAPIClient.java b/java/src/main/java/com/genexus/internet/GXRestAPIClient.java index d554c5f5b..220f3fa98 100644 --- a/java/src/main/java/com/genexus/internet/GXRestAPIClient.java +++ b/java/src/main/java/com/genexus/internet/GXRestAPIClient.java @@ -9,9 +9,7 @@ import java.text.ParseException; import org.json.JSONArray; -import com.genexus.internet.IGxJSONAble; import com.genexus.xml.GXXMLSerializable; -import com.genexus.internet.IGxJSONSerializable; import com.genexus.common.interfaces.SpecificImplementation; import com.genexus.*; import com.genexus.diagnostics.core.ILogger; @@ -32,17 +30,15 @@ public class GXRestAPIClient { private String responseMessage; private String contentType = "application/json; charset=utf-8"; - private String queryString = ""; - private String bodyString = ""; + static final String CONTENT_TYPE_LABEL = "Content-Type"; + static final String AUTHORIZATION_LABEL = "Authorization"; private JSONObject jsonResponse; private HashMap queryVars = new HashMap(); private HashMap bodyVars = new HashMap(); - private HashMap responseData = new HashMap(); + private HashMap headerVars = new HashMap(); + - static final String DATE_FMT = "yyyy-MM-dd"; - static final String DATETIME_FMT = "yyyy-MM-dd'T'HH:mm:ss"; - static final String DATETIME_FMT_MS = "yyyy-MM-dd'T'HH:mm:ss.SSS"; static final String DATE_NULL = "0000-00-00"; static final String DATETIME_NULL = "0000-00-00T00:00:00"; @@ -54,6 +50,40 @@ public class GXRestAPIClient { static final String RESPONSE_ERROR_MSG = "Invalid response"; static final String PARSING_ERROR_MSG = "Error parsing response"; static final String DESERIALIZING_ERROR_MSG = "Error serializing/deserializing object"; + + public enum DateFormat { + + DATE_FMT(1, "yyyy-MM-dd"), + DATETIME_FMT(3, "yyyy-MM-dd'T'HH:mm:ss"), + DATETIME_FMT_MS(4, "yyyy-MM-dd'T'HH:mm:ss.SSS"); + + private final int fmtId; + private final String fmtString; + + DateFormat(int fmtId, String fmtString) { + this.fmtId = fmtId; + this.fmtString = fmtString; + } + + public int getId() { + return fmtId; + } + + public String getFormat() { + return fmtString; + } + + public static DateFormat fromId(int fmtId) { + for (DateFormat format : DateFormat.values()) { + if (format.getId() == fmtId) { + return format; + } + } + throw new IllegalArgumentException("Unknown error code: " + fmtId); + } + } + + public GXRestAPIClient() { responseCode = 0; @@ -151,16 +181,11 @@ public void addQueryVar(String varName, double varValue) { queryVars.put(varName, Double.toString(varValue)); } - public void addQueryVar(String varName, Date varValue) { - SimpleDateFormat df = new SimpleDateFormat(DATE_FMT); - queryVars.put(varName, df.format(varValue)); - } + public void addQueryVar(String varName, Date varValue, int fmtId) { + DateFormat fmt = DateFormat.fromId(fmtId); + String fmtString = fmt.getFormat(); - public void addQueryVar(String varName, Date varValue, boolean hasMilliseconds) { - String fmt = DATETIME_FMT; - if (hasMilliseconds) - fmt = DATETIME_FMT_MS; - SimpleDateFormat df = new SimpleDateFormat(fmt); + SimpleDateFormat df = new SimpleDateFormat(fmtString); queryVars.put(varName, df.format(varValue)); } @@ -190,6 +215,66 @@ private String quoteString(String value) { return "\"" + value + "\""; } + /// Add Header parameters + + public void addHeaderVar(String varName, GXBaseCollection varValue) { + if ( varValue != null) { + headerVars.put(varName, varValue.toJSonString(false)); + } + } + + public void addHeaderVar(String varName, GXXMLSerializable varValue) { + if ( varValue != null) { + headerVars.put(varName, varValue.toJSonString(false)); + } + } + + public void addHeaderVar(String varName, String varValue) { + headerVars.put( varName, quoteString(varValue)); + } + + public void addHeaderVar(String varName, double varValue) { + headerVars.put(varName, quoteString(Double.toString(varValue))); + } + + public void addHeaderVar(String varName, Date varValue, int fmtId) { + DateFormat fmt = DateFormat.fromId(fmtId); + String fmtString = fmt.getFormat(); + + SimpleDateFormat df = new SimpleDateFormat(fmtString); + headerVars.put(varName, df.format(varValue)); + } + + public void addHeaderVar(String varName, short varValue) { + headerVars.put( varName, Short.toString(varValue)); + } + + public void addHeaderVar(String varName, int varValue) { + headerVars.put( varName, Integer.toString(varValue)); + } + + public void addHeaderVar(String varName, long varValue) { + headerVars.put( varName, Long.toString(varValue)); + } + + public void addHeaderVar(String varName, Boolean varValue) { + headerVars.put( varName, varValue.toString()); + } + + public void addHeaderVar(String varName, BigDecimal varValue) { + headerVars.put( varName, varValue.toString()); + } + + public void addHeaderVar(String varName, java.util.UUID varValue) { + headerVars.put( varName, quoteString(varValue.toString())); + } + + public void addHeaderVar(String varName, IGxJSONSerializable varValue) { + headerVars.put( varName, quoteString(varValue.toJSonString())); + } + + /// + public void addBodyVar(String varName, GXBaseCollection varValue) { if ( varValue != null) { bodyVars.put(varName, varValue.toJSonString(false)); @@ -205,21 +290,11 @@ public void addBodyVar(String varName, GXXMLSerializable varValue) { public void addBodyVar(String varName, String varValue) { bodyVars.put( varName, quoteString(varValue)); } - - public void addBodyVar(String varName, double varValue) { - bodyVars.put(varName, quoteString(Double.toString(varValue))); - } - - public void addBodyVar(String varName, Date varValue) { - SimpleDateFormat df = new SimpleDateFormat(DATE_FMT); - bodyVars.put(varName, quoteString(df.format(varValue))); - } - - public void addBodyVar(String varName, Date varValue, boolean hasMilliseconds) { - String fmt = DATETIME_FMT; - if (hasMilliseconds) - fmt = DATETIME_FMT_MS; - SimpleDateFormat df = new SimpleDateFormat(fmt); + + public void addBodyVar(String varName, Date varValue, int fmtId) { + DateFormat fmt = DateFormat.fromId(fmtId); + String fmtString = fmt.getFormat(); + SimpleDateFormat df = new SimpleDateFormat(fmtString); bodyVars.put( varName, quoteString(df.format(varValue))); } @@ -261,7 +336,7 @@ public Date getBodyDate(String varName) { if (val.startsWith(DATE_NULL)) return CommonUtil.newNullDate(); else - return new SimpleDateFormat(DATE_FMT).parse(val); + return new SimpleDateFormat(DateFormat.DATETIME_FMT.getFormat()).parse(val); } catch (ParseException e) { return CommonUtil.newNullDate(); @@ -271,9 +346,9 @@ public Date getBodyDate(String varName) { public Date getBodyDateTime(String varName, Boolean hasMilliseconds) { try{ String val = getJsonStr(varName); - String fmt = DATETIME_FMT; + String fmt = DateFormat.DATETIME_FMT.getFormat(); if (hasMilliseconds) - fmt = DATETIME_FMT_MS; + fmt = DateFormat.DATETIME_FMT_MS.getFormat(); if (val.startsWith(DATETIME_NULL)) return CommonUtil.newNullDate(); @@ -316,16 +391,14 @@ public BigDecimal getBodyNum(String varName) { return new BigDecimal(getJsonStr(varName)); } - public long getBodyLong(String varName) { - long value =0; + public long getBodyLong(String varName) { try{ - value = Long.parseLong(getJsonStr(varName)); + return Long.parseLong(getJsonStr(varName)); } catch(NumberFormatException ex) { - value = Double.valueOf(getJsonStr(varName)).longValue(); - } - return value; + return Double.valueOf(getJsonStr(varName)).longValue(); + } } public int getBodyInt(String varName) { @@ -418,6 +491,7 @@ public GXBaseCollection getBodyObjCollection(St fillCollection(varName, elementClass, col); return col; } + private void fillCollection(String varName, Class elementClass, GXBaseCollection col) { JSONArray jsonarr = new JSONArray(); try { @@ -477,14 +551,15 @@ else if (jsonResponse.length() == 1 && jsonResponse.has("")) { } public void addUploadFile(String filePath, String fileName) { - httpClient.addFile(filePath, fileName); - String mimeType = SpecificImplementation.Application.getContentType(filePath); - contentType = mimeType; + httpClient.addFile(filePath, fileName); + contentType = SpecificImplementation.Application.getContentType(filePath);; } public void RestExecute() { String separator = ""; - queryString = ""; + String queryString = ""; + String bodyString = ""; + if (queryVars.size() > 0) { separator = "?"; for( Map.Entry entry : queryVars.entrySet()) { @@ -492,31 +567,36 @@ public void RestExecute() { separator = "&"; } } - bodyString = ""; if (bodyVars.size() > 0) { separator = ""; for( Map.Entry entry : bodyVars.entrySet()) { - bodyString += separator + "\"" + entry.getKey() + "\":" + entry.getValue() + ""; + bodyString += separator + "\"" + entry.getKey() + "\":" + entry.getValue(); separator = ","; } } if (bodyString.length() > 0) { bodyString = "{" + bodyString + "}"; httpClient.addString( bodyString); - httpClient.addHeader( "Content-Type", contentType); + httpClient.addHeader( CONTENT_TYPE_LABEL, contentType); } else { - if (httpMethod == "POST" || httpMethod == "PUT") { + if (httpMethod.equals("POST") || httpMethod.equals( "PUT")) { bodyString = "{}"; httpClient.addString(bodyString); - httpClient.addHeader("Content-Type", contentType); + httpClient.addHeader(CONTENT_TYPE_LABEL, contentType); } } if (location.getAuthenticationMethod() == 4 && location.getAccessToken() != null && ! location.getAccessToken().trim().isEmpty()) { - httpClient.addHeader("Authorization", location.getAccessToken()); + httpClient.addHeader(AUTHORIZATION_LABEL, location.getAccessToken()); } + if (headerVars.size() > 0) { + for( Map.Entry entry : headerVars.entrySet()) { + httpClient.addHeader(entry.getKey(), entry.getValue()); + } + } + headerVars.clear(); String serviceuri = ((location.getSecure() > 0) ? "https" : "http") + "://" + location.getHost(); - serviceuri += (location.getPort() != 80) ? ":" + Integer.toString(location.getPort()): ""; + serviceuri += (location.getPort() != 80) ? ":" + location.getPort(): ""; serviceuri += "/" + location.getBaseURL() + "/" + location.getResourceName(); serviceuri += queryString; httpClient.execute( this.httpMethod, serviceuri); @@ -527,7 +607,7 @@ public void RestExecute() { if (responseCode >= 300 || httpClient.getErrCode() > 0) { errorCode = httpClient.getErrCode(); errorMessage = httpClient.getErrDescription(); - } + } else { try { String response = httpClient.getString(); @@ -548,9 +628,9 @@ public void RestExecute() { } private void logError(int code, String msg) { - logger.error("Error: " + Integer.toString(code) + " " + msg); + logger.error("Error: " + code + " " + msg); } private void logError(int code, String msg, Exception e) { - logger.error("Error: " + Integer.toString(code) + " " + msg, e); + logger.error("Error: " + code + " " + msg, e); } }