Skip to content

Commit dfbb70b

Browse files
committed
Refactor to have MethodSupplier abstract class, and make ResponderSupplier use it
1 parent 1a49e0e commit dfbb70b

22 files changed

+173
-64
lines changed
Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,34 @@
11
package httpserver;
22

3-
import httpserver.responder.Responder;
3+
import httpserver.request.Request;
4+
import httpserver.responder.MethodResponder;
45

5-
import java.util.HashMap;
6-
import java.util.Map;
6+
import java.util.ArrayList;
7+
import java.util.List;
78

89
public class ResponderSupplier {
9-
private final Responder invalidMethodResponder;
10-
private final Map<Method, Responder> methodResponderMap;
10+
private final MethodResponder invalidMethodResponder;
11+
private final List<MethodResponder> methodResponders;
1112

12-
public ResponderSupplier(Responder invalidMethodResponder) {
13+
public ResponderSupplier(MethodResponder invalidMethodResponder) {
1314
this.invalidMethodResponder = invalidMethodResponder;
14-
this.methodResponderMap = new HashMap<>();
15+
this.methodResponders = new ArrayList<>();
1516
}
1617

17-
public Responder responderForMethodString(String methodString) {
18-
Method method;
19-
try {
20-
method = Method.valueOf(methodString);
21-
} catch (IllegalArgumentException e) {
22-
return invalidMethodResponder;
18+
public MethodResponder supplyResponder(Request request) {
19+
for (MethodResponder methodResponder: methodResponders) {
20+
if (methodResponder.handles(request)) {
21+
return methodResponder;
22+
}
2323
}
24-
return methodResponderMap.get(method);
24+
return invalidMethodResponder;
2525
}
2626

27-
public void registerResponder(Method method, Responder responder) {
28-
this.methodResponderMap.put(method, responder);
27+
public void registerResponder(MethodResponder methodResponder) {
28+
this.methodResponders.add(methodResponder);
29+
}
30+
31+
public List<MethodResponder> allResponders() {
32+
return methodResponders;
2933
}
3034
}

src/main/java/httpserver/ResponderSupplierFactory.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,30 +18,30 @@ public ResponderSupplier makeResponderSupplier() {
1818
RangeHeaderValueParser rangeHeaderValueParser = new RangeHeaderValueParser();
1919
Hasher hasher = new Hasher();
2020

21-
responderSupplier.registerResponder(Method.GET, new GetResponder(
21+
responderSupplier.registerResponder(new GetResponder(
2222
routeMap,
2323
pathExaminer,
2424
html,
2525
rangeHeaderValueParser));
26-
responderSupplier.registerResponder(Method.HEAD, new HeadResponder(
26+
responderSupplier.registerResponder(new HeadResponder(
2727
routeMap,
2828
pathExaminer,
2929
html,
3030
rangeHeaderValueParser));
31-
responderSupplier.registerResponder(Method.POST, new PostResponder(
31+
responderSupplier.registerResponder(new PostResponder(
3232
pathExaminer,
3333
fileOperator));
34-
responderSupplier.registerResponder(Method.PUT, new PutResponder(
34+
responderSupplier.registerResponder(new PutResponder(
3535
pathExaminer,
3636
fileOperator));
37-
responderSupplier.registerResponder(Method.PATCH, new PatchResponder(
37+
responderSupplier.registerResponder(new PatchResponder(
3838
pathExaminer,
3939
fileOperator,
4040
hasher));
41-
responderSupplier.registerResponder(Method.DELETE, new DeleteResponder(
41+
responderSupplier.registerResponder(new DeleteResponder(
4242
pathExaminer,
4343
fileOperator));
44-
responderSupplier.registerResponder(Method.OPTIONS, new OptionsResponder(responderSupplier));
44+
responderSupplier.registerResponder(new OptionsResponder(responderSupplier));
4545

4646
return responderSupplier;
4747
}

src/main/java/httpserver/responder/DeleteResponder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@
1212
import java.io.IOException;
1313
import java.nio.file.Path;
1414

15-
public class DeleteResponder implements Responder {
15+
public class DeleteResponder extends MethodResponder {
1616
private final FileOperator fileOperator;
1717
private final PathExaminer pathExaminer;
1818

1919
public DeleteResponder(PathExaminer pathExaminer, FileOperator fileOperator) {
20+
super.methodString = "DELETE";
2021
this.pathExaminer = pathExaminer;
2122
this.fileOperator = fileOperator;
2223
}

src/main/java/httpserver/responder/GeneralResponder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public GeneralResponder(ResponderSupplier responderSupplier) {
1616
}
1717

1818
public Response respond(AppConfig appConfig, Request request) {
19-
Responder responder = responderSupplier.responderForMethodString(request.getMethodString());
19+
Responder responder = responderSupplier.supplyResponder(request);
2020
try {
2121
return responder.respond(appConfig, request);
2222
} catch (IOException e) {

src/main/java/httpserver/responder/GetResponder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import java.io.IOException;
1616
import java.nio.file.Path;
1717

18-
public class GetResponder implements Responder {
18+
public class GetResponder extends MethodResponder {
1919

2020
private final PathExaminer pathExaminer;
2121
private final RouteMap specialCaseRouteMap;
@@ -26,6 +26,7 @@ public GetResponder(RouteMap getRouteMap,
2626
PathExaminer pathExaminer,
2727
Html html,
2828
RangeHeaderValueParser rangeHeaderValueParser) {
29+
super.methodString = "GET";
2930
this.pathExaminer = pathExaminer;
3031
this.specialCaseRouteMap = getRouteMap;
3132
this.html = html;

src/main/java/httpserver/responder/HeadResponder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public HeadResponder(RouteMap getRouteMap,
1515
Html html,
1616
RangeHeaderValueParser rangeHeaderValueParser) {
1717
super(getRouteMap, pathExaminer, html, rangeHeaderValueParser);
18+
super.methodString = "HEAD";
1819
}
1920

2021
@Override

src/main/java/httpserver/responder/InvalidMethodResponder.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import httpserver.response.MethodNotAllowedResponse;
66
import httpserver.response.Response;
77

8-
public class InvalidMethodResponder implements Responder {
8+
public class InvalidMethodResponder extends MethodResponder {
99
@Override
1010
public Response respond(AppConfig appConfig, Request request) {
1111
return new MethodNotAllowedResponse();
@@ -15,4 +15,9 @@ public Response respond(AppConfig appConfig, Request request) {
1515
public boolean allows(String pathString) {
1616
return true;
1717
}
18+
19+
@Override
20+
public boolean handles(Request request) {
21+
return true;
22+
}
1823
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package httpserver.responder;
2+
3+
import httpserver.request.Request;
4+
5+
public abstract class MethodResponder implements Responder {
6+
protected String methodString;
7+
8+
public String getMethodString() {
9+
return methodString;
10+
}
11+
12+
public boolean handles(Request request) {
13+
return request.getMethodString().equals(this.methodString);
14+
}
15+
}

src/main/java/httpserver/responder/OptionsResponder.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
11
package httpserver.responder;
22

33
import httpserver.AppConfig;
4-
import httpserver.Method;
54
import httpserver.request.Request;
65
import httpserver.ResponderSupplier;
76
import httpserver.header.Header;
87
import httpserver.response.OkResponse;
98
import httpserver.response.Response;
109

10+
import java.util.List;
1111
import java.util.StringJoiner;
1212

13-
public class OptionsResponder implements Responder {
13+
public class OptionsResponder extends MethodResponder {
1414
private final ResponderSupplier responderSupplier;
1515

1616
public OptionsResponder(ResponderSupplier responderSupplier) {
1717
this.responderSupplier = responderSupplier;
18+
super.methodString = "OPTIONS";
1819
}
1920

2021
@Override
2122
public Response respond(AppConfig appConfig, Request request) {
22-
Method[] methods = Method.values();
23+
List<MethodResponder> methodResponders = responderSupplier.allResponders();
2324
StringJoiner joiner = new StringJoiner(",");
2425

25-
for (Method method: methods) {
26-
Responder responder = responderSupplier.responderForMethodString(method.toString());
27-
if (responder.allows(request.getPathString())) {
28-
joiner.add(method.toString());
26+
for (MethodResponder methodResponder: methodResponders) {
27+
if (methodResponder.allows(request.getPathString())) {
28+
joiner.add(methodResponder.getMethodString());
2929
}
3030
}
3131

src/main/java/httpserver/responder/PatchResponder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@
1010
import java.io.IOException;
1111
import java.nio.file.Path;
1212

13-
public class PatchResponder implements Responder {
13+
public class PatchResponder extends MethodResponder {
1414
private PathExaminer pathExaminer;
1515
private final FileOperator fileOperator;
1616
private final Hasher hasher;
1717

1818
public PatchResponder(PathExaminer pathExaminer,
1919
FileOperator fileOperator, Hasher hasher) {
20+
super.methodString = "PATCH";
2021
this.pathExaminer = pathExaminer;
2122
this.fileOperator = fileOperator;
2223
this.hasher = hasher;

0 commit comments

Comments
 (0)