You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@eagle.apache.org by ha...@apache.org on 2016/07/29 11:02:18 UTC

incubator-eagle git commit: [EAGLE-403] Add CRUD for site resource

Repository: incubator-eagle
Updated Branches:
  refs/heads/develop b75367832 -> 0feba43d4


[EAGLE-403] Add CRUD for site resource

Author: Hao Chen <ha...@apache.org>

Closes #286 from haoch/EAGLE-403-SITE.


Project: http://git-wip-us.apache.org/repos/asf/incubator-eagle/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-eagle/commit/0feba43d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-eagle/tree/0feba43d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-eagle/diff/0feba43d

Branch: refs/heads/develop
Commit: 0feba43d4bb93b431f8eccc41ab001859793cecd
Parents: b753678
Author: Hao Chen <ha...@apache.org>
Authored: Fri Jul 29 19:02:00 2016 +0800
Committer: Hao Chen <ha...@apache.org>
Committed: Fri Jul 29 19:02:00 2016 +0800

----------------------------------------------------------------------
 .../eagle/app/resource/ApplicationResource.java | 26 +++++-----
 .../service/ApplicationManagementService.java   |  3 +-
 .../impl/ApplicationManagementServiceImpl.java  |  3 +-
 .../ApplicationNotFoundException.java           | 31 ++++++++++++
 .../exceptions/EntityNotFoundException.java     | 31 ++++++++++++
 .../IllegalApplicationTypeException.java        | 20 ++++++++
 .../persistence/PersistenceService.java         |  4 +-
 .../eagle/metadata/resource/RESTResponse.java   | 37 +++++++++++----
 .../eagle/metadata/resource/SiteResource.java   | 26 ++++++++--
 .../metadata/service/SiteEntityService.java     |  6 ++-
 .../SiteEntityEntityServiceMemoryImpl.java      | 50 ++++++++++++++------
 .../eagle/server/RESTExceptionMapper.java       | 28 +----------
 12 files changed, 194 insertions(+), 71 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/0feba43d/eagle-core/eagle-app/eagle-app-base/src/main/java/org/apache/eagle/app/resource/ApplicationResource.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-app/eagle-app-base/src/main/java/org/apache/eagle/app/resource/ApplicationResource.java b/eagle-core/eagle-app/eagle-app-base/src/main/java/org/apache/eagle/app/resource/ApplicationResource.java
