2121import java .util .Map ;
2222import java .util .regex .Pattern ;
2323
24+ import com .arangodb .entity .ArangoExceptionEntity ;
25+ import com .arangodb .entity .BaseDocument ;
2426import com .arangodb .entity .BaseEntity ;
27+ import com .arangodb .entity .DefaultEntity ;
28+ import com .arangodb .entity .DocumentEntity ;
2529import com .arangodb .entity .EntityDeserializers ;
2630import com .arangodb .entity .EntityFactory ;
2731import com .arangodb .entity .KeyValueEntity ;
3236import com .arangodb .util .DateUtils ;
3337import com .arangodb .util .ReflectionUtils ;
3438import com .arangodb .util .StringUtils ;
39+ import com .google .gson .JsonElement ;
40+ import com .google .gson .JsonObject ;
41+ import com .google .gson .JsonParser ;
3542
3643/**
3744 * @author tamtam180 - kirscheless at gmail.com
@@ -175,6 +182,77 @@ protected <T extends BaseEntity> T createEntity(
175182 if (res == null ) {
176183 return null ;
177184 }
185+ boolean isDocumentEntity = false ;
186+ boolean requestSuccessful = true ;
187+ // the following was added to ensure, that attributes with a key like "error", "code", "errorNum"
188+ // and "etag" will be serialized, when no error was thrown by the database
189+ if ( clazz == DocumentEntity .class ) {
190+ isDocumentEntity = true ;
191+ }
192+ int statusCode = res .getStatusCode ();
193+ if (statusCode >= 400 ) {
194+ requestSuccessful = false ;
195+ DefaultEntity defaultEntity = new DefaultEntity ();
196+ if (res .getText () != null && ! res .getText ().equalsIgnoreCase ("" ) && statusCode != 500 ) {
197+ JsonParser jsonParser = new JsonParser ();
198+ JsonElement jsonElement = jsonParser .parse (res .getText ());
199+ JsonObject jsonObject = jsonElement .getAsJsonObject ();
200+ JsonElement errorMessage = jsonObject .get ("errorMessage" );
201+ defaultEntity .setErrorMessage (errorMessage .getAsString ());
202+ JsonElement errorNumber = jsonObject .get ("errorNum" );
203+ defaultEntity .setErrorNumber (errorNumber .getAsInt ());
204+ } else {
205+ String statusPhrase = "" ;
206+ switch (statusCode ) {
207+ case 400 :
208+ statusPhrase = "Bad Request" ;
209+ break ;
210+ case 401 :
211+ statusPhrase = "Unauthorized" ;
212+ break ;
213+ case 403 :
214+ statusPhrase = "Forbidden" ;
215+ break ;
216+ case 404 :
217+ statusPhrase = "Not Found" ;
218+ break ;
219+ case 405 :
220+ statusPhrase = "Method Not Allowed" ;
221+ break ;
222+ case 406 :
223+ statusPhrase = "Not Acceptable" ;
224+ break ;
225+ case 407 :
226+ statusPhrase = "Proxy Authentication Required" ;
227+ break ;
228+ case 408 :
229+ statusPhrase = "Request Time-out" ;
230+ break ;
231+ case 409 :
232+ statusPhrase = "Conflict" ;
233+ break ;
234+ case 500 :
235+ statusPhrase = "Internal Server Error" ;
236+ break ;
237+ default :
238+ statusPhrase = "unknown error" ;
239+ break ;
240+ }
241+
242+ defaultEntity .setErrorMessage (statusPhrase );
243+ if (statusCode == 500 ) {
244+ defaultEntity .setErrorMessage (statusPhrase + ": " + res .getText ());
245+ }
246+ }
247+
248+ defaultEntity .setCode (statusCode );
249+ defaultEntity .setStatusCode (statusCode );
250+ defaultEntity .setError (true );
251+ ArangoException arangoException = new ArangoException (defaultEntity );
252+ arangoException .setCode (statusCode );
253+ throw arangoException ;
254+ }
255+
178256 try {
179257 EntityDeserializers .setParameterized (pclazz );
180258
@@ -193,6 +271,14 @@ protected <T extends BaseEntity> T createEntity(
193271 if (validate ) {
194272 validate (res , entity );
195273 }
274+
275+ if (isDocumentEntity && requestSuccessful ) {
276+ entity .setCode (statusCode );
277+ entity .setErrorMessage (null );
278+ entity .setError (false );
279+ entity .setErrorNumber (0 );
280+ }
281+
196282 return entity ;
197283 } finally {
198284 EntityDeserializers .removeParameterized ();
0 commit comments