/
DataFormat.java
157 lines (124 loc) · 5.07 KB
/
DataFormat.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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
package org.infinispan.client.hotrod;
import static org.infinispan.client.hotrod.marshall.MarshallerUtil.bytes2obj;
import static org.infinispan.client.hotrod.marshall.MarshallerUtil.obj2bytes;
import java.util.List;
import org.infinispan.client.hotrod.impl.MarshallerRegistry;
import org.infinispan.client.hotrod.logging.Log;
import org.infinispan.client.hotrod.logging.LogFactory;
import org.infinispan.commons.dataconversion.MediaType;
import org.infinispan.commons.marshall.IdentityMarshaller;
import org.infinispan.commons.marshall.Marshaller;
/**
* Defines data format for keys and values during Hot Rod client requests.
*
* @since 9.3
*/
public final class DataFormat {
private static final Log log = LogFactory.getLog(DataFormat.class, Log.class);
private final MediaType keyType;
private final MediaType valueType;
private final Marshaller keyMarshaller;
private final Marshaller valueMarshaller;
private MarshallerRegistry marshallerRegistry;
private Marshaller defaultMarshaller;
private DataFormat(MediaType keyType, MediaType valueType, Marshaller keyMarshaller, Marshaller valueMarshaller) {
this.keyType = keyType;
this.valueType = valueType;
this.keyMarshaller = keyMarshaller;
this.valueMarshaller = valueMarshaller;
}
public DataFormat withoutValueType() {
return new DataFormat(keyType, null, keyMarshaller, null);
}
public MediaType getKeyType() {
return keyType;
}
public MediaType getValueType() {
return valueType;
}
public void initialize(RemoteCacheManager remoteCacheManager) {
this.marshallerRegistry = remoteCacheManager.getMarshallerRegistry();
this.defaultMarshaller = remoteCacheManager.getMarshaller();
}
private Marshaller resolveValueMarshaller() {
if (valueMarshaller != null) return valueMarshaller;
if (valueType == null) return defaultMarshaller;
Marshaller forValueType = marshallerRegistry.getMarshaller(valueType);
if (forValueType != null) return forValueType;
log.debugf("No marshaller registered for %s, using no-op marshaller", valueType);
return IdentityMarshaller.INSTANCE;
}
private Marshaller resolveKeyMarshaller() {
if (keyMarshaller != null) return keyMarshaller;
if (keyType == null) return defaultMarshaller;
Marshaller forKeyType = marshallerRegistry.getMarshaller(keyType);
if (forKeyType != null) return forKeyType;
log.debugf("No marshaller registered for %s, using no-op marshaller", keyType);
return IdentityMarshaller.INSTANCE;
}
public boolean hasCustomFormat() {
return keyType != null || valueType != null;
}
public byte[] keyToBytes(Object key, int estimateKeySize, int estimateValueSize) {
Marshaller keyMarshaller = resolveKeyMarshaller();
return obj2bytes(keyMarshaller, key, true, estimateKeySize, estimateValueSize);
}
public byte[] valueToBytes(Object value, int estimateKeySize, int estimateValueSize) {
Marshaller valueMarshaller = resolveValueMarshaller();
return obj2bytes(valueMarshaller, value, false, estimateKeySize, estimateValueSize);
}
public <T> T keyToObj(byte[] bytes, short status, List<String> whitelist) {
Marshaller keyMarshaller = resolveKeyMarshaller();
return bytes2obj(keyMarshaller, bytes, status, whitelist);
}
public <T> T valueToObj(byte[] bytes, short status, List<String> whitelist) {
Marshaller valueMarshaller = resolveValueMarshaller();
return bytes2obj(valueMarshaller, bytes, status, whitelist);
}
@Override
public String toString() {
return "DataFormat{" +
"keyType=" + keyType +
", valueType=" + valueType +
", keyMarshaller=" + keyMarshaller +
", valueMarshaller=" + valueMarshaller +
", marshallerRegistry=" + marshallerRegistry +
", defaultMarshaller=" + defaultMarshaller +
'}';
}
public static Builder builder() {
return new Builder();
}
public static class Builder {
private MediaType keyType;
private MediaType valueType;
private Marshaller valueMarshaller;
private Marshaller keyMarshaller;
public Builder from(DataFormat dataFormat) {
this.keyType = dataFormat.keyType;
this.valueType = dataFormat.valueType;
this.keyMarshaller = dataFormat.keyMarshaller;
this.valueMarshaller = dataFormat.valueMarshaller;
return this;
}
public Builder valueMarshaller(Marshaller valueMarshaller) {
this.valueMarshaller = valueMarshaller;
return this;
}
public Builder keyMarshaller(Marshaller keyMarshaller) {
this.keyMarshaller = keyMarshaller;
return this;
}
public Builder keyType(MediaType keyType) {
this.keyType = keyType;
return this;
}
public Builder valueType(MediaType valueType) {
this.valueType = valueType;
return this;
}
public DataFormat build() {
return new DataFormat(keyType, valueType, keyMarshaller, valueMarshaller);
}
}
}