99import java .text .ParseException ;
1010
1111import org .json .JSONArray ;
12- import com .genexus .internet .IGxJSONAble ;
1312import com .genexus .xml .GXXMLSerializable ;
14- import com .genexus .internet .IGxJSONSerializable ;
1513import com .genexus .common .interfaces .SpecificImplementation ;
1614import com .genexus .*;
1715import com .genexus .diagnostics .core .ILogger ;
@@ -32,17 +30,15 @@ public class GXRestAPIClient {
3230 private String responseMessage ;
3331
3432 private String contentType = "application/json; charset=utf-8" ;
35- private String queryString = "" ;
36- private String bodyString = "" ;
33+ static final String CONTENT_TYPE_LABEL = "Content-Type " ;
34+ static final String AUTHORIZATION_LABEL = "Authorization " ;
3735
3836 private JSONObject jsonResponse ;
3937 private HashMap <String , String > queryVars = new HashMap <String , String >();
4038 private HashMap <String , String > bodyVars = new HashMap <String , String >();
41- private HashMap <String , String > responseData = new HashMap <String , String >();
39+ private HashMap <String , String > headerVars = new HashMap <String , String >();
40+
4241
43- static final String DATE_FMT = "yyyy-MM-dd" ;
44- static final String DATETIME_FMT = "yyyy-MM-dd'T'HH:mm:ss" ;
45- static final String DATETIME_FMT_MS = "yyyy-MM-dd'T'HH:mm:ss.SSS" ;
4642 static final String DATE_NULL = "0000-00-00" ;
4743 static final String DATETIME_NULL = "0000-00-00T00:00:00" ;
4844
@@ -54,6 +50,40 @@ public class GXRestAPIClient {
5450 static final String RESPONSE_ERROR_MSG = "Invalid response" ;
5551 static final String PARSING_ERROR_MSG = "Error parsing response" ;
5652 static final String DESERIALIZING_ERROR_MSG = "Error serializing/deserializing object" ;
53+
54+ public enum DateFormat {
55+
56+ DATE_FMT (1 , "yyyy-MM-dd" ),
57+ DATETIME_FMT (3 , "yyyy-MM-dd'T'HH:mm:ss" ),
58+ DATETIME_FMT_MS (4 , "yyyy-MM-dd'T'HH:mm:ss.SSS" );
59+
60+ private final int fmtId ;
61+ private final String fmtString ;
62+
63+ DateFormat (int fmtId , String fmtString ) {
64+ this .fmtId = fmtId ;
65+ this .fmtString = fmtString ;
66+ }
67+
68+ public int getId () {
69+ return fmtId ;
70+ }
71+
72+ public String getFormat () {
73+ return fmtString ;
74+ }
75+
76+ public static DateFormat fromId (int fmtId ) {
77+ for (DateFormat format : DateFormat .values ()) {
78+ if (format .getId () == fmtId ) {
79+ return format ;
80+ }
81+ }
82+ throw new IllegalArgumentException ("Unknown error code: " + fmtId );
83+ }
84+ }
85+
86+
5787
5888 public GXRestAPIClient () {
5989 responseCode = 0 ;
@@ -151,16 +181,11 @@ public void addQueryVar(String varName, double varValue) {
151181 queryVars .put (varName , Double .toString (varValue ));
152182 }
153183
154- public void addQueryVar (String varName , Date varValue ) {
155- SimpleDateFormat df = new SimpleDateFormat (DATE_FMT );
156- queryVars .put (varName , df .format (varValue ));
157- }
184+ public void addQueryVar (String varName , Date varValue , int fmtId ) {
185+ DateFormat fmt = DateFormat .fromId (fmtId );
186+ String fmtString = fmt .getFormat ();
158187
159- public void addQueryVar (String varName , Date varValue , boolean hasMilliseconds ) {
160- String fmt = DATETIME_FMT ;
161- if (hasMilliseconds )
162- fmt = DATETIME_FMT_MS ;
163- SimpleDateFormat df = new SimpleDateFormat (fmt );
188+ SimpleDateFormat df = new SimpleDateFormat (fmtString );
164189 queryVars .put (varName , df .format (varValue ));
165190 }
166191
@@ -190,6 +215,66 @@ private String quoteString(String value) {
190215 return "\" " + value + "\" " ;
191216 }
192217
218+ /// Add Header parameters
219+
220+ public <T extends GXXMLSerializable > void addHeaderVar (String varName , GXBaseCollection <T > varValue ) {
221+ if ( varValue != null ) {
222+ headerVars .put (varName , varValue .toJSonString (false ));
223+ }
224+ }
225+
226+ public void addHeaderVar (String varName , GXXMLSerializable varValue ) {
227+ if ( varValue != null ) {
228+ headerVars .put (varName , varValue .toJSonString (false ));
229+ }
230+ }
231+
232+ public void addHeaderVar (String varName , String varValue ) {
233+ headerVars .put ( varName , quoteString (varValue ));
234+ }
235+
236+ public void addHeaderVar (String varName , double varValue ) {
237+ headerVars .put (varName , quoteString (Double .toString (varValue )));
238+ }
239+
240+ public void addHeaderVar (String varName , Date varValue , int fmtId ) {
241+ DateFormat fmt = DateFormat .fromId (fmtId );
242+ String fmtString = fmt .getFormat ();
243+
244+ SimpleDateFormat df = new SimpleDateFormat (fmtString );
245+ headerVars .put (varName , df .format (varValue ));
246+ }
247+
248+ public void addHeaderVar (String varName , short varValue ) {
249+ headerVars .put ( varName , Short .toString (varValue ));
250+ }
251+
252+ public void addHeaderVar (String varName , int varValue ) {
253+ headerVars .put ( varName , Integer .toString (varValue ));
254+ }
255+
256+ public void addHeaderVar (String varName , long varValue ) {
257+ headerVars .put ( varName , Long .toString (varValue ));
258+ }
259+
260+ public void addHeaderVar (String varName , Boolean varValue ) {
261+ headerVars .put ( varName , varValue .toString ());
262+ }
263+
264+ public void addHeaderVar (String varName , BigDecimal varValue ) {
265+ headerVars .put ( varName , varValue .toString ());
266+ }
267+
268+ public void addHeaderVar (String varName , java .util .UUID varValue ) {
269+ headerVars .put ( varName , quoteString (varValue .toString ()));
270+ }
271+
272+ public void addHeaderVar (String varName , IGxJSONSerializable varValue ) {
273+ headerVars .put ( varName , quoteString (varValue .toJSonString ()));
274+ }
275+
276+ ///
277+
193278 public <T extends GXXMLSerializable > void addBodyVar (String varName , GXBaseCollection <T > varValue ) {
194279 if ( varValue != null ) {
195280 bodyVars .put (varName , varValue .toJSonString (false ));
@@ -205,21 +290,11 @@ public void addBodyVar(String varName, GXXMLSerializable varValue) {
205290 public void addBodyVar (String varName , String varValue ) {
206291 bodyVars .put ( varName , quoteString (varValue ));
207292 }
208-
209- public void addBodyVar (String varName , double varValue ) {
210- bodyVars .put (varName , quoteString (Double .toString (varValue )));
211- }
212-
213- public void addBodyVar (String varName , Date varValue ) {
214- SimpleDateFormat df = new SimpleDateFormat (DATE_FMT );
215- bodyVars .put (varName , quoteString (df .format (varValue )));
216- }
217-
218- public void addBodyVar (String varName , Date varValue , boolean hasMilliseconds ) {
219- String fmt = DATETIME_FMT ;
220- if (hasMilliseconds )
221- fmt = DATETIME_FMT_MS ;
222- SimpleDateFormat df = new SimpleDateFormat (fmt );
293+
294+ public void addBodyVar (String varName , Date varValue , int fmtId ) {
295+ DateFormat fmt = DateFormat .fromId (fmtId );
296+ String fmtString = fmt .getFormat ();
297+ SimpleDateFormat df = new SimpleDateFormat (fmtString );
223298 bodyVars .put ( varName , quoteString (df .format (varValue )));
224299 }
225300
@@ -261,7 +336,7 @@ public Date getBodyDate(String varName) {
261336 if (val .startsWith (DATE_NULL ))
262337 return CommonUtil .newNullDate ();
263338 else
264- return new SimpleDateFormat (DATE_FMT ).parse (val );
339+ return new SimpleDateFormat (DateFormat . DATETIME_FMT . getFormat () ).parse (val );
265340 }
266341 catch (ParseException e ) {
267342 return CommonUtil .newNullDate ();
@@ -271,9 +346,9 @@ public Date getBodyDate(String varName) {
271346 public Date getBodyDateTime (String varName , Boolean hasMilliseconds ) {
272347 try {
273348 String val = getJsonStr (varName );
274- String fmt = DATETIME_FMT ;
349+ String fmt = DateFormat . DATETIME_FMT . getFormat () ;
275350 if (hasMilliseconds )
276- fmt = DATETIME_FMT_MS ;
351+ fmt = DateFormat . DATETIME_FMT_MS . getFormat () ;
277352
278353 if (val .startsWith (DATETIME_NULL ))
279354 return CommonUtil .newNullDate ();
@@ -316,16 +391,14 @@ public BigDecimal getBodyNum(String varName) {
316391 return new BigDecimal (getJsonStr (varName ));
317392 }
318393
319- public long getBodyLong (String varName ) {
320- long value =0 ;
394+ public long getBodyLong (String varName ) {
321395 try {
322- value = Long .parseLong (getJsonStr (varName ));
396+ return Long .parseLong (getJsonStr (varName ));
323397 }
324398 catch (NumberFormatException ex )
325399 {
326- value = Double .valueOf (getJsonStr (varName )).longValue ();
327- }
328- return value ;
400+ return Double .valueOf (getJsonStr (varName )).longValue ();
401+ }
329402 }
330403
331404 public int getBodyInt (String varName ) {
@@ -418,6 +491,7 @@ public <T extends GXXMLSerializable> GXBaseCollection<T> getBodyObjCollection(St
418491 fillCollection (varName , elementClass , col );
419492 return col ;
420493 }
494+
421495 private <T extends GXXMLSerializable > void fillCollection (String varName , Class <T > elementClass , GXBaseCollection col ) {
422496 JSONArray jsonarr = new JSONArray ();
423497 try {
@@ -477,46 +551,52 @@ else if (jsonResponse.length() == 1 && jsonResponse.has("")) {
477551 }
478552
479553 public void addUploadFile (String filePath , String fileName ) {
480- httpClient .addFile (filePath , fileName );
481- String mimeType = SpecificImplementation .Application .getContentType (filePath );
482- contentType = mimeType ;
554+ httpClient .addFile (filePath , fileName );
555+ contentType = SpecificImplementation .Application .getContentType (filePath );;
483556 }
484557
485558 public void RestExecute () {
486559 String separator = "" ;
487- queryString = "" ;
560+ String queryString = "" ;
561+ String bodyString = "" ;
562+
488563 if (queryVars .size () > 0 ) {
489564 separator = "?" ;
490565 for ( Map .Entry <String , String > entry : queryVars .entrySet ()) {
491566 queryString += String .format ("%s%s=%s" , separator , entry .getKey (), entry .getValue ());
492567 separator = "&" ;
493568 }
494569 }
495- bodyString = "" ;
496570 if (bodyVars .size () > 0 ) {
497571 separator = "" ;
498572 for ( Map .Entry <String , String > entry : bodyVars .entrySet ()) {
499- bodyString += separator + "\" " + entry .getKey () + "\" :" + entry .getValue () + "" ;
573+ bodyString += separator + "\" " + entry .getKey () + "\" :" + entry .getValue ();
500574 separator = "," ;
501575 }
502576 }
503577 if (bodyString .length () > 0 ) {
504578 bodyString = "{" + bodyString + "}" ;
505579 httpClient .addString ( bodyString );
506- httpClient .addHeader ( "Content-Type" , contentType );
580+ httpClient .addHeader ( CONTENT_TYPE_LABEL , contentType );
507581 }
508582 else {
509- if (httpMethod == "POST" || httpMethod == "PUT" ) {
583+ if (httpMethod . equals ( "POST" ) || httpMethod . equals ( "PUT" ) ) {
510584 bodyString = "{}" ;
511585 httpClient .addString (bodyString );
512- httpClient .addHeader ("Content-Type" , contentType );
586+ httpClient .addHeader (CONTENT_TYPE_LABEL , contentType );
513587 }
514588 }
515589 if (location .getAuthenticationMethod () == 4 && location .getAccessToken () != null && ! location .getAccessToken ().trim ().isEmpty ()) {
516- httpClient .addHeader ("Authorization" , location .getAccessToken ());
590+ httpClient .addHeader (AUTHORIZATION_LABEL , location .getAccessToken ());
517591 }
592+ if (headerVars .size () > 0 ) {
593+ for ( Map .Entry <String , String > entry : headerVars .entrySet ()) {
594+ httpClient .addHeader (entry .getKey (), entry .getValue ());
595+ }
596+ }
597+ headerVars .clear ();
518598 String serviceuri = ((location .getSecure () > 0 ) ? "https" : "http" ) + "://" + location .getHost ();
519- serviceuri += (location .getPort () != 80 ) ? ":" + Integer . toString ( location .getPort () ): "" ;
599+ serviceuri += (location .getPort () != 80 ) ? ":" + location .getPort (): "" ;
520600 serviceuri += "/" + location .getBaseURL () + "/" + location .getResourceName ();
521601 serviceuri += queryString ;
522602 httpClient .execute ( this .httpMethod , serviceuri );
@@ -527,7 +607,7 @@ public void RestExecute() {
527607 if (responseCode >= 300 || httpClient .getErrCode () > 0 ) {
528608 errorCode = httpClient .getErrCode ();
529609 errorMessage = httpClient .getErrDescription ();
530- }
610+ }
531611 else {
532612 try {
533613 String response = httpClient .getString ();
@@ -548,9 +628,9 @@ public void RestExecute() {
548628 }
549629
550630 private void logError (int code , String msg ) {
551- logger .error ("Error: " + Integer . toString ( code ) + " " + msg );
631+ logger .error ("Error: " + code + " " + msg );
552632 }
553633 private void logError (int code , String msg , Exception e ) {
554- logger .error ("Error: " + Integer . toString ( code ) + " " + msg , e );
634+ logger .error ("Error: " + code + " " + msg , e );
555635 }
556636}
0 commit comments