jackson, HTTP codes and JSON responses, xICIC/RRMConfig fix
diff --git a/src/main/java/org.onosproject.xran/rest/CellWebResource.java b/src/main/java/org.onosproject.xran/rest/CellWebResource.java
index 25825a9..ac2806d 100644
--- a/src/main/java/org.onosproject.xran/rest/CellWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/CellWebResource.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.xran.rest;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.commons.lang.exception.ExceptionUtils;
@@ -23,6 +24,7 @@
 import org.onosproject.xran.annotations.Patch;
 import org.onosproject.xran.controller.XranController;
 import org.onosproject.xran.entities.RnibCell;
+import org.onosproject.xran.rest.ResponseHelper.statusCode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -33,7 +35,6 @@
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import java.io.IOException;
 import java.io.InputStream;
 import java.util.concurrent.SynchronousQueue;
 import java.util.concurrent.TimeUnit;
@@ -47,6 +48,9 @@
     private static final Logger log =
             LoggerFactory.getLogger(CellWebResource.class);
 
+    public CellWebResource() {
+    }
+
     /**
      * test.
      *
@@ -61,20 +65,34 @@
 
         if (cell != null) {
             try {
-                ObjectNode rootNode = mapper().createObjectNode();
+                JsonNode jsonNode = mapper().valueToTree(cell);
 
-                JsonNode jsonNode = mapper().readTree(cell.toString());
-                rootNode.put("cell", jsonNode);
-            } catch (IOException e) {
-                log.error(ExceptionUtils.getFullStackTrace(e));
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        statusCode.OK,
+                        jsonNode
+                );
+
+            } catch (Exception e) {
+                String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+                log.error(fullStackTrace);
                 e.printStackTrace();
-                return Response.serverError()
-                        .entity(ExceptionUtils.getFullStackTrace(e))
-                        .build();
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        statusCode.INTERNAL_SERVER_ERROR,
+                        "Exception",
+                        fullStackTrace
+                );
             }
         }
 
-        return Response.serverError().entity("cell not found").build();
+        return ResponseHelper.getResponse(
+                mapper(),
+                statusCode.NOT_FOUND,
+                "Not Found",
+                "Cell with " + eciHex + " was not found"
+        );
     }
 
     /**
@@ -87,6 +105,7 @@
     @Patch
     @Path("{cellid}")
     @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
     public Response patchCell(@PathParam("cellid") String eciHex, InputStream stream) {
         RnibCell cell = get(XranStore.class).getCell(eciHex);
 
@@ -104,27 +123,41 @@
                     String poll = queue[0].poll(5, TimeUnit.SECONDS);
 
                     if (poll != null) {
-                        return Response.ok()
-                                .entity(poll)
-                                .build();
+                        return ResponseHelper.getResponse(
+                                mapper(),
+                                statusCode.OK,
+                                "Handoff Response",
+                                poll
+                        );
                     } else {
-                        return Response.serverError()
-                                .entity("did not receive response in time")
-                                .build();
+                        return ResponseHelper.getResponse(
+                                mapper(),
+                                statusCode.REQUEST_TIMEOUT,
+                                "Handoff Timeout",
+                                "eNodeB did not send a HOComplete/HOFailure on time"
+                        );
                     }
                 }
             } catch (Exception e) {
-                log.error(ExceptionUtils.getFullStackTrace(e));
+                String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+                log.error(fullStackTrace);
                 e.printStackTrace();
-                return Response.serverError()
-                        .entity(ExceptionUtils.getFullStackTrace(e))
-                        .build();
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        statusCode.INTERNAL_SERVER_ERROR,
+                        "Exception",
+                        fullStackTrace
+                );
             }
         }
 
-        return Response.serverError()
-                .entity("cell not found")
-                .build();
+        return ResponseHelper.getResponse(
+                mapper(),
+                statusCode.NOT_FOUND,
+                "Not Found",
+                "Cell " + eciHex + " was not found"
+        );
     }
 
 }
diff --git a/src/main/java/org.onosproject.xran/rest/LinkWebResource.java b/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
index 8a85941..4d8dc11 100644
--- a/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.xran.rest;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.Lists;
@@ -26,14 +27,20 @@
 import org.onosproject.xran.entities.RnibCell;
 import org.onosproject.xran.entities.RnibLink;
 import org.onosproject.xran.entities.RnibUe;
-import org.openmuc.jasn1.ber.types.BerInteger;
+import org.onosproject.xran.codecs.ber.types.BerInteger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.ws.rs.*;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import java.io.IOException;
 import java.io.InputStream;
 import java.util.List;
 import java.util.Optional;
@@ -49,6 +56,10 @@
     private static final Logger log =
             LoggerFactory.getLogger(LinkWebResource.class);
 
+    public LinkWebResource() {
+
+    }
+
     /**
      * test.
      *
@@ -74,18 +85,35 @@
             list.addAll(get(XranStore.class).getLinks());
         }
 
-        try {
-            ObjectNode rootNode = mapper().createObjectNode();
-            JsonNode jsonNode = mapper().readTree(list.toString());
-            rootNode.put("links", jsonNode);
-            return Response.ok(rootNode.toString()).build();
-        } catch (IOException e) {
-            log.error(ExceptionUtils.getFullStackTrace(e));
-            e.printStackTrace();
-            return Response.serverError()
-                    .entity(ExceptionUtils.getFullStackTrace(e))
-                    .build();
+        if (list.size() > 0) {
+            try {
+                JsonNode jsonNode = mapper().valueToTree(list);
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        ResponseHelper.statusCode.OK,
+                        jsonNode
+                );
+            } catch (Exception e) {
+                String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+                log.error(fullStackTrace);
+                e.printStackTrace();
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                        "Exception",
+                        fullStackTrace
+                );
+            }
         }
+
+        return ResponseHelper.getResponse(
+                mapper(),
+                ResponseHelper.statusCode.NOT_FOUND,
+                "Not Found",
+                "Specified links not found"
+        );
     }
 
     /**
@@ -99,6 +127,7 @@
     @Patch
     @Path("{src},{dst}")
     @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
     public Response patchLinks(@PathParam("src") String src, @PathParam("dst") long dst, InputStream stream) {
         RnibLink link = get(XranStore.class).getLinkBetweenCellIdUeId(src, dst);
         if (link != null) {
@@ -122,12 +151,25 @@
                 }
 
             } catch (Exception e) {
-                log.error(ExceptionUtils.getFullStackTrace(e));
+                String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+                log.error(fullStackTrace);
                 e.printStackTrace();
-                return Response.serverError().entity(ExceptionUtils.getFullStackTrace(e)).build();
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                        "Exception",
+                        fullStackTrace
+                );
             }
         }
-        return Response.serverError().entity("link not found use POST request").build();
+
+        return ResponseHelper.getResponse(
+                mapper(),
+                ResponseHelper.statusCode.NOT_FOUND,
+                "Not Found",
+                "Link not found use POST request"
+        );
     }
 
     /**
@@ -141,26 +183,36 @@
     @POST
     @Path("{src},{dst}")
     @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
     public Response postLinks(@PathParam("src") String src, @PathParam("dst") long dst, InputStream stream) {
         RnibCell cell = get(XranStore.class).getCell(src);
         RnibUe ue = get(XranStore.class).getUe(dst);
 
         if (cell == null) {
-            return Response.serverError()
-                    .entity("cell not found")
-                    .build();
+            return ResponseHelper.getResponse(
+                    mapper(),
+                    ResponseHelper.statusCode.NOT_FOUND,
+                    "Not Found",
+                    "Cell " + src + " was not found"
+            );
         }
 
         if (ue == null) {
-            return Response.serverError()
-                    .entity("ue not found")
-                    .build();
+            return ResponseHelper.getResponse(
+                    mapper(),
+                    ResponseHelper.statusCode.NOT_FOUND,
+                    "Not Found",
+                    "Ue with " + dst + " was not found"
+            );
         }
 
         if (get(XranStore.class).getLink(cell.getEcgi(), ue.getMmeS1apId()) != null) {
-            return Response.serverError()
-                    .entity("link exists use PATCH request")
-                    .build();
+            return ResponseHelper.getResponse(
+                    mapper(),
+                    ResponseHelper.statusCode.BAD_REQUEST,
+                    "Bad Request",
+                    "Link already exists use PATCH to modify"
+            );
         }
 
         try {
@@ -186,16 +238,24 @@
             }
 
         } catch (Exception e) {
-            log.error(ExceptionUtils.getFullStackTrace(e));
+            String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+            log.error(fullStackTrace);
             e.printStackTrace();
-            return Response.serverError()
-                    .entity(ExceptionUtils.getFullStackTrace(e))
-                    .build();
+
+            return ResponseHelper.getResponse(
+                    mapper(),
+                    ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                    "Exception",
+                    fullStackTrace
+            );
         }
 
-        return Response.serverError()
-                .entity("unreachable code")
-                .build();
+        return ResponseHelper.getResponse(
+                mapper(),
+                ResponseHelper.statusCode.NOT_IMPLEMENTED,
+                "Not Implemented",
+                "This request is not implemented"
+        );
     }
 
     private Response handleTypeChange(RnibLink link, RnibLink.Type newType) throws InterruptedException {
@@ -204,9 +264,12 @@
         if (newType.equals(RnibLink.Type.SERVING_PRIMARY)) {
             switch (link.getType()) {
                 case SERVING_PRIMARY: {
-                    return Response.serverError()
-                            .entity("link already a primary")
-                            .build();
+                    return ResponseHelper.getResponse(
+                            mapper(),
+                            ResponseHelper.statusCode.BAD_REQUEST,
+                            "Bad Request",
+                            "Link is already a primary link"
+                    );
                 }
                 case SERVING_SECONDARY_CA:
                 case SERVING_SECONDARY_DC:
@@ -221,73 +284,109 @@
                         String poll = queue[0].poll(5, TimeUnit.SECONDS);
 
                         if (poll != null) {
-                            return Response.ok()
-                                    .entity(poll)
-                                    .build();
+                            return ResponseHelper.getResponse(
+                                    mapper(),
+                                    ResponseHelper.statusCode.OK,
+                                    "Handoff Response",
+                                    poll
+                            );
                         } else {
-                            return Response.serverError()
-                                    .entity("did not receive response in time")
-                                    .build();
+                            return ResponseHelper.getResponse(
+                                    mapper(),
+                                    ResponseHelper.statusCode.REQUEST_TIMEOUT,
+                                    "Handoff Timeout",
+                                    "eNodeB did not send a HOComplete/HOFailure on time"
+                            );
                         }
                     } else {
                         link.setType(RnibLink.Type.SERVING_PRIMARY);
-                        return Response.ok()
-                                .entity("there was not another primary link")
-                                .build();
+                        return ResponseHelper.getResponse(
+                                mapper(),
+                                ResponseHelper.statusCode.OK,
+                                "OK",
+                                "Link set to primary"
+                        );
                     }
                 }
             }
         } else if (newType.equals(RnibLink.Type.NON_SERVING)) {
             switch (link.getType()) {
                 case NON_SERVING:
-                    return Response.ok()
-                            .entity("It's already a non serving link!" + link)
-                            .build();
+                    return ResponseHelper.getResponse(
+                            mapper(),
+                            ResponseHelper.statusCode.BAD_REQUEST,
+                            "Bad Request",
+                            "Link is already a primary link"
+                    );
                 case SERVING_PRIMARY:
-                    return Response.serverError()
-                            .entity("Cannot change a Primary link.")
-                            .build();
+                    return ResponseHelper.getResponse(
+                            mapper(),
+                            ResponseHelper.statusCode.BAD_REQUEST,
+                            "Bad Request",
+                            "Cannot modify a primary link"
+                    );
                 case SERVING_SECONDARY_CA:
                 case SERVING_SECONDARY_DC:
                     if (get(XranController.class).sendScellDelete(link)) {
-                        return Response.ok()
-                                .entity("Successfully changed link type to " + link.getType())
-                                .build();
+                        return ResponseHelper.getResponse(
+                                mapper(),
+                                ResponseHelper.statusCode.OK,
+                                "OK",
+                                "Link set to non-serving"
+                        );
                     } else {
-                        return Response.serverError()
-                                .entity("Could not change link type.")
-                                .build();
+                        return ResponseHelper.getResponse(
+                                mapper(),
+                                ResponseHelper.statusCode.NOT_FOUND,
+                                "Not Found",
+                                "Could not find cell config report to construct Scell Delete"
+                        );
                     }
             }
         } else if (newType.equals(RnibLink.Type.SERVING_SECONDARY_CA)) {
             switch (link.getType()) {
                 case SERVING_PRIMARY:
-                    return Response.serverError()
-                            .entity("Cannot change a Primary link.")
-                            .build();
+                    return ResponseHelper.getResponse(
+                            mapper(),
+                            ResponseHelper.statusCode.BAD_REQUEST,
+                            "Bad Request",
+                            "Cannot modify a primary link"
+                    );
                 case SERVING_SECONDARY_DC:
                 case NON_SERVING:
                     queue[0] = get(XranController.class).sendScellAdd(link);
                     String poll = queue[0].poll(5, TimeUnit.SECONDS);
                     if (poll != null) {
-                        return Response.ok()
-                                .entity("Successfully changed link type to " + link.getType())
-                                .build();
+                        return ResponseHelper.getResponse(
+                                mapper(),
+                                ResponseHelper.statusCode.OK,
+                                "ScellAdd Response",
+                                poll
+                        );
                     } else {
-                        return Response.serverError()
-                                .entity("did not receive response in time")
-                                .build();
+                        return ResponseHelper.getResponse(
+                                mapper(),
+                                ResponseHelper.statusCode.REQUEST_TIMEOUT,
+                                "ScellAdd Timeout",
+                                "eNodeB did not send a ScellAddStatus on time"
+                        );
                     }
                 case SERVING_SECONDARY_CA:
-                    return Response.ok()
-                            .entity("It's already a service secondary ca link!")
-                            .build();
+                    return ResponseHelper.getResponse(
+                            mapper(),
+                            ResponseHelper.statusCode.BAD_REQUEST,
+                            "Bad Request",
+                            "Link is already a secondary CA link"
+                    );
             }
         }
 
-        return Response.serverError()
-                .entity("Unknown type")
-                .build();
+        return ResponseHelper.getResponse(
+                mapper(),
+                ResponseHelper.statusCode.NOT_IMPLEMENTED,
+                "Not Implemented",
+                "This request is not implemented"
+        );
     }
 
     private Response handleTrafficChange(RnibLink link, JsonNode trafficpercent) {
@@ -301,7 +400,12 @@
             link.getTrafficPercent().setTrafficPercentUl(new BerInteger(jsonNode.asInt()));
         }
 
-        return Response.ok("trafficpercent changed successfully").build();
+        return ResponseHelper.getResponse(
+                mapper(),
+                ResponseHelper.statusCode.OK,
+                "OK",
+                "Traffic Percent changed"
+        );
     }
 
     private Response handleRRMChange(RnibLink link, JsonNode rrmConf) throws InterruptedException {
@@ -312,13 +416,19 @@
         String poll = queue[0].poll(5, TimeUnit.SECONDS);
 
         if (poll != null) {
-            return Response.ok()
-                    .entity(poll)
-                    .build();
+            return ResponseHelper.getResponse(
+                    mapper(),
+                    ResponseHelper.statusCode.OK,
+                    "RRMConfig Response",
+                    poll
+            );
         } else {
-            return Response.serverError()
-                    .entity("did not receive response in time")
-                    .build();
+            return ResponseHelper.getResponse(
+                    mapper(),
+                    ResponseHelper.statusCode.REQUEST_TIMEOUT,
+                    "RRMConfig Timeout",
+                    "eNodeB did not send a RRMConfingStatus on time"
+            );
         }
     }
 }
diff --git a/src/main/java/org.onosproject.xran/rest/NodeWebResource.java b/src/main/java/org.onosproject.xran/rest/NodeWebResource.java
index 7b54177..2b9124c 100644
--- a/src/main/java/org.onosproject.xran/rest/NodeWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/NodeWebResource.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.xran.rest;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.Lists;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.onosproject.rest.AbstractWebResource;
@@ -34,7 +35,6 @@
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import java.io.IOException;
 import java.util.List;
 
 /**
@@ -46,6 +46,10 @@
     private static final Logger log =
             LoggerFactory.getLogger(NodeWebResource.class);
 
+    public NodeWebResource() {
+
+    }
+
     /**
      * test.
      *
@@ -55,40 +59,52 @@
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     public Response getNodes(@DefaultValue("") @QueryParam("type") String type) {
-        ObjectNode rootNode = mapper().createObjectNode();
-
+        JsonNode jsonNode;
         try {
+            List<Object> nodes;
             if (StringUtils.isBlank(type)) {
-                List<Object> nodes = get(XranStore.class).getNodes();
-
-                JsonNode jsonNode = mapper().readTree(nodes.get(0).toString());
-                JsonNode jsonNode2 = mapper().readTree(nodes.get(1).toString());
-
-                ObjectNode arrayNode = rootNode.putObject("nodes");
-                arrayNode.put("cells", jsonNode);
-                arrayNode.put("ues", jsonNode2);
+                nodes = get(XranStore.class).getNodes();
             } else if (type.equals("cell")) {
-                List<RnibCell> cellNodes = get(XranStore.class).getCellNodes();
-                JsonNode jsonNode = mapper().readTree(cellNodes.toString());
-
-                ObjectNode arrayNode = rootNode.putObject("nodes");
-                arrayNode.put("cells", jsonNode);
+                nodes = get(XranStore.class).getCellNodes();
             } else if (type.equals("ue")) {
-                List<RnibUe> ueNodes = get(XranStore.class).getUeNodes();
-                JsonNode jsonNode = mapper().readTree(ueNodes.toString());
-
-                ObjectNode arrayNode = rootNode.putObject("nodes");
-                arrayNode.put("ues", jsonNode);
+                nodes = get(XranStore.class).getUeNodes();
+            } else {
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        ResponseHelper.statusCode.NOT_FOUND,
+                        "Not Found",
+                        "Type of node was not found"
+                );
             }
-        } catch (IOException e) {
-            log.error(ExceptionUtils.getFullStackTrace(e));
+
+            if (nodes.size() == 0) {
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        ResponseHelper.statusCode.NOT_FOUND,
+                        "Not Found",
+                        "No nodes found"
+                );
+            }
+
+            jsonNode = mapper().valueToTree(nodes);
+        } catch (Exception e) {
+            String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+            log.error(fullStackTrace);
             e.printStackTrace();
-            return Response.serverError()
-                    .entity(ExceptionUtils.getFullStackTrace(e))
-                    .build();
+
+            return ResponseHelper.getResponse(
+                    mapper(),
+                    ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                    "Exception",
+                    fullStackTrace
+            );
         }
 
-        return ok(rootNode.toString()).build();
+        return ResponseHelper.getResponse(
+                mapper(),
+                ResponseHelper.statusCode.OK,
+                jsonNode
+        );
     }
 
     /**
@@ -105,20 +121,33 @@
 
         if (node != null) {
             try {
-                ObjectNode rootNode = mapper().createObjectNode();
-                JsonNode jsonNode = mapper().readTree(node.toString());
-                rootNode.put("node", jsonNode);
-                return ok(rootNode.toString()).build();
-            } catch (IOException e) {
-                log.error(ExceptionUtils.getFullStackTrace(e));
+                JsonNode jsonNode = mapper().valueToTree(node);
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        ResponseHelper.statusCode.OK,
+                        jsonNode
+                );
+            } catch (Exception e) {
+                String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+                log.error(fullStackTrace);
                 e.printStackTrace();
-                return Response.serverError()
-                        .entity(ExceptionUtils.getFullStackTrace(e))
-                        .build();
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                        "Exception",
+                        fullStackTrace
+                );
             }
         }
 
-        return Response.serverError().entity("node not found").build();
+        return ResponseHelper.getResponse(
+                mapper(),
+                ResponseHelper.statusCode.NOT_FOUND,
+                "Not Found",
+                "Node " + nodeid + " was not found"
+        );
     }
 
 }
diff --git a/src/main/java/org.onosproject.xran/rest/ResponseHelper.java b/src/main/java/org.onosproject.xran/rest/ResponseHelper.java
new file mode 100644
index 0000000..826adc1
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/rest/ResponseHelper.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2015-present Open Networking Foundation
+ *
+ * Licensed 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
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.onosproject.xran.rest;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import javax.ws.rs.core.Response;
+
+public class ResponseHelper {
+
+    public static Response getResponse(ObjectMapper mapper, statusCode status, String title, String detail) {
+        ObjectNode rootNode = mapper.createObjectNode();
+
+        switch (status) {
+            case OK:
+            case BAD_REQUEST:
+            case NOT_IMPLEMENTED:
+            case REQUEST_TIMEOUT:
+            case INTERNAL_SERVER_ERROR:
+            case NOT_FOUND: {
+                ArrayNode errors = rootNode.putArray("errors");
+                ObjectNode addObject = errors.addObject();
+                addObject.put("status", status.status);
+                addObject.put("title", title);
+                addObject.put("detail", detail);
+                return Response.status(status.status)
+                        .entity(rootNode.toString())
+                        .build();
+            }
+            default:
+                return Response.noContent().build();
+        }
+    }
+
+    public static Response getResponse(ObjectMapper mapper, statusCode status, JsonNode node) {
+        ObjectNode rootNode = mapper.createObjectNode();
+
+        switch (status) {
+            case OK:
+            case BAD_REQUEST:
+            case NOT_IMPLEMENTED:
+            case REQUEST_TIMEOUT:
+            case INTERNAL_SERVER_ERROR:
+            case NOT_FOUND: {
+                ArrayNode data = rootNode.putArray("data");
+                data.add(node);
+                return Response.status(status.status)
+                        .entity(rootNode.toString())
+                        .build();
+            }
+            default:
+                return Response.noContent().build();
+        }
+    }
+
+    public enum statusCode {
+        OK(200),
+        BAD_REQUEST(400),
+        NOT_FOUND(404),
+        REQUEST_TIMEOUT(408),
+        INTERNAL_SERVER_ERROR(500),
+        NOT_IMPLEMENTED(501);
+
+        public int status;
+
+        statusCode(int status) {
+            this.status = status;
+        }
+    }
+}
diff --git a/src/main/java/org.onosproject.xran/rest/SliceWebResource.java b/src/main/java/org.onosproject.xran/rest/SliceWebResource.java
index e895d55..58b4bef 100644
--- a/src/main/java/org.onosproject.xran/rest/SliceWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/SliceWebResource.java
@@ -15,8 +15,8 @@
  */
 package org.onosproject.xran.rest;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.onosproject.rest.AbstractWebResource;
 import org.onosproject.xran.XranStore;
