Skip to content

Commit 33c4d20

Browse files
committed
Add plugin service descriptor paths to minion classpath
1 parent 013a9e7 commit 33c4d20

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed

pitest-command-line/src/main/java/org/pitest/mutationtest/commandline/PluginFilter.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ public class PluginFilter implements Predicate<String> {
2020
public PluginFilter(final PluginServices plugin) {
2121
FCollection.mapTo(plugin.findClientClasspathPlugins(), classToLocation(),
2222
this.includedClassPathElement);
23+
FCollection.mapTo(plugin.findClientClasspathPluginDescriptors(), fileToLocation(),
24+
this.includedClassPathElement);
2325
}
2426

2527
private static Function<ClientClasspathPlugin, String> classToLocation() {
@@ -43,6 +45,24 @@ private PitError createPitErrorForExceptionOnClass(final Exception ex,
4345
};
4446
}
4547

48+
private static Function<File, String> fileToLocation() {
49+
return new Function<File, String>() {
50+
@Override
51+
public String apply(final File a) {
52+
try {
53+
return a.getCanonicalPath();
54+
} catch (final IOException ex) {
55+
throw createPitErrorForExceptionOnClass(ex, a);
56+
}
57+
}
58+
59+
private PitError createPitErrorForExceptionOnClass(final Exception ex,
60+
final File file) {
61+
return new PitError("Error getting location of file " + file, ex);
62+
}
63+
};
64+
}
65+
4666
@Override
4767
public boolean test(final String a) {
4868
return this.includedClassPathElement.contains(a);

pitest-entry/src/main/java/org/pitest/mutationtest/config/PluginServices.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
package org.pitest.mutationtest.config;
22

3+
import java.io.File;
4+
import java.io.IOException;
5+
import java.net.URISyntaxException;
6+
import java.net.URL;
7+
import java.nio.file.Paths;
38
import java.util.ArrayList;
49
import java.util.Collection;
10+
import java.util.Enumeration;
511
import java.util.List;
612

713
import org.pitest.mutationtest.MutationEngineFactory;
@@ -13,6 +19,7 @@
1319
import org.pitest.plugin.ToolClasspathPlugin;
1420
import org.pitest.testapi.TestPluginFactory;
1521
import org.pitest.util.IsolationUtils;
22+
import org.pitest.util.PitError;
1623
import org.pitest.util.ServiceLoader;
1724

1825
public class PluginServices {
@@ -53,10 +60,23 @@ public Iterable<? extends ClientClasspathPlugin> findClientClasspathPlugins() {
5360
l.addAll(nullPlugins());
5461
return l;
5562
}
63+
64+
public Iterable<? extends File> findClientClasspathPluginDescriptors() {
65+
final List<File> l = new ArrayList<>();
66+
l.addAll(findMutationEngineDescriptors());
67+
l.addAll(findTestFrameworkPluginDescriptors());
68+
l.addAll(nullPluginDescriptors());
69+
return l;
70+
}
71+
5672
Collection<? extends TestPluginFactory> findTestFrameworkPlugins() {
5773
return ServiceLoader.load(TestPluginFactory.class, this.loader);
5874
}
5975

76+
Collection<File> findTestFrameworkPluginDescriptors() {
77+
return findPluginDescriptors(TestPluginFactory.class);
78+
}
79+
6080
Collection<? extends MutationGrouperFactory> findGroupers() {
6181
return ServiceLoader.load(MutationGrouperFactory.class, this.loader);
6282
}
@@ -69,6 +89,10 @@ Collection<? extends MutationEngineFactory> findMutationEngines() {
6989
return ServiceLoader.load(MutationEngineFactory.class, this.loader);
7090
}
7191

92+
Collection<File> findMutationEngineDescriptors() {
93+
return findPluginDescriptors(MutationEngineFactory.class);
94+
}
95+
7296
Collection<? extends TestPrioritiserFactory> findTestPrioritisers() {
7397
return ServiceLoader.load(TestPrioritiserFactory.class, this.loader);
7498
}
@@ -77,8 +101,28 @@ private Collection<ClientClasspathPlugin> nullPlugins() {
77101
return ServiceLoader.load(ClientClasspathPlugin.class, this.loader);
78102
}
79103

104+
private Collection<File> nullPluginDescriptors() {
105+
return findPluginDescriptors(ClientClasspathPlugin.class);
106+
}
107+
80108
public Collection<? extends MutationInterceptorFactory> findInterceptors() {
81109
return ServiceLoader.load(MutationInterceptorFactory.class, this.loader);
82110
}
83111

112+
private Collection<File> findPluginDescriptors(Class<?> ifc) {
113+
try {
114+
final Collection<File> pluginDescriptors = new ArrayList<>();
115+
Enumeration<URL> e = this.loader.getResources("META-INF/services/" + ifc.getName());
116+
while (e.hasMoreElements()) {
117+
URL url = e.nextElement();
118+
if (url.getProtocol() == "file") {
119+
pluginDescriptors.add(Paths.get(url.toURI()).getParent().getParent().getParent().toFile());
120+
}
121+
}
122+
return pluginDescriptors;
123+
} catch (final IOException | URISyntaxException ex) {
124+
throw new PitError("Error finding plugin descriptor for " + ifc.getName(), ex);
125+
}
126+
}
127+
84128
}

0 commit comments

Comments
 (0)