Skip to content

Commit

Permalink
osgi: api changes for PluginInfo. Fix broken TestWithFakeKPMPlugin af…
Browse files Browse the repository at this point in the history
…ter osgi platform modifications
  • Loading branch information
sbrossie committed Nov 24, 2015
1 parent 3b3bfaf commit 2f10c4c
Show file tree
Hide file tree
Showing 6 changed files with 134 additions and 18 deletions.
Expand Up @@ -19,9 +19,12 @@

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;
Expand All @@ -42,6 +45,8 @@
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;
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -111,6 +119,7 @@ public void handleExternalEvents(final ExtBusEvent extBusEvent) {
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);

Expand All @@ -121,7 +130,89 @@ public void handleExternalEvents(final ExtBusEvent extBusEvent) {
}
}

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;
Expand All @@ -137,30 +228,50 @@ public void installNewBundle(final String pluginName, @Nullable final String ver
Mockito.when(bundle.getSymbolicName()).thenReturn(pluginName);

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));
}
Expand All @@ -184,6 +295,7 @@ public static class OverrideModuleForOSGI implements Module {
@Override
public void configure(final Binder binder) {
binder.bind(BundleRegistry.class).to(FakeBundleRegistry.class).asEagerSingleton();
binder.bind(PluginFinder.class).to(FakePluginFinder.class).asEagerSingleton();
}
}

Expand Down Expand Up @@ -261,4 +373,5 @@ public Boolean call() throws Exception {
}
});
}

}
Expand Up @@ -36,28 +36,28 @@ public class PluginInfoJson {

private final String version;

private final boolean running;
private final String state;

private final Set<PluginServiceInfoJson> services;

@JsonCreator
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;
}

public PluginInfoJson(final PluginInfo input) {
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) {
Expand All @@ -78,8 +78,8 @@ public String getVersion() {
return version;
}

public boolean isRunning() {
return running;
public String getState() {
return state;
}

public Set<PluginServiceInfoJson> getServices() {
Expand Down
Expand Up @@ -119,7 +119,7 @@ public PluginServiceInfoJson apply(final PluginServiceInfo input) {
return new PluginInfoJson(input.getBundleSymbolicName(),
input.getPluginName(),
input.getVersion(),
input.isRunning(),
input.getPluginState().name(),
servicesJson);
}
}));
Expand Down
Expand Up @@ -26,6 +26,7 @@
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;
Expand Down Expand Up @@ -94,7 +95,7 @@ private static Iterable<PluginInfo> toPluginInfo(final Iterable<PluginInfoModelJ
@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()));
}
});
}
Expand Down
Expand Up @@ -21,6 +21,7 @@

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;
Expand All @@ -36,28 +37,28 @@ public class PluginInfoModelJson {

private final String version;

private final boolean running;
private final PluginState state;

private final Set<PluginServiceInfoModelJson> services;

@JsonCreator
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;
}

public PluginInfoModelJson(final PluginInfo input) {
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) {
Expand All @@ -78,8 +79,8 @@ public String getVersion() {
return version;
}

public boolean isRunning() {
return running;
public PluginState getState() {
return state;
}

public Set<PluginServiceInfoModelJson> getServices() {
Expand All @@ -97,10 +98,10 @@ public boolean equals(final Object o) {

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) {
Expand All @@ -118,7 +119,7 @@ public int hashCode() {
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;
}
Expand Down
Expand Up @@ -24,6 +24,7 @@

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;
Expand All @@ -47,7 +48,7 @@ public void testNodeInfoSerialization() throws Exception {
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);

Expand Down

0 comments on commit 2f10c4c

Please sign in to comment.