You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by to...@apache.org on 2015/06/12 22:37:21 UTC
incubator-usergrid git commit: Fixes app not found to return a 404
Repository: incubator-usergrid
Updated Branches:
refs/heads/USERGRID-744 2981ba695 -> 6828111b9
Fixes app not found to return a 404
Moves app delete/restore to management endpoint
Fixes bugs in app delete/restore
Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/6828111b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/6828111b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/6828111b
Branch: refs/heads/USERGRID-744
Commit: 6828111b97c54da13ac306481c629f1f07d67b4e
Parents: 2981ba6
Author: Todd Nine <tn...@apigee.com>
Authored: Fri Jun 12 14:37:15 2015 -0600
Committer: Todd Nine <tn...@apigee.com>
Committed: Fri Jun 12 14:37:15 2015 -0600
----------------------------------------------------------------------
.../corepersistence/CpEntityManagerFactory.java | 73 +++++++++--------
.../rest/applications/ApplicationResource.java | 41 +++++++---
...ationApplicationNotFoundExceptionMapper.java | 2 +-
.../applications/ApplicationsResource.java | 13 ---
.../rest/applications/ApplicationDeleteIT.java | 86 +++++++++++++-------
.../cassandra/ManagementServiceImpl.java | 6 +-
6 files changed, 124 insertions(+), 97 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/6828111b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
index 1f8ee5e..e3c17f0 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
@@ -16,20 +16,12 @@
package org.apache.usergrid.corepersistence;
-import java.util.Arrays;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.UUID;
-import java.util.concurrent.atomic.AtomicBoolean;
-import org.apache.usergrid.corepersistence.index.IndexLocationStrategyFactory;
-import org.apache.usergrid.corepersistence.index.ReIndexRequestBuilder;
-import org.apache.usergrid.persistence.*;
-import org.apache.usergrid.persistence.graph.impl.SimpleSearchByEdge;
-import org.apache.usergrid.persistence.index.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
@@ -66,11 +58,14 @@ import org.apache.usergrid.persistence.core.util.Health;
import org.apache.usergrid.persistence.entities.Application;
import org.apache.usergrid.persistence.exceptions.ApplicationAlreadyExistsException;
import org.apache.usergrid.persistence.exceptions.DuplicateUniquePropertyExistsException;
+import org.apache.usergrid.persistence.exceptions.EntityNotFoundException;
import org.apache.usergrid.persistence.graph.Edge;
import org.apache.usergrid.persistence.graph.GraphManager;
import org.apache.usergrid.persistence.graph.GraphManagerFactory;
import org.apache.usergrid.persistence.graph.SearchByEdgeType;
import org.apache.usergrid.persistence.graph.impl.SimpleSearchByEdgeType;
+import org.apache.usergrid.persistence.index.EntityIndex;
+import org.apache.usergrid.persistence.index.IndexRefreshCommand;
import org.apache.usergrid.persistence.model.entity.Id;
import org.apache.usergrid.persistence.model.entity.SimpleId;
import org.apache.usergrid.persistence.model.util.UUIDGenerator;
@@ -364,39 +359,45 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
final ApplicationScope deleteApplicationScope = new ApplicationScopeImpl(deleteApplicationId);
Entity oldAppEntity = managementEm.get(new SimpleEntityRef( deleteTypeName, applicationUUID));
- Observable copyConnections = Observable.empty();
- if (oldAppEntity != null) {
- // ensure that there is not already a deleted app with the same name
- final EntityRef alias = managementEm.getAlias( createCollectionName, oldAppEntity.getName());
- if (alias != null) {
- throw new ConflictException("Cannot delete app with same name as already deleted app");
- }
- // make a copy of the app to delete application_info entity
- // and put it in a deleted_application_info collection
+ if(oldAppEntity == null){
+ throw new EntityNotFoundException( String.format("Could not find application with UUID '%s'", applicationUUID) );
+ }
- final Entity newAppEntity = managementEm.create(new SimpleId(applicationUUID, createTypeName ), oldAppEntity.getProperties());
- // copy its connections too
-
- final Set<String> connectionTypes = managementEm.getConnectionTypes(oldAppEntity);
- copyConnections = Observable.from(connectionTypes).doOnNext(connType -> {
- try {
- final Results connResults =
- managementEm.getTargetEntities(oldAppEntity, connType, null, Query.Level.ALL_PROPERTIES);
- connResults.getEntities().forEach(entity -> {
- try {
- managementEm.createConnection(newAppEntity, connType, entity);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- });
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- });
+ // ensure that there is not already a deleted app with the same name
+ final EntityRef alias = managementEm.getAlias( createCollectionName, oldAppEntity.getName() );
+ if ( alias != null ) {
+ throw new ConflictException( "Cannot delete app with same name as already deleted app" );
}
+ // make a copy of the app to delete application_info entity
+ // and put it in a deleted_application_info collection
+
+ final Entity newAppEntity =
+ managementEm.create( new SimpleId( applicationUUID, createTypeName ), oldAppEntity.getProperties() );
+
+ // copy its connections too
+
+ final Set<String> connectionTypes = managementEm.getConnectionTypes( oldAppEntity );
+ Observable copyConnections = Observable.from( connectionTypes ).doOnNext( connType -> {
+ try {
+ final Results connResults =
+ managementEm.getTargetEntities( oldAppEntity, connType, null, Query.Level.ALL_PROPERTIES );
+ connResults.getEntities().forEach( entity -> {
+ try {
+ managementEm.createConnection( newAppEntity, connType, entity );
+ }
+ catch ( Exception e ) {
+ throw new RuntimeException( e );
+ }
+ } );
+ }
+ catch ( Exception e ) {
+ throw new RuntimeException( e );
+ }
+ } );
+
final Id managementAppId = CpNamingUtils.getManagementApplicationId();
final EntityIndex aei = getManagementIndex();
final GraphManager managementGraphManager = managerCache.getGraphManager(managementAppScope);
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/6828111b/stack/rest/src/main/java/org/apache/usergrid/rest/applications/ApplicationResource.java
----------------------------------------------------------------------
diff --git a/stack/rest/src/main/java/org/apache/usergrid/rest/applications/ApplicationResource.java b/stack/rest/src/main/java/org/apache/usergrid/rest/applications/ApplicationResource.java
index 892590d..bf350bc 100644
--- a/stack/rest/src/main/java/org/apache/usergrid/rest/applications/ApplicationResource.java
+++ b/stack/rest/src/main/java/org/apache/usergrid/rest/applications/ApplicationResource.java
@@ -20,23 +20,36 @@ package org.apache.usergrid.rest.applications;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;
-import java.util.Properties;
import java.util.UUID;
-import javax.ws.rs.*;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.PathSegment;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
-import org.apache.commons.lang.StringUtils;
-import org.apache.usergrid.rest.ApiResponse;
-import org.apache.usergrid.rest.security.annotations.RequireOrganizationAccess;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
+
+import org.apache.amber.oauth2.common.error.OAuthError;
+import org.apache.amber.oauth2.common.exception.OAuthProblemException;
+import org.apache.amber.oauth2.common.message.OAuthResponse;
+import org.apache.amber.oauth2.common.message.types.GrantType;
+import org.apache.shiro.authz.UnauthorizedException;
+import org.apache.shiro.codec.Base64;
+
import org.apache.usergrid.management.ApplicationInfo;
import org.apache.usergrid.management.exceptions.DisabledAdminUserException;
import org.apache.usergrid.management.exceptions.DisabledAppUserException;
@@ -44,10 +57,10 @@ import org.apache.usergrid.management.exceptions.UnactivatedAdminUserException;
import org.apache.usergrid.management.exceptions.UnactivatedAppUserException;
import org.apache.usergrid.mq.QueueManager;
import org.apache.usergrid.persistence.EntityManager;
-import org.apache.usergrid.persistence.index.query.Identifier;
import org.apache.usergrid.persistence.SimpleEntityRef;
import org.apache.usergrid.persistence.entities.Application;
import org.apache.usergrid.persistence.entities.User;
+import org.apache.usergrid.persistence.index.query.Identifier;
import org.apache.usergrid.rest.AbstractContextResource;
import org.apache.usergrid.rest.applications.assets.AssetsResource;
import org.apache.usergrid.rest.applications.events.EventsResource;
@@ -56,16 +69,10 @@ import org.apache.usergrid.rest.applications.users.UsersResource;
import org.apache.usergrid.rest.exceptions.AuthErrorInfo;
import org.apache.usergrid.rest.exceptions.RedirectionException;
import org.apache.usergrid.rest.security.annotations.RequireApplicationAccess;
+import org.apache.usergrid.rest.security.annotations.RequireOrganizationAccess;
import org.apache.usergrid.security.oauth.AccessInfo;
import org.apache.usergrid.security.oauth.ClientCredentialsInfo;
-import org.apache.amber.oauth2.common.error.OAuthError;
-import org.apache.amber.oauth2.common.exception.OAuthProblemException;
-import org.apache.amber.oauth2.common.message.OAuthResponse;
-import org.apache.amber.oauth2.common.message.types.GrantType;
-import org.apache.shiro.authz.UnauthorizedException;
-import org.apache.shiro.codec.Base64;
-
import com.sun.jersey.api.json.JSONWithPadding;
import com.sun.jersey.api.view.Viewable;
@@ -488,6 +495,14 @@ public class ApplicationResource extends ServiceResource {
}
+ @Override
+ @DELETE
+ @RequireOrganizationAccess
+ public JSONWithPadding executeDelete( @Context final UriInfo ui, @DefaultValue( "callback" ) final String callback,
+ final String confirmAppDelete ) throws Exception {
+ throw new UnsupportedOperationException( "Delete must be done from the management endpoint" );
+ }
+
String errorMsg = "";
String applicationName;
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/6828111b/stack/rest/src/main/java/org/apache/usergrid/rest/exceptions/OrganizationApplicationNotFoundExceptionMapper.java
----------------------------------------------------------------------
diff --git a/stack/rest/src/main/java/org/apache/usergrid/rest/exceptions/OrganizationApplicationNotFoundExceptionMapper.java b/stack/rest/src/main/java/org/apache/usergrid/rest/exceptions/OrganizationApplicationNotFoundExceptionMapper.java
index 0d25021..8f4111a 100644
--- a/stack/rest/src/main/java/org/apache/usergrid/rest/exceptions/OrganizationApplicationNotFoundExceptionMapper.java
+++ b/stack/rest/src/main/java/org/apache/usergrid/rest/exceptions/OrganizationApplicationNotFoundExceptionMapper.java
@@ -27,6 +27,6 @@ public class OrganizationApplicationNotFoundExceptionMapper
extends AbstractExceptionMapper<OrganizationApplicationNotFoundException> {
@Override
public Response toResponse( OrganizationApplicationNotFoundException e ) {
- return super.toResponse( Response.Status.BAD_REQUEST, e );
+ return super.toResponse( Response.Status.NOT_FOUND, e );
}
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/6828111b/stack/rest/src/main/java/org/apache/usergrid/rest/management/organizations/applications/ApplicationsResource.java
----------------------------------------------------------------------
diff --git a/stack/rest/src/main/java/org/apache/usergrid/rest/management/organizations/applications/ApplicationsResource.java b/stack/rest/src/main/java/org/apache/usergrid/rest/management/organizations/applications/ApplicationsResource.java
index f8e2268..28eff4e 100644
--- a/stack/rest/src/main/java/org/apache/usergrid/rest/management/organizations/applications/ApplicationsResource.java
+++ b/stack/rest/src/main/java/org/apache/usergrid/rest/management/organizations/applications/ApplicationsResource.java
@@ -135,19 +135,6 @@ public class ApplicationsResource extends AbstractContextResource {
@RequireOrganizationAccess
- @Path(RootResource.APPLICATION_ID_PATH)
- @PUT
- public ApplicationResource restoreApplicationFromOrganizationByApplicationId(
- @Context UriInfo ui,
- @PathParam( "applicationId" )
- String applicationIdStr ) throws Exception {
-
- return getSubResource( ApplicationResource.class )
- .init( organization, UUID.fromString( applicationIdStr ) );
- }
-
-
- @RequireOrganizationAccess
@Path( "{applicationName}" )
public ApplicationResource applicationFromOrganizationByApplicationName(
@Context UriInfo ui, @PathParam( "applicationName" ) String applicationName ) throws Exception {
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/6828111b/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationDeleteIT.java
----------------------------------------------------------------------
diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationDeleteIT.java b/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationDeleteIT.java
index 2fe05e3..d00ae74 100644
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationDeleteIT.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationDeleteIT.java
@@ -18,17 +18,27 @@
package org.apache.usergrid.rest.applications;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.sun.jersey.api.client.UniformInterfaceException;
-import org.apache.usergrid.rest.test.resource2point0.AbstractRestIT;
-import org.apache.usergrid.rest.test.resource2point0.endpoints.mgmt.ManagementResponse;
-import org.apache.usergrid.rest.test.resource2point0.model.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.UUID;
+
+import javax.ws.rs.core.MediaType;
+
import org.junit.Assert;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.ws.rs.core.MediaType;
-import java.util.*;
+
+import org.apache.usergrid.rest.test.resource2point0.AbstractRestIT;
+import org.apache.usergrid.rest.test.resource2point0.endpoints.mgmt.ManagementResponse;
+import org.apache.usergrid.rest.test.resource2point0.model.ApiResponse;
+import org.apache.usergrid.rest.test.resource2point0.model.Application;
+import org.apache.usergrid.rest.test.resource2point0.model.Entity;
+import org.apache.usergrid.rest.test.resource2point0.model.Token;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.sun.jersey.api.client.UniformInterfaceException;
import static org.junit.Assert.fail;
@@ -73,8 +83,10 @@ public class ApplicationDeleteIT extends AbstractRestIT {
fail("Delete must fail without app_delete_confirm parameter");
- } catch ( Exception e ) {
- logger.error("Error", e);
+ } catch ( UniformInterfaceException expected ) {
+ Assert.assertEquals("Error must be 400", 400, expected.getResponse().getStatus() );
+ JsonNode node = mapper.readTree( expected.getResponse().getEntity( String.class ));
+ Assert.assertEquals("Cannot delete application without app_delete_confirm parameter", node.get("error_description").textValue());
}
clientSetup.getRestClient().management().orgs()
@@ -95,10 +107,25 @@ public class ApplicationDeleteIT extends AbstractRestIT {
fail("Must not be able to get deleted app");
} catch ( UniformInterfaceException expected ) {
- Assert.assertEquals("Error must be 400", 400, expected.getResponse().getStatus() );
+ Assert.assertEquals("Error must be 404", 404, expected.getResponse().getStatus() );
JsonNode node = mapper.readTree( expected.getResponse().getEntity( String.class ));
- Assert.assertEquals("organization_application_not_found", node.get("error").textValue());
+ Assert.assertEquals("entity_not_found", node.get("error").textValue());
+ }
+
+
+ try {
+ clientSetup.getRestClient().org( orgName ).app( appToDeleteName ).getResource()
+ .queryParam( "access_token", orgAdminToken.getAccessToken() ).type( MediaType.APPLICATION_JSON )
+ .get( ApiResponse.class );
+
+ fail( "Must not be able to get deleted app" );
}
+ catch ( UniformInterfaceException expected ) {
+ Assert.assertEquals( "Error must be 404", 404, expected.getResponse().getStatus() );
+ JsonNode node = mapper.readTree( expected.getResponse().getEntity( String.class ) );
+ Assert.assertEquals( "organization_application_not_found", node.get( "error" ).textValue() );
+ }
+
// test that we can no longer get deleted app's collection
@@ -112,7 +139,7 @@ public class ApplicationDeleteIT extends AbstractRestIT {
fail("Must not be able to get deleted app's collection");
} catch ( UniformInterfaceException expected ) {
- Assert.assertEquals("Error must be 400", 400, expected.getResponse().getStatus() );
+ Assert.assertEquals("Error must be 400", 404, expected.getResponse().getStatus() );
JsonNode node = mapper.readTree( expected.getResponse().getEntity( String.class ));
Assert.assertEquals("organization_application_not_found", node.get("error").textValue());
}
@@ -131,7 +158,7 @@ public class ApplicationDeleteIT extends AbstractRestIT {
} catch ( UniformInterfaceException expected ) {
// TODO: why not a 404?
- Assert.assertEquals("Error must be 400", 400, expected.getResponse().getStatus() );
+ Assert.assertEquals("Error must be 400", 404, expected.getResponse().getStatus() );
JsonNode node = mapper.readTree( expected.getResponse().getEntity( String.class ));
Assert.assertEquals("organization_application_not_found", node.get("error").textValue());
}
@@ -153,15 +180,16 @@ public class ApplicationDeleteIT extends AbstractRestIT {
// test that we cannot delete the application a second time
try {
- clientSetup.getRestClient().management().orgs()
- .org(orgName).apps().app(appToDeleteId.toString()).getResource()
- .queryParam("access_token", orgAdminToken.getAccessToken())
- .delete();
+ clientSetup.getRestClient().management().orgs().org( orgName ).apps().app( appToDeleteId.toString() )
+ .getResource().queryParam( "access_token", orgAdminToken.getAccessToken() )
+ .queryParam( "app_delete_confirm", "confirm_delete_of_application_and_data" ).delete();
- } catch ( UniformInterfaceException expected ) {
- Assert.assertEquals("Error must be 404", 404, expected.getResponse().getStatus() );
- JsonNode node = mapper.readTree( expected.getResponse().getEntity( String.class ));
- Assert.assertEquals("not_found", node.get("error").textValue());
+ fail("Can't delete a non existent app twice");
+ }
+ catch ( UniformInterfaceException expected ) {
+ Assert.assertEquals( "Error must be 404", 404, expected.getResponse().getStatus() );
+ JsonNode node = mapper.readTree( expected.getResponse().getEntity( String.class ) );
+ Assert.assertEquals( "entity_not_found", node.get( "error" ).textValue() );
}
// test that we can create a new application with the same name
@@ -204,8 +232,8 @@ public class ApplicationDeleteIT extends AbstractRestIT {
logger.debug("\n\nDeleting app\n");
- clientSetup.getRestClient()
- .org(orgName).app( appToDeleteName ).getResource()
+ clientSetup.getRestClient().management().orgs()
+ .org(orgName).apps().app( appToDeleteName ).getResource()
.queryParam("access_token", orgAdminToken.getAccessToken() )
.queryParam("app_delete_confirm", "confirm_delete_of_application_and_data")
.delete();
@@ -217,8 +245,8 @@ public class ApplicationDeleteIT extends AbstractRestIT {
logger.debug("\n\nRestoring app\n");
- clientSetup.getRestClient()
- .org(orgName).app( appToDeleteId.toString() ).getResource()
+ clientSetup.getRestClient().management().orgs()
+ .org(orgName).apps().app( appToDeleteId.toString() ).getResource()
.queryParam("access_token", orgAdminToken.getAccessToken() )
.put();
@@ -282,8 +310,8 @@ public class ApplicationDeleteIT extends AbstractRestIT {
// delete the app
- clientSetup.getRestClient()
- .org( orgName ).app(appToDeleteId.toString() ).getResource()
+ clientSetup.getRestClient().management().orgs()
+ .org( orgName ).apps().app(appToDeleteId.toString() ).getResource()
.queryParam( "access_token", orgAdminToken.getAccessToken() )
.queryParam("app_delete_confirm", "confirm_delete_of_application_and_data")
.delete();
@@ -296,8 +324,8 @@ public class ApplicationDeleteIT extends AbstractRestIT {
try {
- clientSetup.getRestClient()
- .org(orgName).app(appToDeleteId.toString()).getResource()
+ clientSetup.getRestClient() .management().orgs()
+ .org(orgName).apps().app(appToDeleteId.toString()).getResource()
.queryParam("access_token", orgAdminToken.getAccessToken())
.put();
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/6828111b/stack/services/src/main/java/org/apache/usergrid/management/cassandra/ManagementServiceImpl.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/management/cassandra/ManagementServiceImpl.java b/stack/services/src/main/java/org/apache/usergrid/management/cassandra/ManagementServiceImpl.java
index 5c4262d..6f4e675 100644
--- a/stack/services/src/main/java/org/apache/usergrid/management/cassandra/ManagementServiceImpl.java
+++ b/stack/services/src/main/java/org/apache/usergrid/management/cassandra/ManagementServiceImpl.java
@@ -1892,12 +1892,8 @@ public class ManagementServiceImpl implements ManagementService {
return null;
}
EntityManager em = emf.getEntityManager( smf.getManagementAppId() );
- EntityRef mgmtAppRef = new SimpleEntityRef( Schema.TYPE_APPLICATION, smf.getManagementAppId() );
- final Results results = em.searchCollection(mgmtAppRef, CpNamingUtils.DELETED_APPLICATION_INFOS,
- Query.fromQL("select * where " + PROPERTY_APPLICATION_ID + " = " + applicationId.toString()));
-
- Entity entity = results.getEntity();
+ final Entity entity = em.get( new SimpleEntityRef( CpNamingUtils.DELETED_APPLICATION_INFO, applicationId ) );
if ( entity != null ) {
return new ApplicationInfo( applicationId, entity.getName() );