diff --git a/app/aem/api/src/main/java/com/cognifide/apm/api/services/ExecutionResult.java b/app/aem/api/src/main/java/com/cognifide/apm/api/services/ExecutionResult.java index 5d3d3add..d67a0969 100644 --- a/app/aem/api/src/main/java/com/cognifide/apm/api/services/ExecutionResult.java +++ b/app/aem/api/src/main/java/com/cognifide/apm/api/services/ExecutionResult.java @@ -20,6 +20,7 @@ package com.cognifide.apm.api.services; import com.cognifide.apm.api.status.Status; +import java.util.Calendar; import java.util.List; public interface ExecutionResult { @@ -32,6 +33,8 @@ public interface ExecutionResult { String getExecutor(); + Calendar getStartTime(); + long determineExecutionDuration(); interface Entry { diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/ScriptExecutionServlet.java b/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/ScriptExecutionServlet.java index 95606657..d8a3a98a 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/ScriptExecutionServlet.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/ScriptExecutionServlet.java @@ -77,12 +77,16 @@ protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse r return ResponseEntity.ok("Script successfully executed") .addEntry("status", status.getStatus()) .addEntry("output", ((ExecutionStatus.FinishedSuccessfulExecution) status).getEntries()) - .addEntry("path", ((ExecutionStatus.FinishedSuccessfulExecution) status).getPath()); + .addEntry("path", ((ExecutionStatus.FinishedSuccessfulExecution) status).getPath()) + .addEntry("timestamp", ((ExecutionStatus.FinishedSuccessfulExecution) status).getTimestamp()) + .addEntry("formattedDate", ((ExecutionStatus.FinishedSuccessfulExecution) status).getFormattedDate()); } else if (status instanceof ExecutionStatus.FinishedFailedExecution) { return ResponseEntity.internalServerError("Errors while executing script") .addEntry("status", status.getStatus()) .addEntry("output", ((ExecutionStatus.FinishedFailedExecution) status).getEntries()) .addEntry("path", ((ExecutionStatus.FinishedFailedExecution) status).getPath()) + .addEntry("timestamp", ((ExecutionStatus.FinishedFailedExecution) status).getTimestamp()) + .addEntry("formattedDate", ((ExecutionStatus.FinishedFailedExecution) status).getFormattedDate()) .addEntry("errors", ((ExecutionStatus.FinishedFailedExecution) status).getError().getMessages()); } else { return ResponseEntity.ok("Script is still being processed") diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/history/HistoryImpl.java b/app/aem/core/src/main/java/com/cognifide/apm/core/history/HistoryImpl.java index 95f6d562..6bf7fe47 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/history/HistoryImpl.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/history/HistoryImpl.java @@ -79,7 +79,7 @@ public class HistoryImpl implements History { public HistoryEntry logLocal(Script script, ExecutionMode mode, Progress progressLogger) { return SlingHelper.resolveDefault(resolverProvider, resolver -> { HistoryEntryWriter historyEntryWriter = createBuilder(resolver, script, mode, progressLogger) - .executionTime(Calendar.getInstance()) + .executionTime(progressLogger.getStartTime()) .executionDuration(progressLogger.determineExecutionDuration()) .build(); return createHistoryEntry(resolver, script, mode, historyEntryWriter); diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/progress/ProgressImpl.java b/app/aem/core/src/main/java/com/cognifide/apm/core/progress/ProgressImpl.java index 5fed899a..241d415a 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/progress/ProgressImpl.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/progress/ProgressImpl.java @@ -29,6 +29,7 @@ import com.cognifide.apm.core.logger.ProgressEntry; import com.google.common.collect.Lists; import java.util.ArrayList; +import java.util.Calendar; import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -40,7 +41,7 @@ public class ProgressImpl implements Progress { private final String executor; - private final long startTime; + private final Calendar startTime; public ProgressImpl(String executor) { this(executor, new LinkedList<>()); @@ -49,7 +50,7 @@ public ProgressImpl(String executor) { public ProgressImpl(String executor, List entries) { this.executor = executor; this.entries = entries; - this.startTime = System.currentTimeMillis(); + this.startTime = Calendar.getInstance(); } @Override @@ -131,8 +132,13 @@ public String getExecutor() { return executor; } + @Override + public Calendar getStartTime() { + return startTime; + } + @Override public long determineExecutionDuration() { - return (System.currentTimeMillis() - startTime) / 1000; + return (System.currentTimeMillis() - startTime.getTimeInMillis()) / 1000; } } diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/services/async/AsyncScriptExecutorImpl.java b/app/aem/core/src/main/java/com/cognifide/apm/core/services/async/AsyncScriptExecutorImpl.java index 4f099538..5e2c535a 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/services/async/AsyncScriptExecutorImpl.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/services/async/AsyncScriptExecutorImpl.java @@ -26,6 +26,7 @@ import com.cognifide.apm.core.jobs.JobResultsCache; import com.cognifide.apm.core.jobs.JobResultsCache.ExecutionSummary; import com.cognifide.apm.core.jobs.ScriptRunnerJobConsumer; +import com.cognifide.apm.core.ui.utils.DateFormatter; import com.google.common.collect.ImmutableMap; import java.util.List; import java.util.Map; @@ -86,12 +87,14 @@ public ExecutionStatus checkStatus(String id) { private ExecutionStatus finishedExecution(ExecutionSummary executionSummary) { String path = executionSummary.getPath(); + long timestamp = executionSummary.getResult().getStartTime().getTimeInMillis(); + String formattedDate = DateFormatter.determineFormattedDate(executionSummary.getResult().getStartTime()); List entries = executionSummary.getResult().getEntries(); ExecutionResult.Entry errorEntry = executionSummary.getResult().getLastError(); if (errorEntry != null) { - return new ExecutionStatus.FinishedFailedExecution(path, entries, errorEntry); + return new ExecutionStatus.FinishedFailedExecution(path, timestamp, formattedDate, entries, errorEntry); } else { - return new ExecutionStatus.FinishedSuccessfulExecution(path, entries); + return new ExecutionStatus.FinishedSuccessfulExecution(path, timestamp, formattedDate, entries); } } } diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/services/async/ExecutionStatus.java b/app/aem/core/src/main/java/com/cognifide/apm/core/services/async/ExecutionStatus.java index 533ead12..cdb59850 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/services/async/ExecutionStatus.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/services/async/ExecutionStatus.java @@ -48,15 +48,21 @@ public UnknownExecution() { } } - public static class FinishedSuccessfulExecution extends ExecutionStatus { + protected static class FinishedExecutionStatus extends ExecutionStatus { private final String path; + private final long timestamp; + + private final String formattedDate; + private final List entries; - public FinishedSuccessfulExecution(String path, List entries) { + public FinishedExecutionStatus(String path, long timestamp, String formattedDate, List entries) { super("finished"); this.path = path; + this.timestamp = timestamp; + this.formattedDate = formattedDate; this.entries = entries; } @@ -64,34 +70,35 @@ public String getPath() { return path; } + public long getTimestamp() { + return timestamp; + } + + public String getFormattedDate() { + return formattedDate; + } + public List getEntries() { return entries; } } - public static class FinishedFailedExecution extends ExecutionStatus { + public static class FinishedSuccessfulExecution extends FinishedExecutionStatus { - private final String path; + public FinishedSuccessfulExecution(String path, long timestamp, String formattedDate, List entries) { + super(path, timestamp, formattedDate, entries); + } + } - private final List entries; + public static class FinishedFailedExecution extends FinishedExecutionStatus { private final ExecutionResult.Entry error; - public FinishedFailedExecution(String path, List entries, ExecutionResult.Entry error) { - super("finished"); - this.path = path; - this.entries = entries; + public FinishedFailedExecution(String path, long timestamp, String formattedDate, List entries, ExecutionResult.Entry error) { + super(path, timestamp, formattedDate, entries); this.error = error; } - public String getPath() { - return path; - } - - public List getEntries() { - return entries; - } - public ExecutionResult.Entry getError() { return error; } diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/ui/utils/DateFormatter.java b/app/aem/core/src/main/java/com/cognifide/apm/core/ui/utils/DateFormatter.java new file mode 100644 index 00000000..901008d1 --- /dev/null +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/ui/utils/DateFormatter.java @@ -0,0 +1,31 @@ +package com.cognifide.apm.core.ui.utils; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import javax.annotation.PostConstruct; +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.injectorspecific.RequestAttribute; + +@Model(adaptables = {SlingHttpServletRequest.class}) +public class DateFormatter { + + @RequestAttribute + private Calendar date; + + private String formattedDate; + + @PostConstruct + private void afterCreated() { + formattedDate = determineFormattedDate(date); + } + + public static String determineFormattedDate(Calendar date) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return simpleDateFormat.format(date.getTime()); + } + + public String getFormattedDate() { + return formattedDate; + } +} diff --git a/app/aem/ui.apps.base/src/main/content/jcr_root/apps/apm/clientlibs/views/scripts/js/apm-scripts.js b/app/aem/ui.apps.base/src/main/content/jcr_root/apps/apm/clientlibs/views/scripts/js/apm-scripts.js index ddc543c0..7709d85c 100644 --- a/app/aem/ui.apps.base/src/main/content/jcr_root/apps/apm/clientlibs/views/scripts/js/apm-scripts.js +++ b/app/aem/ui.apps.base/src/main/content/jcr_root/apps/apm/clientlibs/views/scripts/js/apm-scripts.js @@ -85,15 +85,11 @@ this.$cell.html(''); }, - showRunStatus: function (success, summaryPath) { + showRunStatus: function (success, summaryPath, timestamp, formattedDate) { let icon = success ? 'check' : 'close'; let href = '/apm/summary.html' + summaryPath; - this.$cell.html('' - + ''); + this.$cell.html('' + + ''); }, updateScript: function () { @@ -131,11 +127,11 @@ this.status = ScriptStatus.FINISHED; const runStatus = getRunStatus(data); showMessageOnFinished(this.mode, runStatus); - this.showRunStatus(runStatus !== RunStatus.ERROR, data.path); + this.showRunStatus(runStatus !== RunStatus.ERROR, data.path, data.timestamp, data.formattedDate); } else if (data.type === 'unknown') { this.status = ScriptStatus.FINISHED; showMessageOnUnknown(this.mode, self.job.message); - this.showRunStatus(false, ''); + this.showRunStatus(false, '', '', ''); } }, diff --git a/app/aem/ui.apps.base/src/main/content/jcr_root/apps/apm/components/historyRow/historyRow.html b/app/aem/ui.apps.base/src/main/content/jcr_root/apps/apm/components/historyRow/historyRow.html index 95252186..767df6db 100644 --- a/app/aem/ui.apps.base/src/main/content/jcr_root/apps/apm/components/historyRow/historyRow.html +++ b/app/aem/ui.apps.base/src/main/content/jcr_root/apps/apm/components/historyRow/historyRow.html @@ -32,9 +32,8 @@ diff --git a/app/aem/ui.apps.base/src/main/content/jcr_root/apps/apm/components/scriptsRow/scriptsRow.html b/app/aem/ui.apps.base/src/main/content/jcr_root/apps/apm/components/scriptsRow/scriptsRow.html index 08282e8a..d78a7c59 100644 --- a/app/aem/ui.apps.base/src/main/content/jcr_root/apps/apm/components/scriptsRow/scriptsRow.html +++ b/app/aem/ui.apps.base/src/main/content/jcr_root/apps/apm/components/scriptsRow/scriptsRow.html @@ -33,8 +33,8 @@ @@ -53,8 +53,8 @@ diff --git a/app/aem/ui.apps.base/src/main/content/jcr_root/apps/apm/components/summaryTable/summaryTable.html b/app/aem/ui.apps.base/src/main/content/jcr_root/apps/apm/components/summaryTable/summaryTable.html index e9867e5e..352a869f 100644 --- a/app/aem/ui.apps.base/src/main/content/jcr_root/apps/apm/components/summaryTable/summaryTable.html +++ b/app/aem/ui.apps.base/src/main/content/jcr_root/apps/apm/components/summaryTable/summaryTable.html @@ -22,7 +22,13 @@ Script: ${item.entry.scriptName} User: ${item.entry.executor} - Duration: ${item.entry.executionDuration}s + Start time: + + + Duration: ${item.entry.executionDuration}s