Repository: usergrid Updated Branches: refs/heads/feature-flags 244b16ae1 -> 06419efa4
Update the KVM resource endpoints to be more client friendly. Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/06419efa Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/06419efa Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/06419efa Branch: refs/heads/feature-flags Commit: 06419efa4150595ec662dc9d9e77713a7f7e8466 Parents: 244b16a Author: Michael Russo <[email protected]> Authored: Wed Sep 7 12:39:29 2016 -0700 Committer: Michael Russo <[email protected]> Committed: Wed Sep 7 12:39:29 2016 -0700 ---------------------------------------------------------------------- .../corepersistence/CpEntityManager.java | 7 +- .../usergrid/system/UsergridFeatures.java | 2 +- .../rest/applications/ApplicationResource.java | 4 +- .../rest/applications/kvm/KvmResource.java | 96 ++++++++++++-------- 4 files changed, 66 insertions(+), 43 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/usergrid/blob/06419efa/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManager.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManager.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManager.java index 87a8649..489ffdf 100644 --- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManager.java +++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManager.java @@ -290,8 +290,11 @@ public class CpEntityManager implements EntityManager { public <A extends Entity> A create( String entityType, Class<A> entityClass, Map<String, Object> properties ) throws Exception { - if ( ( entityType != null ) && ( entityType.startsWith( TYPE_ENTITY ) || entityType - .startsWith( "entities" ) ) ) { + if ( ( entityType != null ) && + ( entityType.startsWith( TYPE_ENTITY ) || entityType.startsWith( "entities" ) + // safeguard against creating entities with type keyvaluemaps since we have specific Usergrid + // keyvaluemap implementation + || entityType.startsWith( "keyvaluemaps" ) || entityType.startsWith( "keyvaluemap" )) ) { throw new IllegalArgumentException( "Invalid entity type" ); } A e = null; http://git-wip-us.apache.org/repos/asf/usergrid/blob/06419efa/stack/core/src/main/java/org/apache/usergrid/system/UsergridFeatures.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/apache/usergrid/system/UsergridFeatures.java b/stack/core/src/main/java/org/apache/usergrid/system/UsergridFeatures.java index 22ba48c..2826f66 100644 --- a/stack/core/src/main/java/org/apache/usergrid/system/UsergridFeatures.java +++ b/stack/core/src/main/java/org/apache/usergrid/system/UsergridFeatures.java @@ -63,7 +63,7 @@ public class UsergridFeatures { public static boolean isKvmFeatureEnabled(){ - return getFeaturesEnabled().contains(Feature.KVM); + return true; } } http://git-wip-us.apache.org/repos/asf/usergrid/blob/06419efa/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 228598c..e73277c 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 @@ -148,8 +148,8 @@ public class ApplicationResource extends CollectionResource { return getEventsResource( ui ); } - //@RequireApplicationAccess - @Path("maps") + @RequireApplicationAccess + @Path("keyvaluemaps") public KvmResource getKvmResource(@Context UriInfo ui ) throws Exception { return getSubResource( KvmResource.class ); } http://git-wip-us.apache.org/repos/asf/usergrid/blob/06419efa/stack/rest/src/main/java/org/apache/usergrid/rest/applications/kvm/KvmResource.java ---------------------------------------------------------------------- diff --git a/stack/rest/src/main/java/org/apache/usergrid/rest/applications/kvm/KvmResource.java b/stack/rest/src/main/java/org/apache/usergrid/rest/applications/kvm/KvmResource.java index 264f968..4d6107e 100644 --- a/stack/rest/src/main/java/org/apache/usergrid/rest/applications/kvm/KvmResource.java +++ b/stack/rest/src/main/java/org/apache/usergrid/rest/applications/kvm/KvmResource.java @@ -43,9 +43,7 @@ import java.util.*; @Component("org.apache.usergrid.rest.applications.kvm.KvmResource") @Scope("prototype") -@Produces({ MediaType.APPLICATION_JSON, "application/javascript", "application/x-javascript", "text/ecmascript", - "application/ecmascript", "text/jscript" -}) +@Produces(MediaType.APPLICATION_JSON) public class KvmResource extends AbstractContextResource { private static final Logger logger = LoggerFactory.getLogger( KvmResource.class ); @@ -87,26 +85,34 @@ public class KvmResource extends AbstractContextResource { throw new IllegalArgumentException("Only 1 map can be created at a time."); } + enforceQueryFeature(ui); + final String mapName = json.keySet().iterator().next(); - final Object meta = json.get(mapName); - if( !(meta instanceof Map) ){ + + if( !(json.get(mapName) instanceof Map) ){ throw new IllegalArgumentException("New map details must be provided as a JSON object."); } + final Map<String, Object> meta = (Map<String, Object>)json.get(mapName); if(StringUtils.isEmpty(mapName)){ throw new IllegalArgumentException("Property mapName is required."); } + if( json.containsKey("metadata") ){ + json.remove("metadata"); + } + final String appMap = services.getApplicationId().toString(); final MapScope mapScope = new MapScopeImpl(services.getApplication().asId(), appMap); final MapManagerFactory mmf = injector.getInstance(MapManagerFactory.class); final MapManager mapManager = mmf.createMapManager(mapScope); final Map<String, Object> mapDetails = new HashMap<String, Object>(){{ - - put("active", true); - put("modified", System.currentTimeMillis() ); - put("details", meta); + put("metadata", new HashMap<String, Object>(){{ + put("active", true); + put("modified", System.currentTimeMillis() ); + }}); + putAll(meta); }}; @@ -121,7 +127,7 @@ public class KvmResource extends AbstractContextResource { response.setAction( "post" ); response.setApplication( services.getApplication() ); response.setParams( ui.getQueryParameters() ); - response.setProperty("maps", Collections.singletonList(map)); + response.setProperty("maps", map); return response; @@ -135,6 +141,7 @@ public class KvmResource extends AbstractContextResource { @QueryParam("cursor") String cursor) { limit = validateLimit(limit); + enforceQueryFeature(ui); final String appMap = services.getApplicationId().toString(); @@ -144,14 +151,12 @@ public class KvmResource extends AbstractContextResource { MapKeyResults mapKeyResults = mapManager.getKeys(cursor, limit ); - List<Map<String, Object>> results = new ArrayList<>(); + Map<String, Object> results = new HashMap<>(); Observable.from(mapKeyResults.getKeys()).flatMap(key -> { - return Observable.just(new HashMap<String, Object>() {{ - put(key, JsonUtils.parse(mapManager.getString(key))); - }}); + return Observable.just(results.put(key, JsonUtils.parse(mapManager.getString(key)))); - }).doOnNext(entry -> results.add(entry)).toBlocking().lastOrDefault(null); + }).toBlocking().lastOrDefault(null); ApiResponse response = createApiResponse(); @@ -177,6 +182,7 @@ public class KvmResource extends AbstractContextResource { @PathParam("mapName") String mapName ) { limit = validateLimit(limit); + enforceQueryFeature(ui); final String appMap = services.getApplicationId().toString(); @@ -193,7 +199,7 @@ public class KvmResource extends AbstractContextResource { response.setAction( "get" ); response.setApplication( services.getApplication() ); response.setParams( ui.getQueryParameters() ); - response.setProperty("maps", Collections.singletonList(map)); + response.setProperty("maps", map); return response; @@ -205,7 +211,7 @@ public class KvmResource extends AbstractContextResource { @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public ApiResponse createEntries( @Context UriInfo ui, - List<Map<String,Object>> json, + Map<String,Object> json, @PathParam("mapName") String mapName ) { if ( json.size() > BATCH_SIZE_MAX ){ @@ -216,19 +222,17 @@ public class KvmResource extends AbstractContextResource { throw new IllegalArgumentException("Property mapName is required."); } + enforceQueryFeature(ui); + final MapScope mapScope = new MapScopeImpl(services.getApplication().asId(), mapName); final MapManagerFactory mmf = injector.getInstance(MapManagerFactory.class); final MapManager mapManager = mmf.createMapManager(mapScope); //TODO maybe RX flatmap this or parallel stream - json.forEach( item -> { - - String key = item.keySet().iterator().next(); - Object value = item.get(key); + json.forEach( (key, value) -> { mapManager.putString(key, value.toString()); - }); @@ -236,7 +240,6 @@ public class KvmResource extends AbstractContextResource { response.setAction( "post" ); response.setApplication( services.getApplication() ); response.setParams( ui.getQueryParameters() ); - response.setProperty("mapName", mapName); response.setProperty("entries", json); return response; @@ -257,6 +260,7 @@ public class KvmResource extends AbstractContextResource { } limit = validateLimit(limit); + enforceQueryFeature(ui); final MapScope mapScope = new MapScopeImpl(services.getApplication().asId(), mapName); final MapManagerFactory mmf = injector.getInstance(MapManagerFactory.class); @@ -264,7 +268,6 @@ public class KvmResource extends AbstractContextResource { MapKeyResults mapKeyResults = mapManager.getKeys(cursor, limit ); - ApiResponse response = createApiResponse(); response.setAction( "get" ); response.setApplication( services.getApplication() ); @@ -292,6 +295,7 @@ public class KvmResource extends AbstractContextResource { } limit = validateLimit(limit); + enforceQueryFeature(ui); final MapScope mapScope = new MapScopeImpl(services.getApplication().asId(), mapName); final MapManagerFactory mmf = injector.getInstance(MapManagerFactory.class); @@ -299,11 +303,10 @@ public class KvmResource extends AbstractContextResource { MapKeyResults mapKeyResults = mapManager.getKeys(cursor, limit ); - List<Map<String, String>> results = new ArrayList<>(); + Map<String, Object> results = new HashMap<>(); Observable.from(mapKeyResults.getKeys()).flatMap(key ->{ - return Observable.just(new HashMap<String, String>(){{put(key, mapManager.getString(key));}}); - - }).doOnNext(entry -> results.add(entry)).toBlocking().lastOrDefault(null); + return Observable.just(results.put(key, mapManager.getString(key))); + }).toBlocking().lastOrDefault(null); ApiResponse response = createApiResponse(); @@ -323,27 +326,34 @@ public class KvmResource extends AbstractContextResource { @GET @Path("{mapName}/entries/{keyName}") @Produces(MediaType.APPLICATION_JSON) - public ApiResponse getEntry( @Context UriInfo ui, + public Object getEntry( @Context UriInfo ui, @PathParam("mapName") String mapName, - @PathParam("keyName") String keyName ) { + @PathParam("keyName") String keyName, + @QueryParam("rawData") @DefaultValue("false") boolean rawData) { + enforceQueryFeature(ui); final MapScope mapScope = new MapScopeImpl(services.getApplication().asId(), mapName); final MapManagerFactory mmf = injector.getInstance(MapManagerFactory.class); final MapManager mapManager = mmf.createMapManager(mapScope); - List<Map<String, String>> results = new ArrayList<>(); - results.add(new HashMap<String, String>(){{put(keyName, mapManager.getString(keyName));}}); + Map<String, Object> results = new HashMap<>(); + Object value = mapManager.getString(keyName); + results.put(keyName, value); + if( !rawData ) { + ApiResponse response = createApiResponse(); + response.setAction("get"); + response.setApplication(services.getApplication()); + response.setParams(ui.getQueryParameters()); + response.setProperty("entries", results); + return response; + }else{ + return value; + } - ApiResponse response = createApiResponse(); - response.setAction( "get" ); - response.setApplication( services.getApplication() ); - response.setParams( ui.getQueryParameters() ); - response.setProperty("entries", results); - return response; } @@ -354,5 +364,15 @@ public class KvmResource extends AbstractContextResource { } + private void enforceQueryFeature(UriInfo ui) { + + if( StringUtils.isNotEmpty(ui.getQueryParameters().getFirst("ql"))){ + + throw new IllegalArgumentException("Query feature not supported for keyvaluemaps"); + + } + + } + }
