[ARIES-1930] Consistent error handling
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/AllOSGi.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/AllOSGi.java
index 3fc1b7b..9530d5e 100644
--- a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/AllOSGi.java
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/AllOSGi.java
@@ -21,9 +21,7 @@
import org.apache.aries.component.dsl.OSGiResult;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.ListIterator;
-import java.util.stream.Collectors;
/**
* @author Carlos Sierra Andrés
@@ -33,23 +31,35 @@
@SafeVarargs
public AllOSGi(OSGi<T>... programs) {
super((bundleContext, op) -> {
- ArrayList<OSGiResult> results = new ArrayList<>();
+ ArrayList<OSGiResult> results = new ArrayList<>(programs.length);
- results.addAll(
- Arrays.stream(programs).
- map(o -> o.run(bundleContext, op)).
- collect(Collectors.toList()));
+ try {
+ for (OSGi<T> program : programs) {
+ results.add(program.run(bundleContext, op));
+ }
+ }
+ catch (Exception e) {
+ cleanUp(results);
+
+ throw e;
+ }
return new OSGiResultImpl(
- () -> {
- ListIterator<OSGiResult> iterator =
- results.listIterator(results.size());
-
- while (iterator.hasPrevious()) {
- iterator.previous().close();
- }
- }
+ () -> cleanUp(results)
);
});
}
+
+ private static void cleanUp(ArrayList<OSGiResult> results) {
+ ListIterator<OSGiResult> iterator =
+ results.listIterator(results.size());
+
+ while (iterator.hasPrevious()) {
+ try {
+ iterator.previous().close();
+ }
+ catch (Exception ex) {
+ }
+ }
+ }
}
diff --git a/itests/src/main/java/org/apache/aries/component/dsl/test/DSLTest.java b/itests/src/main/java/org/apache/aries/component/dsl/test/DSLTest.java
index 31efd00..9634de2 100644
--- a/itests/src/main/java/org/apache/aries/component/dsl/test/DSLTest.java
+++ b/itests/src/main/java/org/apache/aries/component/dsl/test/DSLTest.java
@@ -1025,6 +1025,41 @@
}
@Test
+ public void testAllWithErrors() {
+ ArrayList<Integer> results = new ArrayList<>();
+
+ OSGi<Integer> program = OSGi.all(
+ just(1),
+ just(2),
+ just(3),
+ just(4),
+ just(5)
+ ).effects(
+ results::add, results::remove
+ );
+
+ try(OSGiResult result = program.run(bundleContext)) {
+ assertEquals(Arrays.asList(1, 2, 3, 4, 5), results);
+ }
+
+ try(OSGiResult result = program.filter(i -> {
+ if (i == 5) {
+ throw new IllegalArgumentException();
+ }
+
+ return true;
+ }
+ ).run(
+ bundleContext)
+ ) {
+ fail();
+ }
+ catch (Exception e) {
+ assertEquals(Collections.emptyList(), results);
+ }
+ }
+
+ @Test
public void testMultipleApplies() {
ArrayList<Integer> results = new ArrayList<>();
AtomicInteger results2 = new AtomicInteger();