Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

No exact execution start timestamp and duration #436 #439

Merged
merged 5 commits into from
Mar 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -32,6 +33,8 @@ public interface ExecutionResult {

String getExecutor();

Calendar getStartTime();

long determineExecutionDuration();

interface Entry {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,17 +73,21 @@ public class ScriptExecutionServlet extends SlingAllMethodsServlet {
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
RequestProcessor.process(modelFactory, ScriptExecutionStatusForm.class, request, response, (form, resourceResolver) -> {
ExecutionStatus status = asyncScriptExecutor.checkStatus(form.getId());
if (status instanceof ExecutionStatus.FinishedSuccessfulExecution) {
if (status instanceof ExecutionStatus.Successful) {
return ResponseEntity.ok("Script successfully executed")
.addEntry("status", status.getStatus())
.addEntry("output", ((ExecutionStatus.FinishedSuccessfulExecution) status).getEntries())
.addEntry("path", ((ExecutionStatus.FinishedSuccessfulExecution) status).getPath());
} else if (status instanceof ExecutionStatus.FinishedFailedExecution) {
.addEntry("output", ((ExecutionStatus.Successful) status).getEntries())
.addEntry("path", ((ExecutionStatus.Successful) status).getPath())
.addEntry("timestamp", ((ExecutionStatus.Successful) status).getTimestamp())
.addEntry("formattedDate", ((ExecutionStatus.Successful) status).getFormattedDate());
} else if (status instanceof ExecutionStatus.Failed) {
return ResponseEntity.internalServerError("Errors while executing script")
.addEntry("status", status.getStatus())
.addEntry("output", ((ExecutionStatus.FinishedFailedExecution) status).getEntries())
.addEntry("path", ((ExecutionStatus.FinishedFailedExecution) status).getPath())
.addEntry("errors", ((ExecutionStatus.FinishedFailedExecution) status).getError().getMessages());
.addEntry("output", ((ExecutionStatus.Failed) status).getEntries())
.addEntry("path", ((ExecutionStatus.Failed) status).getPath())
.addEntry("timestamp", ((ExecutionStatus.Failed) status).getTimestamp())
.addEntry("formattedDate", ((ExecutionStatus.Failed) status).getFormattedDate())
.addEntry("errors", ((ExecutionStatus.Failed) status).getError().getMessages());
} else {
return ResponseEntity.ok("Script is still being processed")
.addEntry("status", status.getStatus());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,6 @@ public interface HistoryEntry {

String getChecksum();

Date getUploadTime();

String getExecutionSummaryJson();

String getPath();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,6 @@ public class HistoryEntryImpl implements HistoryEntry {

public static final String PROGRESS_LOG = "summaryJSON";

public static final String UPLOAD_TIME = "uploadTime";

public static final String SCRIPT_CONTENT_PATH = "scriptContentPath";

public static final String INSTANCE_NAME = "instanceName";
Expand Down Expand Up @@ -107,10 +105,6 @@ public class HistoryEntryImpl implements HistoryEntry {
@Named(CHECKSUM)
private String checksum;

@Inject
@Named(UPLOAD_TIME)
private Date uploadTime;

private String executionSummaryJson;

@Inject
Expand Down Expand Up @@ -176,10 +170,6 @@ public String getChecksum() {
return checksum;
}

public Date getUploadTime() {
return uploadTime;
}

public String getExecutionSummaryJson() {
if (executionSummaryJson == null) {
Object progressLog = resource.getValueMap().get(PROGRESS_LOG);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<>());
Expand All @@ -49,7 +50,7 @@ public ProgressImpl(String executor) {
public ProgressImpl(String executor, List<ProgressEntry> entries) {
this.executor = executor;
this.entries = entries;
this.startTime = System.currentTimeMillis();
this.startTime = Calendar.getInstance();
}

@Override
Expand Down Expand Up @@ -131,8 +132,13 @@ public String getExecutor() {
return executor;
}

@Override
public Calendar getStartTime() {
return startTime;
}

@Override
public long determineExecutionDuration() {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

opt-in / if you could use more dedicated types like https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html

return (System.currentTimeMillis() - startTime) / 1000;
return (System.currentTimeMillis() - startTime.getTimeInMillis()) / 1000;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.cognifide.apm.core.jobs.JobResultsCache.ExecutionSummary;
import com.cognifide.apm.core.jobs.ScriptRunnerJobConsumer;
import com.google.common.collect.ImmutableMap;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import java.util.UUID;
Expand Down Expand Up @@ -76,22 +77,23 @@ public String process(Script script, ExecutionMode executionMode, Map<String, St
public ExecutionStatus checkStatus(String id) {
ExecutionSummary executionSummary = jobResultsCache.get(id);
if (executionSummary == null) {
return new ExecutionStatus.UnknownExecution();
return new ExecutionStatus.Unknown();
} else if (executionSummary.isFinished()) {
return finishedExecution(executionSummary);
} else {
return new ExecutionStatus.RunningExecution();
return new ExecutionStatus.Running();
}
}

private ExecutionStatus finishedExecution(ExecutionSummary executionSummary) {
String path = executionSummary.getPath();
Calendar startTime = executionSummary.getResult().getStartTime();
List<ExecutionResult.Entry> entries = executionSummary.getResult().getEntries();
ExecutionResult.Entry errorEntry = executionSummary.getResult().getLastError();
if (errorEntry != null) {
return new ExecutionStatus.FinishedFailedExecution(path, entries, errorEntry);
return new ExecutionStatus.Failed(path, startTime, entries, errorEntry);
} else {
return new ExecutionStatus.FinishedSuccessfulExecution(path, entries);
return new ExecutionStatus.Successful(path, startTime, entries);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
package com.cognifide.apm.core.services.async;

import com.cognifide.apm.api.services.ExecutionResult;
import com.cognifide.apm.core.ui.utils.DateFormatter;
import java.util.Calendar;
import java.util.List;

public abstract class ExecutionStatus {
Expand All @@ -34,64 +36,71 @@ public String getStatus() {
return status;
}

public static class RunningExecution extends ExecutionStatus {
public static class Running extends ExecutionStatus {

public RunningExecution() {
public Running() {
super("running");
}
}

public static class UnknownExecution extends ExecutionStatus {
public static class Unknown extends ExecutionStatus {

public UnknownExecution() {
public Unknown() {
super("unknown");
}
}

public static class FinishedSuccessfulExecution extends ExecutionStatus {
protected static class Finished extends ExecutionStatus {

private final String path;

private final long timestamp;

private final String formattedDate;

private final List<ExecutionResult.Entry> entries;

public FinishedSuccessfulExecution(String path, List<ExecutionResult.Entry> entries) {
public Finished(String path, Calendar startTime, List<ExecutionResult.Entry> entries) {
super("finished");
this.path = path;
this.timestamp = startTime.getTimeInMillis();
this.formattedDate = DateFormatter.format(startTime);
this.entries = entries;
}

public String getPath() {
return path;
}

public long getTimestamp() {
return timestamp;
}

public String getFormattedDate() {
return formattedDate;
}

public List<ExecutionResult.Entry> getEntries() {
return entries;
}
}

public static class FinishedFailedExecution extends ExecutionStatus {
public static class Successful extends Finished {

private final String path;
public Successful(String path, Calendar startTime, List<ExecutionResult.Entry> entries) {
super(path, startTime, entries);
}
}

private final List<ExecutionResult.Entry> entries;
public static class Failed extends Finished {

private final ExecutionResult.Entry error;

public FinishedFailedExecution(String path, List<ExecutionResult.Entry> entries, ExecutionResult.Entry error) {
super("finished");
this.path = path;
this.entries = entries;
public Failed(String path, Calendar startTime, List<ExecutionResult.Entry> entries, ExecutionResult.Entry error) {
super(path, startTime, entries);
this.error = error;
}

public String getPath() {
return path;
}

public List<ExecutionResult.Entry> getEntries() {
return entries;
}

public ExecutionResult.Entry getError() {
return error;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/*-
* ========================LICENSE_START=================================
* AEM Permission Management
* %%
* Copyright (C) 2013 Wunderman Thompson Technology
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =========================LICENSE_END==================================
*/
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 = format(date);
}

public static String format(Calendar date) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return simpleDateFormat.format(date.getTime());
}

public String getFormattedDate() {
return formattedDate;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -85,15 +85,11 @@
this.$cell.html('<coral-wait/>');
},

showRunStatus: function (success, summaryPath) {
showRunStatus: function (success, summaryPath, timestamp, formattedDate) {
let icon = success ? 'check' : 'close';
let href = '/apm/summary.html' + summaryPath;
this.$cell.html('<a data-sly-test="${run.time}" '
+ 'is="coral-anchorbutton" '
+ 'iconsize="S" '
+ 'icon="' + icon + '"'
+ 'href="' + href + '"></a>'
+ '<time>1 second ago</time>');
this.$cell.html('<a is="coral-anchorbutton" iconsize="S" icon="' + icon + '" href="' + href + '"></a>'
+ '<time datetime="' + timestamp + '">' + formattedDate + '</time>');
},

updateScript: function () {
Expand Down Expand Up @@ -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, '', '', '');
}
},

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,10 @@
class="foundation-collection-item-title"
style="text-decoration:none; color:#4b4b4b">${item.scriptName}</a>
</td>
<td is="coral-table-cell" value="${item.executionTime.timeInMillis || 0}">
<time data-sly-test="${item.executionTime}" datetime="${item.executionTime.timeInMillis || 0}"
class="foundation-collection-item-time"
data-sly-use.execLast="${'com.adobe.cq.xf.ui.DateFormatter' @ date=item.executionTimeCalendar, simpleFormat='yyyy-MM-dd HH:mm:ss'}">
${execLast.date}
<td is="coral-table-cell" value="${item.executionTimeCalendar.timeInMillis || 0}">
<time data-sly-test="${item.executionTime}" datetime="${item.executionTimeCalendar.timeInMillis || 0}"
data-sly-use.execLast="${'com.cognifide.apm.core.ui.utils.DateFormatter' @ date=item.executionTimeCalendar}">
${execLast.formattedDate}
</time>
</td>
<td is="coral-table-cell" value="${item.author}">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@
</td>
<td is="coral-table-cell" value="${item.lastModified.timeInMillis || 0}">
<time data-sly-test="${item.lastModified}" datetime="${item.lastModified.timeInMillis || 0}"
data-sly-use.lastMod="${'com.adobe.cq.xf.ui.DateFormatter' @ date=item.lastModified, simpleFormat='yyyy-MM-dd HH:mm:ss'}">
${lastMod.date}
data-sly-use.lastMod="${'com.cognifide.apm.core.ui.utils.DateFormatter' @ date=item.lastModified}">
${lastMod.formattedDate}
</time>
</td>
<td is="coral-table-cell" value="${item.author}">
Expand All @@ -53,8 +53,8 @@
<a data-sly-test="${run.time}" is="coral-anchorbutton" iconsize="S" icon="${run.success ? 'check' : 'close'}"
href="/apm/summary.html${run.summary}"></a>
<time data-sly-test="${run.time}" datetime="${run.time.timeInMillis || 0}"
data-sly-use.runTime="${'com.adobe.cq.xf.ui.DateFormatter' @ date=run.time, simpleFormat='yyyy-MM-dd HH:mm:ss'}">
${runTime.date}
data-sly-use.runTime="${'com.cognifide.apm.core.ui.utils.DateFormatter' @ date=run.time}">
${runTime.formattedDate}
</time>
</td>
<sly data-sly-test="${item.runs.size == 0}">
Expand Down
Loading
Loading