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