Repository: falcon
Updated Branches:
  refs/heads/master ec0a4a82e -> 205465a8c


FALCON-1565 Listing API non-intuitive response if time > endTime. Contributed 
by Praveen Adlakha.


Project: http://git-wip-us.apache.org/repos/asf/falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/falcon/commit/205465a8
Tree: http://git-wip-us.apache.org/repos/asf/falcon/tree/205465a8
Diff: http://git-wip-us.apache.org/repos/asf/falcon/diff/205465a8

Branch: refs/heads/master
Commit: 205465a8c7cc3ef928119e95c4fd0c45ae589863
Parents: ec0a4a8
Author: Ajay Yadava <[email protected]>
Authored: Wed Dec 30 01:31:44 2015 +0530
Committer: Ajay Yadava <[email protected]>
Committed: Wed Dec 30 01:58:43 2015 +0530

----------------------------------------------------------------------
 CHANGES.txt                                     |  2 +
 .../apache/falcon/cli/FalconInstanceCLI.java    |  3 +-
 .../falcon/client/FalconCLIException.java       | 35 +++++++++++++++
 .../org/apache/falcon/client/FalconClient.java  | 45 +++++++++++++++++++-
 .../org/apache/falcon/FalconWebException.java   | 13 ++++++
 .../resource/AbstractInstanceManager.java       | 26 +++++------
 .../falcon/resource/channel/HTTPChannel.java    |  8 +++-
 .../resource/proxy/InstanceManagerProxy.java    |  5 ++-
 8 files changed, 120 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/falcon/blob/205465a8/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 402e72a..618bb2a 100755
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -90,6 +90,8 @@ Trunk (Unreleased)
   OPTIMIZATIONS
 
   BUG FIXES
+    FALCON-1565 Listing API non-intuitive response if time > endTime (Praveen 
Adlakha via Ajay Yadava)
+
     FALCON-1696 Falcon build failing in checkstyle module (Praveen Adlakha via 
Pallavi Rao)
 
     FALCON-1694 Status API shows params along with instance status(Pallavi Rao 
via Ajay Yadava)

http://git-wip-us.apache.org/repos/asf/falcon/blob/205465a8/client/src/main/java/org/apache/falcon/cli/FalconInstanceCLI.java
----------------------------------------------------------------------
diff --git a/client/src/main/java/org/apache/falcon/cli/FalconInstanceCLI.java 
b/client/src/main/java/org/apache/falcon/cli/FalconInstanceCLI.java
index 6ea34da..bfb1d65 100644
--- a/client/src/main/java/org/apache/falcon/cli/FalconInstanceCLI.java
+++ b/client/src/main/java/org/apache/falcon/cli/FalconInstanceCLI.java
@@ -267,8 +267,7 @@ public class FalconInstanceCLI extends FalconCLI {
             result = ResponseHelper.getString(client.getParamsOfInstance(type, 
entity,
                     start, colo, lifeCycles, doAsUser));
         } else if (optionsList.contains(LISTING_OPT)) {
-            result = ResponseHelper.getString(client
-                    .getFeedListing(type, entity, start, end, colo, doAsUser));
+            result = 
ResponseHelper.getString(client.getFeedInstanceListing(type, entity, start, 
end, colo, doAsUser));
         } else {
             throw new FalconCLIException("Invalid command");
         }

http://git-wip-us.apache.org/repos/asf/falcon/blob/205465a8/client/src/main/java/org/apache/falcon/client/FalconCLIException.java
----------------------------------------------------------------------
diff --git 
a/client/src/main/java/org/apache/falcon/client/FalconCLIException.java 
b/client/src/main/java/org/apache/falcon/client/FalconCLIException.java
index 51ef952..831f7ac 100644
--- a/client/src/main/java/org/apache/falcon/client/FalconCLIException.java
+++ b/client/src/main/java/org/apache/falcon/client/FalconCLIException.java
@@ -76,4 +76,39 @@ public class FalconCLIException extends Exception {
         }
         return statusValue + ";" + message;
     }