@@ -44,6 +44,10 @@
     private static final Logger log =
             LoggerFactory.getLogger(SliceWebResource.class);
 
+    public SliceWebResource() {
+
+    }
+
     /**
      * test.
      *
@@ -58,20 +62,33 @@
 
         if (slice != null) {
             try {
-                ObjectNode rootNode = mapper().createObjectNode();
-                JsonNode jsonNode = mapper().readTree(slice.toString());
-                rootNode.put("slice", jsonNode);
-                return ok(rootNode.toString()).build();
-            } catch (IOException e) {
-                log.error(ExceptionUtils.getFullStackTrace(e));
+                JsonNode jsonNode = mapper().valueToTree(slice);
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        ResponseHelper.statusCode.OK,
+                        jsonNode
+                );
+            } catch (Exception e) {
+                String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+                log.error(fullStackTrace);
                 e.printStackTrace();
-                return Response.serverError()
-                        .entity(ExceptionUtils.getFullStackTrace(e))
-                        .build();
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                        "Exception",
+                        fullStackTrace
+                );
             }
         }
 
-        return Response.serverError().entity("slice not found").build();
+        return ResponseHelper.getResponse(
+                mapper(),
+                ResponseHelper.statusCode.NOT_FOUND,
+                "Not Found",
+                "Slice " + sliceid + " not found"
+        );
     }
 
     /**
@@ -82,19 +99,30 @@
      */
     @POST
     @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
     public Response postSlice(InputStream stream) {
         try {
-            boolean b;
-            ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
+//            ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
+//            get(XranStore.class).createSlice(jsonTree);
 
-            b = get(XranStore.class).createSlice(jsonTree);
-            return ok(b).build();
+            // FIXME: change when implemented
+            return ResponseHelper.getResponse(
+                    mapper(),
+                    ResponseHelper.statusCode.NOT_IMPLEMENTED,
+                    "Not Implemented",
+                    "POST Slice not implemented"
+            );
         } catch (Exception e) {
-            log.error(ExceptionUtils.getFullStackTrace(e));
+            String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+            log.error(fullStackTrace);
             e.printStackTrace();
-            return Response.serverError()
-                    .entity(ExceptionUtils.getFullStackTrace(e))
-                    .build();
+
+            return ResponseHelper.getResponse(
+                    mapper(),
+                    ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                    "Exception",
+                    fullStackTrace
+            );
         }
     }