Skip to content

Commit 6cd8fc7

Browse files
committed
Changed the response body system
1 parent 4e42a17 commit 6cd8fc7

6 files changed

Lines changed: 119 additions & 43 deletions

File tree

‎pom.xml‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,16 @@
4343
<version>5.4.2</version>
4444
<scope>test</scope>
4545
</dependency>
46+
<dependency>
47+
<groupId>org.javawebstack</groupId>
48+
<artifactId>Graph</artifactId>
49+
<version>1.0-SNAPSHOT</version>
50+
</dependency>
51+
<dependency>
52+
<groupId>org.javawebstack</groupId>
53+
<artifactId>Validator</artifactId>
54+
<version>1.0-SNAPSHOT</version>
55+
</dependency>
4656
<dependency>
4757
<groupId>org.javawebstack</groupId>
4858
<artifactId>Injector</artifactId>

‎src/main/java/org/javawebstack/httpserver/Exchange.java‎

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
package org.javawebstack.httpserver;
22

33
import com.google.gson.JsonElement;
4+
import org.javawebstack.graph.GraphElement;
45
import org.javawebstack.httpserver.helper.HttpMethod;
6+
import org.javawebstack.httpserver.helper.MimeType;
7+
import org.javawebstack.validator.ValidationException;
8+
import org.javawebstack.validator.ValidationResult;
9+
import org.javawebstack.validator.Validator;
510

611
import javax.servlet.MultipartConfigElement;
712
import javax.servlet.http.HttpServletRequest;
@@ -10,6 +15,7 @@
1015
import java.io.IOException;
1116
import java.io.InputStream;
1217
import java.nio.charset.StandardCharsets;
18+
import java.util.Collection;
1319
import java.util.HashMap;
1420
import java.util.Map;
1521

@@ -33,15 +39,35 @@ public Exchange(HTTPServer server, HttpServletRequest request, HttpServletRespon
3339
method = "websocket".equalsIgnoreCase(request.getHeader("Upgrade")) ? HttpMethod.WEBSOCKET : HttpMethod.valueOf(request.getMethod());
3440
}
3541