+
+    public static FalconCLIException fromReponse(ClientResponse 
clientResponse, Class clazz) {
+        return new FalconCLIException(getMessage(clientResponse, clazz));
+    }
+
+    private static  String getMessage(ClientResponse clientResponse, Class<? 
extends APIResult> clazz) {
+        ClientResponse.Status status = 
clientResponse.getClientResponseStatus();
+        String statusValue = status.toString();
+        String message = "";
+        if (status == ClientResponse.Status.BAD_REQUEST) {
+            clientResponse.bufferEntity();
+            InputStream in = clientResponse.getEntityInputStream();
+            try {
+                in.mark(MB);
+                message = clientResponse.getEntity(clazz).getMessage();
+            } catch (Throwable th) {
+                try {
+                    in.reset();
+                    message = 
clientResponse.getEntity(APIResult.class).getMessage();
+                } catch (Throwable t) {
+                    byte[] data = new byte[MB];
+                    try {
+                        in.reset();
+                        int len = in.read(data);
+                        message = new String(data, 0, len);
+                    } catch (IOException e) {
+                        message = e.getMessage();
+                    }
+                }
+            }
+
+
+        }
+        return statusValue + ";" + message;
+    }
 }

http://git-wip-us.apache.org/repos/asf/falcon/blob/205465a8/client/src/main/java/org/apache/falcon/client/FalconClient.java
----------------------------------------------------------------------
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 00aa167..4a773c6 100644
--- a/client/src/main/java/org/apache/falcon/client/FalconClient.java
+++ b/client/src/main/java/org/apache/falcon/client/FalconClient.java
@@ -48,6 +48,7 @@ import 
org.apache.hadoop.security.authentication.client.AuthenticatedURL;
 import org.apache.hadoop.security.authentication.client.KerberosAuthenticator;
 import org.apache.hadoop.security.authentication.client.PseudoAuthenticator;
 
+
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.HttpsURLConnection;
 import javax.net.ssl.SSLContext;
@@ -952,6 +953,36 @@ public class FalconClient extends AbstractFalconClient {
         return clientResponse;
     }
 
+
+    public FeedInstanceResult getFeedInstanceListing(String type, String 
entity, String start, String end, String colo
+            , String doAsUser) throws FalconCLIException {
+
+        checkType(type);
+        Instances api = Instances.LISTING;
+        WebResource resource = service.path(api.path).path(type).path(entity);
+        if (colo != null) {
+            resource = resource.queryParam("colo", colo);
+        }
+        if (StringUtils.isNotEmpty(doAsUser)) {
+            resource = resource.queryParam(FalconCLI.DO_AS_OPT, doAsUser);
+        }
+        if (StringUtils.isNotEmpty(start)){
+            resource = resource.queryParam("start", start);
+        }
+        if (StringUtils.isNotEmpty(end)) {
+            resource = resource.queryParam("end", end);
+        }
+
+        ClientResponse clientResponse = resource.header("Cookie", 
AUTH_COOKIE_EQ + authenticationToken)
+                                                .accept(api.mimeType)
+                                                .method(api.method, 
ClientResponse.class);
+
+        printClientResponse(clientResponse);
+        checkIfSuccessful(clientResponse, FeedInstanceResult.class);
+        return clientResponse.getEntity(FeedInstanceResult.class);
+    }
+
+
     public InstanceDependencyResult getInstanceDependencies(String entityType, 
String entityName, String instanceTime,
                                                             String colo) 
