Skip to content

Commit befe0fd

Browse files
author
Kaleidox
committed
allow ErrorHandler to provide an alternate result
1 parent 41c75a0 commit befe0fd

5 files changed

Lines changed: 33 additions & 36 deletions

File tree

src/main/java/org/comroid/api/tree/Component.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ default String getFullName() {
105105

106106
@Override
107107
default <T extends Component> Stream<T> components(@Nullable Class<? super T> type) {
108-
return Stream.concat(streamChildren(type),
109-
isSubComponent() ? Stream.of(getParent()).filter(Objects::nonNull).flatMap(comp -> comp.components(type)) : empty());
108+
return Stream.<T>concat(streamChildren(type),
109+
isSubComponent() ? Stream.of(getParent()).filter(Objects::nonNull).flatMap(comp -> comp.components(type)) : empty()).distinct();
110110
}
111111

112112
@Override

src/main/java/org/comroid/interaction/InteractionCore.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@
44
import lombok.extern.java.Log;
55
import org.comroid.api.tree.Component;
66
import org.comroid.interaction.component.RegistryHandler;
7-
import org.comroid.interaction.component.error.ErrorHandler;
87
import org.comroid.interaction.component.response.ResponseConverter;
98
import org.comroid.interaction.component.response.ResponseHandler;
10-
import org.comroid.interaction.model.InteractionContext;
119
import org.comroid.interaction.model.InteractionTree;
1210
import org.comroid.interaction.registry.InstanceRegistry;
1311
import org.comroid.interaction.registry.RegistrySource;
@@ -17,7 +15,6 @@
1715
import java.util.Collections;
1816
import java.util.HashSet;
1917
import java.util.Set;
20-
import java.util.logging.Level;
2118

2219
@Log
2320
@Value
@@ -59,16 +56,4 @@ public void register(Object target) {
5956
private void verifyComponentExists(Class<?> type) {
6057
component(type).assertion("No component of type %s was found".formatted(type.getCanonicalName()));
6158
}
62-
63-
public void handle(InteractionContext context, Throwable error) {
64-
log.log(Level.SEVERE, "Encountered an error during interaction handling", error);
65-
66-
var handlers = (context == null ? components(ErrorHandler.class) : context.components(ErrorHandler.class)).iterator();
67-
if (!handlers.hasNext()) return;
68-
69-
do {
70-
var state = handlers.next().handle(context, error);
71-
if (state != ErrorHandler.State.UNCHANGED) break;
72-
} while (handlers.hasNext());
73-
}
7459
}

src/main/java/org/comroid/interaction/adapter/stdio/StreamAdapter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.Objects;
2020
import java.util.Queue;
2121
import java.util.concurrent.LinkedBlockingQueue;
22+
import java.util.logging.Level;
2223

2324
@Log
2425
@Value
@@ -119,7 +120,8 @@ public void run() {
119120
(context = createContext(line)).invoke();
120121
output.write("> ");
121122
} catch (Throwable t) {
122-
core.handle(context, t);
123+
if (context != null) context.handle(t);
124+
else log.log(Level.SEVERE, "An error occurred during initialization", t);
123125
}
124126
}
125127
}

src/main/java/org/comroid/interaction/component/error/ErrorHandler.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,5 @@
44
import org.jspecify.annotations.Nullable;
55

66
public interface ErrorHandler {
7-
State handle(@Nullable InteractionContext context, Throwable error);
8-
9-
enum State {UNCHANGED, RECOVERED}
7+
@Nullable Object handle(@Nullable InteractionContext context, Throwable error);
108
}

src/main/java/org/comroid/interaction/model/InteractionContext.java

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.comroid.api.tree.Component;
99
import org.comroid.eval.MinimalExpression;
1010
import org.comroid.interaction.InteractionCore;
11+
import org.comroid.interaction.component.error.ErrorHandler;
1112
import org.comroid.interaction.component.response.ResponseConverter;
1213
import org.comroid.interaction.component.response.ResponseHandler;
1314
import org.comroid.interaction.node.MethodNode;
@@ -21,6 +22,7 @@
2122
import java.util.Objects;
2223
import java.util.concurrent.CompletableFuture;
2324
import java.util.function.Supplier;
25+
import java.util.logging.Level;
2426

2527
@Log
2628
@Value
@@ -99,31 +101,41 @@ public void invoke() {
99101
if (node.getInteraction().async()) {
100102
component(ResponseHandler.class).ifPresent(it -> it.deferResponse(this));
101103

102-
CompletableFuture.supplyAsync(() -> node.invoke(this)).thenAccept(this::handleResponse).exceptionally(t -> {
103-
core.handle(this, t);
104+
CompletableFuture.supplyAsync(() -> node.invoke(this)).thenAccept(this::handle).exceptionally(t -> {
105+
handle(t);
104106
return null;
105107
});
106108
} else try {
107109
var response = node.invoke(this);
108110

109-
handleResponse(response);
111+
handle(response);
110112
} catch (Throwable t) {
111-
core.handle(this, t);
113+
handle(t);
112114
}
113115
}
114116

115117
@SuppressWarnings("unchecked")
116-
private void handleResponse(final Object response) {
117-
components(ResponseConverter.class).distinct()
118-
.map(converter -> converter.convertResponse(response))
119-
.distinct()
120-
.filter(Objects::nonNull)
121-
.forEach(formatted -> {
122-
var fType = formatted.getClass();
123-
components(ResponseHandler.class).distinct()
124-
.filter(handler -> handler.getResponseType().isAssignableFrom(fType))
125-
.forEach(handler -> handler.sendResponse(this, formatted));
126-
});
118+
private void handle(final Object response) {
119+
components(ResponseConverter.class).map(converter -> converter.convertResponse(response)).distinct().filter(Objects::nonNull).forEach(formatted -> {
120+
var fType = formatted.getClass();
121+
components(ResponseHandler.class).filter(handler -> handler.getResponseType().isAssignableFrom(fType))
122+
.forEach(handler -> handler.sendResponse(this, formatted));
123+
});
124+
}
125+
126+
public void handle(Throwable error) {
127+
log.log(Level.SEVERE, "Encountered an error during interaction handling", error);
128+
129+
var handlers = components(ErrorHandler.class).iterator();
130+
if (!handlers.hasNext()) return;
131+
132+
Object response;
133+
134+
do {
135+
response = handlers.next().handle(this, error);
136+
} while (response == null && handlers.hasNext());
137+
138+
if (response != null) handle(response);
127139
}
128140

129141
private static Supplier<RuntimeException> noSuchCommand(String name) {

0 commit comments

Comments
 (0)