36-
public <T> T getBody(Class<T> clazz){
42+
public <T> T body(Class<T> clazz){
3743
if(body == null)
3844
body = read();
3945
if(clazz == byte[].class)
4046
return (T) body;
4147
String body = new String(this.body, StandardCharsets.UTF_8);
4248
if(clazz == String.class)
4349
return (T) body;
44-
return server.getGson().fromJson(body, clazz);
50+
MimeType type = MimeType.byMimeType(getContentType());
51+
if(type == null)
52+
type = MimeType.JSON;
53+
GraphElement request = null;
54+
switch (type){
55+
case JSON:
56+
request = GraphElement.fromJson(body);
57+
break;
58+
case YAML:
59+
request = GraphElement.fromYaml(body, !(clazz.isArray() || Collection.class.isAssignableFrom(clazz)));
60+
break;
61+
case X_WWW_FORM_URLENCODED:
62+
request = GraphElement.fromFormData(body);
63+
break;
64+
}
65+
if(request == null)
66+
return null;
67+
ValidationResult result = Validator.getValidator(clazz).validate(request);
68+
if(!result.isValid())
69+
throw new ValidationException(result);
70+
return server.getGraphMapper().fromGraph(request, clazz);
4571
}
4672

4773
public HTTPServer getServer() {
@@ -146,19 +172,19 @@ public String bearerAuth(){
146172
return auth.substring(7);
147173
}
148174
public <T> T getBodyPath(String path, Class<T> clazz){
149-
return server.getGson().fromJson(getBodyPathElement(path), clazz);
175+
return server.getGraphMapper().fromGraph(getBodyPathElement(path), clazz);
150176
}
151-
public JsonElement getBodyPathElement(String path){
152-
return getPathElement(getBody(JsonElement.class), path);
177+
public GraphElement getBodyPathElement(String path){
178+
return getPathElement(body(GraphElement.class), path);
153179
}
154-
protected static JsonElement getPathElement(JsonElement source, String path){
180+
protected static GraphElement getPathElement(GraphElement source, String path){
155181
if(source == null || path == null || path.length() == 0)
156182
return source;
157183
if(!path.contains(".")){
158-
if(source.isJsonObject()){
159-
return source.getAsJsonObject().get(path);
160-
}else if(source.isJsonArray()){
161-
return source.getAsJsonArray().get(Integer.parseInt(path));
184+
if(source.isObject()){
185+
return source.object().get(path);
186+
}else if(source.isArray()){
187+
return source.array().get(Integer.parseInt(path));
162188
}else{
163189
return null;
164190
}

‎src/main/java/org/javawebstack/httpserver/HTTPServer.java‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.google.gson.GsonBuilder;
66
import org.eclipse.jetty.util.log.Log;
77
import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
8+
import org.javawebstack.graph.GraphMapper;
89
import org.javawebstack.httpserver.helper.JettyNoLog;
910
import org.javawebstack.httpserver.helper.HttpMethod;
1011
import org.javawebstack.httpserver.router.RouteBinder;
@@ -45,6 +46,7 @@ public class HTTPServer implements RouteParamTransformerProvider {
4546
private final List<RequestInterceptor> beforeInterceptors = new ArrayList<>();
4647
private Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
4748
.setDateFormat("yyyy-MM-dd HH:mm:ss").disableHtmlEscaping().create();
49+
private GraphMapper graphMapper = new GraphMapper();
4850
private Injector injector = null;
4951
private org.eclipse.jetty.websocket.server.WebSocketHandler webSocketHandler;
5052

@@ -57,6 +59,15 @@ public HTTPServer logger(Logger logger){
5759
return this;
5860
}
5961

62+
public HTTPServer graph(GraphMapper graphMapper){
63+
this.graphMapper = graphMapper;
64+
return this;
65+
}
66+
67+
public GraphMapper getGraphMapper() {
68+
return graphMapper;
69+
}
70+
6071
public Logger getLogger(){
6172
return logger;
6273
}

‎src/main/java/org/javawebstack/httpserver/helper/MimeType.java‎

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,21 @@ public enum MimeType {
2222
MP4("video/mp4", "mp4"),
2323
MP3("audio/mpeg", "mp3"),
2424
WAV("audio/wav", "wav"),
25-
OGG("audio/ogg", "ogg");
25+
OGG("audio/ogg", "ogg"),
26+
YAML(new String[]{"text/yaml", "text/x-yaml", "application/yaml", "application/x-yaml"}, "yaml", "yml");
2627

27-
MimeType(String mime, String... extensions){
28-
this.mime = mime;
29-
this.extensions = Arrays.asList(extensions);
28+
MimeType(String mimeType, String... extensions){
29+
this(new String[]{ mimeType }, extensions);
3030
}
3131

32+
MimeType(String[] mimeTypes, String... extensions){
33+
this.mimeTypes = Arrays.asList(mimeTypes);
34+
this.extensions = Arrays.asList(extensions);
35+
}
3236

33-
final String mime;
37+
final List<String> mimeTypes;
3438
final List<String> extensions;
35-
static MimeType byExtension(String extension){
39+
public static MimeType byExtension(String extension){
3640
if(extension.startsWith("."))
3741
extension = extension.substring(1);
3842
for(MimeType type : values()){
@@ -42,7 +46,15 @@ static MimeType byExtension(String extension){
4246
}
4347
return null;
4448
}
45-
static MimeType byFileName(String fileName){
49+
public static MimeType byMimeType(String mimeType){
50+
for(MimeType type : values()){
51+
if(type.mimeTypes.contains(mimeType)){
52+
return type;
53+
}
54+
}
55+
return null;
56+
}
57+
public static MimeType byFileName(String fileName){
4658
if(fileName.contains("/")) {
4759
String[] spl = fileName.split("/");
4860
fileName = spl[spl.length - 1];

‎src/main/java/org/javawebstack/httpserver/router/RouteBinder.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ public Object handle(Exchange exchange) {
146146
continue;
147147
}
148148
if(parameterTypes[i] instanceof Body){
149-
args[i] = exchange.getBody(method.getParameterTypes()[i]);
149+
args[i] = exchange.body(method.getParameterTypes()[i]);
150150
continue;
151151
}
152152
if(parameterTypes[i] instanceof Attrib){

‎src/main/java/org/javawebstack/httpserver/test/TestExchange.java‎

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package org.javawebstack.httpserver.test;
22

33
import com.google.gson.JsonElement;
4+
import org.javawebstack.graph.GraphElement;
45
import org.javawebstack.httpserver.Exchange;
56
import org.javawebstack.httpserver.HTTPServer;
7+
import org.javawebstack.httpserver.helper.MimeType;
68
import org.junit.jupiter.api.Assertions;
79

10+
import java.util.Collection;
11+
812
public class TestExchange extends Exchange {
913
private MockHttpServletRequest mockReq;
1014
private MockHttpServletResponse mockRes;
@@ -71,11 +75,11 @@ public TestExchange assertHeader(String key, String value, String message){
7175
return this;
7276
}
7377
public TestExchange assertJsonPath(String path, Object value){
74-
Assertions.assertTrue(checkJson(getPathElement(getServer().getGson().fromJson(mockRes.getContentString(), JsonElement.class), path), value));
78+
Assertions.assertTrue(checkGraph(getPathElement(mockResponseBody(mockRes), path), value));
7579
return this;
7680
}
7781
public TestExchange assertJsonPath(String path, Object value, String message){
78-
Assertions.assertTrue(checkJson(getPathElement(getServer().getGson().fromJson(mockRes.getContentString(), JsonElement.class), path), value), message);
82+
Assertions.assertTrue(checkGraph(getPathElement(mockResponseBody(mockRes), path), value), message);
7983
return this;
8084
}
8185
public TestExchange assertJson(Object value){
@@ -94,50 +98,63 @@ public TestExchange assertBody(String content, String message){
9498
Assertions.assertEquals(content, mockRes.getContentString(), message);
9599
return this;
96100
}
97-
private boolean checkJson(JsonElement element, Object value){
101+
private GraphElement mockResponseBody(MockHttpServletResponse response){
102+
MimeType type = MimeType.byMimeType(response.getContentType());
103+
if(type == null)
104+
type = MimeType.JSON;
105+
switch (type){
106+
default:
107+
return GraphElement.fromJson(response.getContentString());
108+
case YAML:
109+
return GraphElement.fromYaml(response.getContentString(), true);
110+
case X_WWW_FORM_URLENCODED:
111+
return GraphElement.fromFormData(response.getContentString());
112+
}
113+
}
114+
private boolean checkGraph(GraphElement element, Object value){
98115
if(value == null)
99116
return element == null;
100117
if(element == null)
101118
return false;
102-
JsonElement val = getServer().getGson().toJsonTree(value);
103-
if(val.isJsonNull())
104-
return element.isJsonNull();
105-
if(val.isJsonObject()){
106-
if(!element.isJsonObject())
119+
GraphElement val = getServer().getGraphMapper().toGraph(value);
120+
if(val.isNull())
121+
return element.isNull();
122+
if(val.isObject()){
123+
if(!element.isObject())
107124
return false;
108-
for(String key : val.getAsJsonObject().keySet()){
109-
if(!element.getAsJsonObject().has(key))
125+
for(String key : val.object().keys()){
126+
if(!element.object().has(key))
110127
return false;
111-
if(!checkJson(element.getAsJsonObject().get(key), val.getAsJsonObject().get(key)))
128+
if(!checkGraph(element.object().get(key), val.object().get(key)))
112129
return false;
113130
}
114131
return true;
115132
}
116-
if(val.isJsonArray()){
117-
if(!element.isJsonArray())
133+
if(val.isArray()){
134+
if(!element.isArray())
118135
return false;
119-
if(val.getAsJsonArray().size() != element.getAsJsonArray().size())
136+
if(val.array().size() != element.array().size())
120137
return false;
121-
for(int i=0; i<val.getAsJsonArray().size(); i++){
122-
if(!checkJson(element.getAsJsonArray().get(i), val.getAsJsonArray().get(i)))
138+
for(int i=0; i<val.array().size(); i++){
139+
if(!checkGraph(element.array().get(i), val.array().get(i)))
123140
return false;
124141
}
125142
return true;
126143
}
127-
if(val.getAsJsonPrimitive().isString()){
128-
if(!element.getAsJsonPrimitive().isString())
144+
if(val.isString()){
145+
if(!element.isString())
129146
return false;
130-
return val.getAsString().equals(element.getAsString());
147+
return val.string().equals(element.string());
131148
}
132-
if(val.getAsJsonPrimitive().isNumber()){
133-
if(!element.getAsJsonPrimitive().isNumber())
149+
if(val.isNumber()){
150+
if(!element.isNumber())
134151
return false;
135-
return val.getAsNumber().equals(element.getAsNumber());
152+
return val.number().equals(element.number());
136153
}
137-
if(val.getAsJsonPrimitive().isBoolean()){
138-
if(!element.getAsJsonPrimitive().isBoolean())
154+
if(val.isBoolean()){
155+
if(!element.isBoolean())
139156
return false;
140-
return val.getAsBoolean() == element.getAsBoolean();
157+
return val.bool() == element.bool();
141158
}
142159
return false;
143160
}

0 commit comments

Comments
 (0)