/
DefaultTranscoder.java
138 lines (121 loc) · 5.41 KB
/
DefaultTranscoder.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package org.infinispan.commons.dataconversion;
import static org.infinispan.commons.dataconversion.MediaType.APPLICATION_OBJECT;
import static org.infinispan.commons.dataconversion.MediaType.APPLICATION_OCTET_STREAM;
import static org.infinispan.commons.dataconversion.MediaType.APPLICATION_WWW_FORM_URLENCODED;
import static org.infinispan.commons.dataconversion.MediaType.TEXT_PLAIN;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import org.infinispan.commons.logging.Log;
import org.infinispan.commons.logging.LogFactory;
/**
* Handle conversions between text/plain, url-encoded, java objects, and octet-stream contents.
*
* @since 9.2
*/
public final class DefaultTranscoder implements Transcoder {
private static final Log log = LogFactory.getLog(DefaultTranscoder.class);
private static final Set<MediaType> supportedTypes = new HashSet<>();
public static final DefaultTranscoder INSTANCE = new DefaultTranscoder();
private DefaultTranscoder() {
}
static {
supportedTypes.add(APPLICATION_OBJECT);
supportedTypes.add(APPLICATION_OCTET_STREAM);
supportedTypes.add(APPLICATION_WWW_FORM_URLENCODED);
supportedTypes.add(TEXT_PLAIN);
}
@Override
public Object transcode(Object content, MediaType contentType, MediaType destinationType) {
try {
if (destinationType.match(APPLICATION_OCTET_STREAM)) {
return convertToOctetStream(content, contentType, destinationType);
}
if (destinationType.match(APPLICATION_OBJECT)) {
return convertToObject(content, contentType, destinationType);
}
if (destinationType.match(TEXT_PLAIN)) {
return convertToTextPlain(content, contentType, destinationType);
}
if (destinationType.match(APPLICATION_WWW_FORM_URLENCODED)) {
return convertToUrlEncoded(content, contentType);
}
throw log.unsupportedContent(content);
} catch (EncodingException | InterruptedException | IOException e) {
throw log.unsupportedContent(content);
}
}
private Object convertToUrlEncoded(Object content, MediaType contentType) {
if (contentType.match(APPLICATION_OCTET_STREAM)) {
return StandardConversions.convertOctetStreamToUrlEncoded(content, contentType);
}
if (contentType.match(APPLICATION_OBJECT)) {
return StandardConversions.convertUrlEncodedToObject(content);
}
if (contentType.match(TEXT_PLAIN)) {
return StandardConversions.convertTextToUrlEncoded(content, contentType);
}
if (contentType.match(APPLICATION_WWW_FORM_URLENCODED)) {
return content;
}
throw log.unsupportedContent(content);
}
private Object convertToTextPlain(Object content, MediaType contentType, MediaType destinationType) {
if (contentType.match(APPLICATION_OCTET_STREAM)) {
byte[] decoded = StandardConversions.decodeOctetStream(content, destinationType);
return StandardConversions.convertOctetStreamToText(decoded, destinationType);
}
if (contentType.match(APPLICATION_OBJECT)) {
return StandardConversions.convertJavaToText(content, contentType, destinationType);
}
if (contentType.match(TEXT_PLAIN)) {
return StandardConversions.convertTextToText(content, contentType, destinationType);
}
if (contentType.match(APPLICATION_WWW_FORM_URLENCODED)) {
return StandardConversions.convertUrlEncodedToText(content, destinationType);
}
throw log.unsupportedContent(content);
}
private Object convertToObject(Object content, MediaType contentType, MediaType destinationType) {
if (contentType.match(APPLICATION_OCTET_STREAM)) {
byte[] decoded = StandardConversions.decodeOctetStream(content, destinationType);
return StandardConversions.convertOctetStreamToJava(decoded, destinationType);
}
if (contentType.match(APPLICATION_OBJECT)) {
return content;
}
if (contentType.match(TEXT_PLAIN)) {
return StandardConversions.convertTextToObject(content, contentType);
}
if (contentType.match(APPLICATION_WWW_FORM_URLENCODED)) {
return StandardConversions.convertUrlEncodedToObject(content);
}
throw log.unsupportedContent(content);
}
public Object convertToOctetStream(Object content, MediaType contentType, MediaType destinationType) throws IOException, InterruptedException {
if (contentType.match(APPLICATION_OCTET_STREAM)) {
return StandardConversions.decodeOctetStream(content, contentType);
}
if (contentType.match(APPLICATION_OBJECT)) {
return StandardConversions.convertJavaToOctetStream(content, contentType);
}
if (contentType.match(TEXT_PLAIN)) {
return StandardConversions.convertTextToOctetStream(content, destinationType);
}
if (contentType.match(APPLICATION_WWW_FORM_URLENCODED)) {
return StandardConversions.convertUrlEncodedToOctetStream(content);
}
throw log.unsupportedContent(content);
}
@Override
public Set<MediaType> getSupportedMediaTypes() {
return supportedTypes;
}
private boolean in(MediaType mediaType, Set<MediaType> set) {
return set.stream().anyMatch(s -> s.match(mediaType));
}
@Override
public boolean supportsConversion(MediaType mediaType, MediaType other) {
return in(mediaType, supportedTypes) && in(other, supportedTypes);
}
}