From 7448b100f3065ad2db80dc6a0b9429e0ffa6679e Mon Sep 17 00:00:00 2001
From: Shinsuke Sugaya <shinsuke@apache.org>
Date: Thu, 16 Jan 2020 07:05:20 +0900
Subject: [PATCH] fix #2365 add job name

---
 .../fess/app/job/ScriptExecutorJob.java       | 10 ++++++++
 .../java/org/codelibs/fess/exec/Crawler.java  |  2 ++
 .../org/codelibs/fess/helper/JobHelper.java   | 10 ++++++++
 .../java/org/codelibs/fess/job/CrawlJob.java  |  8 +-----
 .../java/org/codelibs/fess/job/ExecJob.java   | 25 +++++++++++++++++++
 .../fess/job/GenerateThumbnailJob.java        |  8 +-----
 .../org/codelibs/fess/job/SuggestJob.java     |  8 +-----
 .../fess/mylasta/mail/CrawlerPostcard.java    | 15 ++++++++---
 src/main/resources/mail/crawler.dfmail        |  1 +
 9 files changed, 63 insertions(+), 24 deletions(-)

diff --git a/src/main/java/org/codelibs/fess/app/job/ScriptExecutorJob.java b/src/main/java/org/codelibs/fess/app/job/ScriptExecutorJob.java
index 2be61034d..7bfa3211e 100644
--- a/src/main/java/org/codelibs/fess/app/job/ScriptExecutorJob.java
+++ b/src/main/java/org/codelibs/fess/app/job/ScriptExecutorJob.java
@@ -36,6 +36,16 @@ public class ScriptExecutorJob implements LaJob {
 
     @Override
     public void run(final LaJobRuntime runtime) {
+        final JobHelper jobHelper = ComponentUtil.getJobHelper();
+        try {
+            jobHelper.setJobRuntime(runtime);
+            process(runtime);
+        } finally {
+            jobHelper.setJobRuntime(null);
+        }
+    }
+
+    protected void process(final LaJobRuntime runtime) {
         if (!runtime.getParameterMap().containsKey(Constants.SCHEDULED_JOB)) {
             logger.warn(Constants.SCHEDULED_JOB + " is empty.");
             return;
diff --git a/src/main/java/org/codelibs/fess/exec/Crawler.java b/src/main/java/org/codelibs/fess/exec/Crawler.java
index ae18f29ae..8a40a260c 100644
--- a/src/main/java/org/codelibs/fess/exec/Crawler.java
+++ b/src/main/java/org/codelibs/fess/exec/Crawler.java
@@ -392,6 +392,7 @@ public class Crawler {
 
             logger.debug("\ninfoMap: {}\ndataMap: {}", infoMap, dataMap);
 
+            final DynamicProperties systemProperties = ComponentUtil.getSystemProperties();
             final Postbox postbox = ComponentUtil.getComponent(Postbox.class);
             CrawlerPostcard.droppedInto(postbox, postcard -> {
                 postcard.setFrom(fessConfig.getMailFromAddress(), fessConfig.getMailFromName());
@@ -418,6 +419,7 @@ public class Crawler {
                 } else {
                     postcard.setStatus(Constants.FAIL);
                 }
+                postcard.setJobname(systemProperties.getProperty("job.runtime.name", StringUtil.EMPTY));
             });
         }
     }
diff --git a/src/main/java/org/codelibs/fess/helper/JobHelper.java b/src/main/java/org/codelibs/fess/helper/JobHelper.java
index 12c6ae491..ad538da3a 100644
--- a/src/main/java/org/codelibs/fess/helper/JobHelper.java
+++ b/src/main/java/org/codelibs/fess/helper/JobHelper.java
@@ -35,6 +35,7 @@ import org.codelibs.fess.util.ComponentUtil;
 import org.dbflute.optional.OptionalThing;
 import org.lastaflute.job.JobManager;
 import org.lastaflute.job.LaCron;
+import org.lastaflute.job.LaJobRuntime;
 import org.lastaflute.job.LaScheduledJob;
 import org.lastaflute.job.key.LaJobUnique;
 import org.lastaflute.job.subsidiary.CronParamsSupplier;
@@ -44,6 +45,8 @@ public class JobHelper {
 
     protected int monitorInterval = 60 * 60;// 1hour
 
+    protected ThreadLocal<LaJobRuntime> jobRuntimeLocal = new ThreadLocal<>();
+
     public void register(final ScheduledJob scheduledJob) {
         final JobManager jobManager = ComponentUtil.getJobManager();
         jobManager.schedule(cron -> register(cron, scheduledJob));
@@ -186,4 +189,11 @@ public class JobHelper {
 
     }
 
+    public void setJobRuntime(LaJobRuntime runtime) {
+        jobRuntimeLocal.set(runtime);
+    }
+
+    public LaJobRuntime getJobRuntime() {
+        return jobRuntimeLocal.get();
+    }
 }
diff --git a/src/main/java/org/codelibs/fess/job/CrawlJob.java b/src/main/java/org/codelibs/fess/job/CrawlJob.java
index 5c9d06c2a..a348c1fd7 100644
--- a/src/main/java/org/codelibs/fess/job/CrawlJob.java
+++ b/src/main/java/org/codelibs/fess/job/CrawlJob.java
@@ -18,12 +18,10 @@ package org.codelibs.fess.job;
 import static org.codelibs.core.stream.StreamUtil.stream;
 
 import java.io.File;
-import java.io.FileOutputStream;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
-import java.util.Properties;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import javax.servlet.ServletContext;
@@ -331,11 +329,7 @@ public class CrawlJob extends ExecJob {
         try {
             cmdList.add("-p");
             cmdList.add(propFile.getAbsolutePath());
-            try (FileOutputStream out = new FileOutputStream(propFile)) {
-                final Properties prop = new Properties();
-                prop.putAll(ComponentUtil.getSystemProperties());
-                prop.store(out, cmdList.toString());
-            }
+            createSystemProperties(cmdList, propFile);
 
             final File baseDir = new File(servletContext.getRealPath("/WEB-INF")).getParentFile();
 
diff --git a/src/main/java/org/codelibs/fess/job/ExecJob.java b/src/main/java/org/codelibs/fess/job/ExecJob.java
index dbdb533e6..606716dcf 100644
--- a/src/main/java/org/codelibs/fess/job/ExecJob.java
+++ b/src/main/java/org/codelibs/fess/job/ExecJob.java
@@ -16,16 +16,23 @@
 package org.codelibs.fess.job;
 
 import java.io.File;
+import java.io.FileOutputStream;
 import java.io.FilenameFilter;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Properties;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.codelibs.core.timer.TimeoutManager;
 import org.codelibs.core.timer.TimeoutTask;
+import org.codelibs.fess.Constants;
+import org.codelibs.fess.es.config.exentity.ScheduledJob;
 import org.codelibs.fess.util.ComponentUtil;
+import org.lastaflute.di.exception.IORuntimeException;
+import org.lastaflute.job.LaJobRuntime;
 
 public abstract class ExecJob {
 
@@ -157,4 +164,22 @@ public abstract class ExecJob {
             processTimeout = true;
         }, timeout, false);
     }
+
+    protected void createSystemProperties(final List<String> cmdList, final File propFile) {
+        try (FileOutputStream out = new FileOutputStream(propFile)) {
+            final Properties prop = new Properties();
+            prop.putAll(ComponentUtil.getSystemProperties());
+            final LaJobRuntime jobRuntime = ComponentUtil.getJobHelper().getJobRuntime();
+            if (jobRuntime != null) {
+                final ScheduledJob job = (ScheduledJob) jobRuntime.getParameterMap().get(Constants.SCHEDULED_JOB);
+                if (job != null) {
+                    prop.setProperty("job.runtime.id", job.getId());
+                    prop.setProperty("job.runtime.name", job.getName());
+                }
+            }
+            prop.store(out, cmdList.toString());
+        } catch (final IOException e) {
+            throw new IORuntimeException(e);
+        }
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/org/codelibs/fess/job/GenerateThumbnailJob.java b/src/main/java/org/codelibs/fess/job/GenerateThumbnailJob.java
index eccb74070..5697a143e 100644
--- a/src/main/java/org/codelibs/fess/job/GenerateThumbnailJob.java
+++ b/src/main/java/org/codelibs/fess/job/GenerateThumbnailJob.java
@@ -18,10 +18,8 @@ package org.codelibs.fess.job;
 import static org.codelibs.core.stream.StreamUtil.stream;
 
 import java.io.File;
-import java.io.FileOutputStream;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Properties;
 
 import javax.servlet.ServletContext;
 
@@ -212,11 +210,7 @@ public class GenerateThumbnailJob extends ExecJob {
         try {
             cmdList.add("-p");
             cmdList.add(propFile.getAbsolutePath());
-            try (FileOutputStream out = new FileOutputStream(propFile)) {
-                final Properties prop = new Properties();
-                prop.putAll(ComponentUtil.getSystemProperties());
-                prop.store(out, cmdList.toString());
-            }
+            createSystemProperties(cmdList, propFile);
 
             final File baseDir = new File(servletContext.getRealPath("/WEB-INF")).getParentFile();
 
diff --git a/src/main/java/org/codelibs/fess/job/SuggestJob.java b/src/main/java/org/codelibs/fess/job/SuggestJob.java
index ea8e6c55f..bda2623b8 100644
--- a/src/main/java/org/codelibs/fess/job/SuggestJob.java
+++ b/src/main/java/org/codelibs/fess/job/SuggestJob.java
@@ -18,10 +18,8 @@ package org.codelibs.fess.job;
 import static org.codelibs.core.stream.StreamUtil.stream;
 
 import java.io.File;
-import java.io.FileOutputStream;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Properties;
 
 import javax.servlet.ServletContext;
 
@@ -194,11 +192,7 @@ public class SuggestJob extends ExecJob {
         try {
             cmdList.add("-p");
             cmdList.add(propFile.getAbsolutePath());
-            try (FileOutputStream out = new FileOutputStream(propFile)) {
-                final Properties prop = new Properties();
-                prop.putAll(ComponentUtil.getSystemProperties());
-                prop.store(out, cmdList.toString());
-            }
+            createSystemProperties(cmdList, propFile);
 
             final File baseDir = new File(servletContext.getRealPath("/WEB-INF")).getParentFile();
 
diff --git a/src/main/java/org/codelibs/fess/mylasta/mail/CrawlerPostcard.java b/src/main/java/org/codelibs/fess/mylasta/mail/CrawlerPostcard.java
index 9b144b8e9..875a1921b 100644
--- a/src/main/java/org/codelibs/fess/mylasta/mail/CrawlerPostcard.java
+++ b/src/main/java/org/codelibs/fess/mylasta/mail/CrawlerPostcard.java
@@ -50,9 +50,9 @@ public class CrawlerPostcard extends LaTypicalPostcard {
 
     @Override
     protected String[] getPropertyNames() {
-        return new String[] { "hostname", "webFsCrawlStartTime", "webFsCrawlEndTime", "webFsCrawlExecTime", "webFsIndexExecTime",
-                "webFsIndexSize", "dataCrawlStartTime", "dataCrawlEndTime", "dataCrawlExecTime", "dataIndexExecTime", "dataIndexSize",
-                "crawlerStartTime", "crawlerEndTime", "crawlerExecTime", "status" };
+        return new String[] { "hostname", "jobname", "webFsCrawlStartTime", "webFsCrawlEndTime", "webFsCrawlExecTime",
+                "webFsIndexExecTime", "webFsIndexSize", "dataCrawlStartTime", "dataCrawlEndTime", "dataCrawlExecTime", "dataIndexExecTime",
+                "dataIndexSize", "crawlerStartTime", "crawlerEndTime", "crawlerExecTime", "status" };
     }
 
     // ===================================================================================
@@ -109,6 +109,15 @@ public class CrawlerPostcard extends LaTypicalPostcard {
         registerVariable("hostname", hostname);
     }
 
+    /**
+     * Set the value of jobname, used in parameter comment. <br>
+     * Even if empty string, treated as empty plainly. So "IF pmb != null" is false if empty.
+     * @param jobname The parameter value of jobname. (NotNull)
+     */
+    public void setJobname(String jobname) {
+        registerVariable("jobname", jobname);
+    }
+
     /**
      * Set the value of webFsCrawlStartTime, used in parameter comment. <br>
      * Even if empty string, treated as empty plainly. So "IF pmb != null" is false if empty.
diff --git a/src/main/resources/mail/crawler.dfmail b/src/main/resources/mail/crawler.dfmail
index 4dc8c0a1c..e01fc21b7 100644
--- a/src/main/resources/mail/crawler.dfmail
+++ b/src/main/resources/mail/crawler.dfmail
@@ -6,6 +6,7 @@ subject: [FESS] Crawler completed: /*pmb.hostname*/
 >>>
 --- Server Info ---
 Host Name: /*pmb.hostname:orElse('Unknown')*/
+Job Name: /*pmb.jobname:orElse('Unknown')*/
 
 --- Web/FileSystem Crawler ---
 Start Time: /*pmb.webFsCrawlStartTime:orElse('-')*/
-- 
GitLab