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 );
+
+ }
}