Skip to content

Commit 96075b3

Browse files
committed
Added ability for extension factories to be declared as classes
1 parent 1f41bf1 commit 96075b3

File tree

4 files changed

+78
-7
lines changed

4 files changed

+78
-7
lines changed

src/main/java/com/github/tomakehurst/wiremock/core/WireMockConfiguration.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,10 @@ public WireMockConfiguration extensions(Extension... extensionInstances) {
427427
return this;
428428
}
429429

430+
public WireMockConfiguration extensionFactories(ExtensionFactory... extensionFactories) {
431+
return extensions(extensionFactories);
432+
}
433+
430434
public WireMockConfiguration extensions(ExtensionFactory... extensionFactories) {
431435
extensions.add(extensionFactories);
432436
return this;
@@ -437,6 +441,12 @@ public WireMockConfiguration extensions(Class<? extends Extension>... classes) {
437441
return this;
438442
}
439443

444+
public WireMockConfiguration extensionFactories(
445+
Class<? extends ExtensionFactory>... factoryClasses) {
446+
extensions.addFactories(factoryClasses);
447+
return this;
448+
}
449+
440450
public WireMockConfiguration extensionScanningEnabled(boolean enabled) {
441451
this.extensionScanningEnabled = enabled;
442452
return this;

src/main/java/com/github/tomakehurst/wiremock/extension/ExtensionDeclarations.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public class ExtensionDeclarations {
2626
private final List<String> classNames;
2727
private final List<Class<? extends Extension>> classes;
2828
private final Map<String, Extension> instances;
29+
private final List<Class<? extends ExtensionFactory>> factoryClasses;
2930
private final List<ExtensionFactory> factories;
3031
private static final String WEBHOOK_MESSAGE =
3132
"Passing webhooks in extensions is no longer required and"
@@ -35,6 +36,7 @@ public ExtensionDeclarations() {
3536
this.classNames = new ArrayList<>();
3637
this.classes = new ArrayList<>();
3738
this.instances = new LinkedHashMap<>();
39+
this.factoryClasses = new ArrayList<>();
3840
this.factories = new ArrayList<>();
3941
}
4042

@@ -58,6 +60,10 @@ public void add(ExtensionFactory... factories) {
5860
this.factories.addAll(asList(factories));
5961
}
6062

63+
public void addFactories(Class<? extends ExtensionFactory>... factoryClasses) {
64+
this.factoryClasses.addAll(asList(factoryClasses));
65+
}
66+
6167
public List<String> getClassNames() {
6268
return classNames;
6369
}
@@ -74,6 +80,10 @@ public List<ExtensionFactory> getFactories() {
7480
return factories;
7581
}
7682

83+
public List<Class<? extends ExtensionFactory>> getFactoryClasses() {
84+
return factoryClasses;
85+
}
86+
7787
private boolean removeWebhook(String className) {
7888
if (className.equals(Webhooks.class.getName())) {
7989
System.out.println(WEBHOOK_MESSAGE);

src/main/java/com/github/tomakehurst/wiremock/extension/Extensions.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static java.util.stream.Collectors.toMap;
2121

2222
import com.github.jknack.handlebars.Helper;
23+
import com.github.tomakehurst.wiremock.common.Exceptions;
2324
import com.github.tomakehurst.wiremock.common.FileSource;
2425
import com.github.tomakehurst.wiremock.core.Admin;
2526
import com.github.tomakehurst.wiremock.core.Options;
@@ -93,11 +94,15 @@ public void load() {
9394
loadExtensionsAsServices().collect(toMap(Extension::getName, Function.identity())));
9495
}
9596

97+
final Stream<ExtensionFactory> declaredFactories =
98+
Stream.concat(
99+
extensionDeclarations.getFactories().stream(),
100+
extensionDeclarations.getFactoryClasses().stream()
101+
.map(Extensions::instantiateExtensionFactory));
96102
final Stream<ExtensionFactory> allFactories =
97103
options.isExtensionScanningEnabled()
98-
? Stream.concat(
99-
extensionDeclarations.getFactories().stream(), loadExtensionFactoriesAsServices())
100-
: extensionDeclarations.getFactories().stream();
104+
? Stream.concat(declaredFactories, loadExtensionFactoriesAsServices())
105+
: declaredFactories;
101106

102107
loadedExtensions.putAll(
103108
allFactories
@@ -255,4 +260,10 @@ public <T extends Extension> Map<String, T> ofType(Class<T> extensionType) {
255260
(entry1, entry2) -> entry1,
256261
LinkedHashMap::new)));
257262
}
263+
264+
private static ExtensionFactory instantiateExtensionFactory(
265+
Class<? extends ExtensionFactory> factoryClass) {
266+
return Exceptions.uncheck(
267+
() -> factoryClass.getDeclaredConstructor().newInstance(), ExtensionFactory.class);
268+
}
258269
}

src/test/java/com/github/tomakehurst/wiremock/ExtensionFactoryTest.java

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@
1515
*/
1616
package com.github.tomakehurst.wiremock;
1717

18-
import static com.github.tomakehurst.wiremock.client.WireMock.get;
19-
import static com.github.tomakehurst.wiremock.client.WireMock.noContent;
18+
import static com.github.tomakehurst.wiremock.client.WireMock.*;
2019
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options;
2120
import static com.github.tomakehurst.wiremock.http.RequestMethod.GET;
2221
import static com.github.tomakehurst.wiremock.testsupport.TestFiles.defaultTestFilesRoot;
@@ -26,15 +25,17 @@
2625
import static org.hamcrest.Matchers.is;
2726

2827
import com.github.tomakehurst.wiremock.admin.Router;
28+
import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder;
2929
import com.github.tomakehurst.wiremock.common.FileSource;
3030
import com.github.tomakehurst.wiremock.common.Strings;
3131
import com.github.tomakehurst.wiremock.core.Admin;
3232
import com.github.tomakehurst.wiremock.core.Options;
3333
import com.github.tomakehurst.wiremock.core.WireMockConfiguration;
34-
import com.github.tomakehurst.wiremock.extension.AdminApiExtension;
35-
import com.github.tomakehurst.wiremock.extension.Extensions;
34+
import com.github.tomakehurst.wiremock.extension.*;
3635
import com.github.tomakehurst.wiremock.http.ResponseDefinition;
3736
import com.github.tomakehurst.wiremock.store.Stores;
37+
import com.github.tomakehurst.wiremock.stubbing.ServeEvent;
38+
import com.github.tomakehurst.wiremock.testsupport.WireMockResponse;
3839
import com.github.tomakehurst.wiremock.testsupport.WireMockTestClient;
3940
import java.io.File;
4041
import java.util.List;
@@ -132,6 +133,19 @@ void usesExtensionInstanceLoadedViaServiceLoader() {
132133
assertThat(client.get("/transform-this").content(), is("Expected stuff"));
133134
}
134135

136+
@Test
137+
@SuppressWarnings("unchecked")
138+
void usesExtensionFactoryLoadedAsClass() {
139+
initialiseWireMockServer(
140+
options().dynamicPort().extensionFactories(HeaderAddingExtensionFactory.class));
141+
142+
wm.stubFor(any(anyUrl()).willReturn(ok()));
143+
144+
WireMockResponse response = client.get("/test");
145+
146+
assertThat(response.firstHeader("added-header"), is("present"));
147+
}
148+
135149
private void initialiseWireMockServer(WireMockConfiguration options) {
136150
wm = new WireMockServer(options);
137151
wm.start();
@@ -181,4 +195,30 @@ public void contributeAdminApiRoutes(Router router) {
181195
});
182196
}
183197
}
198+
199+
public static class HeaderAddingExtensionFactory implements ExtensionFactory {
200+
201+
@Override
202+
public List<Extension> create(WireMockServices services) {
203+
return List.of(
204+
new ResponseDefinitionTransformerV2() {
205+
@Override
206+
public ResponseDefinition transform(ServeEvent serveEvent) {
207+
return ResponseDefinitionBuilder.like(serveEvent.getResponseDefinition())
208+
.withHeader("added-header", "present")
209+
.build();
210+
}
211+
212+
@Override
213+
public boolean applyGlobally() {
214+
return true;
215+
}
216+
217+
@Override
218+
public String getName() {
219+
return "add-header";
220+
}
221+
});
222+
}
223+
}
184224
}

0 commit comments

Comments
 (0)