You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by da...@apache.org on 2019/12/19 15:07:07 UTC

[sling-whiteboard] branch master updated: Add ConflictResolver interface

This is an automated email from the ASF dual-hosted git repository.

davidb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git


The following commit(s) were added to refs/heads/master by this push:
     new 2d098e8  Add ConflictResolver interface
2d098e8 is described below

commit 2d098e8b6b427dbd05cddf577789f2607d2bdd0c
Author: David Bosschaert <da...@gmail.com>
AuthorDate: Thu Dec 19 15:06:40 2019 +0000

    Add ConflictResolver interface
---
 .../java/org/osgi/feature/ConflictResolver.java    | 21 ++++++++++++
 .../main/java/org/osgi/feature/MergeContext.java   |  6 ++--
 .../osgi/feature/builder/MergeContextBuilder.java  | 40 ++++++++++++----------
 .../org/osgi/feature/impl/FeatureServiceImpl.java  |  6 ++--
 .../osgi/feature/impl/FeatureServiceImplTest.java  |  6 ++--
 5 files changed, 51 insertions(+), 28 deletions(-)

diff --git a/osgi-featuremodel/src/main/java/org/osgi/feature/ConflictResolver.java b/osgi-featuremodel/src/main/java/org/osgi/feature/ConflictResolver.java
new file mode 100644
index 0000000..2cedced
--- /dev/null
+++ b/osgi-featuremodel/src/main/java/org/osgi/feature/ConflictResolver.java
@@ -0,0 +1,21 @@
+/*
+ * 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.osgi.feature;
+
+public interface ConflictResolver<T, R> {
+    R resolve(Feature f1, T o1, Feature f2, T o2);
+}
diff --git a/osgi-featuremodel/src/main/java/org/osgi/feature/MergeContext.java b/osgi-featuremodel/src/main/java/org/osgi/feature/MergeContext.java
index 8d504e7..761daa1 100644
--- a/osgi-featuremodel/src/main/java/org/osgi/feature/MergeContext.java
+++ b/osgi-featuremodel/src/main/java/org/osgi/feature/MergeContext.java
@@ -32,7 +32,7 @@ public interface MergeContext {
      * @return Return a list of bundles that should be used in this case. This could
      * be one or both of the provided bundles, or a different bundle altogether.
      */
-    List<Bundle> resolveBundleConflict(Bundle b1, Bundle b2);
+    List<Bundle> handleBundleConflict(Feature f1, Bundle b1, Feature f2, Bundle b2);
 
     /**
      * If two merged features both contain the same configuration PID, this method
@@ -41,7 +41,7 @@ public interface MergeContext {
      * @param c2 The second configuration.
      * @return The configuration to use.
      */
-    Configuration resolveConfigurationConflict(Configuration c1, Configuration c2);
+    Configuration handleConfigurationConflict(Feature f1, Configuration c1, Feature f2, Configuration c2);
 
-    Extension resolveExtensionConflict(Extension e1, Extension e2);
+    Extension handleExtensionConflict(Feature f1, Extension e1, Feature f2, Extension e2);
 }
diff --git a/osgi-featuremodel/src/main/java/org/osgi/feature/builder/MergeContextBuilder.java b/osgi-featuremodel/src/main/java/org/osgi/feature/builder/MergeContextBuilder.java
index 100d01b..31dac73 100644
--- a/osgi-featuremodel/src/main/java/org/osgi/feature/builder/MergeContextBuilder.java
+++ b/osgi-featuremodel/src/main/java/org/osgi/feature/builder/MergeContextBuilder.java
@@ -18,28 +18,29 @@ package org.osgi.feature.builder;
 
 import org.osgi.feature.Bundle;
 import org.osgi.feature.Configuration;
+import org.osgi.feature.ConflictResolver;
 import org.osgi.feature.Extension;
+import org.osgi.feature.Feature;
 import org.osgi.feature.MergeContext;
 
 import java.util.List;
