killbill-memoizeit

osgi: api changes for PluginInfo. Fix broken TestWithFakeKPMPlugin

11/23/2015 11:23:27 PM

Details

diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithFakeKPMPlugin.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithFakeKPMPlugin.java
index 74db2b7..a822b7d 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithFakeKPMPlugin.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithFakeKPMPlugin.java
@@ -19,9 +19,12 @@ package org.killbill.billing.beatrix.integration;
 
 import java.io.File;
 import java.io.IOException;
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.Callable;
 
 import javax.annotation.Nullable;
@@ -42,6 +45,8 @@ import org.killbill.billing.osgi.api.config.PluginConfig;
 import org.killbill.billing.osgi.api.config.PluginConfigServiceApi;
 import org.killbill.billing.osgi.api.config.PluginLanguage;
 import org.killbill.billing.osgi.api.config.PluginType;
+import org.killbill.billing.osgi.config.OSGIConfig;
+import org.killbill.billing.osgi.pluginconf.PluginConfigException;
 import org.killbill.billing.osgi.pluginconf.PluginFinder;
 import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.killbill.billing.util.jackson.ObjectMapper;
@@ -83,6 +88,9 @@ public class TestWithFakeKPMPlugin extends TestIntegrationBase {
     @Inject
     private PluginsInfoApi pluginsInfoApi;
 
+    @Inject
+    private PluginFinder pluginFinder;
+
     @Override
     protected KillbillConfigSource getConfigSource() {
         ImmutableMap additionalProperties = new ImmutableMap.Builder()
@@ -111,6 +119,7 @@ public class TestWithFakeKPMPlugin extends TestIntegrationBase {
                     final BroadcastMetadata broadcastMetadata = objectMapper.readValue(metadata, BroadcastMetadata.class);
 
                     final PluginNodeCommandMetadata nodeCommandMetadata = (PluginNodeCommandMetadata) nodeInfoMapper.deserializeNodeCommand(broadcastMetadata.getEventJson(), broadcastMetadata.getCommandType());
+                    ((FakePluginFinder) pluginFinder).addPlugin(createPluginConfig(nodeCommandMetadata));
 
                     pluginsInfoApi.notifyOfStateChanged(PluginStateChange.NEW_VERSION, nodeCommandMetadata.getPluginName(), nodeCommandMetadata.getPluginVersion(), PluginLanguage.JAVA);
 
@@ -121,7 +130,89 @@ public class TestWithFakeKPMPlugin extends TestIntegrationBase {
         }
     }
 
+    private PluginConfig createPluginConfig(final PluginNodeCommandMetadata nodeCommandMetadata) {
+        return new PluginConfig() {
+            @Override
+            public int compareTo(final PluginConfig o) {
+                return 0;
+            }
+
+            @Override
+            public String getPluginName() {
+                return nodeCommandMetadata.getPluginName();
+            }
+
+            @Override
+            public PluginType getPluginType() {
+                return PluginType.NOTIFICATION;
+            }
+
+            @Override
+            public String getVersion() {
+                return nodeCommandMetadata.getPluginVersion();
+            }
+
+            @Override
+            public String getPluginVersionnedName() {
+                return getPluginName() + "-" + getVersion();
+            }
+
+            @Override
+            public File getPluginVersionRoot() {
+                return null;
+            }
+
+            @Override
+            public PluginLanguage getPluginLanguage() {
+                return PluginLanguage.JAVA;
+            }
+
+            @Override
+            public boolean isSelectedForStart() {
+                return true;
+            }
+
+            @Override
+            public boolean isDisabled() {
+                return false;
+            }
+        };
+    }
+
     // We override the  BundleRegistry to bypass the bundle installation and yet return our new bundle as being installed.
+    private static class FakePluginFinder extends PluginFinder {
+
+        @Inject
+        public FakePluginFinder(final OSGIConfig osgiConfig) {
+            super(osgiConfig);
+        }
+
+        public void reloadPlugins() throws PluginConfigException, IOException {
+        }
+
+        public void addPlugin(final PluginConfig newPlugin) {
+            final Map<String, LinkedList<PluginConfig>> allPluginField = getAllPluginField();
+
+            allPluginField.clear();
+            if (allPluginField.get(newPlugin.getPluginName()) == null) {
+                allPluginField.put(newPlugin.getPluginName(), new LinkedList<PluginConfig>());
+            }
+            allPluginField.get(newPlugin.getPluginName()).add(newPlugin);
+        }
+
+        private Map<String, LinkedList<PluginConfig>> getAllPluginField() {
+            try {
+                final Field f = PluginFinder.class.getDeclaredField("allPlugins");
+                f.setAccessible(true);
+                return (Map<String, LinkedList<PluginConfig>>) f.get(this);
+            } catch (NoSuchFieldException e) {
+                throw new RuntimeException("Failed to retrieve private field allPlugins from PluginFinder class ", e);
+            } catch (IllegalAccessException e) {
+                throw new RuntimeException("Failed to retrieve private field allPlugins from PluginFinder class ", e);
+            }
+        }
+    }
+
     private static class FakeBundleRegistry extends BundleRegistry {
 
         private final List<BundleWithMetadata> bundles;
@@ -138,29 +229,49 @@ public class TestWithFakeKPMPlugin extends TestIntegrationBase {
 
             final BundleWithConfig config = new BundleWithConfig(bundle, new PluginConfig() {
                 @Override
+                public int compareTo(final PluginConfig o) {
+                    return 0;
+                }
+
+                @Override
                 public String getPluginName() {
                     return pluginName;
                 }
+
                 @Override
                 public PluginType getPluginType() {
                     return PluginType.NOTIFICATION;
                 }
+
                 @Override
                 public String getVersion() {
                     return version;
                 }
+
                 @Override
                 public String getPluginVersionnedName() {
                     return null;
                 }
+
                 @Override
                 public File getPluginVersionRoot() {
                     return null;
                 }
+
                 @Override
                 public PluginLanguage getPluginLanguage() {
                     return pluginLanguage;
                 }
+
+                @Override
+                public boolean isSelectedForStart() {
+                    return true;
+                }
+
+                @Override
+                public boolean isDisabled() {
+                    return false;
+                }
             });
             bundles.add(new BundleWithMetadata(config));
         }
@@ -184,6 +295,7 @@ public class TestWithFakeKPMPlugin extends TestIntegrationBase {
         @Override
         public void configure(final Binder binder) {
             binder.bind(BundleRegistry.class).to(FakeBundleRegistry.class).asEagerSingleton();
+            binder.bind(PluginFinder.class).to(FakePluginFinder.class).asEagerSingleton();
         }
     }
 
@@ -261,4 +373,5 @@ public class TestWithFakeKPMPlugin extends TestIntegrationBase {
             }
         });
     }
