azkaban-aplcache

Details

diff --git a/azkaban-common/src/main/java/azkaban/executor/ExecutableFlow.java b/azkaban-common/src/main/java/azkaban/executor/ExecutableFlow.java
index 5a77a3e..806106c 100644
--- a/azkaban-common/src/main/java/azkaban/executor/ExecutableFlow.java
+++ b/azkaban-common/src/main/java/azkaban/executor/ExecutableFlow.java
@@ -38,13 +38,18 @@ public class ExecutableFlow extends ExecutableFlowBase {
   public static final String VERSION_PARAM = "version";
   public static final String PROXYUSERS_PARAM = "proxyUsers";
   public static final String PROJECTNAME_PARAM = "projectName";
+  public static final String LASTMODIFIEDTIME_PARAM = "lastModfiedTime";
+  public static final String LASTMODIFIEDUSER_PARAM = "lastModifiedUser";
+
 
   private int executionId = -1;
   private int scheduleId = -1;
   private int projectId;
   private String projectName;
+  private String lastModifiedUser;
   private int version;
   private long submitTime = -1;
+  private long lastModifiedTimestamp;
   private String submitUser;
   private String executionPath;
 
@@ -56,7 +61,8 @@ public class ExecutableFlow extends ExecutableFlowBase {
     this.projectName = project.getName();
     this.version = project.getVersion();
     this.scheduleId = -1;
-
+    this.lastModifiedTimestamp = project.getLastModifiedTimestamp();
+    this.lastModifiedUser = project.getLastModifiedUser();
     this.setFlow(project, flow);
   }
 
@@ -113,6 +119,24 @@ public class ExecutableFlow extends ExecutableFlowBase {
   }
 
   @Override
+  public long getLastModifiedTimestamp() {
+    return lastModifiedTimestamp;
+  }
+
+  public void setLastModifiedTimestamp(long lastModifiedTimestamp) {
+    this.lastModifiedTimestamp = lastModifiedTimestamp;
+  }
+
+  @Override
+  public String getLastModifiedByUser() {
+    return lastModifiedUser;
+  }
+
+  public void setLastModifiedByUser(String lastModifiedUser) {
+    this.lastModifiedUser = lastModifiedUser;
+  }
+
+  @Override
   public int getProjectId() {
     return projectId;
   }
@@ -183,6 +207,8 @@ public class ExecutableFlow extends ExecutableFlowBase {
 
     flowObj.put(SUBMITUSER_PARAM, submitUser);
     flowObj.put(VERSION_PARAM, version);
+    flowObj.put(LASTMODIFIEDTIME_PARAM, lastModifiedTimestamp);
+    flowObj.put(LASTMODIFIEDUSER_PARAM, lastModifiedUser);
 
     flowObj.put(EXECUTIONOPTIONS_PARAM, this.executionOptions.toObject());
     flowObj.put(VERSION_PARAM, version);
@@ -217,6 +243,8 @@ public class ExecutableFlow extends ExecutableFlowBase {
     this.scheduleId = flowObj.getInt(SCHEDULEID_PARAM);
     this.submitUser = flowObj.getString(SUBMITUSER_PARAM);
     this.version = flowObj.getInt(VERSION_PARAM);
+    this.lastModifiedTimestamp = flowObj.getLong(LASTMODIFIEDTIME_PARAM);
+    this.lastModifiedUser = flowObj.getString(LASTMODIFIEDUSER_PARAM);
     this.submitTime = flowObj.getLong(SUBMITTIME_PARAM);
 
     if (flowObj.containsKey(EXECUTIONOPTIONS_PARAM)) {
diff --git a/azkaban-common/src/main/java/azkaban/executor/ExecutableFlowBase.java b/azkaban-common/src/main/java/azkaban/executor/ExecutableFlowBase.java
index fb574fb..41389b6 100644
--- a/azkaban-common/src/main/java/azkaban/executor/ExecutableFlowBase.java
+++ b/azkaban-common/src/main/java/azkaban/executor/ExecutableFlowBase.java
@@ -87,6 +87,22 @@ public class ExecutableFlowBase extends ExecutableNode {
     return -1;
   }
 
+  public String getLastModifiedByUser() {
+    if (this.getParentFlow() != null) {
+      return this.getParentFlow().getLastModifiedByUser();
+    }
+
+    return null;
+  }
+
+  public long getLastModifiedTimestamp() {
+    if (this.getParentFlow() != null) {
+      return this.getParentFlow().getLastModifiedTimestamp();
+    }
+
+    return -1;
+  }
+
   public Collection<FlowProps> getFlowProps() {
     return flowProps.values();
   }
diff --git a/azkaban-common/src/main/java/azkaban/flow/CommonJobProperties.java b/azkaban-common/src/main/java/azkaban/flow/CommonJobProperties.java
index 7c0b774..3d408f2 100644
--- a/azkaban-common/src/main/java/azkaban/flow/CommonJobProperties.java
+++ b/azkaban-common/src/main/java/azkaban/flow/CommonJobProperties.java
@@ -114,6 +114,16 @@ public class CommonJobProperties {
   public static final String PROJECT_NAME = "azkaban.flow.projectname";
 
   /**
+   * The project last modified by user.
+   */
+  public static final String PROJECT_LAST_CHANGED_BY = "azkaban.flow.projectlastchangedby";
+
+  /**
+   * The project last modified on date.
+   */
+  public static final String PROJECT_LAST_CHANGED_DATE = "azkaban.flow.projectlastchangeddate";
+
+  /**
    * The version of the project the flow is running. This may change if a forced
    * hotspot occurs.
    */
diff --git a/azkaban-common/src/main/java/azkaban/utils/PropsUtils.java b/azkaban-common/src/main/java/azkaban/utils/PropsUtils.java
index b397ad4..6fe0ac7 100644
--- a/azkaban-common/src/main/java/azkaban/utils/PropsUtils.java
+++ b/azkaban-common/src/main/java/azkaban/utils/PropsUtils.java
@@ -285,6 +285,8 @@ public class PropsUtils {
     props.put(CommonJobProperties.PROJECT_NAME, flow.getProjectName());
     props.put(CommonJobProperties.PROJECT_VERSION, flow.getVersion());
     props.put(CommonJobProperties.FLOW_UUID, UUID.randomUUID().toString());
+    props.put(CommonJobProperties.PROJECT_LAST_CHANGED_BY, flow.getLastModifiedByUser());
+    props.put(CommonJobProperties.PROJECT_LAST_CHANGED_DATE, flow.getLastModifiedTimestamp());
 
     DateTime loadTime = new DateTime();
 
@@ -299,6 +301,7 @@ public class PropsUtils {
         loadTime.toString("SSS"));
     props.put(CommonJobProperties.FLOW_START_TIMEZONE,
         loadTime.toString("ZZZZ"));
+
     return props;
   }