index 185a1d5..dad9f66 100644
--- a/eagle-core/eagle-app/eagle-app-base/src/main/java/org/apache/eagle/app/resource/ApplicationResource.java
+++ b/eagle-core/eagle-app/eagle-app-base/src/main/java/org/apache/eagle/app/resource/ApplicationResource.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
@@ -64,10 +64,10 @@ public class ApplicationResource {
     @Path("/providers/reload")
     @Produces(MediaType.APPLICATION_JSON)
     public RESTResponse<Collection<ApplicationDesc>> reloadApplicationDescs(){
-        return RESTResponse.<Collection<ApplicationDesc>>async((builder)-> {
+        return RESTResponse.<Collection<ApplicationDesc>>async((response)-> {
             providerService.reload();
-            builder.message("Successfully reload application providers");
-            builder.data(providerService.getApplicationDescs());
+            response.message("Successfully reload application providers");
+            response.data(providerService.getApplicationDescs());
         }).get();
     }
 
@@ -104,10 +104,10 @@ public class ApplicationResource {
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
     public RESTResponse<ApplicationEntity> installApplication(ApplicationOperations.InstallOperation operation){
-        return RESTResponse.<ApplicationEntity>async((builder)-> {
+        return RESTResponse.<ApplicationEntity>async((response)-> {
             ApplicationEntity entity = applicationManagementService.install(operation);
-            builder.message("Successfully installed application "+operation.getAppType()+" onto site "+operation.getSiteId());
-            builder.data(entity);
+            response.message("Successfully installed application "+operation.getAppType()+" onto site "+operation.getSiteId());
+            response.data(entity);
         }).get();
     }
 
@@ -126,9 +126,9 @@ public class ApplicationResource {
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
     public RESTResponse<Void> uninstallApplication(ApplicationOperations.UninstallOperation operation){
-        return RESTResponse.<Void>async((builder)-> {
+        return RESTResponse.<Void>async((response)-> {
             ApplicationEntity entity = applicationManagementService.uninstall(operation);
-            builder.success(true).message("Successfully uninstalled application "+entity.getUuid());
+            response.success(true).message("Successfully uninstalled application "+entity.getUuid());
         }).get();
     }
 
@@ -146,9 +146,9 @@ public class ApplicationResource {
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
     public RESTResponse<Void> startApplication(ApplicationOperations.StartOperation operation){
-        return RESTResponse.<Void>async((builder)-> {
+        return RESTResponse.<Void>async((response)-> {
             ApplicationEntity entity = applicationManagementService.start(operation);
-            builder.success(true).message("Successfully started application "+entity.getUuid());
+            response.success(true).message("Successfully started application "+entity.getUuid());
         }).get();
     }
 
@@ -166,9 +166,9 @@ public class ApplicationResource {
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
     public RESTResponse<Void> stopApplication(ApplicationOperations.StopOperation operation){
-        return RESTResponse.<Void>async((builder)-> {
+        return RESTResponse.<Void>async((response)-> {
             ApplicationEntity entity = applicationManagementService.stop(operation);
-            builder.success(true).message("Successfully stopped application "+entity.getUuid());
+            response.success(true).message("Successfully stopped application "+entity.getUuid());
         }).get();
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/0feba43d/eagle-core/eagle-app/eagle-app-base/src/main/java/org/apache/eagle/app/service/ApplicationManagementService.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-app/eagle-app-base/src/main/java/org/apache/eagle/app/service/ApplicationManagementService.java b/eagle-core/eagle-app/eagle-app-base/src/main/java/org/apache/eagle/app/service/ApplicationManagementService.java
index 30ae0b9..82c441a 100644
--- a/eagle-core/eagle-app/eagle-app-base/src/main/java/org/apache/eagle/app/service/ApplicationManagementService.java
+++ b/eagle-core/eagle-app/eagle-app-base/src/main/java/org/apache/eagle/app/service/ApplicationManagementService.java
@@ -16,6 +16,7 @@
  */
 package org.apache.eagle.app.service;
 
+import org.apache.eagle.metadata.exceptions.EntityNotFoundException;
 import org.apache.eagle.metadata.model.ApplicationEntity;
 
 public interface ApplicationManagementService {
@@ -24,7 +25,7 @@ public interface ApplicationManagementService {
      * @param operation
      * @return
      */
-    ApplicationEntity install(ApplicationOperations.InstallOperation operation);
+    ApplicationEntity install(ApplicationOperations.InstallOperation operation) throws EntityNotFoundException;
 
     /**
      *

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/0feba43d/eagle-core/eagle-app/eagle-app-base/src/main/java/org/apache/eagle/app/service/impl/ApplicationManagementServiceImpl.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-app/eagle-app-base/src/main/java/org/apache/eagle/app/service/impl/ApplicationManagementServiceImpl.java b/eagle-core/eagle-app/eagle-app-base/src/main/java/org/apache/eagle/app/service/impl/ApplicationManagementServiceImpl.java
index 9e34459..f681b6d 100644
--- a/eagle-core/eagle-app/eagle-app-base/src/main/java/org/apache/eagle/app/service/impl/ApplicationManagementServiceImpl.java
+++ b/eagle-core/eagle-app/eagle-app-base/src/main/java/org/apache/eagle/app/service/impl/ApplicationManagementServiceImpl.java
@@ -24,6 +24,7 @@ import org.apache.eagle.app.ApplicationContext;
 import org.apache.eagle.app.service.ApplicationOperations;
 import org.apache.eagle.app.service.ApplicationManagementService;
 import org.apache.eagle.app.service.ApplicationProviderService;
+import org.apache.eagle.metadata.exceptions.EntityNotFoundException;
 import org.apache.eagle.metadata.model.ApplicationDesc;
 import org.apache.eagle.metadata.model.ApplicationEntity;
 import org.apache.eagle.metadata.model.SiteEntity;
@@ -52,7 +53,7 @@ public class ApplicationManagementServiceImpl implements ApplicationManagementSe
         this.applicationEntityService = applicationEntityService;
     }
 
-    public ApplicationEntity install(ApplicationOperations.InstallOperation operation) {
+    public ApplicationEntity install(ApplicationOperations.InstallOperation operation) throws EntityNotFoundException {
         Preconditions.checkNotNull(operation.getSiteId(),"siteId is null");
         Preconditions.checkNotNull(operation.getAppType(),"appType is null");
         SiteEntity siteEntity = siteEntityService.getBySiteId(operation.getSiteId());

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/0feba43d/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/exceptions/ApplicationNotFoundException.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/exceptions/ApplicationNotFoundException.java b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/exceptions/ApplicationNotFoundException.java
new file mode 100644
index 0000000..2b986c4
--- /dev/null
+++ b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/exceptions/ApplicationNotFoundException.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.eagle.metadata.exceptions;
+
+public class ApplicationNotFoundException extends Exception {
+    public ApplicationNotFoundException(String message) {
+        super(message);
+    }
+
+    public ApplicationNotFoundException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public ApplicationNotFoundException(Throwable cause) {
+        super(cause);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/0feba43d/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/exceptions/EntityNotFoundException.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/exceptions/EntityNotFoundException.java b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/exceptions/EntityNotFoundException.java
new file mode 100644
index 0000000..990d77c
--- /dev/null
+++ b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/exceptions/EntityNotFoundException.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.eagle.metadata.exceptions;
+
+public class EntityNotFoundException extends Exception{
+    public EntityNotFoundException(Throwable cause) {
+        super(cause);
+    }
+
+    public EntityNotFoundException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public EntityNotFoundException(String message) {
+        super(message);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/0feba43d/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/exceptions/IllegalApplicationTypeException.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/exceptions/IllegalApplicationTypeException.java b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/exceptions/IllegalApplicationTypeException.java
new file mode 100644
index 0000000..b9efb58
--- /dev/null
+++ b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/exceptions/IllegalApplicationTypeException.java
@@ -0,0 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.eagle.metadata.exceptions;
+
+public class IllegalApplicationTypeException {
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/0feba43d/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/persistence/PersistenceService.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/persistence/PersistenceService.java b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/persistence/PersistenceService.java
index d525936..bde8298 100644
--- a/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/persistence/PersistenceService.java
+++ b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/persistence/PersistenceService.java
@@ -16,10 +16,12 @@
  */
 package org.apache.eagle.metadata.persistence;
 
+import org.apache.eagle.metadata.exceptions.EntityNotFoundException;
+
 import java.util.Collection;
 
 public interface PersistenceService<T extends PersistenceEntity> {
     Collection<T> findAll();
-    T getByUUID(String uuid);
+    T getByUUID(String uuid) throws EntityNotFoundException;
     T create(T entity);
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/0feba43d/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/resource/RESTResponse.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/resource/RESTResponse.java b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/resource/RESTResponse.java
index 4431c8c..1c9d112 100644
--- a/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/resource/RESTResponse.java
+++ b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/resource/RESTResponse.java
@@ -22,6 +22,7 @@ import org.apache.commons.lang3.exception.ExceptionUtils;
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.Response;
 import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
 
@@ -32,6 +33,17 @@ public class RESTResponse<T>{
     private String exception;
     private T data;
 
+    public RESTResponse(){}
+
+    public RESTResponse(Throwable throwable){
+        if(throwable.getMessage() == null || throwable.getMessage().isEmpty()) {
+            this.setMessage(throwable.getMessage());
+        }else{
+            this.setMessage(ExceptionUtils.getMessage(throwable));
+        }
+        this.setException(ExceptionUtils.getStackTrace(throwable));
+    }
+
     public T getData() {
         return data;
     }
@@ -96,6 +108,7 @@ public class RESTResponse<T>{
     public static class RestResponseBuilder<E>{
         private RESTResponse current = new RESTResponse();
         private Response.Status status = Response.Status.OK;
+        private CompletableFuture future = null;
 
         public RestResponseBuilder<E> success(boolean success){
             this.current.setSuccess(success);
@@ -119,6 +132,13 @@ public class RESTResponse<T>{
 
         public RestResponseBuilder<E> exception(Throwable exception){
             this.current.setThrowable(exception);
+            if(this.current.getMessage() == null){
+                if(exception.getMessage() ==null || exception.getMessage().isEmpty()){
+                    this.current.setMessage(ExceptionUtils.getMessage(exception));
+                }else{
+                    this.current.setMessage(exception.getMessage());
+                }
+            }
             return this;
         }
 
@@ -127,7 +147,7 @@ public class RESTResponse<T>{
                 this.success(true).status(Response.Status.OK);
                 func.accept(this);
             } catch (Exception ex){
-                this.success(false).data(null).status(Response.Status.INTERNAL_SERVER_ERROR).message(ex.getMessage());
+                this.success(false).data(null).status(Response.Status.BAD_REQUEST).exception(ex);
                 raiseWebAppException(ex);
             }
             return this;
@@ -137,7 +157,7 @@ public class RESTResponse<T>{
             try {
                 this.success(true).status(Response.Status.OK).data(func.get());
             } catch (Throwable ex){
-                this.success(false).status(Response.Status.INTERNAL_SERVER_ERROR).message(ex.getMessage());
+                this.success(false).status(Response.Status.BAD_REQUEST).exception(ex);
                 raiseWebAppException(ex);
             }
             return this;
@@ -148,7 +168,7 @@ public class RESTResponse<T>{
                 try {
                     this.status(Response.Status.OK).success(true).data(func.get());
                 } catch (Throwable e) {
-                    this.success(false).status(Response.Status.INTERNAL_SERVER_ERROR).message(e.getMessage()).exception(e);
+                    this.success(false).status(Response.Status.BAD_REQUEST).exception(e);
                     raiseWebAppException(e);
                 }
             });
@@ -162,9 +182,10 @@ public class RESTResponse<T>{
             } catch (InterruptedException ex) {
                 Thread.currentThread().interrupt();
                 future.cancel(true);
-                this.success(false).status(Response.Status.INTERNAL_SERVER_ERROR).message(ex.getMessage()).exception(ex);
-            } catch (Throwable ex) {
-                this.success(false).status(Response.Status.INTERNAL_SERVER_ERROR).message(ex.getMessage()).exception(ex);
+                this.success(false).status(Response.Status.BAD_REQUEST).exception(ex.getCause());
+                raiseWebAppException(ex);
+            } catch (ExecutionException ex) {
+                this.success(false).status(Response.Status.BAD_REQUEST).exception(ex.getCause());
                 raiseWebAppException(ex);
             }
         }
@@ -179,7 +200,7 @@ public class RESTResponse<T>{
                     func.accept(this);
                     this.success(true);
                 } catch (Throwable ex) {
-                    this.success(false).status(Response.Status.INTERNAL_SERVER_ERROR).message(ex.getMessage()).exception(ex);
+                    this.success(false).status(Response.Status.BAD_REQUEST).exception(ex);
                     raiseWebAppException(ex);
                 }
             });
@@ -191,7 +212,7 @@ public class RESTResponse<T>{
             try {
                 func.accept(this);
             } catch (Throwable ex) {
-                this.success(false).status(Response.Status.INTERNAL_SERVER_ERROR).message(ex.getMessage()).exception(ex);
+                this.success(false).status(Response.Status.BAD_REQUEST).exception(ex);
                 raiseWebAppException(ex);
             }
             return this;

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/0feba43d/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/resource/SiteResource.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/resource/SiteResource.java b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/resource/SiteResource.java
index ec683b7..972cda1 100644
--- a/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/resource/SiteResource.java
+++ b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/resource/SiteResource.java
@@ -25,8 +25,6 @@ import javax.ws.rs.*;
 import javax.ws.rs.core.MediaType;
 import java.util.Collection;
 
-import static org.apache.eagle.metadata.resource.RESTResponse.async;
-
 @Path("/sites")
 @Singleton
 public class SiteResource {
@@ -57,9 +55,27 @@ public class SiteResource {
     }
 
     @GET
-    @Path("/{siteIdOrUUID}")
+    @Path("/{siteId}")
     @Produces(MediaType.APPLICATION_JSON)
-    public RESTResponse<SiteEntity> getSiteByNameOrUUID(@PathParam("siteIdOrUUID") String siteIdOrUUID){
-        return RESTResponse.async(()->siteEntityService.getBySiteIdOrUUID(siteIdOrUUID)).get();
+    public RESTResponse<SiteEntity> getSiteBySiteId(@PathParam("siteId") String siteId){
+        return RESTResponse.async(()->siteEntityService.getBySiteId(siteId)).get();
+    }
+
+    @DELETE
+    @Path("/{siteId}")
+    @Produces(MediaType.APPLICATION_JSON)
+    public RESTResponse<SiteEntity> deleteSiteBySiteId(@PathParam("siteId") String siteId){
+        return RESTResponse.async(()->siteEntityService.deleteBySiteId(siteId)).get();
+    }
+
+    @PUT
+    @Path("/{siteId}")
+    @Produces(MediaType.APPLICATION_JSON)
+    @Consumes(MediaType.APPLICATION_JSON)
+    public RESTResponse<SiteEntity> updateSite(@PathParam("siteId") String siteId,SiteEntity siteEntity){
+        return RESTResponse.async(()-> {
+            siteEntity.setSiteId(siteId);
+            return siteEntityService.update(siteEntity);
+        }).get();
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/0feba43d/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/service/SiteEntityService.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/service/SiteEntityService.java b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/service/SiteEntityService.java
index 2f5254d..acea982 100644
--- a/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/service/SiteEntityService.java
+++ b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/service/SiteEntityService.java
@@ -16,10 +16,12 @@
  */
 package org.apache.eagle.metadata.service;
 
+import org.apache.eagle.metadata.exceptions.EntityNotFoundException;
 import org.apache.eagle.metadata.model.SiteEntity;
 import org.apache.eagle.metadata.persistence.PersistenceService;
 
 public interface SiteEntityService extends PersistenceService<SiteEntity>{
-    SiteEntity getBySiteId(String siteId);
-    SiteEntity getBySiteIdOrUUID(String siteIdOrUUID);
+    SiteEntity getBySiteId(String siteId) throws EntityNotFoundException;
+    SiteEntity deleteBySiteId(String siteId) throws EntityNotFoundException;
+    SiteEntity update(SiteEntity siteEntity) throws EntityNotFoundException;
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/0feba43d/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/service/memory/SiteEntityEntityServiceMemoryImpl.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/service/memory/SiteEntityEntityServiceMemoryImpl.java b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/service/memory/SiteEntityEntityServiceMemoryImpl.java
index 8e27c53..f2a6f60 100644
--- a/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/service/memory/SiteEntityEntityServiceMemoryImpl.java
+++ b/eagle-core/eagle-metadata/eagle-metadata-base/src/main/java/org/apache/eagle/metadata/service/memory/SiteEntityEntityServiceMemoryImpl.java
@@ -16,49 +16,71 @@
  */
 package org.apache.eagle.metadata.service.memory;
 
+import com.google.common.base.Preconditions;
 import com.google.inject.Singleton;
+import org.apache.eagle.metadata.exceptions.EntityNotFoundException;
 import org.apache.eagle.metadata.model.SiteEntity;
 import org.apache.eagle.metadata.service.SiteEntityService;
 
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Optional;
 
 @Singleton
 public class SiteEntityEntityServiceMemoryImpl implements SiteEntityService {
-    private Map<String,SiteEntity> nameSiteMap = new HashMap<>();
+    private Map<String,SiteEntity> siteId2EntityMap = new HashMap<>();
 
     @Override
     public Collection<SiteEntity> findAll() {
-        return nameSiteMap.values();
+        return siteId2EntityMap.values();
     }
 
     @Override
-    public SiteEntity getByUUID(String uuid) {
-        return nameSiteMap.values().stream().filter((site) -> uuid.equals(site.getUuid())).findAny().get();
+    public SiteEntity getByUUID(String uuid) throws EntityNotFoundException {
+        Optional<SiteEntity> entityOptional = siteId2EntityMap.values().stream().filter((site) -> uuid.equals(site.getUuid())).findAny();
+        if(entityOptional.isPresent()){
+            return entityOptional.get();
+        }else{
+            throw new EntityNotFoundException("Site with UUID: "+uuid+" not found");
+        }
     }
 
     @Override
     public SiteEntity create(SiteEntity entity) {
-        if(getBySiteId(entity.getSiteId()) != null){
-            throw new IllegalArgumentException("Duplicated site: "+entity);
+        Preconditions.checkNotNull(entity.getSiteId(),"SiteId is null: "+entity.getSiteId());
+        if(siteId2EntityMap.containsKey(entity.getSiteId())){
+            throw new IllegalArgumentException("Duplicated siteId: "+entity.getSiteId());
         }
         entity.ensureDefault();
-        nameSiteMap.put(entity.getSiteId(),entity);
+        siteId2EntityMap.put(entity.getSiteId(),entity);
         return entity;
     }
 
     @Override
-    public SiteEntity getBySiteId(String siteName) {
-        return nameSiteMap.get(siteName);
+    public SiteEntity getBySiteId(String siteId) throws EntityNotFoundException {
+        if(!siteId2EntityMap.containsKey(siteId)){
+            throw new EntityNotFoundException("Site with siteId: "+siteId+" not exists");
+        }
+        return siteId2EntityMap.get(siteId);
+    }
+
+
+    @Override
+    public SiteEntity deleteBySiteId(String siteId) throws EntityNotFoundException {
+        return siteId2EntityMap.remove(getBySiteId(siteId).getSiteId());
     }
 
     @Override
-    public SiteEntity getBySiteIdOrUUID(String siteNameOrUUID) {
-        if(nameSiteMap.containsKey(siteNameOrUUID)){
-            return nameSiteMap.get(siteNameOrUUID);
-        } else {
-            return getByUUID(siteNameOrUUID);
+    public SiteEntity update(SiteEntity siteEntity) throws EntityNotFoundException {
+        if(siteEntity.getSiteId() == null && siteEntity.getUuid() == null){
+            throw new IllegalArgumentException("siteId and UUID are both null, don't know how to update");
         }
+        SiteEntity oldEntity = (siteEntity.getSiteId()!=null)? getBySiteId(siteEntity.getSiteId()) : getByUUID(siteEntity.getUuid());
+        siteEntity.setUuid(oldEntity.getUuid());
+        siteEntity.setCreatedTime(oldEntity.getCreatedTime());
+        siteEntity.ensureDefault();
+        siteId2EntityMap.put(siteEntity.getSiteId(),siteEntity);
+        return siteEntity;
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/0feba43d/eagle-server/src/main/java/org/apache/eagle/server/RESTExceptionMapper.java
----------------------------------------------------------------------
diff --git a/eagle-server/src/main/java/org/apache/eagle/server/RESTExceptionMapper.java b/eagle-server/src/main/java/org/apache/eagle/server/RESTExceptionMapper.java
index 2d257a4..ba7963f 100644
--- a/eagle-server/src/main/java/org/apache/eagle/server/RESTExceptionMapper.java
+++ b/eagle-server/src/main/java/org/apache/eagle/server/RESTExceptionMapper.java
@@ -18,6 +18,7 @@ package org.apache.eagle.server;
 
 import io.dropwizard.jersey.errors.LoggingExceptionMapper;
 import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.apache.eagle.metadata.resource.RESTResponse;
 
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.MediaType;
@@ -32,31 +33,6 @@ public class RESTExceptionMapper extends LoggingExceptionMapper<Throwable> {
         }
         final long id = ThreadLocalRandom.current().nextLong();
         logException(id, throwable);
-       return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(new ExceptionResponseEntity(throwable)).type(MediaType.APPLICATION_JSON_TYPE).build();
-    }
-
-    public static class ExceptionResponseEntity {
-        public ExceptionResponseEntity(Throwable throwable){
-            this.setMessage(ExceptionUtils.getMessage(throwable));
-            this.setException(ExceptionUtils.getStackTrace(throwable));
-        }
-        private String message;
-        private String exception;
-
-        public String getException() {
-            return exception;
-        }
-
-        public void setException(String exception) {
-            this.exception = exception;
-        }
-
-        public String getMessage() {
-            return message;
-        }
-
-        public void setMessage(String message) {
-            this.message = message;
-        }
+       return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(new RESTResponse<>(throwable)).type(MediaType.APPLICATION_JSON_TYPE).build();
     }
 }
\ No newline at end of file