You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by cs...@apache.org on 2021/03/08 17:28:05 UTC
[aries-component-dsl] branch master updated (a28ae83 -> 30c0c17)
This is an automated email from the ASF dual-hosted git repository.
csierra pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/aries-component-dsl.git.
from a28ae83 match order
new 77a5482 Propagate signal but do not contribute to refresh enclosing resfreshers
new e2d1c3d Add refreshAsUpdate
new 9097f3c Move to own classes and unify implementation
new d2652d1 Unify implementations
new 6706be6 Reorganize effects methods
new 5edbc1b Update only when not refreshing
new adbf76f Update name
new 1ffa2fe Mark as deprecated
new 4f9ac22 use shorter effects
new 30c0c17 Update effects should execute in proper order
The 10 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../java/org/apache/aries/component/dsl/OSGi.java | 48 +++----
.../aries/component/dsl/internal/BaseOSGiImpl.java | 139 +++++++++----------
.../dsl/internal/ConfigurationOSGiImpl.java | 2 +-
.../dsl/internal/ConfigurationsOSGiImpl.java | 2 +-
.../aries/component/dsl/internal/EffectsOSGi.java | 17 ++-
.../component/dsl/internal/OnceTransformer.java | 55 ++++++++
.../apache/aries/component/dsl/internal/Pad.java | 4 +-
.../dsl/internal/RefreshAsUpdatesTransformer.java | 78 +++++++++++
.../component/dsl/internal/RefreshWhenOSGi.java | 7 +-
.../dsl/internal/ServiceReferenceOSGi.java | 2 +-
.../component/dsl/internal/UpdateSupport.java | 18 ++-
.../apache/aries/component/dsl/test/DSLTest.java | 153 ++++++++++++++++++++-
12 files changed, 411 insertions(+), 114 deletions(-)
create mode 100644 component-dsl/src/main/java/org/apache/aries/component/dsl/internal/OnceTransformer.java
create mode 100644 component-dsl/src/main/java/org/apache/aries/component/dsl/internal/RefreshAsUpdatesTransformer.java
[aries-component-dsl] 05/10: Reorganize effects methods
Posted by cs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
csierra pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/aries-component-dsl.git
commit 6706be6bb6da3b2f94bdbbabb9ebc8851a0582a3
Author: Carlos Sierra Andrés <ca...@liferay.com>
AuthorDate: Mon Mar 8 14:35:18 2021 +0100
Reorganize effects methods
---
.../main/java/org/apache/aries/component/dsl/OSGi.java | 18 ++++++++++++++----
.../aries/component/dsl/internal/BaseOSGiImpl.java | 9 ---------
.../org/apache/aries/component/dsl/test/DSLTest.java | 2 --
3 files changed, 14 insertions(+), 15 deletions(-)
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/OSGi.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/OSGi.java
index b32ae17..45a5d7c 100644
--- a/component-dsl/src/main/java/org/apache/aries/component/dsl/OSGi.java
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/OSGi.java
@@ -599,13 +599,19 @@ public interface OSGi<T> extends OSGiRunnable<T> {
return effects(onAdded, __ -> {}, __ -> {}, onRemoved);
}
- OSGi<T> effects(
+ default OSGi<T> effects(
+ Consumer<? super T> onAdded, Consumer<? super T> onRemoved, Consumer<? super T> onUpdate) {
+
+ return effects(onAdded, __ -> {}, __ -> {}, onRemoved, onUpdate);
+ }
+
+ default OSGi<T> effects(
Consumer<? super T> onAddedBefore, Consumer<? super T> onAddedAfter,
Consumer<? super T> onRemovedBefore,
- Consumer<? super T> onRemovedAfter);
+ Consumer<? super T> onRemovedAfter) {
- default OSGi<T> effects(Effect<? super T> effect) {
- return effects(effect.getOnIncoming(), effect.getOnLeaving());
+ return effects(
+ onAddedBefore, onAddedAfter, onRemovedBefore, onRemovedAfter, __ -> {});
}
OSGi<T> effects(
@@ -614,6 +620,10 @@ public interface OSGi<T> extends OSGiRunnable<T> {
Consumer<? super T> onRemovedAfter,
Consumer<? super T> onUpdate);
+ default OSGi<T> effects(Effect<? super T> effect) {
+ return effects(effect.getOnIncoming(), effect.getOnLeaving());
+ }
+
OSGi<T> filter(Predicate<T> predicate);
<S> OSGi<S> flatMap(Function<? super T, OSGi<? extends S>> fun);
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java
index 74b0219..5d9fc2a 100644
--- a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java
@@ -227,15 +227,6 @@ public class BaseOSGiImpl<T> implements OSGi<T> {
public OSGi<T> effects(
Consumer<? super T> onAddedBefore, Consumer<? super T> onAddedAfter,
Consumer<? super T> onRemovedBefore,
- Consumer<? super T> onRemovedAfter) {
-
- return effects(onAddedBefore, onAddedAfter, onRemovedBefore, onRemovedAfter, __ -> {});
- }
-
- @Override
- public OSGi<T> effects(
- Consumer<? super T> onAddedBefore, Consumer<? super T> onAddedAfter,
- Consumer<? super T> onRemovedBefore,
Consumer<? super T> onRemovedAfter,
Consumer<? super T> onUpdate) {
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 0dc4feb..a0f9371 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
@@ -1952,8 +1952,6 @@ public class DSLTest {
atomicInteger.incrementAndGet();
},
- __ -> {},
- __ -> {},
__ -> atomicReference.set(null),
sr ->
atomicReference.set(
[aries-component-dsl] 02/10: Add refreshAsUpdate
Posted by cs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
csierra pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/aries-component-dsl.git
commit e2d1c3def22679e9161f8a3735544545a42297ac
Author: Carlos Sierra Andrés <ca...@liferay.com>
AuthorDate: Mon Mar 8 14:10:02 2021 +0100
Add refreshAsUpdate
to allow to _recalculate_ parts of the _tree_ and treat them as
updates afterwards
---
.../java/org/apache/aries/component/dsl/OSGi.java | 53 +++++++++++++++++
.../component/dsl/internal/UpdateSupport.java | 4 ++
.../apache/aries/component/dsl/test/DSLTest.java | 67 ++++++++++++++++++++++
3 files changed, 124 insertions(+)
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/OSGi.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/OSGi.java
index b935efa..de175db 100644
--- a/component-dsl/src/main/java/org/apache/aries/component/dsl/OSGi.java
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/OSGi.java
@@ -454,6 +454,59 @@ public interface OSGi<T> extends OSGiRunnable<T> {
return new RecoverWithOSGi<>(program, function);
}
+ static <T> OSGi<T> refreshAsUpdates(OSGi<T> program) {
+ return program.transform(op -> {
+ class ResultState {
+ boolean gone;
+ OSGiResult result;
+
+ public ResultState(boolean gone, OSGiResult result) {
+ this.gone = gone;
+ this.result = result;
+ }
+ }
+
+ ThreadLocal<ResultState> threadLocal = ThreadLocal.withInitial(() -> null);
+
+ return t -> {
+ AtomicReference<OSGiResult> atomicReference = new AtomicReference<>(NOOP);
+
+ if (!UpdateSupport.isUpdate()) {
+ atomicReference.set(op.publish(t));
+ }
+ else {
+ threadLocal.get().gone = false;
+ }
+
+ return new OSGiResultImpl(
+ () -> {
+ if (!UpdateSupport.isUpdate()) {
+ atomicReference.getAndSet(NOOP).run();
+ }
+ else {
+ threadLocal.set(new ResultState(true, atomicReference.get()));
+
+ UpdateSupport.deferTermination(
+ () -> {
+ if (threadLocal.get().gone) {
+ threadLocal.get().result.run();
+
+ threadLocal.remove();
+ atomicReference.set(NOOP);
+ }
+ else {
+ threadLocal.get().result.update();
+ }
+ }
+ );
+ }
+ },
+ () -> atomicReference.get().update()
+ );
+ };
+ });
+ }
+
static <T> OSGi<T> refreshWhen(OSGi<T> program, Predicate<T> refresher) {
return new RefreshWhenOSGi<>(program, refresher);
}
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/UpdateSupport.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/UpdateSupport.java
index 5008bf9..253ca30 100644
--- a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/UpdateSupport.java
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/UpdateSupport.java
@@ -32,6 +32,10 @@ public class UpdateSupport {
private static final ThreadLocal<Boolean> isUpdate =
ThreadLocal.withInitial(() -> Boolean.FALSE);
+ public static boolean isUpdate() {
+ return isUpdate.get();
+ }
+
public static void deferPublication(Runnable runnable) {
if (isUpdate.get()) {
deferredPublishersStack.get().peekLast().addLast(runnable);
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 f98cd4a..0dc4feb 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
@@ -1921,6 +1921,73 @@ public class DSLTest {
}
}
+ @Test
+ public void testServiceReferenceWithFilterUpdates() {
+ AtomicReference<String> atomicReference = new AtomicReference<>();
+
+ ServiceRegistration<Service> serviceRegistration =
+ bundleContext.registerService(
+ Service.class, new Service(),
+ new Hashtable<String, Object>() {{
+ put("property", "original");
+ put("admissible", "true");
+ }});
+
+ AtomicInteger atomicInteger = new AtomicInteger();
+
+ try {
+ OSGi<?> program =
+ refreshAsUpdates(
+ serviceReferences(
+ Service.class
+ ).filter(
+ sr -> sr.getProperty("admissible").equals("true")
+ )
+ ).map(
+ CachingServiceReference::getServiceReference
+ ).effects(
+ sr -> {
+ atomicReference.set(
+ String.valueOf(sr.getProperty("property")));
+
+ atomicInteger.incrementAndGet();
+ },
+ __ -> {},
+ __ -> {},
+ __ -> atomicReference.set(null),
+ sr ->
+ atomicReference.set(
+ String.valueOf(sr.getProperty("property")))
+ );
+
+ program.run(bundleContext);
+
+ assertEquals(1, atomicInteger.get());
+ assertEquals("original", atomicReference.get());
+
+ serviceRegistration.setProperties(
+ new Hashtable<String, Object>() {{
+ put("property", "updated");
+ put("admissible", "true");
+ }});
+
+ assertEquals(1, atomicInteger.get());
+ assertEquals("updated", atomicReference.get());
+
+ serviceRegistration.setProperties(
+ new Hashtable<String, Object>() {{
+ put("property", "updated");
+ put("admissible", "false");
+ }});
+
+ assertEquals(1, atomicInteger.get());
+ assertNull(atomicReference.get());
+ }
+ finally {
+ serviceRegistration.unregister();
+ }
+ }
+
@Test
public void testServiceReferenceUpdatesWithSelector() {
[aries-component-dsl] 03/10: Move to own classes and unify
implementation
Posted by cs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
csierra pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/aries-component-dsl.git
commit 9097f3c336f6761cc02c5c47f8b321a410a79e18
Author: Carlos Sierra Andrés <ca...@liferay.com>
AuthorDate: Mon Mar 8 14:19:24 2021 +0100
Move to own classes and unify implementation
---
.../java/org/apache/aries/component/dsl/OSGi.java | 77 +--------------------
.../component/dsl/internal/OnceTransformer.java | 55 +++++++++++++++
.../dsl/internal/RefreshAsUpdatesTransformer.java | 78 ++++++++++++++++++++++
3 files changed, 135 insertions(+), 75 deletions(-)
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/OSGi.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/OSGi.java
index de175db..b32ae17 100644
--- a/component-dsl/src/main/java/org/apache/aries/component/dsl/OSGi.java
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/OSGi.java
@@ -53,8 +53,6 @@ import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicReference;
import java.util.function.*;
/**
@@ -376,29 +374,7 @@ public interface OSGi<T> extends OSGiRunnable<T> {
}
static <T> OSGi<T> once(OSGi<T> program) {
- return program.transform(op -> {
- AtomicInteger count = new AtomicInteger();
-
- AtomicReference<Runnable> terminator = new AtomicReference<>();
-
- return t -> {
- if (count.getAndIncrement() == 0) {
- UpdateSupport.deferPublication(
- () -> terminator.set(op.apply(t)));
- }
-
- return () -> {
- if (count.decrementAndGet() == 0) {
- UpdateSupport.deferTermination(() -> {
- Runnable runnable = terminator.getAndSet(NOOP);
-
- runnable.run();
- });
- }
-
- };
- };
- });
+ return program.transform(new OnceTransformer<>());
}
static OSGi<ServiceObjects<Object>> prototypes(String filterString) {
@@ -455,56 +431,7 @@ public interface OSGi<T> extends OSGiRunnable<T> {
}
static <T> OSGi<T> refreshAsUpdates(OSGi<T> program) {
- return program.transform(op -> {
- class ResultState {
- boolean gone;
- OSGiResult result;
-
- public ResultState(boolean gone, OSGiResult result) {
- this.gone = gone;
- this.result = result;
- }
- }
-
- ThreadLocal<ResultState> threadLocal = ThreadLocal.withInitial(() -> null);
-
- return t -> {
- AtomicReference<OSGiResult> atomicReference = new AtomicReference<>(NOOP);
-
- if (!UpdateSupport.isUpdate()) {
- atomicReference.set(op.publish(t));
- }
- else {
- threadLocal.get().gone = false;
- }
-
- return new OSGiResultImpl(
- () -> {
- if (!UpdateSupport.isUpdate()) {
- atomicReference.getAndSet(NOOP).run();
- }
- else {
- threadLocal.set(new ResultState(true, atomicReference.get()));
-
- UpdateSupport.deferTermination(
- () -> {
- if (threadLocal.get().gone) {
- threadLocal.get().result.run();
-
- threadLocal.remove();
- atomicReference.set(NOOP);
- }
- else {
- threadLocal.get().result.update();
- }
- }
- );
- }
- },
- () -> atomicReference.get().update()
- );
- };
- });
+ return program.transform(new RefreshAsUpdatesTransformer<>());
}
static <T> OSGi<T> refreshWhen(OSGi<T> program, Predicate<T> refresher) {
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/OnceTransformer.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/OnceTransformer.java
new file mode 100644
index 0000000..8feaae9
--- /dev/null
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/OnceTransformer.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.aries.component.dsl.internal;
+
+import org.apache.aries.component.dsl.OSGi;
+import org.apache.aries.component.dsl.OSGiResult;
+import org.apache.aries.component.dsl.Publisher;
+import org.apache.aries.component.dsl.Transformer;
+
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
+public class OnceTransformer<T> implements Transformer<T, T> {
+
+ @Override
+ public Publisher<T> transform(Publisher<? super T> op) {
+ AtomicInteger count = new AtomicInteger();
+
+ AtomicReference<OSGiResult> terminator = new AtomicReference<>();
+
+ return t -> {
+ if (count.getAndIncrement() == 0) {
+ UpdateSupport.deferPublication(
+ () -> terminator.set(op.apply(t)));
+ }
+
+ return new OSGiResultImpl(() -> {
+ if (count.decrementAndGet() == 0) {
+ UpdateSupport.deferTermination(() -> {
+ Runnable runnable = terminator.getAndSet(OSGi.NOOP);
+
+ runnable.run();
+ });
+ }},
+ () -> terminator.get().update()
+ );
+ };
+ }
+
+}
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/RefreshAsUpdatesTransformer.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/RefreshAsUpdatesTransformer.java
new file mode 100644
index 0000000..7f711bd
--- /dev/null
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/RefreshAsUpdatesTransformer.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.aries.component.dsl.internal;
+
+import org.apache.aries.component.dsl.OSGi;
+import org.apache.aries.component.dsl.OSGiResult;
+import org.apache.aries.component.dsl.Publisher;
+import org.apache.aries.component.dsl.Transformer;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+public class RefreshAsUpdatesTransformer<T> implements Transformer<T, T> {
+
+ @Override
+ public Publisher<T> transform(Publisher<? super T> op) {
+ ThreadLocal<ResultState> threadLocal = ThreadLocal.withInitial(() -> null);
+
+ return t -> {
+ AtomicReference<OSGiResult> atomicReference = new AtomicReference<>(OSGi.NOOP);
+
+ if (!UpdateSupport.isUpdate()) {
+ atomicReference.set(op.publish(t));
+ } else {
+ threadLocal.get().gone = false;
+ }
+
+ return new OSGiResultImpl(
+ () -> {
+ if (!UpdateSupport.isUpdate()) {
+ atomicReference.getAndSet(OSGi.NOOP).run();
+ } else {
+ threadLocal.set(new ResultState(true, atomicReference.get()));
+
+ UpdateSupport.deferTermination(
+ () -> {
+ if (threadLocal.get().gone) {
+ threadLocal.get().result.run();
+
+ threadLocal.remove();
+ atomicReference.set(OSGi.NOOP);
+ } else {
+ threadLocal.get().result.update();
+ }
+ }
+ );
+ }
+ },
+ () -> atomicReference.get().update()
+ );
+ };
+ }
+
+ private static class ResultState {
+ boolean gone;
+ OSGiResult result;
+
+ public ResultState(boolean gone, OSGiResult result) {
+ this.gone = gone;
+ this.result = result;
+ }
+ }
+
+}
[aries-component-dsl] 06/10: Update only when not refreshing
Posted by cs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
csierra pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/aries-component-dsl.git
commit 5edbc1b9333a0b4057382fa11b3b29ffe8e4e464
Author: Carlos Sierra Andrés <ca...@liferay.com>
AuthorDate: Mon Mar 8 14:35:48 2021 +0100
Update only when not refreshing
---
.../org/apache/aries/component/dsl/internal/BaseOSGiImpl.java | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java
index 5d9fc2a..c3ecd78 100644
--- a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java
@@ -259,9 +259,13 @@ public class BaseOSGiImpl<T> implements OSGi<T> {
}
},
() -> {
- onUpdate.accept(t);
+ boolean refresh = terminator.update();
- return terminator.update();
+ if (!refresh) {
+ onUpdate.accept(t);
+ }
+
+ return refresh;
}
);
[aries-component-dsl] 09/10: use shorter effects
Posted by cs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
csierra pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/aries-component-dsl.git
commit 4f9ac22e927b3d38b480c3b39b4c77728b7ebceb
Author: Carlos Sierra Andrés <ca...@liferay.com>
AuthorDate: Mon Mar 8 17:19:41 2021 +0100
use shorter effects
---
itests/src/main/java/org/apache/aries/component/dsl/test/DSLTest.java | 2 --
1 file changed, 2 deletions(-)
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 a0f9371..875dc3a 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
@@ -1887,8 +1887,6 @@ public class DSLTest {
atomicInteger.incrementAndGet();
},
__ -> {},
- __ -> {},
- __ -> {},
csr ->
atomicReference.set(
String.valueOf(
[aries-component-dsl] 10/10: Update effects should execute in
proper order
Posted by cs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
csierra pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/aries-component-dsl.git
commit 30c0c17412edc2f5c314dea919cd8f38460c2693
Author: Carlos Sierra Andrés <ca...@liferay.com>
AuthorDate: Mon Mar 8 18:26:52 2021 +0100
Update effects should execute in proper order
and only when update signal does not trigger a refresh
---
.../aries/component/dsl/internal/BaseOSGiImpl.java | 15 ++--
.../dsl/internal/ConfigurationOSGiImpl.java | 2 +-
.../dsl/internal/ConfigurationsOSGiImpl.java | 2 +-
.../aries/component/dsl/internal/EffectsOSGi.java | 17 ++++-
.../dsl/internal/ServiceReferenceOSGi.java | 2 +-
.../component/dsl/internal/UpdateSupport.java | 14 +++-
.../apache/aries/component/dsl/test/DSLTest.java | 86 ++++++++++++++++++++++
7 files changed, 125 insertions(+), 13 deletions(-)
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java
index f9c658b..1f9a222 100644
--- a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java
@@ -23,6 +23,7 @@ import org.osgi.framework.InvalidSyntaxException;
import java.util.HashMap;
import java.util.IdentityHashMap;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
@@ -259,13 +260,17 @@ public class BaseOSGiImpl<T> implements OSGi<T> {
}
},
() -> {
- boolean refresh = terminator.update();
+ AtomicBoolean atomicBoolean = new AtomicBoolean();
- if (!refresh) {
- onUpdate.accept(t);
- }
+ UpdateSupport.deferPublication(() -> {
+ if (!atomicBoolean.get()) {
+ onUpdate.accept(t);
+ }
+ });
+
+ atomicBoolean.set(terminator.update());
- return refresh;
+ return atomicBoolean.get();
}
);
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/ConfigurationOSGiImpl.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/ConfigurationOSGiImpl.java
index 2690c05..54698dc 100644
--- a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/ConfigurationOSGiImpl.java
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/ConfigurationOSGiImpl.java
@@ -96,7 +96,7 @@ public class ConfigurationOSGiImpl extends OSGiImpl<ConfigurationHolder> {
atomicReference.set(configuration);
}
else {
- if (!terminatorAtomicReference.get().update()) {
+ if (!UpdateSupport.sendUpdate(terminatorAtomicReference.get())) {
return;
}
}
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/ConfigurationsOSGiImpl.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/ConfigurationsOSGiImpl.java
index d718560..d485c53 100644
--- a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/ConfigurationsOSGiImpl.java
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/ConfigurationsOSGiImpl.java
@@ -95,7 +95,7 @@ public class ConfigurationsOSGiImpl extends OSGiImpl<ConfigurationHolder> {
OSGiResult osgiResult = terminators.get(pid);
- if (osgiResult != null && !osgiResult.update()) {
+ if (osgiResult != null && !UpdateSupport.sendUpdate(osgiResult)) {
return;
}
}
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/EffectsOSGi.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/EffectsOSGi.java
index ed6864a..8b87d38 100644
--- a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/EffectsOSGi.java
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/EffectsOSGi.java
@@ -19,6 +19,8 @@ package org.apache.aries.component.dsl.internal;
import org.apache.aries.component.dsl.OSGiResult;
+import java.util.concurrent.atomic.AtomicBoolean;
+
/**
* @author Carlos Sierra Andrés
*/
@@ -58,11 +60,18 @@ public class EffectsOSGi extends OSGiImpl<Void> {
}
},
() -> {
- onUpdate.run();
+ AtomicBoolean atomicBoolean = new AtomicBoolean();
+
+ UpdateSupport.deferPublication(() -> {
+ if (!atomicBoolean.get()) {
+ onUpdate.run();
+ }
+ });
+
+ atomicBoolean.set(terminator.update());
- return terminator.update();
- }
- );
+ return atomicBoolean.get();
+ } );
try {
onAddingAfter.run();
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/ServiceReferenceOSGi.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/ServiceReferenceOSGi.java
index 998bbae..e60aa22 100644
--- a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/ServiceReferenceOSGi.java
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/ServiceReferenceOSGi.java
@@ -74,7 +74,7 @@ public class ServiceReferenceOSGi<T>
public void modifiedService(
ServiceReference<T> reference, Tracked<T> tracked) {
- if (tracked.runnable.update()) {
+ if (UpdateSupport.sendUpdate(tracked.runnable)) {
UpdateSupport.runUpdate(() -> {
tracked.runnable.run();
tracked.cachingServiceReference = new CachingServiceReference<>(
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/UpdateSupport.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/UpdateSupport.java
index 253ca30..76bd163 100644
--- a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/UpdateSupport.java
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/UpdateSupport.java
@@ -17,8 +17,11 @@
package org.apache.aries.component.dsl.internal;
+import org.apache.aries.component.dsl.OSGiResult;
+
import java.util.Deque;
import java.util.LinkedList;
+import java.util.function.Supplier;
/**
* @author Carlos Sierra Andrés
@@ -55,6 +58,14 @@ public class UpdateSupport {
}
public static void runUpdate(Runnable runnable) {
+ UpdateSupport.<Void>runInUpdate(() -> {runnable.run(); return null;});
+ }
+
+ public static boolean sendUpdate(OSGiResult osgiResult) {
+ return runInUpdate(osgiResult::update);
+ }
+
+ public static <R> R runInUpdate(Supplier<R> supplier) {
isUpdate.set(true);
Deque<Deque<Runnable>> deferredPublishers =
@@ -66,7 +77,7 @@ public class UpdateSupport {
deferredTerminators.addLast(new LinkedList<>());
try {
- runnable.run();
+ return supplier.get();
}
finally {
isUpdate.set(false);
@@ -88,4 +99,5 @@ public class UpdateSupport {
isUpdate.set(!deferredTerminators.isEmpty());
}
}
+
}
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 875dc3a..f644a3c 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
@@ -2202,6 +2202,92 @@ public class DSLTest {
assertEquals(maps, gone);
}
+
+ @Test
+ public void testUpdateEffectsOrder() {
+ ArrayList<String> updateEffects = new ArrayList<>();
+
+ ServiceRegistration<Service> serviceRegistration =
+ bundleContext.registerService(
+ Service.class, new Service(),
+ new Hashtable<String, Object>() {{
+ put("property", "original");
+ }});
+
+ try {
+ OSGi<?> program =
+ serviceReferences(
+ Service.class, __ -> false
+ ).effects(
+ __ -> {},
+ __ -> {},
+ __ -> updateEffects.add("first")
+ ).effects(
+ __ -> {},
+ __ -> {},
+ __ -> updateEffects.add("second")
+ );
+
+ program.run(bundleContext);
+
+ assertEquals(Collections.emptyList(), updateEffects);
+
+ serviceRegistration.setProperties(
+ new Hashtable<String, Object>() {{
+ put("property", "updated");
+ }});
+
+ assertEquals(Arrays.asList("first", "second"), updateEffects);
+ }
+ finally {
+ serviceRegistration.unregister();
+ }
+ }
+
+ @Test
+ public void testUpdateEffectsAreOnlyExecutedWhenNoRefresh() {
+ ArrayList<String> updateEffects = new ArrayList<>();
+
+ ServiceRegistration<Service> serviceRegistration =
+ bundleContext.registerService(
+ Service.class, new Service(),
+ new Hashtable<String, Object>() {{
+ put("property", "original");
+ }});
+
+ try {
+ OSGi<?> program =
+ refreshWhen(
+ serviceReferences(
+ Service.class, __ -> false
+ ).effects(
+ __ -> {},
+ __ -> {},
+ __ -> updateEffects.add("first")
+ ).effects(
+ __ -> {},
+ __ -> {},
+ __ -> updateEffects.add("second")
+ ),
+ __ -> true
+ );
+
+ program.run(bundleContext);
+
+ assertEquals(Collections.emptyList(), updateEffects);
+
+ serviceRegistration.setProperties(
+ new Hashtable<String, Object>() {{
+ put("property", "updated");
+ }});
+
+ assertEquals(Collections.emptyList(), updateEffects);
+ }
+ finally {
+ serviceRegistration.unregister();
+ }
+ }
+
static BundleContext bundleContext = FrameworkUtil.getBundle(
DSLTest.class).getBundleContext();
[aries-component-dsl] 08/10: Mark as deprecated
Posted by cs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
csierra pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/aries-component-dsl.git
commit 1ffa2fe2ce4b9f35e2ded8d85002a3073e2571a1
Author: Carlos Sierra Andrés <ca...@liferay.com>
AuthorDate: Mon Mar 8 17:16:43 2021 +0100
Mark as deprecated
---
.../main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java | 2 ++
1 file changed, 2 insertions(+)
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java
index c3ecd78..f9c658b 100644
--- a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java
@@ -319,6 +319,7 @@ public class BaseOSGiImpl<T> implements OSGi<T> {
return transform(op -> t -> op.apply(function.apply(t)));
}
+ @Deprecated
@Override
public OSGi<T> recover(BiFunction<T, Exception, T> onError) {
return new BaseOSGiImpl<>((executionContext, op) ->
@@ -335,6 +336,7 @@ public class BaseOSGiImpl<T> implements OSGi<T> {
));
}
+ @Deprecated
@Override
public OSGi<T> recoverWith(BiFunction<T, Exception, OSGi<T>> onError) {
return new BaseOSGiImpl<>((executionContext, op) ->
[aries-component-dsl] 07/10: Update name
Posted by cs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
csierra pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/aries-component-dsl.git
commit adbf76fd5c6b710f36d4f999cb60da2131fe0dd8
Author: Carlos Sierra Andrés <ca...@liferay.com>
AuthorDate: Mon Mar 8 17:13:00 2021 +0100
Update name
---
.../src/main/java/org/apache/aries/component/dsl/internal/Pad.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/Pad.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/Pad.java
index 89eabed..9cfdd3f 100644
--- a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/Pad.java
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/Pad.java
@@ -32,7 +32,7 @@ import static org.apache.aries.component.dsl.OSGi.NOOP;
public class Pad<T, S> implements Publisher<T>, OSGiResult {
public Pad(
- ExecutionContext bundleContext,
+ ExecutionContext executionContext,
Function<OSGi<T>, OSGi<S>> fun,
Publisher<? super S> continuation) {
@@ -40,7 +40,7 @@ public class Pad<T, S> implements Publisher<T>, OSGiResult {
OSGi<S> next = fun.apply(probe);
- _result = next.run(bundleContext, continuation);
+ _result = next.run(executionContext, continuation);
_publisher = continuation.pipe(
probe.getPublisher() != null ?
[aries-component-dsl] 01/10: Propagate signal but do not contribute
to refresh enclosing resfreshers
Posted by cs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
csierra pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/aries-component-dsl.git
commit 77a548272f8101c7a64b78029a1b4c89652372de
Author: Carlos Sierra Andrés <ca...@liferay.com>
AuthorDate: Mon Mar 8 11:48:14 2021 +0100
Propagate signal but do not contribute to refresh enclosing resfreshers
---
.../org/apache/aries/component/dsl/internal/RefreshWhenOSGi.java | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/RefreshWhenOSGi.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/RefreshWhenOSGi.java
index e591787..e144d54 100644
--- a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/RefreshWhenOSGi.java
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/RefreshWhenOSGi.java
@@ -48,7 +48,12 @@ public class RefreshWhenOSGi<T> extends OSGiImpl<T> {
}
));
- return new OSGiResultImpl(result::close, () -> false);
+ return new OSGiResultImpl(
+ result::close,
+ () -> {
+ result.update(); return false;
+ }
+ );
});
}
[aries-component-dsl] 04/10: Unify implementations
Posted by cs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
csierra pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/aries-component-dsl.git
commit d2652d13bceb443904de4155240fa095485257b6
Author: Carlos Sierra Andrés <ca...@liferay.com>
AuthorDate: Mon Mar 8 14:27:41 2021 +0100
Unify implementations
---
.../aries/component/dsl/internal/BaseOSGiImpl.java | 123 ++++++++++-----------
1 file changed, 58 insertions(+), 65 deletions(-)
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java
index 1bf1358..74b0219 100644
--- a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/BaseOSGiImpl.java
@@ -239,84 +239,78 @@ public class BaseOSGiImpl<T> implements OSGi<T> {
Consumer<? super T> onRemovedAfter,
Consumer<? super T> onUpdate) {
- return new BaseOSGiImpl<>((executionContext, op) ->
- run(
- executionContext,
- op.pipe(t -> {
- onAddedBefore.accept(t);
+ return transform(op -> t -> {
+ onAddedBefore.accept(t);
- try {
- OSGiResult terminator = op.publish(t);
+ try {
+ OSGiResult terminator = op.publish(t);
- OSGiResult result = new OSGiResultImpl(() -> {
- try {
- onRemovedBefore.accept(t);
- }
- catch (Exception e) {
- //TODO: logging
- }
+ OSGiResult result = new OSGiResultImpl(() -> {
+ try {
+ onRemovedBefore.accept(t);
+ }
+ catch (Exception e) {
+ //TODO: logging
+ }
- try {
- terminator.run();
- }
- catch (Exception e) {
- //TODO: logging
- }
+ try {
+ terminator.run();
+ }
+ catch (Exception e) {
+ //TODO: logging
+ }
- try {
- onRemovedAfter.accept(t);
- }
- catch (Exception e) {
- //TODO: logging
- }
- },
- () -> {
- onUpdate.accept(t);
+ try {
+ onRemovedAfter.accept(t);
+ }
+ catch (Exception e) {
+ //TODO: logging
+ }
+ },
+ () -> {
+ onUpdate.accept(t);
- return terminator.update();
- }
- );
+ return terminator.update();
+ }
+ );
- try {
- onAddedAfter.accept(t);
- }
- catch (Exception e) {
- result.run();
+ try {
+ onAddedAfter.accept(t);
+ }
+ catch (Exception e) {
+ result.run();
- throw e;
- }
+ throw e;
+ }
- return result;
- }
- catch (Exception e) {
- try {
- onRemovedAfter.accept(t);
- }
- catch (Exception e1) {
- //TODO: logging
- }
+ return result;
+ }
+ catch (Exception e) {
+ try {
+ onRemovedAfter.accept(t);
+ }
+ catch (Exception e1) {
+ //TODO: logging
+ }
- throw e;
- }
+ throw e;
+ }
}
- )
- ));
+ );
}
@Override
public OSGi<T> filter(Predicate<T> predicate) {
- return new BaseOSGiImpl<>((executionContext, op) ->
- run(
- executionContext,
- op.pipe(t -> {
- if (predicate.test(t)) {
- return op.apply(t);
- }
- else {
- return NOOP;
- }
+ return transform(
+ op -> t -> {
+ if (predicate.test(t)) {
+ return op.apply(t);
}
- )));
+ else {
+ return NOOP;
+ }
+ }
+ );
}
@Override
@@ -327,8 +321,7 @@ public class BaseOSGiImpl<T> implements OSGi<T> {
@Override
public <S> OSGi<S> map(Function<? super T, ? extends S> function) {
- return new BaseOSGiImpl<>((executionContext, op) ->
- run(executionContext, op.pipe(t -> op.apply(function.apply(t)))));
+ return transform(op -> t -> op.apply(function.apply(t)));
}
@Override