Skip to content

Commit 642b29a

Browse files
Merge pull request #206 from wttech/deploy-waiter-aemaacs
Deploy waiter AEMaaCS
2 parents 4d52ca1 + fc4a7ab commit 642b29a

File tree

8 files changed

+96
-107
lines changed

8 files changed

+96
-107
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package dev.vml.es.acm.core.code;
2+
3+
import dev.vml.es.acm.core.event.Event;
4+
import dev.vml.es.acm.core.event.EventListener;
5+
import dev.vml.es.acm.core.event.EventType;
6+
import dev.vml.es.acm.core.util.ResolverUtils;
7+
import org.apache.sling.api.resource.LoginException;
8+
import org.apache.sling.api.resource.ResourceResolver;
9+
import org.apache.sling.api.resource.ResourceResolverFactory;
10+
import org.osgi.service.component.annotations.Component;
11+
import org.osgi.service.component.annotations.Reference;
12+
import org.slf4j.Logger;
13+
import org.slf4j.LoggerFactory;
14+
15+
@Component(service = EventListener.class, immediate = true)
16+
public class ExecutionHistoryManager implements EventListener {
17+
18+
private static final Logger LOG = LoggerFactory.getLogger(ExecutionHistoryManager.class);
19+
20+
@Reference
21+
private ResourceResolverFactory resourceResolverFactory;
22+
23+
@Override
24+
public void onEvent(Event event) {
25+
EventType eventType = EventType.of(event.getName()).orElse(null);
26+
if (eventType == EventType.HISTORY_CLEAR) {
27+
clear();
28+
}
29+
}
30+
31+
public void clear() {
32+
try (ResourceResolver resolver = ResolverUtils.contentResolver(resourceResolverFactory, null)) {
33+
ExecutionHistory executionHistory = new ExecutionHistory(resolver);
34+
executionHistory.clear();
35+
LOG.info("Execution history cleared successfully");
36+
} catch (LoginException e) {
37+
LOG.error("Cannot access repository while clearing history!", e);
38+
}
39+
}
40+
}

core/src/main/java/dev/vml/es/acm/core/code/ExecutionQueue.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package dev.vml.es.acm.core.code;
22

33
import dev.vml.es.acm.core.AcmException;
4+
import dev.vml.es.acm.core.event.Event;
5+
import dev.vml.es.acm.core.event.EventListener;
6+
import dev.vml.es.acm.core.event.EventType;
47
import dev.vml.es.acm.core.util.ResolverUtils;
58
import dev.vml.es.acm.core.util.StreamUtils;
69
import java.util.*;
@@ -28,11 +31,11 @@
2831

