You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2015/09/09 18:12:12 UTC

[2/6] usergrid git commit: adding status service

adding status service


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/1c742af7
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/1c742af7
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/1c742af7

Branch: refs/heads/two-dot-o-dev
Commit: 1c742af77bc9edec078580aed700c2ef60a3def5
Parents: 88f0751
Author: Shawn Feldman <sf...@apache.org>
Authored: Tue Sep 8 16:23:07 2015 -0600
Committer: Shawn Feldman <sf...@apache.org>
Committed: Tue Sep 8 16:23:07 2015 -0600

----------------------------------------------------------------------
 .../corepersistence/service/StatusService.java  |  6 +-
 .../service/StatusServiceImpl.java              | 46 +++++++++--
 .../usergrid/rest/ApplicationsResource.java     | 86 +++++++++++++++++---
 3 files changed, 119 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/1c742af7/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/StatusService.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/StatusService.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/StatusService.java
index 5faa0fc..37fac78 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/StatusService.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/StatusService.java
@@ -29,12 +29,12 @@ import java.util.UUID;
  * serializing job status or any kind
  */
 public interface StatusService  {
-    public Observable<UUID> setStatus(final UUID jobStatusId, final Status status, final Map<String,Object> data );
+    Observable<UUID> setStatus(final UUID applicationdId, final UUID jobStatusId, final Status status, final Map<String,Object> data );
 
-    public  Observable<JobStatus> getStatus(final UUID jobId);
+    Observable<JobStatus> getStatus(final UUID applicationdId, final UUID jobId);
 
     enum Status{
-        STARTED, INPROGRESS, COMPLETE, UNKNOWN;
+        STARTED, FAILED, INPROGRESS, COMPLETE, UNKNOWN;
     }
 
     class JobStatus{

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1c742af7/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/StatusServiceImpl.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/StatusServiceImpl.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/StatusServiceImpl.java
index 90025a9..6a3a220 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/StatusServiceImpl.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/StatusServiceImpl.java
@@ -19,9 +19,16 @@
  */
 package org.apache.usergrid.corepersistence.service;
 
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.inject.Inject;
+import org.apache.usergrid.corepersistence.util.CpNamingUtils;
+import org.apache.usergrid.persistence.core.util.StringUtils;
 import org.apache.usergrid.persistence.map.MapManager;
 import org.apache.usergrid.persistence.map.MapManagerFactory;
+import org.apache.usergrid.persistence.map.impl.MapScopeImpl;
+import org.apache.usergrid.persistence.model.entity.Id;
+import org.apache.usergrid.persistence.model.entity.SimpleId;
 import rx.Observable;
 
 import java.util.Map;
@@ -33,6 +40,10 @@ import java.util.UUID;
 public class StatusServiceImpl implements StatusService {
 
     private final MapManagerFactory mapManagerFactory;
+    final static String statusKey = "status";
+    final static String dataKey = "data";
+    private final JsonFactory JSON_FACTORY = new JsonFactory();
+    private final ObjectMapper MAPPER = new ObjectMapper( JSON_FACTORY );
 
     @Inject
     public StatusServiceImpl(final MapManagerFactory mapManagerFactory){
@@ -40,13 +51,38 @@ public class StatusServiceImpl implements StatusService {
     }
 
     @Override
-    public Observable<UUID> setStatus( UUID jobStatusId, Status status, Map<String, Object> data) {
-//        mapManager.putUuid(jobStatusId+"ke",);
-        return null;
+    public Observable<UUID> setStatus(final UUID applicationId, final UUID jobId, final Status status, final Map<String, Object> data) {
+        return Observable.create(sub -> {
+            final String jobString = StringUtils.sanitizeUUID(jobId);
+            final Id appId = CpNamingUtils.generateApplicationId(applicationId);
+            final MapManager mapManager = mapManagerFactory.createMapManager(new MapScopeImpl(appId, "status"));
+            try {
+                final String dataString = MAPPER.writeValueAsString(data);
+                mapManager.putString(jobString + dataKey, dataString);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+            mapManager.putString(jobString + statusKey, status.toString());
+            sub.onNext(jobId);
+            sub.onCompleted();
+        });
     }
 
     @Override
-    public Observable<JobStatus> getStatus(UUID jobId) {
-        return null;
+    public Observable<JobStatus> getStatus(final UUID applicationId, UUID jobId) {
+        final String jobString = StringUtils.sanitizeUUID(jobId);
+
+        return Observable.create(subscriber -> {
+            Id appId = CpNamingUtils.generateApplicationId(applicationId);
+            final MapManager mapManager = mapManagerFactory.createMapManager(new MapScopeImpl(appId, "status"));
+            try {
+                final Map<String, Object> data = MAPPER.readValue(mapManager.getString(jobString+dataKey), Map.class);
+                final Status status = Status.valueOf(mapManager.getString(jobString+statusKey));
+                subscriber.onNext(new JobStatus(jobId,status,data));
+                subscriber.onCompleted();
+            }catch (Exception e){
+                throw new RuntimeException(e);
+            }
+        });
     }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/1c742af7/stack/rest/src/main/java/org/apache/usergrid/rest/ApplicationsResource.java
----------------------------------------------------------------------
diff --git a/stack/rest/src/main/java/org/apache/usergrid/rest/ApplicationsResource.java b/stack/rest/src/main/java/org/apache/usergrid/rest/ApplicationsResource.java
index a554dfb..ac1a834 100644
--- a/stack/rest/src/main/java/org/apache/usergrid/rest/ApplicationsResource.java
+++ b/stack/rest/src/main/java/org/apache/usergrid/rest/ApplicationsResource.java
@@ -20,8 +20,11 @@
 package org.apache.usergrid.rest;
 
 import com.sun.jersey.api.json.JSONWithPadding;
+import org.apache.usergrid.corepersistence.service.StatusService;
 import org.apache.usergrid.persistence.Entity;
 import org.apache.usergrid.persistence.EntityManager;
+import org.apache.usergrid.persistence.core.util.StringUtils;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
 import org.apache.usergrid.rest.security.annotations.RequireSystemAccess;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,6 +36,7 @@ import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -72,30 +76,90 @@ public class ApplicationsResource extends AbstractContextResource {
             throw new IllegalArgumentException("please make add a QueryString for confirmApplicationName");
         }
 
+        final UUID jobId = UUIDGenerator.newTimeUUID();
+
         final EntityManager em =  emf.getEntityManager(applicationId);
         final String name =  em.getApplication().getApplicationName();
         if(!name.toLowerCase().equals(confirmApplicationName.toLowerCase())){
             throw new IllegalArgumentException("confirmApplicationName: " + confirmApplicationName + " does not equal " + name);
         }
+        final StatusService statusService = injector.getInstance(StatusService.class);
+
         final ApiResponse response = createApiResponse();
+
         response.setAction( "clear application" );
 
         logger.info( "clearing up application" );
-        final AtomicInteger itemsDeleted = new AtomicInteger(0);
-        try {
-            management.deleteAllEntities(applicationId, limit)
-                .count()
-                .doOnNext(count -> itemsDeleted.set(count))
-                .toBlocking().lastOrDefault(0);
-        }
-        catch ( Exception e ) {
-            logger.error( "Unable to delete all items, deleted: " + itemsDeleted.get(), e );
-        }
+
+
+        final Thread delete = new Thread() {
+
+            @Override
+            public void run() {
+                final AtomicInteger itemsDeleted = new AtomicInteger(0);
+                try {
+                    management.deleteAllEntities(applicationId, limit)
+                        .count()
+                        .doOnNext(count -> itemsDeleted.set(count))
+                        .doOnNext(count -> {
+                            if( count%100 == 0 ){
+                                Map<String,Object> map = new LinkedHashMap<>();
+                                map.put("count",itemsDeleted.intValue());
+                                statusService.setStatus(applicationId, jobId, StatusService.Status.INPROGRESS,map);
+                            }
+                        })
+                        .doOnCompleted(() ->{
+                            Map<String,Object> map = new LinkedHashMap<>();
+                            map.put("count",itemsDeleted.intValue());
+                            statusService.setStatus(applicationId,jobId, StatusService.Status.FAILED,map);
+                        })
+                        .subscribe();
+
+                } catch ( Exception e ) {
+                    Map<String,Object> map = new LinkedHashMap<>();
+                    map.put("exception",e);
+                    statusService.setStatus(applicationId,jobId, StatusService.Status.FAILED,map).subscribe();
+                    logger.error( "Failed to delete appid:"+applicationId + " jobid:"+jobId+" count:"+itemsDeleted, e );
+                }
+            }
+        };
+
+        delete.setName( "Delete for app : "+applicationId + " job: "+jobId );
+        delete.setDaemon(true);
+        delete.start();
+
+        statusService.setStatus(applicationId,jobId, StatusService.Status.STARTED,new LinkedHashMap<>()).subscribe();
+
         Map<String,Object> data = new HashMap<>();
-        data.put("count",itemsDeleted.get());
+        data.put("jobId",jobId);
         response.setData(data);
         response.setSuccess();
         return new JSONWithPadding( response, callback );
     }
+    @RequireSystemAccess
+    @GET
+    @Path( "{applicationId}/job/{jobId}" )
+    public JSONWithPadding getStatus( @Context UriInfo ui,
+                                             @PathParam("applicationId") UUID applicationId,
+                                            @PathParam("jobId") UUID jobId,
+                                             @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback ) {
+        final StatusService statusService = injector.getInstance(StatusService.class);
+
+        final ApiResponse response = createApiResponse();
+
+        response.setAction( "clear application" );
+
+        StatusService.JobStatus jobStatus = statusService.getStatus(applicationId, jobId).toBlocking().lastOrDefault(null);
+
+        Map<String,Object> data = new HashMap<>();
+        data.put("jobId",jobId);
+        data.put( "status", jobStatus.getStatus().toString() );
+        data.put( "metadata", jobStatus.getData().toString() );
+        response.setData(data);
+        response.setSuccess();
+
+        return new JSONWithPadding( response, callback );
+
+    }
 
 }