Added error checking to rest endpoint, with test cases for each exception thrown. Renamed returned entity from export job âExport Entityâ
Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/dde48e28 Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/dde48e28 Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/dde48e28 Branch: refs/heads/master Commit: dde48e2843de8a2c763f438257ed6f8c4b8b9da8 Parents: 9e716a6 Author: grey <[email protected]> Authored: Thu Mar 6 09:46:11 2014 -0800 Committer: grey <[email protected]> Committed: Thu Mar 6 09:46:11 2014 -0800 ---------------------------------------------------------------------- .../applications/ApplicationResource.java | 78 +++++-- .../rest/management/ManagementResourceIT.java | 212 ++++++++++++++++++- .../management/export/S3ExportImpl.java | 2 +- 3 files changed, 265 insertions(+), 27 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/dde48e28/stack/rest/src/main/java/org/apache/usergrid/rest/management/organizations/applications/ApplicationResource.java ---------------------------------------------------------------------- diff --git a/stack/rest/src/main/java/org/apache/usergrid/rest/management/organizations/applications/ApplicationResource.java b/stack/rest/src/main/java/org/apache/usergrid/rest/management/organizations/applications/ApplicationResource.java index 73e550b..bf44877 100644 --- a/stack/rest/src/main/java/org/apache/usergrid/rest/management/organizations/applications/ApplicationResource.java +++ b/stack/rest/src/main/java/org/apache/usergrid/rest/management/organizations/applications/ApplicationResource.java @@ -221,20 +221,48 @@ public class ApplicationResource extends AbstractContextResource { OAuthResponse response = null; UUID jobUUID = null; Map<String, String> uuidRet = new HashMap<String, String>(); + + Map<String,Object> properties; + Map<String, Object> storage_info; + //TODO: do input verification here! make sure json map has all correct values. try { //parse the json into some useful object (the config params) //ExportInfo objEx = new ExportInfo( json ); - if(json.get( "properties" ) == null){ - throw new NullPointerException(); + if((properties = ( Map<String, Object> ) json.get( "properties" )) == null){ + throw new NullPointerException("Could not find 'properties'"); + } + storage_info = ( Map<String, Object> ) properties.get( "storage_info" ); + String storage_provider = ( String ) properties.get( "storage_provider" ); + if(storage_provider == null) { + throw new NullPointerException( "Could not find field 'storage_provider'" ); } + if(storage_info == null) { + throw new NullPointerException( "Could not find field 'storage_info'" ); + } + + + String bucketName = ( String ) storage_info.get( "bucket_location" ); + String accessId = ( String ) storage_info.get( "s3_access_id" ); + String secretKey = ( String ) storage_info.get( "s3_key" ); + + if(bucketName == null) { + throw new NullPointerException( "Could not find field 'bucketName'" ); + } + if(accessId == null) { + throw new NullPointerException( "Could not find field 's3_access_id'" ); + } + if(secretKey == null) { + throw new NullPointerException( "Could not find field 's3_key'" ); + } + json.put( "organizationId",organization.getUuid()); //objEx.setOrganizationId( organization.getUuid() ); json.put( "applicationId",applicationId); //objEx.setApplicationId( applicationId ); jobUUID = exportService.schedule( json ); - uuidRet.put( "jobUUID", jobUUID.toString() ); + uuidRet.put( "Export Entity", jobUUID.toString() ); } catch ( NullPointerException e ) { return Response.status( SC_BAD_REQUEST ).type( JSONPUtils.jsonMediaType( callback ) ) @@ -264,23 +292,43 @@ public class ApplicationResource extends AbstractContextResource { String colExport = collection_name; Map<String, String> uuidRet = new HashMap<String, String>(); + Map<String,Object> properties; + Map<String, Object> storage_info; + try { //checkJsonExportProperties(json); - if(json.get( "properties" ) == null){ - throw new NullPointerException(); + if((properties = ( Map<String, Object> ) json.get( "properties" )) == null){ + throw new NullPointerException("Could not find 'properties'"); + } + storage_info = ( Map<String, Object> ) properties.get( "storage_info" ); + String storage_provider = ( String ) properties.get( "storage_provider" ); + if(storage_provider == null) { + throw new NullPointerException( "Could not find field 'storage_provider'" ); + } + if(storage_info == null) { + throw new NullPointerException( "Could not find field 'storage_info'" ); + } + + + String bucketName = ( String ) storage_info.get( "bucket_location" ); + String accessId = ( String ) storage_info.get( "s3_access_id" ); + String secretKey = ( String ) storage_info.get( "s3_key" ); + + if(bucketName == null) { + throw new NullPointerException( "Could not find field 'bucketName'" ); + } + if(accessId == null) { + throw new NullPointerException( "Could not find field 's3_access_id'" ); + } + if(secretKey == null) { + throw new NullPointerException( "Could not find field 's3_key'" ); } - //if(json.get( "properties.")) - //parse the json into some useful object (the config params) -// ExportInfo objEx = new ExportInfo( json ); -// objEx.setOrganizationId( organization.getUuid() ); -// objEx.setApplicationId( applicationId ); -// objEx.setCollection( colExport ); json.put( "organizationId",organization.getUuid() ); json.put( "applicationId", applicationId); json.put( "collectionName", colExport); jobUUID = exportService.schedule( json ); - uuidRet.put( "jobUUID", jobUUID.toString() ); + uuidRet.put( "Export Entity", jobUUID.toString() ); } catch ( NullPointerException e ) { return Response.status( SC_BAD_REQUEST ).type( JSONPUtils.jsonMediaType( callback ) ) @@ -302,13 +350,13 @@ public class ApplicationResource extends AbstractContextResource { @GET @RequireOrganizationAccess - @Path("export/{jobUUID: [A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}}") - public Response exportGetJson( @Context UriInfo ui, @PathParam("jobUUID") UUID jobUUIDStr, + @Path("export/{exportEntity: [A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}}") + public Response exportGetJson( @Context UriInfo ui, @PathParam("exportEntity") UUID exportEntityUUIDStr, @QueryParam("callback") @DefaultValue("") String callback ) throws Exception { Export entity; try { - entity = smf.getServiceManager( applicationId ).getEntityManager().get( jobUUIDStr, Export.class ); + entity = smf.getServiceManager( applicationId ).getEntityManager().get( exportEntityUUIDStr, Export.class ); } catch ( Exception e ) { //this might not be a bad request and needs better error checking return Response.status( SC_BAD_REQUEST ).type( JSONPUtils.jsonMediaType( callback ) ) http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/dde48e28/stack/rest/src/test/java/org/apache/usergrid/rest/management/ManagementResourceIT.java ---------------------------------------------------------------------- diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/management/ManagementResourceIT.java b/stack/rest/src/test/java/org/apache/usergrid/rest/management/ManagementResourceIT.java index 7eb9ed1..0c8e99a 100644 --- a/stack/rest/src/test/java/org/apache/usergrid/rest/management/ManagementResourceIT.java +++ b/stack/rest/src/test/java/org/apache/usergrid/rest/management/ManagementResourceIT.java @@ -611,7 +611,7 @@ public class ManagementResourceIT extends AbstractRestIT { } assertEquals( Status.ACCEPTED, responseStatus ); - assertNotNull( node.get( "jobUUID" ) ); + assertNotNull( node.get( "Export Entity" ) ); } // @Test @@ -634,7 +634,7 @@ public class ManagementResourceIT extends AbstractRestIT { } assertEquals( Status.ACCEPTED, responseStatus ); - assertNotNull( node.get( "jobUUID" ) ); + assertNotNull( node.get( "Export Entity" ) ); } @@ -650,7 +650,7 @@ public class ManagementResourceIT extends AbstractRestIT { node = resource().path( "/management/orgs/test-organization/apps/test-app/export" ) .queryParam( "access_token", superAdminToken() ).accept( MediaType.APPLICATION_JSON ) .type( MediaType.APPLICATION_JSON_TYPE ).post( JsonNode.class, payload ); - String uuid = String.valueOf( node.get( "jobUUID" ) ); + String uuid = String.valueOf( node.get( "Export Entity" ) ); uuid = uuid.replaceAll( "\"", "" ); try { @@ -677,7 +677,7 @@ public class ManagementResourceIT extends AbstractRestIT { node = resource().path( "/management/orgs/test-organization/apps/test-app/collection/users/export" ) .queryParam( "access_token", superAdminToken() ).accept( MediaType.APPLICATION_JSON ) .type( MediaType.APPLICATION_JSON_TYPE ).post( JsonNode.class, payload ); - String uuid = String.valueOf( node.get( "jobUUID" ) ); + String uuid = String.valueOf( node.get( "Export Entity" ) ); uuid = uuid.replaceAll( "\"", "" ); try { @@ -713,7 +713,7 @@ public class ManagementResourceIT extends AbstractRestIT { } // @Test - public void exportPostApplicationNullPointer() throws Exception { + public void exportPostApplicationNullPointerProperties() throws Exception { JsonNode node = null; Status responseStatus = Status.OK; @@ -728,7 +728,6 @@ public class ManagementResourceIT extends AbstractRestIT { properties.put( "storage_provider", "s3" ); properties.put( "storage_info", storage_info ); - payload.put( "path", "test-organization/test-app" ); try { node = resource().path( "/management/orgs/test-organization/apps/test-app/export" ) @@ -802,6 +801,201 @@ public class ManagementResourceIT extends AbstractRestIT { assertEquals( Status.UNAUTHORIZED, responseStatus ); } + @Test + public void exportPostApplicationNullPointerStorageInfo() throws Exception { + JsonNode node = null; + Status responseStatus = Status.OK; + + HashMap<String, Object> payload = payloadBuilder(); + HashMap<String, Object> properties = ( HashMap<String, Object> ) payload.get("properties"); + //remove storage_info field + properties.remove( "storage_info" ); + + try { + node = resource().path( "/management/orgs/test-organization/apps/test-app/export" ) + .queryParam( "access_token", superAdminToken() ).accept( MediaType.APPLICATION_JSON ) + .type( MediaType.APPLICATION_JSON_TYPE ).post( JsonNode.class,payload ); + } + catch ( UniformInterfaceException uie ) { + responseStatus = uie.getResponse().getClientResponseStatus(); + } + assertEquals( Status.BAD_REQUEST, responseStatus ); + } + + @Test + public void exportPostCollectionNullPointerStorageInfo() throws Exception { + JsonNode node = null; + Status responseStatus = Status.OK; + + HashMap<String, Object> payload = payloadBuilder(); + HashMap<String, Object> properties = ( HashMap<String, Object> ) payload.get("properties"); + //remove storage_info field + properties.remove( "storage_info" ); + + try { + node = resource().path( "/management/orgs/test-organization/apps/test-app/collection/users/export" ) + .queryParam( "access_token", superAdminToken() ).accept( MediaType.APPLICATION_JSON ) + .type( MediaType.APPLICATION_JSON_TYPE ).post( JsonNode.class,payload ); + } + catch ( UniformInterfaceException uie ) { + responseStatus = uie.getResponse().getClientResponseStatus(); + } + assertEquals( Status.BAD_REQUEST, responseStatus ); + } + + @Test + public void exportPostApplicationNullPointerStorageProvider() throws Exception { + JsonNode node = null; + Status responseStatus = Status.OK; + + HashMap<String, Object> payload = payloadBuilder(); + HashMap<String, Object> properties = ( HashMap<String, Object> ) payload.get("properties"); + //remove storage_info field + properties.remove( "storage_provider" ); + + + try { + node = resource().path( "/management/orgs/test-organization/apps/test-app/export" ) + .queryParam( "access_token", superAdminToken() ).accept( MediaType.APPLICATION_JSON ) + .type( MediaType.APPLICATION_JSON_TYPE ).post( JsonNode.class,payload ); + } + catch ( UniformInterfaceException uie ) { + responseStatus = uie.getResponse().getClientResponseStatus(); + } + assertEquals( Status.BAD_REQUEST, responseStatus ); + } + + @Test + public void exportPostCollectionNullPointerStorageProvider() throws Exception { + JsonNode node = null; + Status responseStatus = Status.OK; + + HashMap<String, Object> payload = payloadBuilder(); + HashMap<String, Object> properties = ( HashMap<String, Object> ) payload.get("properties"); + //remove storage_info field + properties.remove( "storage_provider" ); + + + try { + node = resource().path( "/management/orgs/test-organization/apps/test-app/collection/users/export" ) + .queryParam( "access_token", superAdminToken() ).accept( MediaType.APPLICATION_JSON ) + .type( MediaType.APPLICATION_JSON_TYPE ).post( JsonNode.class,payload ); + } + catch ( UniformInterfaceException uie ) { + responseStatus = uie.getResponse().getClientResponseStatus(); + } + assertEquals( Status.BAD_REQUEST, responseStatus ); + } + + @Test + public void exportPostApplicationNullPointerStorageVerification() throws Exception { + JsonNode node = null; + Status responseStatus = Status.OK; + + HashMap<String, Object> payload = payloadBuilder(); + HashMap<String, Object> properties = ( HashMap<String, Object> ) payload.get("properties"); + HashMap<String, Object> storage_info = ( HashMap<String, Object> ) properties.get("storage_info"); + //remove storage_key field + storage_info.remove( "s3_key" ); + + try { + node = resource().path( "/management/orgs/test-organization/apps/test-app/export" ) + .queryParam( "access_token", superAdminToken() ).accept( MediaType.APPLICATION_JSON ) + .type( MediaType.APPLICATION_JSON_TYPE ).post( JsonNode.class,payload ); + } + catch ( UniformInterfaceException uie ) { + responseStatus = uie.getResponse().getClientResponseStatus(); + } + assertEquals( Status.BAD_REQUEST, responseStatus ); + + payload = payloadBuilder(); + properties = ( HashMap<String, Object> ) payload.get("properties"); + storage_info = ( HashMap<String, Object> ) properties.get("storage_info"); + //remove storage_key field + storage_info.remove( "s3_access_id" ); + + try { + node = resource().path( "/management/orgs/test-organization/apps/test-app/export" ) + .queryParam( "access_token", superAdminToken() ).accept( MediaType.APPLICATION_JSON ) + .type( MediaType.APPLICATION_JSON_TYPE ).post( JsonNode.class,payload ); + } + catch ( UniformInterfaceException uie ) { + responseStatus = uie.getResponse().getClientResponseStatus(); + } + assertEquals( Status.BAD_REQUEST, responseStatus ); + + payload = payloadBuilder(); + properties = ( HashMap<String, Object> ) payload.get("properties"); + storage_info = ( HashMap<String, Object> ) properties.get("storage_info"); + //remove storage_key field + storage_info.remove( "bucket_location" ); + + try { + node = resource().path( "/management/orgs/test-organization/apps/test-app/export" ) + .queryParam( "access_token", superAdminToken() ).accept( MediaType.APPLICATION_JSON ) + .type( MediaType.APPLICATION_JSON_TYPE ).post( JsonNode.class,payload ); + } + catch ( UniformInterfaceException uie ) { + responseStatus = uie.getResponse().getClientResponseStatus(); + } + assertEquals( Status.BAD_REQUEST, responseStatus ); + + } + + @Test + public void exportPostCollectionNullPointerStorageVerification() throws Exception { + JsonNode node = null; + Status responseStatus = Status.OK; + + HashMap<String, Object> payload = payloadBuilder(); + HashMap<String, Object> properties = ( HashMap<String, Object> ) payload.get("properties"); + HashMap<String, Object> storage_info = ( HashMap<String, Object> ) properties.get("storage_info"); + //remove storage_key field + storage_info.remove( "s3_key" ); + + try { + node = resource().path( "/management/orgs/test-organization/apps/test-app/collection/users/export" ) + .queryParam( "access_token", superAdminToken() ).accept( MediaType.APPLICATION_JSON ) + .type( MediaType.APPLICATION_JSON_TYPE ).post( JsonNode.class,payload ); + } + catch ( UniformInterfaceException uie ) { + responseStatus = uie.getResponse().getClientResponseStatus(); + } + assertEquals( Status.BAD_REQUEST, responseStatus ); + + payload = payloadBuilder(); + properties = ( HashMap<String, Object> ) payload.get("properties"); + storage_info = ( HashMap<String, Object> ) properties.get("storage_info"); + //remove storage_key field + storage_info.remove( "s3_access_id" ); + + try { + node = resource().path( "/management/orgs/test-organization/apps/test-app/collection/users/export" ) + .queryParam( "access_token", superAdminToken() ).accept( MediaType.APPLICATION_JSON ) + .type( MediaType.APPLICATION_JSON_TYPE ).post( JsonNode.class,payload ); + } + catch ( UniformInterfaceException uie ) { + responseStatus = uie.getResponse().getClientResponseStatus(); + } + assertEquals( Status.BAD_REQUEST, responseStatus ); + + payload = payloadBuilder(); + properties = ( HashMap<String, Object> ) payload.get("properties"); + storage_info = ( HashMap<String, Object> ) properties.get("storage_info"); + storage_info.remove( "bucket_location" ); + + try { + node = resource().path( "/management/orgs/test-organization/apps/test-app/collection/users/export" ) + .queryParam( "access_token", superAdminToken() ).accept( MediaType.APPLICATION_JSON ) + .type( MediaType.APPLICATION_JSON_TYPE ).post( JsonNode.class,payload ); + } + catch ( UniformInterfaceException uie ) { + responseStatus = uie.getResponse().getClientResponseStatus(); + } + assertEquals( Status.BAD_REQUEST, responseStatus ); + + } + /*Creates fake payload for testing purposes.*/ public HashMap<String, Object> payloadBuilder() { @@ -811,14 +1005,10 @@ public class ManagementResourceIT extends AbstractRestIT { //TODO: always put dummy values here and ignore this test. //TODO: add a ret for when s3 values are invalid. storage_info.put( "s3_key", "insert key here" ); - storage_info.put( "s3_accessId", "insert access id here" ); + storage_info.put( "s3_access_id", "insert access id here" ); storage_info.put( "bucket_location", "insert bucket name here" ); - - properties.put( "storage_provider", "s3" ); properties.put( "storage_info", storage_info ); - - payload.put( "path", "test-organization/test-app" ); payload.put( "properties", properties ); return payload; } http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/dde48e28/stack/services/src/main/java/org/apache/usergrid/management/export/S3ExportImpl.java ---------------------------------------------------------------------- diff --git a/stack/services/src/main/java/org/apache/usergrid/management/export/S3ExportImpl.java b/stack/services/src/main/java/org/apache/usergrid/management/export/S3ExportImpl.java index 7439acf..fd3f376 100644 --- a/stack/services/src/main/java/org/apache/usergrid/management/export/S3ExportImpl.java +++ b/stack/services/src/main/java/org/apache/usergrid/management/export/S3ExportImpl.java @@ -39,7 +39,7 @@ public class S3ExportImpl implements S3Export { Map<String, Object> storage_info = (Map<String,Object>)properties.get( "storage_info" ); String bucketName = ( String ) storage_info.get( "bucket_location" ); - String accessId = ( String ) storage_info.get( "s3_accessId" ); + String accessId = ( String ) storage_info.get( "s3_access_id" ); String secretKey = ( String ) storage_info.get( "s3_key" ); Properties overrides = new Properties();
