Skip to content

Commit fc4a7ab

Browse files
Decoupled event listeners
1 parent 495e95e commit fc4a7ab

File tree

6 files changed

+85
-84
lines changed

6 files changed

+85
-84
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 & 74 deletions
This file was deleted.

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

Lines changed: 13 additions & 3 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, AutomaticScriptScheduler.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

@@ -132,6 +134,14 @@ public void onChange(List<ResourceChange> changes) {
132134
}
133135
}
134136

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+
135145
public void bootOnDemand() {
136146
LOG.info("Automatic scripts booting on demand - job scheduling");
137147
unscheduleBoot();

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)