ATLAS-4845 : Atlas Import is failing with fetchType: Incremental if there are no changes between two consecutive runs

Signed-off-by: Pinal Shah <pinal.shah@freestoneinfotech.com>
diff --git a/intg/src/main/java/org/apache/atlas/model/impexp/AtlasExportRequest.java b/intg/src/main/java/org/apache/atlas/model/impexp/AtlasExportRequest.java
index b03b386..878b1d8 100644
--- a/intg/src/main/java/org/apache/atlas/model/impexp/AtlasExportRequest.java
+++ b/intg/src/main/java/org/apache/atlas/model/impexp/AtlasExportRequest.java
@@ -62,6 +62,7 @@
     public static final String MATCH_TYPE_CONTAINS = "contains";
     public static final String MATCH_TYPE_MATCHES = "matches";
     public static final String MATCH_TYPE_FOR_TYPE = "forType";
+    public static final String OMIT_ZIP_RESPONSE_FOR_EMPTY_EXPORT = "omitZipResponseForEmptyExport";
 
     private List<AtlasObjectId> itemsToExport = new ArrayList<>();
     private Map<String, Object> options = new HashMap<>();
@@ -151,6 +152,25 @@
         }
     }
 
+    public Boolean getOmitZipResponseForEmptyExport() {
+
+        if (MapUtils.isEmpty(getOptions()) ||
+                !getOptions().containsKey(AtlasExportRequest.OMIT_ZIP_RESPONSE_FOR_EMPTY_EXPORT)) {
+            return false;
+        }
+
+        Object o = getOptions().get(AtlasExportRequest.OMIT_ZIP_RESPONSE_FOR_EMPTY_EXPORT);
+        if (o instanceof String) {
+            return Boolean.parseBoolean((String) o);
+        }
+
+        if (o instanceof Boolean) {
+            return (Boolean) o;
+        }
+
+        return false;
+    }
+
     public StringBuilder toString(StringBuilder sb) {
         if (sb == null) {
             sb = new StringBuilder();
diff --git a/repository/src/main/java/org/apache/atlas/repository/impexp/ZipSink.java b/repository/src/main/java/org/apache/atlas/repository/impexp/ZipSink.java
index 5cec39d..4bb7313 100644
--- a/repository/src/main/java/org/apache/atlas/repository/impexp/ZipSink.java
+++ b/repository/src/main/java/org/apache/atlas/repository/impexp/ZipSink.java
@@ -127,4 +127,8 @@
     private void recordAddedEntityGuids(AtlasEntity entity) {
         guids.add(entity.getGuid());
     }
+
+    public Set<String> getGuids() {
+        return guids;
+    }
 }
diff --git a/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java b/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java
index 3a7777a..89d1dd3 100755
--- a/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java
+++ b/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java
@@ -127,6 +127,7 @@
 import java.util.stream.Collectors;
 
 import static org.apache.atlas.web.filters.AtlasCSRFPreventionFilter.CSRF_TOKEN;
+import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT;
 
 
 /**
@@ -624,7 +625,6 @@
                                                          Servlets.getHostName(httpServletRequest),
                                                          AtlasAuthorizationUtils.getRequestIpAddress(httpServletRequest));
 
-            exportSink.close();
 
             httpServletResponse.addHeader("Content-Encoding","gzip");
             httpServletResponse.setContentType("application/zip");
@@ -632,9 +632,20 @@
                                           "attachment; filename=" + result.getClass().getSimpleName());
             httpServletResponse.setHeader("Transfer-Encoding", "chunked");
 
-            httpServletResponse.getOutputStream().flush();
             isSuccessful = true;
-            return Response.ok().build();
+            if (CollectionUtils.isNotEmpty(exportSink.getGuids())) {
+                httpServletResponse.getOutputStream().flush();
+                return Response.ok().build();
+            } else {
+                if (request.getOmitZipResponseForEmptyExport()) {
+                    httpServletResponse.setStatus(SC_NO_CONTENT);
+                    httpServletResponse.getOutputStream().flush();
+                    return Response.status(Response.Status.NO_CONTENT).build();
+                } else {
+                    httpServletResponse.getOutputStream().flush();
+                    return Response.ok().build();
+                }
+            }
         } catch (IOException excp) {
             LOG.error("export() failed", excp);