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);