2932
@Component(
3033
immediate = true,
31-
service = {ExecutionQueue.class, JobExecutor.class},
34+
service = {ExecutionQueue.class, JobExecutor.class, EventListener.class},
3235
property = {JobExecutor.PROPERTY_TOPICS + "=" + ExecutionQueue.TOPIC})
3336
@Designate(ocd = ExecutionQueue.Config.class)
3437
@SuppressWarnings("java:S1181")
35-
public class ExecutionQueue implements JobExecutor {
38+
public class ExecutionQueue implements JobExecutor, EventListener {
3639

3740
public static final String TOPIC = "dev/vml/es/acm/ExecutionQueue";
3841

@@ -77,6 +80,14 @@ protected void deactivate() {
7780
}
7881
}
7982

83+
@Override
84+
public void onEvent(Event event) {
85+
EventType eventType = EventType.of(event.getName()).orElse(null);
86+
if (eventType == EventType.EXECUTOR_RESET) {
87+
reset();
88+
}
89+
}
90+
8091
public Execution submit(Executable executable, ExecutionContextOptions contextOptions) throws AcmException {
8192
long currentSize = getCurrentSize();
8293
if (currentSize >= getMaxSize()) {

core/src/main/java/dev/vml/es/acm/core/code/Executor.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
import dev.vml.es.acm.core.AcmConstants;
44
import dev.vml.es.acm.core.AcmException;
55
import dev.vml.es.acm.core.code.script.ContentScript;
6+
import dev.vml.es.acm.core.event.Event;
7+
import dev.vml.es.acm.core.event.EventListener;
8+
import dev.vml.es.acm.core.event.EventType;
69
import dev.vml.es.acm.core.format.TemplateFormatter;
710
import dev.vml.es.acm.core.instance.InstanceSettings;
811
import dev.vml.es.acm.core.notification.NotificationManager;
@@ -29,10 +32,12 @@
2932
import org.osgi.service.metatype.annotations.Designate;
3033
import org.osgi.service.metatype.annotations.ObjectClassDefinition;
3134

32-
@Component(immediate = true, service = Executor.class)
35+
@Component(
36+
immediate = true,
37+
service = {Executor.class, EventListener.class})
3338
@Designate(ocd = Executor.Config.class)
3439
@SuppressWarnings("java:S1181")
35-
public class Executor {
40+
public class Executor implements EventListener {
3641

3742
public static final String LOCK_DIR = "executor";
3843

@@ -112,6 +117,14 @@ protected void activate(Config config) {
112117
this.config = config;
113118
}
114119

120+
@Override
121+
public void onEvent(Event event) {
122+
EventType eventType = EventType.of(event.getName()).orElse(null);
123+
if (eventType == EventType.EXECUTOR_RESET) {
124+
reset();
125+
}
126+
}
127+
115128
public ExecutionContext createContext(
116129
String id, ExecutionMode mode, Executable executable, ResourceResolver resourceResolver) {
117130
CodeContext codeContext = new CodeContext(osgiContext, resourceResolver);

core/src/main/java/dev/vml/es/acm/core/event/EventDispatcher.java

Lines changed: 0 additions & 67 deletions
This file was deleted.

core/src/main/java/dev/vml/es/acm/core/event/EventType.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55

66
public enum EventType {
77
EXECUTOR_RESET,
8-
HISTORY_CLEAR;
8+
HISTORY_CLEAR,
9+
SCRIPT_SCHEDULER_BOOT;
910

1011
public static Optional<EventType> of(String name) {
1112
return Arrays.stream(values())

core/src/main/java/dev/vml/es/acm/core/instance/HealthChecker.java

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@
2020
import org.apache.sling.api.resource.ResourceResolver;
2121
import org.apache.sling.api.resource.ResourceResolverFactory;
2222
import org.apache.sling.discovery.DiscoveryService;
23-
import org.apache.sling.discovery.InstanceDescription;
24-
import org.apache.sling.discovery.TopologyView;
2523
import org.osgi.framework.Bundle;
2624
import org.osgi.framework.FrameworkUtil;
2725
import org.osgi.framework.ServiceRegistration;
@@ -91,7 +89,6 @@ public HealthStatus checkStatus() {
9189

9290
private HealthStatus checkStatus(ResourceResolver resourceResolver) {
9391
List<HealthIssue> issues = new LinkedList<>();
94-
checkCluster(issues);
9592
checkRepository(issues, resourceResolver);
9693
checkInstaller(issues, resourceResolver);
9794
checkBundles(issues);
@@ -101,24 +98,6 @@ private HealthStatus checkStatus(ResourceResolver resourceResolver) {
10198
return new HealthStatus(issues, CollectionUtils.isEmpty(issues));
10299
}
103100

104-
private void checkCluster(List<HealthIssue> issues) {
105-
if (!instanceInfo.isCluster()) {
106-
return;
107-
}
108-
if (!isClusterLeader()) {
109-
issues.add(new HealthIssue(
110-
HealthIssueSeverity.CRITICAL, HealthIssueCategory.INSTANCE, "Not a cluster leader", null));
111-
}
112-
}
113-
114-
private boolean isClusterLeader() {
115-
return Optional.ofNullable(discoveryService)
116-
.map(DiscoveryService::getTopology)
117-
.map(TopologyView::getLocalInstance)
118-
.map(InstanceDescription::isLeader)
119-
.orElse(false);
120-
}
121-
122101
// TODO seems to not work on AEMaaCS as there is no Sling Installer JMX MBean
123102
private void checkInstaller(List<HealthIssue> issues, ResourceResolver resourceResolver) {
124103
if (!config.installerChecking()) {

core/src/main/java/dev/vml/es/acm/core/script/AutomaticScriptScheduler.java

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@
55
import dev.vml.es.acm.core.code.schedule.BootSchedule;
66
import dev.vml.es.acm.core.code.schedule.CronSchedule;
77
import dev.vml.es.acm.core.code.schedule.NoneSchedule;
8+
import dev.vml.es.acm.core.event.Event;
9+
import dev.vml.es.acm.core.event.EventListener;
10+
import dev.vml.es.acm.core.event.EventType;
811
import dev.vml.es.acm.core.instance.HealthChecker;
912
import dev.vml.es.acm.core.instance.HealthStatus;
1013
import dev.vml.es.acm.core.osgi.InstanceInfo;
1114
import dev.vml.es.acm.core.osgi.InstanceType;
1215
import dev.vml.es.acm.core.repo.Repo;
1316
import dev.vml.es.acm.core.util.ChecksumUtils;
1417
import dev.vml.es.acm.core.util.ResolverUtils;
15-
import java.util.Date;
1618
import java.util.List;
1719
import java.util.Map;
1820
import java.util.concurrent.ConcurrentHashMap;
@@ -34,7 +36,7 @@
3436
import org.slf4j.LoggerFactory;
3537

3638
@Component(
37-
service = ResourceChangeListener.class,
39+
service = {ResourceChangeListener.class, EventListener.class},
3840
immediate = true,
3941
property = {
4042
ResourceChangeListener.PATHS + "=glob:" + ScriptRepository.ROOT + "/automatic/**/*.groovy",
@@ -43,7 +45,7 @@
4345
ResourceChangeListener.CHANGES + "=REMOVED"
4446
})
4547
@Designate(ocd = AutomaticScriptScheduler.Config.class)
46-
public class AutomaticScriptScheduler implements ResourceChangeListener {
48+
public class AutomaticScriptScheduler implements ResourceChangeListener, EventListener {
4749

4850
private static final Logger LOG = LoggerFactory.getLogger(AutomaticScriptScheduler.class);
4951

@@ -54,12 +56,6 @@ public class AutomaticScriptScheduler implements ResourceChangeListener {
5456
description = "Schedules automatic scripts on instance up and script changes")
5557
public @interface Config {
5658

57-
@AttributeDefinition(
58-
name = "Boot Delay",
59-
description = "Time in milliseconds to delay the boot job execution"
60-
)
61-
long bootDelay() default 1000 * 10; // 10 seconds
62-
6359
@AttributeDefinition(
6460
name = "User Impersonation ID",
6561
description =
@@ -138,6 +134,22 @@ public void onChange(List<ResourceChange> changes) {
138134
}
139135
}
140136

137+
@Override
138+
public void onEvent(Event event) {
139+
EventType eventType = EventType.of(event.getName()).orElse(null);
140+
if (eventType == EventType.SCRIPT_SCHEDULER_BOOT) {
141+
bootOnDemand();
142+
}
143+
}
144+
145+
public void bootOnDemand() {
146+
LOG.info("Automatic scripts booting on demand - job scheduling");
147+
unscheduleBoot();
148+
scheduleBoot();
149+
LOG.info("Automatic scripts booting on demand - job scheduled");
150+
}
151+
152+
// TODO on AEMaaCS scheduler refuses to schedule job during activate
141153
private void bootWhenInstanceUp() {
142154
LOG.info("Automatic scripts booting on instance up - job scheduling");
143155
unscheduleBoot();
@@ -157,8 +169,7 @@ private void unscheduleBoot() {
157169
}
158170

159171
private void scheduleBoot() {
160-
Date bootDate = new Date(System.currentTimeMillis() + config.bootDelay());
161-
scheduler.schedule(bootJob(), configureScheduleOptions(BOOT_JOB_NAME, scheduler.AT(bootDate)));
172+
scheduler.schedule(bootJob(), configureScheduleOptions(BOOT_JOB_NAME, scheduler.NOW()));
162173
}
163174

164175
private ScheduleOptions configureScheduleOptions(String name, ScheduleOptions options) {

core/src/main/java/dev/vml/es/acm/core/servlet/EventServlet.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
import static dev.vml.es.acm.core.util.ServletResult.*;
44
import static dev.vml.es.acm.core.util.ServletUtils.respondJson;
55

6-
import dev.vml.es.acm.core.event.EventDispatcher;
6+
import dev.vml.es.acm.core.event.EventManager;
77
import dev.vml.es.acm.core.event.EventType;
88
import java.io.IOException;
9+
import java.util.Collections;
910
import javax.servlet.Servlet;
1011
import org.apache.sling.api.SlingHttpServletRequest;
1112
import org.apache.sling.api.SlingHttpServletResponse;
@@ -32,7 +33,7 @@ public class EventServlet extends SlingAllMethodsServlet {
3233
private static final Logger LOG = LoggerFactory.getLogger(EventServlet.class);
3334

3435
@Reference
35-
private transient EventDispatcher dispatcher;
36+
private transient EventManager eventManager;
3637

3738
@Override
3839
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
@@ -44,7 +45,7 @@ protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse
4445
}
4546

4647
try {
47-
dispatcher.dispatch(event);
48+
eventManager.triggerEvent(event.name().toLowerCase(), Collections.emptyMap());
4849
respondJson(response, ok(String.format("Event '%s' dispatched successfully!", name)));
4950
} catch (Exception e) {
5051
LOG.error("Event '{}' cannot be dispatched!", name, e);

0 commit comments

Comments
 (0)