Skip to content

Commit cca9c6e

Browse files
committed
调整代码逻辑+增加unitTest
增加多类型匹配 增加多类型匹配 修改泛型+unitTest 调整方案
1 parent aa2d522 commit cca9c6e

File tree

10 files changed

+381
-0
lines changed

10 files changed

+381
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package io.arex.inst.httpservlet.convert;
2+
3+
import io.arex.agent.bootstrap.util.CollectionUtil;
4+
import io.arex.inst.httpservlet.adapter.ServletAdapter;
5+
import io.arex.inst.httpservlet.convert.impl.DefaultHttpMessageConverter;
6+
7+
import java.util.*;
8+
9+
public class HttpMessageConvertFactory {
10+
11+
12+
private static final List<HttpMessageConverter> cacheList = new ArrayList<>();
13+
14+
15+
16+
static {
17+
ServiceLoader<HttpMessageConverter> load = ServiceLoader.load(HttpMessageConverter.class);
18+
if (load != null) {
19+
Iterator<HttpMessageConverter> iterator = load.iterator();
20+
while (iterator.hasNext()) {
21+
cacheList.add(iterator.next());
22+
}
23+
}
24+
}
25+
26+
27+
public static <P, R> HttpMessageConverter<P, R> getSupportedConverter(P p, R r, ServletAdapter adapter) {
28+
synchronized (HttpMessageConvertFactory.class) {
29+
if (CollectionUtil.isNotEmpty(cacheList)) {
30+
for (HttpMessageConverter converter : cacheList) {
31+
if (converter.match(p, r, adapter)) {
32+
return converter;
33+
}
34+
}
35+
}
36+
return DefaultHttpMessageConverter.getInstance();
37+
}
38+
}
39+
40+
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package io.arex.inst.httpservlet.convert;
2+
3+
import io.arex.inst.httpservlet.adapter.ServletAdapter;
4+
5+
public interface HttpMessageConverter<HttpServletRequest, HttpServletResponse> {
6+
7+
boolean match(HttpServletRequest request,HttpServletResponse response, ServletAdapter adapter);
8+
byte[] getRequest(HttpServletRequest request, ServletAdapter adapter);
9+
byte[] getResponse(HttpServletResponse request, ServletAdapter adapter);
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package io.arex.inst.httpservlet.convert.impl;
2+
3+
import io.arex.agent.bootstrap.util.StringUtil;
4+
import io.arex.inst.httpservlet.adapter.ServletAdapter;
5+
import io.arex.inst.httpservlet.convert.HttpMessageConverter;
6+
7+
public class ApplicationJsonBodyConverter<HttpServletRequest, HttpServletResponse> implements HttpMessageConverter<HttpServletRequest, HttpServletResponse> {
8+
9+
private static final String CONTENT_TYPE = "application/json";
10+
11+
@Override
12+
public boolean match(HttpServletRequest request, HttpServletResponse response, ServletAdapter adapter) {
13+
if (request == null || response ==null || adapter == null) {
14+
return false;
15+
}
16+
String contentType = adapter.getContentType(request);
17+
return StringUtil.isNotEmpty(contentType) && contentType.contains(CONTENT_TYPE);
18+
}
19+
20+
@Override
21+
public byte[] getRequest(HttpServletRequest request, ServletAdapter adapter) {
22+
if (request == null || adapter == null) {
23+
return new byte[0];
24+
}
25+
return adapter.getRequestBytes(request);
26+
}
27+
28+
@Override
29+
public byte[] getResponse(HttpServletResponse response, ServletAdapter adapter) {
30+
return new byte[0];
31+
}
32+
}
33+
34+
35+
36+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package io.arex.inst.httpservlet.convert.impl;
2+
3+
import io.arex.agent.bootstrap.util.StringUtil;
4+
import io.arex.inst.httpservlet.adapter.ServletAdapter;
5+
import io.arex.inst.httpservlet.convert.HttpMessageConverter;
6+
7+
8+
public class ApplicationXmlBodyConverter<HttpServletRequest, HttpServletResponse> implements HttpMessageConverter<HttpServletRequest, HttpServletResponse> {
9+
10+
private static final String CONTENT_TYPE = "application/xml";
11+
12+
@Override
13+
public boolean match(HttpServletRequest request, HttpServletResponse response, ServletAdapter adapter) {
14+
if (request == null || response ==null || adapter == null) {
15+
return false;
16+
}
17+
String contentType = adapter.getContentType(request);
18+
return StringUtil.isNotEmpty(contentType) && contentType.contains(CONTENT_TYPE);
19+
}
20+
21+
@Override
22+
public byte[] getRequest(HttpServletRequest request, ServletAdapter adapter) {
23+
return new byte[0];
24+
}
25+
26+
@Override
27+
public byte[] getResponse(HttpServletResponse response, ServletAdapter adapter) {
28+
return new byte[0];
29+
}
30+
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package io.arex.inst.httpservlet.convert.impl;
2+
3+
import io.arex.inst.httpservlet.adapter.ServletAdapter;
4+
import io.arex.inst.httpservlet.convert.HttpMessageConverter;
5+
6+
public class DefaultHttpMessageConverter<HttpServletRequest, HttpServletResponse> implements HttpMessageConverter<HttpServletRequest, HttpServletResponse> {
7+
8+
private DefaultHttpMessageConverter() {
9+
10+
}
11+
12+
private static class SingletonHolder {
13+
private static final DefaultHttpMessageConverter INSTANCE = new DefaultHttpMessageConverter();
14+
}
15+
16+
public static DefaultHttpMessageConverter getInstance() {
17+
return SingletonHolder.INSTANCE;
18+
}
19+
20+
21+
@Override
22+
public boolean match(HttpServletRequest request, HttpServletResponse response, ServletAdapter adapter) {
23+
return false;
24+
}
25+
26+
@Override
27+
public byte[] getRequest(HttpServletRequest request, ServletAdapter adapter) {
28+
return new byte[0];
29+
}
30+
31+
@Override
32+
public byte[] getResponse(HttpServletResponse response, ServletAdapter adapter) {
33+
return new byte[0];
34+
}
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
io.arex.inst.httpservlet.convert.impl.ApplicationJsonBodyConverter
2+
io.arex.inst.httpservlet.convert.impl.ApplicationXmlBodyConverter
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package io.arex.inst.httpservlet.convert;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
import static org.mockito.Mockito.when;
5+
6+
import io.arex.inst.httpservlet.adapter.impl.ServletAdapterImplV3;
7+
import io.arex.inst.httpservlet.adapter.impl.ServletAdapterImplV5;
8+
import io.arex.inst.httpservlet.convert.impl.DefaultHttpMessageConverter;
9+
import org.junit.jupiter.api.AfterEach;
10+
import org.junit.jupiter.api.BeforeEach;
11+
import org.junit.jupiter.api.Test;
12+
import org.mockito.Mockito;
13+
14+
import javax.servlet.http.HttpServletRequest;
15+
import javax.servlet.http.HttpServletResponse;
16+
17+
public class HttpMessageConvertFactoryTest {
18+
19+
HttpServletRequest mockRequest = Mockito.mock(HttpServletRequest.class);
20+
HttpServletResponse mockResponse = Mockito.mock(HttpServletResponse.class);
21+
ServletAdapterImplV3 instance3 = ServletAdapterImplV3.getInstance();
22+
ServletAdapterImplV5 instance5 = ServletAdapterImplV5.getInstance();
23+
jakarta.servlet.http.HttpServletRequest mockRequest5 = Mockito.mock(jakarta.servlet.http.HttpServletRequest.class);
24+
jakarta.servlet.http.HttpServletResponse mockResponse5 = Mockito.mock(jakarta.servlet.http.HttpServletResponse.class);
25+
26+
@BeforeEach
27+
void setUp() {
28+
}
29+
30+
@AfterEach
31+
void tearDown() {
32+
}
33+
34+
@Test
35+
void getOne(){
36+
when(mockRequest.getContentType()).thenReturn("application/json");
37+
when(mockRequest5.getContentType()).thenReturn("application/json");
38+
assertNotNull(HttpMessageConvertFactory.getSupportedConverter(mockRequest,mockResponse,instance3));
39+
assertNotNull(HttpMessageConvertFactory.getSupportedConverter(mockRequest5,mockResponse5,instance5));
40+
}
41+
42+
@Test
43+
void getDefault(){
44+
when(mockRequest.getContentType()).thenReturn("application/jn");
45+
when(mockRequest5.getContentType()).thenReturn("application/jn");
46+
47+
assertTrue(HttpMessageConvertFactory.getSupportedConverter(mockRequest,mockResponse,instance3) instanceof DefaultHttpMessageConverter);
48+
assertTrue(HttpMessageConvertFactory.getSupportedConverter(mockRequest5,mockResponse5,instance5) instanceof DefaultHttpMessageConverter);
49+
}
50+
51+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package io.arex.inst.httpservlet.convert.impl;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
import static org.mockito.Mockito.when;
5+
6+
7+
import io.arex.inst.httpservlet.adapter.impl.ServletAdapterImplV3;
8+
import io.arex.inst.httpservlet.adapter.impl.ServletAdapterImplV5;
9+
import org.junit.jupiter.api.AfterEach;
10+
import org.junit.jupiter.api.BeforeEach;
11+
import org.junit.jupiter.api.Test;
12+
import org.mockito.Mockito;
13+
14+
15+
import javax.servlet.http.HttpServletRequest;
16+
import javax.servlet.http.HttpServletResponse;
17+
18+
public class ApplicationJsonBodyConvertTest {
19+
20+
HttpServletRequest mockRequest = Mockito.mock(HttpServletRequest.class);
21+
HttpServletResponse mockResponse = Mockito.mock(HttpServletResponse.class);
22+
23+
ServletAdapterImplV3 instance3 = ServletAdapterImplV3.getInstance();
24+
ServletAdapterImplV5 instance5 = ServletAdapterImplV5.getInstance();
25+
jakarta.servlet.http.HttpServletRequest mockRequest5 = Mockito.mock(jakarta.servlet.http.HttpServletRequest.class);
26+
jakarta.servlet.http.HttpServletResponse mockResponse5 = Mockito.mock(jakarta.servlet.http.HttpServletResponse.class);
27+
28+
29+
static ApplicationJsonBodyConverter applicationJsonBodyConvert = null;
30+
31+
32+
33+
@BeforeEach
34+
void setUp() {
35+
applicationJsonBodyConvert = new ApplicationJsonBodyConverter();
36+
37+
}
38+
39+
@AfterEach
40+
void tearDown() {
41+
}
42+
43+
@Test
44+
void match() {
45+
when(mockRequest.getContentType()).thenReturn("application/json");
46+
when(mockRequest5.getContentType()).thenReturn("application/json");
47+
assertEquals(true, applicationJsonBodyConvert.match(mockRequest,mockResponse,instance3));
48+
assertEquals(true, applicationJsonBodyConvert.match(mockRequest5,mockResponse5,instance5));
49+
}
50+
51+
52+
@Test
53+
void notMatch1() {
54+
when(mockRequest.getContentType()).thenReturn("application/jn");
55+
when(mockRequest5.getContentType()).thenReturn("application/n");
56+
assertEquals(false, applicationJsonBodyConvert.match(mockRequest,mockResponse,instance3));
57+
assertEquals(false, applicationJsonBodyConvert.match(mockRequest5,mockResponse5,instance5));
58+
}
59+
60+
61+
@Test
62+
void notMatch2() {
63+
assertEquals(false, applicationJsonBodyConvert.match(null,mockResponse,instance3));
64+
assertEquals(false, applicationJsonBodyConvert.match(null,mockResponse5,instance5));
65+
}
66+
67+
68+
@Test
69+
void get0Request() {
70+
assertEquals(0, applicationJsonBodyConvert.getRequest(null,instance3).length);
71+
assertEquals(0, applicationJsonBodyConvert.getRequest(null,instance5).length);
72+
}
73+
74+
@Test
75+
void getRequest() {
76+
assertEquals(0, applicationJsonBodyConvert.getRequest(instance3.wrapRequest(mockRequest),instance3).length);
77+
assertEquals(0, applicationJsonBodyConvert.getRequest(instance5.wrapRequest(mockRequest5),instance5).length);
78+
}
79+
80+
81+
@Test
82+
void getResponse() {
83+
assertEquals(0, applicationJsonBodyConvert.getResponse(instance3.wrapResponse(mockResponse),instance3).length);
84+
assertEquals(0, applicationJsonBodyConvert.getResponse(instance5.wrapResponse(mockResponse5),instance5).length);
85+
}
86+
87+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package io.arex.inst.httpservlet.convert.impl;
2+
3+
import io.arex.inst.httpservlet.adapter.impl.ServletAdapterImplV3;
4+
import io.arex.inst.httpservlet.adapter.impl.ServletAdapterImplV5;
5+
import org.junit.jupiter.api.AfterEach;
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Test;
8+
import org.mockito.Mockito;
9+
10+
import javax.servlet.http.HttpServletRequest;
11+
import javax.servlet.http.HttpServletResponse;
12+
13+
import static org.junit.jupiter.api.Assertions.assertEquals;
14+
import static org.junit.jupiter.api.Assertions.assertNull;
15+
import static org.mockito.Mockito.when;
16+
17+
public class ApplicationXmlBodyConvertTest {
18+
19+
HttpServletRequest mockRequest = Mockito.mock(HttpServletRequest.class);
20+
HttpServletResponse mockResponse = Mockito.mock(HttpServletResponse.class);
21+
22+
ServletAdapterImplV3 instance3 = ServletAdapterImplV3.getInstance();
23+
ServletAdapterImplV5 instance5 = ServletAdapterImplV5.getInstance();
24+
jakarta.servlet.http.HttpServletRequest mockRequest5 = Mockito.mock(jakarta.servlet.http.HttpServletRequest.class);
25+
jakarta.servlet.http.HttpServletResponse mockResponse5 = Mockito.mock(jakarta.servlet.http.HttpServletResponse.class);
26+
27+
28+
static ApplicationXmlBodyConverter applicationXmlBodyConvert = null;
29+
30+
31+
32+
@BeforeEach
33+
void setUp() {
34+
applicationXmlBodyConvert = new ApplicationXmlBodyConverter();
35+
36+
}
37+
38+
@AfterEach
39+
void tearDown() {
40+
}
41+
42+
@Test
43+
void match() {
44+
when(mockRequest.getContentType()).thenReturn("application/xml");
45+
when(mockRequest5.getContentType()).thenReturn("application/xml");
46+
assertEquals(true, applicationXmlBodyConvert.match(mockRequest,mockResponse,instance3));
47+
assertEquals(true, applicationXmlBodyConvert.match(mockRequest5,mockResponse5,instance5));
48+
}
49+
50+
51+
@Test
52+
void notMatch1() {
53+
when(mockRequest.getContentType()).thenReturn("application/xl");
54+
when(mockRequest5.getContentType()).thenReturn("application/xl");
55+
assertEquals(false, applicationXmlBodyConvert.match(mockRequest,mockResponse,instance3));
56+
assertEquals(false, applicationXmlBodyConvert.match(mockRequest5,mockResponse5,instance5));
57+
}
58+
59+
60+
@Test
61+
void notMatch2() {
62+
assertEquals(false, applicationXmlBodyConvert.match(null,mockResponse,instance3));
63+
assertEquals(false, applicationXmlBodyConvert.match(null,mockResponse5,instance5));
64+
}
65+
66+
67+
@Test
68+
void get0Request() {
69+
assertEquals(0, applicationXmlBodyConvert.getRequest(null,instance3).length);
70+
assertEquals(0, applicationXmlBodyConvert.getRequest(null,instance5).length);
71+
}
72+
73+
@Test
74+
void getRequest() {
75+
assertEquals(0, applicationXmlBodyConvert.getRequest(instance3.wrapRequest(mockRequest),instance3).length);
76+
assertEquals(0, applicationXmlBodyConvert.getRequest(instance5.wrapRequest(mockRequest5),instance5).length);
77+
}
78+
79+
80+
@Test
81+
void getResponse() {
82+
assertEquals(0, applicationXmlBodyConvert.getResponse(instance3.wrapResponse(mockResponse),instance3).length);
83+
assertEquals(0, applicationXmlBodyConvert.getResponse(instance5.wrapResponse(mockResponse5),instance5).length);
84+
}
85+
86+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
io.arex.inst.httpservlet.convert.impl.ApplicationJsonBodyConvert
2+
io.arex.inst.httpservlet.convert.impl.ApplicationXmlBodyConvert

0 commit comments

Comments
 (0)