throws FalconCLIException {
         checkType(entityType);
@@ -1232,7 +1263,10 @@ public class FalconClient extends AbstractFalconClient {
         printClientResponse(clientResponse);
         return clientResponse.getEntity(String.class);
     }
-
+    /*
+     * Donot use this getMessage use the overloaded one
+    * with clazz as param for better error handling
+    * */
     private void checkIfSuccessful(ClientResponse clientResponse) throws 
FalconCLIException {
         Response.Status.Family statusFamily = 
clientResponse.getClientResponseStatus().getFamily();
         if (statusFamily != Response.Status.Family.SUCCESSFUL
@@ -1241,6 +1275,15 @@ public class FalconClient extends AbstractFalconClient {
         }
     }
 
+    private void checkIfSuccessful(ClientResponse clientResponse, Class clazz) 
throws FalconCLIException {
+        Response.Status.Family statusFamily = 
clientResponse.getClientResponseStatus().getFamily();
+        if (statusFamily != Response.Status.Family.SUCCESSFUL
+            && statusFamily != Response.Status.Family.INFORMATIONAL) {
+            throw FalconCLIException.fromReponse(clientResponse, clazz);
+        }
+    }
+
+
     private void printClientResponse(ClientResponse clientResponse) {
         if (getDebugMode()) {
             OUT.get().println(clientResponse.toString());

http://git-wip-us.apache.org/repos/asf/falcon/blob/205465a8/prism/src/main/java/org/apache/falcon/FalconWebException.java
----------------------------------------------------------------------
diff --git a/prism/src/main/java/org/apache/falcon/FalconWebException.java 
b/prism/src/main/java/org/apache/falcon/FalconWebException.java
index 666e3d7..0b6c38e 100644
--- a/prism/src/main/java/org/apache/falcon/FalconWebException.java
+++ b/prism/src/main/java/org/apache/falcon/FalconWebException.java
@@ -104,6 +104,19 @@ public class FalconWebException extends 
WebApplicationException {
         return e.getCause()==null? e.getMessage():e.getMessage() + 
"\nCausedBy: " + e.getCause().getMessage();
     }
 
+
+    public static FalconWebException newAPIException(String message) {
+        Response response = Response.status(Response.Status.BAD_REQUEST)
+                            .entity(new APIResult(APIResult.Status.FAILED, 
message))
+                            .type(MediaType.TEXT_XML_TYPE)
+                            .build();
+        return new FalconWebException(response);
+    }
+
+    public FalconWebException(Response response) {
+        super(response);
+    }
+
     public FalconWebException(Throwable e, Response response) {
         super(e, response);
     }

http://git-wip-us.apache.org/repos/asf/falcon/blob/205465a8/prism/src/main/java/org/apache/falcon/resource/AbstractInstanceManager.java
----------------------------------------------------------------------
diff --git 
a/prism/src/main/java/org/apache/falcon/resource/AbstractInstanceManager.java 
b/prism/src/main/java/org/apache/falcon/resource/AbstractInstanceManager.java
index da2fea7..d50d111 100644
--- 
a/prism/src/main/java/org/apache/falcon/resource/AbstractInstanceManager.java
+++ 
b/prism/src/main/java/org/apache/falcon/resource/AbstractInstanceManager.java
@@ -179,10 +179,9 @@ public abstract class AbstractInstanceManager extends 
AbstractEntityManager {
             return getInstanceResultSubset(wfEngine.getStatus(entityObject,
                             startAndEndDate.first, startAndEndDate.second, 
lifeCycles),
                     filterBy, orderBy, sortOrder, offset, numResults);
-        } catch (Throwable e) {
+        } catch (FalconException e) {
             LOG.error("Failed to get instances status", e);
-            throw FalconWebException
-                    .newInstanceException(e, Response.Status.BAD_REQUEST);
+            throw FalconWebException.newAPIException(e.getMessage());
         }
     }
 
@@ -515,18 +514,20 @@ public abstract class AbstractInstanceManager extends 
AbstractEntityManager {
                                          String endStr, String colo) {
         checkColo(colo);
         EntityType entityType = checkType(type);
+
+        if (entityType != EntityType.FEED) {
+            throw FalconWebException.newAPIException("getLocation is not 
applicable for " + entityType);
+        }
         try {
-            if (entityType != EntityType.FEED) {
-                throw new IllegalArgumentException("getLocation is not 
applicable for " + type);
-            }
+
             validateParams(type, entity);
             Entity entityObject = EntityUtil.getEntity(type, entity);
             Pair<Date, Date> startAndEndDate = 
getStartAndEndDate(entityObject, startStr, endStr);
 
             return FeedHelper.getFeedInstanceListing(entityObject, 
startAndEndDate.first, startAndEndDate.second);
-        } catch (Throwable e) {
+        } catch (FalconException e) {
             LOG.error("Failed to get instances listing", e);
-            throw FalconWebException.newInstanceException(e, 
Response.Status.BAD_REQUEST);
+            throw FalconWebException.newAPIException(e.getMessage());
         }
     }
 
@@ -873,12 +874,13 @@ public abstract class AbstractInstanceManager extends 
AbstractEntityManager {
         Frequency frequency = EntityUtil.getFrequency(entityObject);
         Date endDate = getEndDate(endStr, clusterStartEndDates.second);
         Date startDate = getStartDate(startStr, endDate, 
clusterStartEndDates.first, frequency, numResults);
-
         if (startDate.after(endDate)) {
-            throw new FalconException("Specified End date " + 
SchemaHelper.getDateFormat().format(endDate)
-                    + " is before the entity was scheduled " + 
SchemaHelper.getDateFormat().format(startDate));
+            throw FalconWebException.newAPIException("Specified End date "
+                    + SchemaHelper.getDateFormat().format(endDate)
+                    + " is before the entity was scheduled "
+                    + SchemaHelper.getDateFormat().format(startDate));
         }
-        return new Pair<Date, Date>(startDate, endDate);
+        return new Pair<>(startDate, endDate);
     }
 
     private Date getEndDate(String endStr, Date clusterEndDate) throws 
FalconException {

http://git-wip-us.apache.org/repos/asf/falcon/blob/205465a8/prism/src/main/java/org/apache/falcon/resource/channel/HTTPChannel.java
----------------------------------------------------------------------
diff --git 
a/prism/src/main/java/org/apache/falcon/resource/channel/HTTPChannel.java 
b/prism/src/main/java/org/apache/falcon/resource/channel/HTTPChannel.java
index 6801398..41be13f 100644
--- a/prism/src/main/java/org/apache/falcon/resource/channel/HTTPChannel.java
+++ b/prism/src/main/java/org/apache/falcon/resource/channel/HTTPChannel.java
@@ -23,6 +23,8 @@ import com.sun.jersey.api.client.ClientResponse;
 import com.sun.jersey.api.client.WebResource;
 import com.sun.jersey.api.client.config.DefaultClientConfig;
 import org.apache.falcon.FalconException;
+import org.apache.falcon.FalconWebException;
+import org.apache.falcon.resource.APIResult;
 import org.apache.falcon.resource.proxy.BufferedRequest;
 import org.apache.falcon.security.CurrentUser;
 import org.apache.falcon.util.DeploymentProperties;
@@ -117,11 +119,15 @@ public class HTTPChannel extends AbstractChannel {
             } else if (response.getClientResponseStatus().getStatusCode()
                     == Response.Status.BAD_REQUEST.getStatusCode()) {
                 LOG.error("Request failed: {}", 
response.getClientResponseStatus().getStatusCode());
-                return (T) response.getEntity(method.getReturnType());
+                throw FalconWebException.newInstanceException(response.
+                        getEntity(APIResult.class).getMessage(), 
Response.Status.BAD_REQUEST);
             } else {
                 LOG.error("Request failed: {}", 
response.getClientResponseStatus().getStatusCode());
                 throw new FalconException(response.getEntity(String.class));
             }
+        } catch (FalconWebException falconWebException) {
+            LOG.error("Request failed", falconWebException);
+            throw falconWebException;
         } catch (Throwable e) {
             LOG.error("Request failed", e);
             throw new FalconException(e);

http://git-wip-us.apache.org/repos/asf/falcon/blob/205465a8/prism/src/main/java/org/apache/falcon/resource/proxy/InstanceManagerProxy.java
----------------------------------------------------------------------
diff --git 
a/prism/src/main/java/org/apache/falcon/resource/proxy/InstanceManagerProxy.java
 
b/prism/src/main/java/org/apache/falcon/resource/proxy/InstanceManagerProxy.java
index 96c99f0..801bd10 100644
--- 
a/prism/src/main/java/org/apache/falcon/resource/proxy/InstanceManagerProxy.java
+++ 
b/prism/src/main/java/org/apache/falcon/resource/proxy/InstanceManagerProxy.java
@@ -619,10 +619,13 @@ public class InstanceManagerProxy extends 
AbstractInstanceManager {
                 try {
                     T resultHolder = doExecute(colo);
                     results.put(colo, resultHolder);
+                } catch (FalconWebException e){
+                    APIResult result = (APIResult)e.getResponse().getEntity();
+                    results.put(colo, 
getResultInstance(APIResult.Status.FAILED, result.getMessage()));
                 } catch (Throwable e) {
                     LOG.error("Failed to fetch results for colo:{}", colo, e);
                     results.put(colo, 
getResultInstance(APIResult.Status.FAILED,
-                            e.getClass().getName() + "::" + e.getMessage()));
+                        e.getClass().getName() + "::" + e.getMessage()));
                 }
             }
             T finalResult = consolidateResult(results, clazz);

Reply via email to