+
 }
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PluginInfoJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PluginInfoJson.java
index 50910cb..5957022 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PluginInfoJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PluginInfoJson.java
@@ -36,7 +36,7 @@ public class PluginInfoJson {
 
     private final String version;
 
-    private final boolean running;
+    private final String state;
 
     private final Set<PluginServiceInfoJson> services;
 
@@ -44,12 +44,12 @@ public class PluginInfoJson {
     public PluginInfoJson(@JsonProperty("bundleSymbolicName") final String bundleSymbolicName,
                           @JsonProperty("pluginName") final String pluginName,
                           @JsonProperty("version") final String version,
-                          @JsonProperty("running") final boolean running,
+                          @JsonProperty("state") final String state,
                           @JsonProperty("services") final Set<PluginServiceInfoJson> services) {
         this.bundleSymbolicName = bundleSymbolicName;
         this.pluginName = pluginName;
         this.version = version;
-        this.running = running;
+        this.state = state;
         this.services = services;
     }
 
@@ -57,7 +57,7 @@ public class PluginInfoJson {
         this(input.getBundleSymbolicName(),
              input.getPluginName(),
              input.getVersion(),
-             input.isRunning(),
+             input.getPluginState().name(),
              ImmutableSet.copyOf(Iterables.transform(input.getServices(), new Function<PluginServiceInfo, PluginServiceInfoJson>() {
                  @Override
                  public PluginServiceInfoJson apply(final PluginServiceInfo input) {
@@ -78,8 +78,8 @@ public class PluginInfoJson {
         return version;
     }
 
-    public boolean isRunning() {
-        return running;
+    public String getState() {
+        return state;
     }
 
     public Set<PluginServiceInfoJson> getServices() {
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/NodesInfoResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/NodesInfoResource.java
index 0f6eb3c..b6fa653 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/NodesInfoResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/NodesInfoResource.java
@@ -119,7 +119,7 @@ public class NodesInfoResource extends JaxRsResourceBase {
                         return new PluginInfoJson(input.getBundleSymbolicName(),
                                                   input.getPluginName(),
                                                   input.getVersion(),
-                                                  input.isRunning(),
+                                                  input.getPluginState().name(),
                                                   servicesJson);
                     }
                 }));
diff --git a/util/src/main/java/org/killbill/billing/util/nodes/DefaultNodeInfo.java b/util/src/main/java/org/killbill/billing/util/nodes/DefaultNodeInfo.java
index ce8200d..53afd81 100644
--- a/util/src/main/java/org/killbill/billing/util/nodes/DefaultNodeInfo.java
+++ b/util/src/main/java/org/killbill/billing/util/nodes/DefaultNodeInfo.java
@@ -26,6 +26,7 @@ import org.killbill.billing.osgi.api.DefaultPluginsInfoApi.DefaultPluginInfo;
 import org.killbill.billing.osgi.api.DefaultPluginsInfoApi.DefaultPluginServiceInfo;
 import org.killbill.billing.osgi.api.PluginInfo;
 import org.killbill.billing.osgi.api.PluginServiceInfo;
+import org.killbill.billing.osgi.api.PluginState;
 import org.killbill.billing.util.nodes.json.NodeInfoModelJson;
 import org.killbill.billing.util.nodes.json.PluginInfoModelJson;
 import org.killbill.billing.util.nodes.json.PluginServiceInfoModelJson;
@@ -94,7 +95,7 @@ public class DefaultNodeInfo implements NodeInfo {
             @Override
             public PluginInfo apply(final PluginInfoModelJson input) {
 
-                return new DefaultPluginInfo(input.getBundleSymbolicName(), input.getPluginName(), input.getVersion(), input.isRunning(), toPluginServiceInfo(input.getServices()));
+                return new DefaultPluginInfo(input.getBundleSymbolicName(), input.getPluginName(), input.getVersion(), input.getState(), toPluginServiceInfo(input.getServices()));
             }
         });
     }
diff --git a/util/src/main/java/org/killbill/billing/util/nodes/json/PluginInfoModelJson.java b/util/src/main/java/org/killbill/billing/util/nodes/json/PluginInfoModelJson.java
index c1acb87..bd48b20 100644
--- a/util/src/main/java/org/killbill/billing/util/nodes/json/PluginInfoModelJson.java
+++ b/util/src/main/java/org/killbill/billing/util/nodes/json/PluginInfoModelJson.java
@@ -21,6 +21,7 @@ import java.util.Set;
 
 import org.killbill.billing.osgi.api.PluginInfo;
 import org.killbill.billing.osgi.api.PluginServiceInfo;
+import org.killbill.billing.osgi.api.PluginState;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -36,7 +37,7 @@ public class PluginInfoModelJson {
 
     private final String version;
 
-    private final boolean running;
+    private final PluginState state;
 
     private final Set<PluginServiceInfoModelJson> services;
 
@@ -44,12 +45,12 @@ public class PluginInfoModelJson {
     public PluginInfoModelJson(@JsonProperty("bundleSymbolicName") final String bundleSymbolicName,
                                @JsonProperty("pluginName") final String pluginName,
                                @JsonProperty("version") final String version,
-                               @JsonProperty("running") final boolean running,
+                               @JsonProperty("state") final PluginState state,
                                @JsonProperty("services") final Set<PluginServiceInfoModelJson> services) {
         this.bundleSymbolicName = bundleSymbolicName;
         this.pluginName = pluginName;
         this.version = version;
-        this.running = running;
+        this.state = state;
         this.services = services;
     }
 
@@ -57,7 +58,7 @@ public class PluginInfoModelJson {
         this(input.getBundleSymbolicName(),
              input.getPluginName(),
              input.getVersion(),
-             input.isRunning(),
+             input.getPluginState(),
              ImmutableSet.copyOf(Iterables.transform(input.getServices(), new Function<PluginServiceInfo, PluginServiceInfoModelJson>() {
                  @Override
                  public PluginServiceInfoModelJson apply(final PluginServiceInfo input) {
@@ -78,8 +79,8 @@ public class PluginInfoModelJson {
         return version;
     }
 
-    public boolean isRunning() {
-        return running;
+    public PluginState getState() {
+        return state;
     }
 
     public Set<PluginServiceInfoModelJson> getServices() {
@@ -97,10 +98,10 @@ public class PluginInfoModelJson {
 
         final PluginInfoModelJson that = (PluginInfoModelJson) o;
 
-        if (running != that.running) {
+        if (bundleSymbolicName != null ? !bundleSymbolicName.equals(that.bundleSymbolicName) : that.bundleSymbolicName != null) {
             return false;
         }
-        if (bundleSymbolicName != null ? !bundleSymbolicName.equals(that.bundleSymbolicName) : that.bundleSymbolicName != null) {
+        if (state != null ? !state.equals(that.state) : that.state != null) {
             return false;
         }
         if (pluginName != null ? !pluginName.equals(that.pluginName) : that.pluginName != null) {
@@ -118,7 +119,7 @@ public class PluginInfoModelJson {
         int result = bundleSymbolicName != null ? bundleSymbolicName.hashCode() : 0;
         result = 31 * result + (pluginName != null ? pluginName.hashCode() : 0);
         result = 31 * result + (version != null ? version.hashCode() : 0);
-        result = 31 * result + (running ? 1 : 0);
+        result = 31 * result + (state != null ? state.hashCode() : 0);
         result = 31 * result + (services != null ? services.hashCode() : 0);
         return result;
     }
diff --git a/util/src/test/java/org/killbill/billing/util/nodes/TestNodeInfoMapper.java b/util/src/test/java/org/killbill/billing/util/nodes/TestNodeInfoMapper.java
index f75cdfb..5b31f6e 100644
--- a/util/src/test/java/org/killbill/billing/util/nodes/TestNodeInfoMapper.java
+++ b/util/src/test/java/org/killbill/billing/util/nodes/TestNodeInfoMapper.java
@@ -24,6 +24,7 @@ import java.util.Set;
 
 import javax.inject.Inject;
 
+import org.killbill.billing.osgi.api.PluginState;
 import org.killbill.billing.util.UtilTestSuiteNoDB;
 import org.killbill.billing.util.nodes.json.NodeInfoModelJson;
 import org.killbill.billing.util.nodes.json.PluginInfoModelJson;
@@ -47,7 +48,7 @@ public class TestNodeInfoMapper extends UtilTestSuiteNoDB {
         services1.add(svc);
 
         final List<PluginInfoModelJson> pluginInfos = new ArrayList<PluginInfoModelJson>();
-        final PluginInfoModelJson info1 = new PluginInfoModelJson("sym1", "name1", "vers1", true, services1);
+        final PluginInfoModelJson info1 = new PluginInfoModelJson("sym1", "name1", "vers1", PluginState.INSTALLED, services1);
         pluginInfos.add(info1);
         final NodeInfoModelJson input = new NodeInfoModelJson("nodeName", clock.getUTCNow(), clock.getUTCNow(), "1.0", "1.0", "1.0", "1.0", "1.0", pluginInfos);