FALCON-2224 Change return type of extension APIs to APIResult

Author: Pracheer Agarwal <pracheer.agarwal@inmobi.com>

Reviewers: @sandeepSamudrala, @pallavi-rao

Closes #330 from PracheerAgarwal/APIResult and squashes the following commits:

2f62d03 [Pracheer Agarwal] resolved merge conficts
1c0d6fb [Pracheer Agarwal] resolved merge conficts
8e058e7 [Pracheer Agarwal] removed unused imports
ff1dbb4 [Pracheer Agarwal] FALCON-2224 added getExtensionDetail and getExtensions to AbstractFalconClient
533d507 [Pracheer Agarwal] FALCON-2224, Change return type of extension APIs to APIResult
46042fd [Pracheer Agarwal] Merge branch 'master' of https://github.com/PracheerAgarwal/falcon
daa3ffc [Pracheer Agarwal] FALCON-2225 extension owner added for trusted extensions
622cae4 [Pracheer Agarwal] FALCON-2225 extension owner added for trusted extensions
diff --git a/cli/src/main/java/org/apache/falcon/cli/FalconExtensionCLI.java b/cli/src/main/java/org/apache/falcon/cli/FalconExtensionCLI.java
index c8c66bf..59538bc 100644
--- a/cli/src/main/java/org/apache/falcon/cli/FalconExtensionCLI.java
+++ b/cli/src/main/java/org/apache/falcon/cli/FalconExtensionCLI.java
@@ -77,26 +77,26 @@
         String description = commandLine.getOptionValue(FalconCLIConstants.DESCRIPTION);
 
         if (optionsList.contains(ENUMERATE_OPT)) {
-            result = client.enumerateExtensions();
+            result = client.enumerateExtensions().getMessage();
             result = prettyPrintJson(result);
         } else if (optionsList.contains(DEFINITION_OPT)) {
             validateRequiredParameter(extensionName, EXTENSION_NAME_OPT);
-            result = client.getExtensionDefinition(extensionName);
+            result = client.getExtensionDefinition(extensionName).getMessage();
             result = prettyPrintJson(result);
         } else if (optionsList.contains(DESCRIBE_OPT)) {
             validateRequiredParameter(extensionName, EXTENSION_NAME_OPT);
-            result = client.getExtensionDescription(extensionName);
+            result = client.getExtensionDescription(extensionName).getMessage();
         } else if (optionsList.contains(UNREGISTER_OPT)) {
             validateRequiredParameter(extensionName, EXTENSION_NAME_OPT);
-            result = client.unregisterExtension(extensionName);
+            result = client.unregisterExtension(extensionName).getMessage();
         } else if (optionsList.contains(DETAIL_OPT)) {
             if (optionsList.contains(JOB_NAME_OPT)) {
                 validateRequiredParameter(jobName, JOB_NAME_OPT);
-                result = client.getExtensionJobDetails(jobName);
+                result = client.getExtensionJobDetails(jobName).getMessage();
                 result = prettyPrintJson(result);
             } else {
                 validateRequiredParameter(extensionName, EXTENSION_NAME_OPT);
-                result = client.getExtensionDetail(extensionName);
+                result = client.getExtensionDetail(extensionName).getMessage();
                 result = prettyPrintJson(result);
             }
         } else if (optionsList.contains(FalconCLIConstants.SUBMIT_OPT)) {
@@ -107,7 +107,7 @@
         } else if (optionsList.contains(REGISTER_OPT)) {
             validateRequiredParameter(extensionName, EXTENSION_NAME_OPT);
             validateRequiredParameter(path, PATH);
-            result = client.registerExtension(extensionName, path, description);
+            result = client.registerExtension(extensionName, path, description).getMessage();
         } else if (optionsList.contains(FalconCLIConstants.SUBMIT_AND_SCHEDULE_OPT)) {
             validateRequiredParameter(extensionName, EXTENSION_NAME_OPT);
             validateRequiredParameter(filePath, FalconCLIConstants.FILE_PATH_OPT);
diff --git a/client/src/main/java/org/apache/falcon/client/AbstractFalconClient.java b/client/src/main/java/org/apache/falcon/client/AbstractFalconClient.java
index 3dabf52..879d794 100644
--- a/client/src/main/java/org/apache/falcon/client/AbstractFalconClient.java
+++ b/client/src/main/java/org/apache/falcon/client/AbstractFalconClient.java
@@ -187,14 +187,14 @@
      * @param description description of the extension.
      * @return Result of the registerExtension command.
      */
-    public abstract String registerExtension(String extensionName, String packagePath, String description);
+    public abstract APIResult registerExtension(String extensionName, String packagePath, String description);
 
     /**
      *
      * @param extensionName extensionName that needs to be unregistered
      * @return Result of the unregisterExtension operation
      */
-    public abstract String unregisterExtension(String extensionName);
+    public abstract APIResult unregisterExtension(String extensionName);
 
     /**
      * Prepares set of entities the extension has implemented and stage them to a local directory and submit them too.
@@ -226,7 +226,20 @@
      * @param jobName job name of the extension job.
      * @return
      */
-    public abstract String getExtensionJobDetails(final String jobName);
+    public abstract APIResult getExtensionJobDetails(final String jobName);
+
+    /**
+     * Returns details of an extension.
+     * @param extensionName name of the extension.
+     * @return
+     */
+    public abstract APIResult getExtensionDetail(final String extensionName);
+
+    /**
+     * Returns all registered extensions.
+     * @return
+     */
+    public abstract APIResult enumerateExtensions();
 
     /**
      *
diff --git a/client/src/main/java/org/apache/falcon/client/FalconClient.java b/client/src/main/java/org/apache/falcon/client/FalconClient.java
index d5b8342..fbb4db3 100644
--- a/client/src/main/java/org/apache/falcon/client/FalconClient.java
+++ b/client/src/main/java/org/apache/falcon/client/FalconClient.java
@@ -1009,28 +1009,28 @@
         return sendMetadataLineageRequest(MetadataOperations.EDGES, id, doAsUser);
     }
 
-    public String enumerateExtensions()  {
+    public APIResult enumerateExtensions()  {
         ClientResponse clientResponse = new ResourceBuilder()
                 .path(ExtensionOperations.ENUMERATE.path)
                 .call(ExtensionOperations.ENUMERATE);
-        return getResponse(String.class, clientResponse);
+        return getResponse(APIResult.class, clientResponse);
     }
 
-    public String unregisterExtension(final String extensionName) {
+    public APIResult unregisterExtension(final String extensionName) {
         ClientResponse clientResponse = new ResourceBuilder()
                 .path(ExtensionOperations.UNREGISTER.path, extensionName)
                 .call(ExtensionOperations.UNREGISTER);
-        return getResponse(String.class, clientResponse);
+        return getResponse(APIResult.class, clientResponse);
     }
 
-    public String getExtensionDetail(final String extensionName) {
-        return getResponse(String.class, getExtensionDetailResponse(extensionName));
+    public APIResult getExtensionDetail(final String extensionName) {
+        return getResponse(APIResult.class, getExtensionDetailResponse(extensionName));
     }
 
-    public String getExtensionJobDetails(final String jobName) {
+    public APIResult getExtensionJobDetails(final String jobName) {
         ClientResponse clientResponse = new ResourceBuilder().path(ExtensionOperations.JOB_DETAILS.path, jobName)
                 .call(ExtensionOperations.JOB_DETAILS);
-        return getResponse(String.class, clientResponse);
+        return getResponse(APIResult.class, clientResponse);
     }
 
     private ClientResponse getExtensionDetailResponse(final String extensionName) {
@@ -1038,26 +1038,26 @@
                 .call(ExtensionOperations.DETAIL);
     }
 
-    public String registerExtension(final String extensionName, final String packagePath, final String description) {
+    public APIResult registerExtension(final String extensionName, final String packagePath, final String description) {
         ClientResponse clientResponse = new ResourceBuilder()
                 .path(ExtensionOperations.REGISTER.path, extensionName).addQueryParam(PATH, packagePath)
                 .addQueryParam(FalconCLIConstants.DESCRIPTION, description)
                 .call(ExtensionOperations.REGISTER);
-        return getResponse(String.class, clientResponse);
+        return getResponse(APIResult.class, clientResponse);
     }
 
-    public String getExtensionDefinition(final String extensionName)  {
+    public APIResult getExtensionDefinition(final String extensionName)  {
         ClientResponse clientResponse = new ResourceBuilder()
                 .path(ExtensionOperations.DEFINITION.path, extensionName)
                 .call(ExtensionOperations.DEFINITION);
-        return getResponse(String.class, clientResponse);
+        return getResponse(APIResult.class, clientResponse);
     }
 
-    public String getExtensionDescription(final String extensionName)  {
+    public APIResult getExtensionDescription(final String extensionName)  {
         ClientResponse clientResponse = new ResourceBuilder()
                 .path(ExtensionOperations.DESCRIBE.path, extensionName)
                 .call(ExtensionOperations.DESCRIBE);
-        return getResponse(String.class, clientResponse);
+        return getResponse(APIResult.class, clientResponse);
     }
 
     @Override
diff --git a/prism/src/main/java/org/apache/falcon/resource/AbstractExtensionManager.java b/prism/src/main/java/org/apache/falcon/resource/AbstractExtensionManager.java
index a50b535..d360370 100644
--- a/prism/src/main/java/org/apache/falcon/resource/AbstractExtensionManager.java
+++ b/prism/src/main/java/org/apache/falcon/resource/AbstractExtensionManager.java
@@ -23,14 +23,17 @@
 import org.apache.falcon.entity.parser.ValidationException;
 import org.apache.falcon.extensions.jdbc.ExtensionMetaStore;
 import org.apache.falcon.extensions.store.ExtensionStore;
+import org.apache.falcon.persistence.ExtensionBean;
 import org.apache.falcon.persistence.ExtensionJobsBean;
 import org.apache.falcon.security.CurrentUser;
+import org.codehaus.jettison.json.JSONArray;
 import org.codehaus.jettison.json.JSONException;
 import org.codehaus.jettison.json.JSONObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.ws.rs.core.Response;
+import java.util.List;
 
 /**
  * A base class for managing Extension Operations.
@@ -47,6 +50,11 @@
     private static final String CREATION_TIME  = "creationTime";
     private static final String LAST_UPDATE_TIME  = "lastUpdatedTime";
 
+    private static final String NAME = "name";
+    private static final String EXTENSION_TYPE = "type";
+    private static final String EXTENSION_DESC = "description";
+    private static final String EXTENSION_LOCATION = "location";
+
     public static void validateExtensionName(final String extensionName) {
         if (StringUtils.isBlank(extensionName)) {
             throw FalconWebException.newAPIException("Extension name is mandatory and shouldn't be blank",
@@ -54,27 +62,45 @@
         }
     }
 
-    public String registerExtensionMetadata(String extensionName, String path, String description, String owner) {
+    public APIResult registerExtensionMetadata(String extensionName, String path, String description, String owner) {
         validateExtensionName(extensionName);
         try {
-            return ExtensionStore.get().registerExtension(extensionName, path, description, owner);
+            return new APIResult(APIResult.Status.SUCCEEDED, ExtensionStore.get().registerExtension(extensionName, path,
+                    description, owner));
         } catch (Throwable e) {
             throw FalconWebException.newAPIException(e, Response.Status.INTERNAL_SERVER_ERROR);
         }
     }
 
-    public String getExtensionJobDetail(String jobName) {
+    public APIResult getExtensionJobDetail(String jobName) {
         try {
-            return buildExtensionJobDetailResult(jobName).toString();
+            return new APIResult(APIResult.Status.SUCCEEDED, buildExtensionJobDetailResult(jobName).toString());
         } catch (FalconException e) {
             throw FalconWebException.newAPIException(e, Response.Status.INTERNAL_SERVER_ERROR);
         }
     }
 
-    public String deleteExtensionMetadata(String extensionName){
+    public APIResult getExtensionDetail(String extensionName) {
+        try {
+            return new APIResult(APIResult.Status.SUCCEEDED, buildExtensionDetailResult(extensionName).toString());
+        } catch (FalconException e) {
+            throw FalconWebException.newAPIException(e, Response.Status.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    public APIResult getExtensions() {
+        try {
+            return new APIResult(APIResult.Status.SUCCEEDED, buildEnumerateResult().toString());
+        } catch (FalconException e) {
+            throw FalconWebException.newAPIException(e, Response.Status.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    public APIResult deleteExtensionMetadata(String extensionName){
         validateExtensionName(extensionName);
         try {
-            return ExtensionStore.get().deleteExtension(extensionName, CurrentUser.getUser());
+            return new APIResult(APIResult.Status.SUCCEEDED, ExtensionStore.get().deleteExtension(extensionName,
+                    CurrentUser.getUser()));
         } catch (Throwable e) {
             throw FalconWebException.newAPIException(e, Response.Status.INTERNAL_SERVER_ERROR);
         }
@@ -114,4 +140,45 @@
         }
         return tags.substring(nameStart, nameEnd);
     }
+
+    private JSONObject buildExtensionDetailResult(final String extensionName) throws FalconException {
+        ExtensionMetaStore metaStore = ExtensionStore.getMetaStore();
+
+        if (!metaStore.checkIfExtensionExists(extensionName)){
+            throw new ValidationException("No extension resources found for " + extensionName);
+        }
+
+        ExtensionBean bean = metaStore.getDetail(extensionName);
+        JSONObject resultObject = new JSONObject();
+        try {
+            resultObject.put(NAME, bean.getExtensionName());
+            resultObject.put(EXTENSION_TYPE, bean.getExtensionType());
+            resultObject.put(EXTENSION_DESC, bean.getDescription());
+            resultObject.put(EXTENSION_LOCATION, bean.getLocation());
+        } catch (JSONException e) {
+            LOG.error("Exception in buildDetailResults:", e);
+            throw new FalconException(e);
+        }
+        return resultObject;
+    }
+
+    private static JSONArray buildEnumerateResult() throws FalconException {
+        JSONArray results = new JSONArray();
+        ExtensionMetaStore metaStore = ExtensionStore.getMetaStore();
+        List<ExtensionBean> extensionBeanList = metaStore.getAllExtensions();
+        for (ExtensionBean extensionBean : extensionBeanList) {
+            JSONObject resultObject = new JSONObject();
+
+            try {
+                resultObject.put(NAME, extensionBean.getExtensionName().toLowerCase());
+                resultObject.put(EXTENSION_TYPE, extensionBean.getExtensionType());
+                resultObject.put(EXTENSION_DESC, extensionBean.getDescription());
+                resultObject.put(EXTENSION_LOCATION, extensionBean.getLocation());
+            } catch (JSONException e) {
+                throw new FalconException(e);
+            }
+            results.put(resultObject);
+        }
+        return results;
+    }
 }
diff --git a/prism/src/main/java/org/apache/falcon/resource/proxy/ExtensionManagerProxy.java b/prism/src/main/java/org/apache/falcon/resource/proxy/ExtensionManagerProxy.java
index 9ddebe8..ebe989d 100644
--- a/prism/src/main/java/org/apache/falcon/resource/proxy/ExtensionManagerProxy.java
+++ b/prism/src/main/java/org/apache/falcon/resource/proxy/ExtensionManagerProxy.java
@@ -25,8 +25,6 @@
 import org.apache.falcon.FalconWebException;
 import org.apache.falcon.entity.EntityUtil;
 import org.apache.falcon.entity.parser.ProcessEntityParser;
-import org.apache.falcon.entity.parser.ValidationException;
-import org.apache.falcon.entity.store.StoreAccessException;
 import org.apache.falcon.entity.v0.Entity;
 import org.apache.falcon.entity.v0.EntityType;
 import org.apache.falcon.entity.v0.feed.Feed;
@@ -49,9 +47,6 @@
 import org.apache.falcon.security.CurrentUser;
 import org.apache.falcon.service.Services;
 import org.apache.falcon.util.DeploymentUtil;
-import org.codehaus.jettison.json.JSONArray;
-import org.codehaus.jettison.json.JSONException;
-import org.codehaus.jettison.json.JSONObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -95,24 +90,15 @@
     private static final String TAG_PREFIX_EXTENSION_NAME = "_falcon_extension_name=";
     private static final String ASCENDING_SORT_ORDER = "asc";
     private static final String DESCENDING_SORT_ORDER = "desc";
-
     private Extension extension = new Extension();
-
-    private static final String EXTENSION_RESULTS = "extensions";
-    private static final String TOTAL_RESULTS = "totalResults";
     private static final String README = "README";
-    private static final String NAME = "name";
-    private static final String EXTENSION_TYPE = "type";
-    private static final String EXTENSION_DESC = "description";
-    private static final String EXTENSION_LOCATION = "location";
+
     private boolean embeddedMode = DeploymentUtil.isEmbeddedMode();
     private String currentColo = DeploymentUtil.getCurrentColo();
     private final Map<String, Channel> configSyncChannels = new HashMap<String, Channel>();
-    private static final String PRISM_TAG = "prism";
     private final Map<String, Channel> entityManagerChannels = new HashMap<String, Channel>();
 
 
-
     private static final String EXTENSION_PROPERTY_JSON_SUFFIX = "-properties.json";
     //SUSPEND CHECKSTYLE CHECK ParameterNumberCheck
     @GET
@@ -596,26 +582,11 @@
     @GET
     @Path("enumerate")
     @Produces({MediaType.APPLICATION_JSON})
-    public Response getExtensions() {
+    public APIResult getExtensions() {
         checkIfExtensionServiceIsEnabled();
-        JSONArray results;
-
         try {
-            results = buildEnumerateResult();
-        } catch (StoreAccessException e) {
-            LOG.error("Failed when accessing extension store.", e);
-            throw FalconWebException.newAPIException(e, Response.Status.INTERNAL_SERVER_ERROR);
-        } catch (FalconException e) {
-            throw FalconWebException.newAPIException(e, Response.Status.INTERNAL_SERVER_ERROR);
-        }
-
-        try {
-            JSONObject response = new JSONObject();
-            response.put(EXTENSION_RESULTS, results);
-            response.put(TOTAL_RESULTS, results.length());
-
-            return Response.ok(response).build();
-        } catch (Throwable e) {
+            return new APIResult(APIResult.Status.SUCCEEDED, super.getExtensions().toString());
+        } catch (FalconWebException e) {
             throw FalconWebException.newAPIException(e, Response.Status.INTERNAL_SERVER_ERROR);
         }
     }
@@ -623,12 +594,12 @@
     @GET
     @Path("describe/{extension-name}")
     @Produces(MediaType.TEXT_PLAIN)
-    public String getExtensionDescription(
+    public APIResult getExtensionDescription(
             @PathParam("extension-name") String extensionName) {
         checkIfExtensionServiceIsEnabled();
         validateExtensionName(extensionName);
         try {
-            return ExtensionStore.get().getResource(extensionName, README);
+            return new APIResult(APIResult.Status.SUCCEEDED, ExtensionStore.get().getResource(extensionName, README));
         } catch (Throwable e) {
             throw FalconWebException.newAPIException(e, Response.Status.INTERNAL_SERVER_ERROR);
         }
@@ -637,11 +608,11 @@
     @GET
     @Path("detail/{extension-name}")
     @Produces({MediaType.APPLICATION_JSON})
-    public Response getDetail(@PathParam("extension-name") String extensionName) {
+    public APIResult getDetail(@PathParam("extension-name") String extensionName) {
         checkIfExtensionServiceIsEnabled();
         validateExtensionName(extensionName);
         try {
-            return Response.ok(buildExtensionDetailResult(extensionName)).build();
+            return super.getExtensionDetail(extensionName);
         } catch (Throwable e) {
             throw FalconWebException.newAPIException(e, Response.Status.INTERNAL_SERVER_ERROR);
         }
@@ -650,10 +621,10 @@
     @GET
     @Path("extensionJobDetails/{job-name}")
     @Produces({MediaType.APPLICATION_JSON})
-    public String getExtensionJobDetail(@PathParam("job-name") String jobName) {
+    public APIResult getExtensionJobDetail(@PathParam("job-name") String jobName) {
         checkIfExtensionServiceIsEnabled();
         try {
-            return  super.getExtensionJobDetail(jobName);
+            return super.getExtensionJobDetail(jobName);
         } catch (Throwable e) {
             throw FalconWebException.newAPIException(e, Response.Status.INTERNAL_SERVER_ERROR);
         }
@@ -663,7 +634,7 @@
     @Path("unregister/{extension-name}")
     @Consumes({MediaType.TEXT_XML, MediaType.TEXT_PLAIN})
     @Produces(MediaType.TEXT_PLAIN)
-    public String deleteExtensionMetadata(
+    public APIResult deleteExtensionMetadata(
             @PathParam("extension-name") String extensionName){
         checkIfExtensionServiceIsEnabled();
         try {
@@ -677,7 +648,7 @@
     @Path("register/{extension-name}")
     @Consumes({MediaType.TEXT_XML, MediaType.TEXT_PLAIN})
     @Produces(MediaType.TEXT_PLAIN)
-    public String registerExtensionMetadata(
+    public APIResult registerExtensionMetadata(
             @PathParam("extension-name") String extensionName,
             @QueryParam("path") String path,
             @QueryParam("description") String description) {
@@ -692,38 +663,17 @@
     @GET
     @Path("definition/{extension-name}")
     @Produces({MediaType.APPLICATION_JSON})
-    public String getExtensionDefinition(
+    public APIResult getExtensionDefinition(
             @PathParam("extension-name") String extensionName) {
         checkIfExtensionServiceIsEnabled();
         try {
-            return ExtensionStore.get().getResource(extensionName,
-                    extensionName.toLowerCase() + EXTENSION_PROPERTY_JSON_SUFFIX);
+            return new APIResult(APIResult.Status.SUCCEEDED, ExtensionStore.get().getResource(extensionName,
+                    extensionName.toLowerCase() + EXTENSION_PROPERTY_JSON_SUFFIX));
         } catch (Throwable e) {
             throw FalconWebException.newAPIException(e, Response.Status.INTERNAL_SERVER_ERROR);
         }
     }
 
-    private static JSONArray buildEnumerateResult() throws FalconException {
-        JSONArray results = new JSONArray();
-        ExtensionMetaStore metaStore = ExtensionStore.getMetaStore();
-        List<ExtensionBean> extensionBeanList = metaStore.getAllExtensions();
-        for (ExtensionBean extensionBean : extensionBeanList) {
-            JSONObject resultObject = new JSONObject();
-
-            try {
-                resultObject.put(NAME, extensionBean.getExtensionName().toLowerCase());
-                resultObject.put(EXTENSION_TYPE, extensionBean.getExtensionType());
-                resultObject.put(EXTENSION_DESC, extensionBean.getDescription());
-                resultObject.put(EXTENSION_LOCATION, extensionBean.getLocation());
-            } catch (JSONException e) {
-                throw new FalconException(e);
-            }
-            results.put(resultObject);
-
-        }
-        return results;
-    }
-
     private List<Entity> generateEntities(String extensionName, InputStream configStream)
         throws FalconException, IOException {
         // get entities for extension job
@@ -738,27 +688,6 @@
         return entities;
     }
 
-    private JSONObject buildExtensionDetailResult(final String extensionName) throws FalconException {
-        ExtensionMetaStore metaStore = ExtensionStore.getMetaStore();
-
-        if (!metaStore.checkIfExtensionExists(extensionName)){
-            throw new ValidationException("No extension resources found for " + extensionName);
-        }
-
-        ExtensionBean bean = metaStore.getDetail(extensionName);
-        JSONObject resultObject = new JSONObject();
-        try {
-            resultObject.put(NAME, bean.getExtensionName());
-            resultObject.put(EXTENSION_TYPE, bean.getExtensionType());
-            resultObject.put(EXTENSION_DESC, bean.getDescription());
-            resultObject.put(EXTENSION_LOCATION, bean.getLocation());
-        } catch (JSONException e) {
-            LOG.error("Exception in buildDetailResults:", e);
-            throw new FalconException(e);
-        }
-        return resultObject;
-    }
-
     private Map<String, List<Entity>> groupEntitiesByJob(List<Entity> entities) {
         Map<String, List<Entity>> groupedEntities = new HashMap<>();
         for (Entity entity : entities) {
diff --git a/unit/src/main/java/org/apache/falcon/unit/FalconUnitClient.java b/unit/src/main/java/org/apache/falcon/unit/FalconUnitClient.java
index 7036dc7..3a3c5b2 100644
--- a/unit/src/main/java/org/apache/falcon/unit/FalconUnitClient.java
+++ b/unit/src/main/java/org/apache/falcon/unit/FalconUnitClient.java
@@ -272,12 +272,12 @@
     }
 
     @Override
-    public String registerExtension(String extensionName, String packagePath, String description) {
+    public APIResult registerExtension(String extensionName, String packagePath, String description) {
         return localExtensionManager.registerExtensionMetadata(extensionName, packagePath, description);
     }
 
     @Override
-    public String unregisterExtension(String extensionName) {
+    public APIResult unregisterExtension(String extensionName) {
         return localExtensionManager.unRegisterExtension(extensionName);
     }
 
@@ -336,11 +336,21 @@
     }
 
     @Override
-    public String getExtensionJobDetails(final String jobName) {
+    public APIResult getExtensionJobDetails(final String jobName) {
         return localExtensionManager.getExtensionJobDetails(jobName);
     }
 
     @Override
+    public APIResult getExtensionDetail(String extensionName) {
+        return localExtensionManager.getExtensionDetails(extensionName);
+    }
+
+    @Override
+    public APIResult enumerateExtensions() {
+        return localExtensionManager.getExtensions();
+    }
+
+    @Override
     public EntityList getEntityList(String entityType, String fields, String nameSubsequence, String tagKeywords,
                                     String filterBy, String filterTags, String orderBy, String sortOrder,
                                     Integer offset, Integer numResults, String doAsUser) {
diff --git a/unit/src/main/java/org/apache/falcon/unit/LocalExtensionManager.java b/unit/src/main/java/org/apache/falcon/unit/LocalExtensionManager.java
index 57c339e..4cf3ae4 100644
--- a/unit/src/main/java/org/apache/falcon/unit/LocalExtensionManager.java
+++ b/unit/src/main/java/org/apache/falcon/unit/LocalExtensionManager.java
@@ -87,16 +87,24 @@
     }
 
 
-    public String registerExtensionMetadata(String extensionName, String packagePath , String description) {
+    public APIResult registerExtensionMetadata(String extensionName, String packagePath , String description) {
         return super.registerExtensionMetadata(extensionName, packagePath, description, CurrentUser.getUser());
     }
 
-    public String unRegisterExtension(String extensionName) {
+    public APIResult unRegisterExtension(String extensionName) {
         return super.deleteExtensionMetadata(extensionName);
     }
 
-    public String getExtensionJobDetails(String jobName){
+    public APIResult getExtensionJobDetails(String jobName){
         return super.getExtensionJobDetail(jobName);
     }
 
+    public APIResult getExtensionDetails(String extensionName){
+        return super.getExtensionJobDetail(extensionName);
+    }
+
+    public APIResult getExtensions(){
+        return super.getExtensions();
+    }
+
 }
diff --git a/unit/src/test/java/org/apache/falcon/unit/FalconUnitTestBase.java b/unit/src/test/java/org/apache/falcon/unit/FalconUnitTestBase.java
index 6f71747..0771b9d 100644
--- a/unit/src/test/java/org/apache/falcon/unit/FalconUnitTestBase.java
+++ b/unit/src/test/java/org/apache/falcon/unit/FalconUnitTestBase.java
@@ -221,15 +221,15 @@
     public String registerExtension(String extensionName, String packagePath, String description)
         throws IOException, FalconException {
 
-        return falconUnitClient.registerExtension(extensionName, packagePath, description);
+        return falconUnitClient.registerExtension(extensionName, packagePath, description).getMessage();
     }
 
     public String getExtensionJobDetails(String jobName) {
-        return falconUnitClient.getExtensionJobDetails(jobName);
+        return falconUnitClient.getExtensionJobDetails(jobName).getMessage();
     }
 
     public String unregisterExtension(String extensionName) {
-        return falconUnitClient.unregisterExtension(extensionName);
+        return falconUnitClient.unregisterExtension(extensionName).getMessage();
     }
 
     public APIResult submitExtensionJob(String extensionName, String jobName, String configPath, String doAsUser) {