-import java.util.function.BiFunction;
 
 public class MergeContextBuilder {
-    private BiFunction<Bundle, Bundle, List<Bundle>> bundleHandler;
-    private BiFunction<Configuration, Configuration, Configuration> configHandler;
-    private BiFunction<Extension, Extension, Extension> extensionHandler;
+    private ConflictResolver<Bundle, List<Bundle>> bundleHandler;
+    private ConflictResolver<Configuration, Configuration> configHandler;
+    private ConflictResolver<Extension, Extension> extensionHandler;
 
-    public MergeContextBuilder bundleConflictHandler(BiFunction<Bundle, Bundle, List<Bundle>> bh) {
+    public MergeContextBuilder bundleConflictHandler(ConflictResolver<Bundle, List<Bundle>> bh) {
         bundleHandler = bh;
         return this;
     }
 
-    public MergeContextBuilder configConflictHandler(BiFunction<Configuration, Configuration, Configuration> ch) {
+    public MergeContextBuilder configConflictHandler(ConflictResolver<Configuration, Configuration> ch) {
         configHandler = ch;
         return this;
     }
 
-    public MergeContextBuilder extensionConflictHandler(BiFunction<Extension, Extension, Extension> eh) {
+    public MergeContextBuilder extensionConflictHandler(ConflictResolver<Extension, Extension> eh) {
         extensionHandler = eh;
         return this;
     }
@@ -49,31 +50,32 @@ public class MergeContextBuilder {
     }
 
     private static class MergeContextImpl implements MergeContext {
-        private final BiFunction<Bundle, Bundle, List<Bundle>> bundleHandler;
-        private final BiFunction<Configuration, Configuration, Configuration> configHandler;
-        private final BiFunction<Extension, Extension, Extension> extensionHandler;
+        private final ConflictResolver<Bundle, List<Bundle>> bundleHandler;
+        private final ConflictResolver<Configuration, Configuration> configHandler;
+        private final ConflictResolver<Extension, Extension> extensionHandler;
 
-        private MergeContextImpl(BiFunction<Bundle, Bundle, List<Bundle>> bundleHandler,
-                BiFunction<Configuration, Configuration, Configuration> configHandler,
-                BiFunction<Extension, Extension, Extension> extensionHandler) {
+
+        public MergeContextImpl(ConflictResolver<Bundle, List<Bundle>> bundleHandler,
+                ConflictResolver<Configuration, Configuration> configHandler,
+                ConflictResolver<Extension, Extension> extensionHandler) {
             this.bundleHandler = bundleHandler;
             this.configHandler = configHandler;
             this.extensionHandler = extensionHandler;
         }
 
         @Override
-        public List<Bundle> resolveBundleConflict(Bundle b1, Bundle b2) {
-            return bundleHandler.apply(b1, b2);
+        public List<Bundle> handleBundleConflict(Feature f1, Bundle b1, Feature f2, Bundle b2) {
+            return bundleHandler.resolve(f1, b1, f2, b2);
         }
 
         @Override
-        public Configuration resolveConfigurationConflict(Configuration c1, Configuration c2) {
-            return configHandler.apply(c1, c2);
+        public Configuration handleConfigurationConflict(Feature f1, Configuration c1, Feature f2, Configuration c2) {
+            return configHandler.resolve(f1, c1, f2, c2);
         }
 
         @Override
-        public Extension resolveExtensionConflict(Extension e1, Extension e2) {
-            return extensionHandler.apply(e1, e2);
+        public Extension handleExtensionConflict(Feature f1, Extension e1, Feature f2, Extension e2) {
+            return extensionHandler.resolve(f1, e1, f2, e2);
         }
     }
 }
diff --git a/osgi-featuremodel/src/main/java/org/osgi/feature/impl/FeatureServiceImpl.java b/osgi-featuremodel/src/main/java/org/osgi/feature/impl/FeatureServiceImpl.java
index 6bbc926..e0aebf0 100644
--- a/osgi-featuremodel/src/main/java/org/osgi/feature/impl/FeatureServiceImpl.java
+++ b/osgi-featuremodel/src/main/java/org/osgi/feature/impl/FeatureServiceImpl.java
@@ -245,7 +245,7 @@ public class FeatureServiceImpl implements FeatureService {
                 if (bID.getGroupId().equals(orgID.getGroupId()) &&
                         bID.getArtifactId().equals(orgID.getArtifactId())) {
                     found = true;
-                    List<Bundle> res = new ArrayList<>(ctx.resolveBundleConflict(b, orgb));
+                    List<Bundle> res = new ArrayList<>(ctx.handleBundleConflict(f1, b, f2, orgb));
                     if (res.contains(orgb)) {
                         res.remove(orgb);
                     } else {
@@ -271,7 +271,7 @@ public class FeatureServiceImpl implements FeatureService {
             Configuration newCfg = cfgEntry.getValue();
             Configuration orgCfg = configs.get(pid);
             if (orgCfg != null) {
-                Configuration resCfg = ctx.resolveConfigurationConflict(orgCfg, newCfg);
+                Configuration resCfg = ctx.handleConfigurationConflict(f1, orgCfg, f2, newCfg);
                 if (!resCfg.equals(orgCfg)) {
                     configs.remove(pid);
                     addConfigs.put(pid, resCfg);
@@ -294,7 +294,7 @@ public class FeatureServiceImpl implements FeatureService {
             Extension newEx = exEntry.getValue();
             Extension orgEx = extensions.get(key);
             if (orgEx != null) {
-                Extension resEx = ctx.resolveExtensionConflict(orgEx, newEx);
+                Extension resEx = ctx.handleExtensionConflict(f1, orgEx, f2, newEx);
                 if (!resEx.equals(orgEx)) {
                     extensions.remove(key);
                     addExtensions.put(key, resEx);
diff --git a/osgi-featuremodel/src/test/java/org/osgi/feature/impl/FeatureServiceImplTest.java b/osgi-featuremodel/src/test/java/org/osgi/feature/impl/FeatureServiceImplTest.java
index 0c28e78..91e819a 100644
--- a/osgi-featuremodel/src/test/java/org/osgi/feature/impl/FeatureServiceImplTest.java
+++ b/osgi-featuremodel/src/test/java/org/osgi/feature/impl/FeatureServiceImplTest.java
@@ -89,8 +89,8 @@ public class FeatureServiceImplTest {
         }
 
         MergeContext ctx = new MergeContextBuilder()
-                .bundleConflictHandler((b1, b2) -> Arrays.asList(b1, b2))
-                .configConflictHandler((c1, c2) -> new ConfigurationBuilder(c1)
+                .bundleConflictHandler((cf1, b1, cf2, b2) -> Arrays.asList(b1, b2))
+                .configConflictHandler((cf1, c1, cf2, c2) -> new ConfigurationBuilder(c1)
                         .addValues(c2.getValues()).build())
                 .build();
 
@@ -141,7 +141,7 @@ public class FeatureServiceImplTest {
         }
 
         MergeContext ctx = new MergeContextBuilder()
-                .extensionConflictHandler((e1, e2) ->
+                .extensionConflictHandler((cf1, e1, cf2, e2) ->
                     new ExtensionBuilder(e1.getName(), e1.getType(), e1.getKind())
                         .addText(e1.getText())
                         .addText(e2.getText())