22
33import com .android .volley .NetworkResponse ;
44import com .android .volley .RequestQueue ;
5+ import com .android .volley .RetryPolicy ;
56import com .android .volley .VolleyError ;
67import com .android .volley .toolbox .RequestFuture ;
78import com .fasterxml .jackson .core .JsonParseException ;
2122import java .util .concurrent .TimeoutException ;
2223
2324import stannieman .commonservices .helpers .ResultCodeHelper ;
25+ import stannieman .commonservices .models .DataServiceResult ;
2426import stannieman .commonservices .models .GeneralResultCodes ;
2527import stannieman .commonservices .models .IHasDataAndSuccessState ;
2628import stannieman .commonservices .models .ServiceResult ;
@@ -52,8 +54,9 @@ abstract class RestClientBase implements IRestClient {
5254 private final int port ;
5355 private final String absoluteEndpointPath ;
5456 private final long timeout ;
57+ private final RetryPolicy retryPolicy ;
5558
56- protected RestClientBase (ObjectMapper objectMapper , RequestQueue requestQueue , Scheme scheme , String host , int port , String apiBasePath , String endpointPath , long timeout ) {
59+ protected RestClientBase (ObjectMapper objectMapper , RequestQueue requestQueue , Scheme scheme , String host , int port , String apiBasePath , String endpointPath , long timeout , RetryPolicy retryPolicy ) {
5760 this .objectMapper = objectMapper ;
5861 this .requestQueue = requestQueue ;
5962
@@ -62,33 +65,34 @@ protected RestClientBase(ObjectMapper objectMapper, RequestQueue requestQueue, S
6265 this .port = port ;
6366 this .absoluteEndpointPath = getAbsoluteEndpointPath (apiBasePath , endpointPath );
6467 this .timeout = timeout ;
68+ this .retryPolicy = retryPolicy ;
6569 }
6670
6771 protected <SuccessResponseDataType , ErrorResponseDataType extends ErrorResponseDataBase > IHasDataAndSuccessState <RestResult <SuccessResponseDataType , ErrorResponseDataType >> doRequest (int method , RequestProperties <SuccessResponseDataType , ErrorResponseDataType > requestProperties , List <AbstractMap .SimpleEntry <String , String >> queryParameters , Map <String , String > headers ) {
6872 IHasDataAndSuccessState <String > uriResult = getUriString (requestProperties .getSubPath (), requestProperties .getSubPathParameters (), queryParameters );
6973 if (!uriResult .isSuccess ()) {
7074 RestClientResultCodes resultCode = ResultCodeHelper .GetResultCodeOrNull (uriResult , RestClientResultCodes .class );
7175 return resultCode != null
72- ? new ServiceResult <RestResult <SuccessResponseDataType , ErrorResponseDataType >, RestClientResultCodes >(resultCode )
73- : new ServiceResult <RestResult <SuccessResponseDataType , ErrorResponseDataType >, RestClientResultCodes >(RestClientResultCodes .CANNOT_CREATE_URI );
76+ ? new DataServiceResult <RestResult <SuccessResponseDataType , ErrorResponseDataType >, RestClientResultCodes >(resultCode )
77+ : new DataServiceResult <RestResult <SuccessResponseDataType , ErrorResponseDataType >, RestClientResultCodes >(RestClientResultCodes .CANNOT_CREATE_URI );
7478 }
7579 String uriString = uriResult .getData ();
7680
7781 IHasDataAndSuccessState <String > bodyStringResult = getBodyString (requestProperties .getBody ());
7882 if (!bodyStringResult .isSuccess ()) {
7983 RestClientResultCodes resultCode = ResultCodeHelper .GetResultCodeOrNull (uriResult , RestClientResultCodes .class );
8084 return resultCode != null
81- ? new ServiceResult <RestResult <SuccessResponseDataType , ErrorResponseDataType >, RestClientResultCodes >(resultCode )
82- : new ServiceResult <RestResult <SuccessResponseDataType , ErrorResponseDataType >, RestClientResultCodes >(RestClientResultCodes .CANNOT_CREATE_JSON_STRING_FROM_OBJECT );
85+ ? new DataServiceResult <RestResult <SuccessResponseDataType , ErrorResponseDataType >, RestClientResultCodes >(resultCode )
86+ : new DataServiceResult <RestResult <SuccessResponseDataType , ErrorResponseDataType >, RestClientResultCodes >(RestClientResultCodes .CANNOT_CREATE_JSON_STRING_FROM_OBJECT );
8387 }
8488 String bodyString = bodyStringResult .getData ();
8589
8690 IHasDataAndSuccessState <NetworkResponse > networkResponseResult = getNetworkResponse (method , uriString , headers , bodyString );
8791 if (!networkResponseResult .isSuccess ()) {
8892 RestClientResultCodes resultCode = ResultCodeHelper .GetResultCodeOrNull (uriResult , RestClientResultCodes .class );
8993 return resultCode != null
90- ? new ServiceResult <RestResult <SuccessResponseDataType , ErrorResponseDataType >, RestClientResultCodes >(resultCode )
91- : new ServiceResult <RestResult <SuccessResponseDataType , ErrorResponseDataType >, RestClientResultCodes >(RestClientResultCodes .REQUEST_FAILED );
94+ ? new DataServiceResult <RestResult <SuccessResponseDataType , ErrorResponseDataType >, RestClientResultCodes >(resultCode )
95+ : new DataServiceResult <RestResult <SuccessResponseDataType , ErrorResponseDataType >, RestClientResultCodes >(RestClientResultCodes .REQUEST_FAILED );
9296 }
9397 NetworkResponse networkResponse = networkResponseResult .getData ();
9498
@@ -101,84 +105,92 @@ private IHasDataAndSuccessState<String> getUriString(String subPath, String[] su
101105 try {
102106 String uriString = new URI (scheme , null , host , port , absoluteEndpointPath + parametrizedSubPath , null , null ).toString ();
103107 String queryString = QueryParamsHelper .getQueryString (queryParameters , ENCODING );
104- return new ServiceResult <>(uriString + queryString , GeneralResultCodes .OK );
108+ return new DataServiceResult <>(uriString + queryString , GeneralResultCodes .OK );
105109 } catch (Exception e ) {
106- return new ServiceResult <>(CANNOT_CREATE_URI );
110+ return new DataServiceResult <>(CANNOT_CREATE_URI );
107111 }
108112 }
109113
110114 private IHasDataAndSuccessState <String > getBodyString (Object body ) {
111115 if (body != null ) {
112116 try {
113- return new ServiceResult <>(objectMapper .writeValueAsString (body ), GeneralResultCodes .OK );
117+ return new DataServiceResult <>(objectMapper .writeValueAsString (body ), GeneralResultCodes .OK );
114118 } catch (Exception e ) {
115- return new ServiceResult <>(RestClientResultCodes .CANNOT_CREATE_JSON_STRING_FROM_OBJECT );
119+ return new DataServiceResult <>(RestClientResultCodes .CANNOT_CREATE_JSON_STRING_FROM_OBJECT );
116120 }
117121 }
118- return new ServiceResult <>();
122+ return new DataServiceResult <>();
119123 }
120124
121125 private IHasDataAndSuccessState <NetworkResponse > getNetworkResponse (int method , String uriString , Map <String , String > headers , String bodyString ) {
122126 RequestFuture <NetworkResponse > future = RequestFuture .newFuture ();
123- requestQueue .add (new NetworkResponseRequest (method , uriString , getHeadersWithRequestDefaultHeaders (headers ), bodyString , future , future , ENCODING ));
127+ requestQueue .add (new NetworkResponseRequest (
128+ method ,
129+ uriString ,
130+ getHeadersWithRequestDefaultHeaders (headers ),
131+ bodyString ,
132+ retryPolicy ,
133+ future ,
134+ future ,
135+ ENCODING ));
124136
125137 NetworkResponse response ;
126138 try {
127139 response = future .get (timeout , TimeUnit .MILLISECONDS );
128140 }
129141 catch (InterruptedException e ) {
130- return new ServiceResult <>(RestClientResultCodes .REQUEST_INTERRUPTED );
142+ return new DataServiceResult <>(RestClientResultCodes .REQUEST_INTERRUPTED );
131143 } catch (ExecutionException e ) {
132144 Throwable cause = e .getCause ();
133145 if (!(cause instanceof VolleyError )) {
134- return new ServiceResult <>(RestClientResultCodes .REQUEST_FAILED );
146+ return new DataServiceResult <>(RestClientResultCodes .REQUEST_FAILED );
135147 }
136148 VolleyError error = (VolleyError ) cause ;
137149 if (error .networkResponse == null ) {
138- return new ServiceResult <>(RestClientResultCodes .REQUEST_FAILED );
150+ return new DataServiceResult <>(RestClientResultCodes .REQUEST_FAILED );
139151 }
140152 response = error .networkResponse ;
141153 } catch (TimeoutException e ) {
142- return new ServiceResult <>(RestClientResultCodes .REQUEST_TIMED_OUT );
154+ return new DataServiceResult <>(RestClientResultCodes .REQUEST_TIMED_OUT );
143155 }
144156
145- return new ServiceResult <>(response , GeneralResultCodes .OK );
157+ return new DataServiceResult <>(response , GeneralResultCodes .OK );
146158 }
147159
148160 private <SuccessResponseDataType , ErrorResponseDataType extends ErrorResponseDataBase > IHasDataAndSuccessState <RestResult <SuccessResponseDataType , ErrorResponseDataType >> createRestResultFromNetworkResponse (Class <SuccessResponseDataType > successResponseDataType , Class <ErrorResponseDataType > errorResponseDataType , NetworkResponse networkResponse , Integer [] successStatusCodes ) {
149161 String jsonString = NetworkResponseRequest .parseToString (networkResponse );
150162
151163 if (isStatusCodeOk (networkResponse .statusCode , successStatusCodes )) {
152164 if (successResponseDataType == null ) {
153- return new ServiceResult <>(new RestResult <SuccessResponseDataType , ErrorResponseDataType >(networkResponse .statusCode ), GeneralResultCodes .OK );
165+ return new DataServiceResult <>(new RestResult <SuccessResponseDataType , ErrorResponseDataType >(networkResponse .statusCode ), GeneralResultCodes .OK );
154166 }
155167 else {
156168 try {
157169 SuccessResponseDataType successObject = objectMapper .readValue (jsonString , successResponseDataType );
158- return new ServiceResult <>(new RestResult <SuccessResponseDataType , ErrorResponseDataType >(networkResponse .statusCode , successObject ), GeneralResultCodes .OK );
170+ return new DataServiceResult <>(new RestResult <SuccessResponseDataType , ErrorResponseDataType >(networkResponse .statusCode , successObject ), GeneralResultCodes .OK );
159171 } catch (JsonMappingException e ) {
160- return new ServiceResult <>(RestClientResultCodes .JSON_RESPONSE_DATA_TYPE_MISMATCH );
172+ return new DataServiceResult <>(RestClientResultCodes .JSON_RESPONSE_DATA_TYPE_MISMATCH );
161173 } catch (JsonParseException e ) {
162- return new ServiceResult <>(RestClientResultCodes .RESPONSE_IS_NOT_VALID_JSON );
174+ return new DataServiceResult <>(RestClientResultCodes .RESPONSE_IS_NOT_VALID_JSON );
163175 } catch (IOException e ) {
164- return new ServiceResult <>(RestClientResultCodes .CANNOT_CREATE_OBJECT_FROM_SUCCESS_RESPONSE );
176+ return new DataServiceResult <>(RestClientResultCodes .CANNOT_CREATE_OBJECT_FROM_SUCCESS_RESPONSE );
165177 }
166178 }
167179 }
168180
169181 if (errorResponseDataType == null ) {
170- return new ServiceResult <>(new RestResult <SuccessResponseDataType , ErrorResponseDataType >(false , networkResponse .statusCode ));
182+ return new DataServiceResult <>(new RestResult <SuccessResponseDataType , ErrorResponseDataType >(false , networkResponse .statusCode ));
171183 }
172184 else {
173185 try {
174186 ErrorResponseDataType errorObject = objectMapper .readValue (jsonString , errorResponseDataType );
175- return new ServiceResult <>(new RestResult <SuccessResponseDataType , ErrorResponseDataType >(networkResponse .statusCode , errorObject ), GeneralResultCodes .OK );
187+ return new DataServiceResult <>(new RestResult <SuccessResponseDataType , ErrorResponseDataType >(networkResponse .statusCode , errorObject ), GeneralResultCodes .OK );
176188 } catch (JsonMappingException e ) {
177- return new ServiceResult <>(RestClientResultCodes .JSON_ERROR_DATA_TYPE_MISMATCH );
189+ return new DataServiceResult <>(RestClientResultCodes .JSON_ERROR_DATA_TYPE_MISMATCH );
178190 } catch (JsonParseException e ) {
179- return new ServiceResult <>(RestClientResultCodes .RESPONSE_IS_NOT_VALID_JSON );
191+ return new DataServiceResult <>(RestClientResultCodes .RESPONSE_IS_NOT_VALID_JSON );
180192 } catch (IOException e ) {
181- return new ServiceResult <>(RestClientResultCodes .CANNOT_CREATE_OBJECT_FROM_ERROR_RESPONSE );
193+ return new DataServiceResult <>(RestClientResultCodes .CANNOT_CREATE_OBJECT_FROM_ERROR_RESPONSE );
182194 }
183195 }
184196 }
0 commit comments