1 | |
|
2 | |
|
3 | |
|
4 | |
|
5 | |
|
6 | |
|
7 | |
|
8 | |
|
9 | |
|
10 | |
|
11 | |
|
12 | |
|
13 | |
|
14 | |
|
15 | |
|
16 | |
|
17 | |
|
18 | |
|
19 | |
package org.apache.johnzon.mapper; |
20 | |
|
21 | |
import java.math.BigDecimal; |
22 | |
import java.math.BigInteger; |
23 | |
import java.util.Comparator; |
24 | |
import java.util.Date; |
25 | |
import java.util.HashMap; |
26 | |
import java.util.Map; |
27 | |
|
28 | |
import javax.json.JsonReaderFactory; |
29 | |
import javax.json.spi.JsonProvider; |
30 | |
import javax.json.stream.JsonGenerator; |
31 | |
import javax.json.stream.JsonGeneratorFactory; |
32 | |
|
33 | |
import org.apache.johnzon.mapper.access.AccessMode; |
34 | |
import org.apache.johnzon.mapper.access.FieldAccessMode; |
35 | |
import org.apache.johnzon.mapper.access.FieldAndMethodAccessMode; |
36 | |
import org.apache.johnzon.mapper.access.MethodAccessMode; |
37 | |
import org.apache.johnzon.mapper.converter.BigDecimalConverter; |
38 | |
import org.apache.johnzon.mapper.converter.BigIntegerConverter; |
39 | |
import org.apache.johnzon.mapper.converter.BooleanConverter; |
40 | |
import org.apache.johnzon.mapper.converter.ByteConverter; |
41 | |
import org.apache.johnzon.mapper.converter.CachedDelegateConverter; |
42 | |
import org.apache.johnzon.mapper.converter.CharacterConverter; |
43 | |
import org.apache.johnzon.mapper.converter.ClassConverter; |
44 | |
import org.apache.johnzon.mapper.converter.DateConverter; |
45 | |
import org.apache.johnzon.mapper.converter.DoubleConverter; |
46 | |
import org.apache.johnzon.mapper.converter.FloatConverter; |
47 | |
import org.apache.johnzon.mapper.converter.IntegerConverter; |
48 | |
import org.apache.johnzon.mapper.converter.LongConverter; |
49 | |
import org.apache.johnzon.mapper.converter.ShortConverter; |
50 | |
import org.apache.johnzon.mapper.converter.StringConverter; |
51 | |
|
52 | 56 | public class MapperBuilder { |
53 | 1 | private static final Map<Class<?>, Converter<?>> DEFAULT_CONVERTERS = new HashMap<Class<?>, Converter<?>>(); |
54 | |
|
55 | |
static { |
56 | |
|
57 | 1 | DEFAULT_CONVERTERS.put(Date.class, new DateConverter("yyyyMMddHHmmssZ")); |
58 | 1 | DEFAULT_CONVERTERS.put(Class.class, new ClassConverter()); |
59 | 1 | DEFAULT_CONVERTERS.put(String.class, new StringConverter()); |
60 | 1 | DEFAULT_CONVERTERS.put(BigDecimal.class, new BigDecimalConverter()); |
61 | 1 | DEFAULT_CONVERTERS.put(BigInteger.class, new BigIntegerConverter()); |
62 | 1 | DEFAULT_CONVERTERS.put(Byte.class, new CachedDelegateConverter<Byte>(new ByteConverter())); |
63 | 1 | DEFAULT_CONVERTERS.put(Character.class, new CharacterConverter()); |
64 | 1 | DEFAULT_CONVERTERS.put(Double.class, new DoubleConverter()); |
65 | 1 | DEFAULT_CONVERTERS.put(Float.class, new FloatConverter()); |
66 | 1 | DEFAULT_CONVERTERS.put(Integer.class, new IntegerConverter()); |
67 | 1 | DEFAULT_CONVERTERS.put(Long.class, new LongConverter()); |
68 | 1 | DEFAULT_CONVERTERS.put(Short.class, new ShortConverter()); |
69 | 1 | DEFAULT_CONVERTERS.put(Boolean.class, new CachedDelegateConverter<Boolean>(new BooleanConverter())); |
70 | 1 | DEFAULT_CONVERTERS.put(byte.class, DEFAULT_CONVERTERS.get(Byte.class)); |
71 | 1 | DEFAULT_CONVERTERS.put(char.class, new CharacterConverter()); |
72 | 1 | DEFAULT_CONVERTERS.put(double.class, DEFAULT_CONVERTERS.get(Double.class)); |
73 | 1 | DEFAULT_CONVERTERS.put(float.class, DEFAULT_CONVERTERS.get(Float.class)); |
74 | 1 | DEFAULT_CONVERTERS.put(int.class, DEFAULT_CONVERTERS.get(Integer.class)); |
75 | 1 | DEFAULT_CONVERTERS.put(long.class, DEFAULT_CONVERTERS.get(Long.class)); |
76 | 1 | DEFAULT_CONVERTERS.put(short.class, DEFAULT_CONVERTERS.get(Short.class)); |
77 | 1 | DEFAULT_CONVERTERS.put(boolean.class, DEFAULT_CONVERTERS.get(Boolean.class)); |
78 | 1 | } |
79 | |
|
80 | |
private JsonReaderFactory readerFactory; |
81 | |
private JsonGeneratorFactory generatorFactory; |
82 | 56 | private boolean doCloseOnStreams = false; |
83 | 56 | private boolean supportHiddenAccess = true; |
84 | 56 | private int version = -1; |
85 | 56 | private int maxSize = -1; |
86 | 56 | private int bufferSize = -1; |
87 | |
private String bufferStrategy; |
88 | 56 | private Comparator<String> attributeOrder = null; |
89 | 56 | private boolean skipNull = true; |
90 | 56 | private boolean skipEmptyArray = false; |
91 | 56 | private boolean supportsComments = false; |
92 | |
protected boolean pretty; |
93 | 56 | private AccessMode accessMode = new MethodAccessMode(); |
94 | |
private boolean treatByteArrayAsBase64; |
95 | 56 | private final Map<Class<?>, Converter<?>> converters = new HashMap<Class<?>, Converter<?>>(DEFAULT_CONVERTERS); |
96 | |
|
97 | |
public Mapper build() { |
98 | 56 | if (readerFactory == null || generatorFactory == null) { |
99 | 56 | final JsonProvider provider = JsonProvider.provider(); |
100 | 56 | final Map<String, Object> config = new HashMap<String, Object>(); |
101 | 56 | if (maxSize > 0) { |
102 | 0 | config.put("org.apache.johnzon.max-string-length", maxSize); |
103 | |
} |
104 | 56 | if (bufferSize > 0) { |
105 | 0 | config.put("org.apache.johnzon.default-char-buffer", bufferSize); |
106 | |
} |
107 | 56 | if (bufferStrategy != null) { |
108 | 0 | config.put("org.apache.johnzon.buffer-strategy", bufferStrategy); |
109 | |
} |
110 | 56 | if (pretty) { |
111 | 0 | config.put(JsonGenerator.PRETTY_PRINTING, true); |
112 | |
} |
113 | |
|
114 | 56 | if (generatorFactory == null) { |
115 | 56 | generatorFactory = provider.createGeneratorFactory(config); |
116 | |
} |
117 | |
|
118 | 56 | config.remove(JsonGenerator.PRETTY_PRINTING); |
119 | 56 | if (supportsComments) { |
120 | 0 | config.put("org.apache.johnzon.supports-comments", "true"); |
121 | |
} |
122 | 56 | if (readerFactory == null) { |
123 | 56 | readerFactory = provider.createReaderFactory(config); |
124 | |
} |
125 | |
} |
126 | |
|
127 | 56 | return new Mapper( |
128 | |
readerFactory, generatorFactory, |
129 | |
doCloseOnStreams, |
130 | |
converters, |
131 | |
version, |
132 | |
attributeOrder, |
133 | |
skipNull, skipEmptyArray, |
134 | |
accessMode, |
135 | |
supportHiddenAccess, |
136 | |
treatByteArrayAsBase64); |
137 | |
} |
138 | |
|
139 | |
public MapperBuilder setSupportsComments(final boolean supportsComments) { |
140 | 0 | this.supportsComments = supportsComments; |
141 | 0 | return this; |
142 | |
} |
143 | |
|
144 | |
public MapperBuilder setPretty(final boolean pretty) { |
145 | 0 | this.pretty = pretty; |
146 | 0 | return this; |
147 | |
} |
148 | |
|
149 | |
public MapperBuilder setBufferSize(final int bufferSize) { |
150 | 0 | this.bufferSize = bufferSize; |
151 | 0 | return this; |
152 | |
} |
153 | |
|
154 | |
public MapperBuilder setBufferStrategy(final String bufferStrategy) { |
155 | 0 | this.bufferStrategy = bufferStrategy; |
156 | 0 | return this; |
157 | |
} |
158 | |
|
159 | |
public MapperBuilder setMaxSize(final int size) { |
160 | 0 | this.maxSize = size; |
161 | 0 | return this; |
162 | |
} |
163 | |
|
164 | |
public MapperBuilder setAccessMode(final AccessMode mode) { |
165 | 0 | this.accessMode = mode; |
166 | 0 | return this; |
167 | |
} |
168 | |
|
169 | |
public MapperBuilder setAccessModeName(final String mode) { |
170 | 1 | if ("field".equalsIgnoreCase(mode)) { |
171 | 1 | this.accessMode = new FieldAccessMode(); |
172 | 0 | } else if ("method".equalsIgnoreCase(mode)) { |
173 | 0 | this.accessMode = new MethodAccessMode(); |
174 | 0 | } else if ("both".equalsIgnoreCase(mode)) { |
175 | 0 | this.accessMode = new FieldAndMethodAccessMode(); |
176 | |
} else { |
177 | 0 | throw new IllegalArgumentException("Mode " + mode + " unsupported"); |
178 | |
} |
179 | 1 | return this; |
180 | |
} |
181 | |
|
182 | |
public MapperBuilder setSupportHiddenAccess(final boolean supportHiddenAccess) { |
183 | 1 | this.supportHiddenAccess = supportHiddenAccess; |
184 | 1 | return this; |
185 | |
} |
186 | |
|
187 | |
public MapperBuilder setAttributeOrder(final Comparator<String> attributeOrder) { |
188 | 12 | this.attributeOrder = attributeOrder; |
189 | 12 | return this; |
190 | |
} |
191 | |
|
192 | |
public MapperBuilder setReaderFactory(final JsonReaderFactory readerFactory) { |
193 | 0 | this.readerFactory = readerFactory; |
194 | 0 | return this; |
195 | |
} |
196 | |
|
197 | |
public MapperBuilder setGeneratorFactory(final JsonGeneratorFactory generatorFactory) { |
198 | 0 | this.generatorFactory = generatorFactory; |
199 | 0 | return this; |
200 | |
} |
201 | |
|
202 | |
public MapperBuilder setDoCloseOnStreams(final boolean doCloseOnStreams) { |
203 | 0 | this.doCloseOnStreams = doCloseOnStreams; |
204 | 0 | return this; |
205 | |
} |
206 | |
|
207 | |
public MapperBuilder addPropertyEditor(final Class<?> clazz, final Converter<?> converter) { |
208 | 0 | this.converters.put(clazz, converter); |
209 | 0 | return this; |
210 | |
} |
211 | |
|
212 | |
public MapperBuilder setVersion(final int version) { |
213 | 4 | this.version = version; |
214 | 4 | return this; |
215 | |
} |
216 | |
|
217 | |
public MapperBuilder setSkipNull(final boolean skipNull) { |
218 | 4 | this.skipNull = skipNull; |
219 | 4 | return this; |
220 | |
} |
221 | |
|
222 | |
public MapperBuilder setSkipEmptyArray(final boolean skipEmptyArray) { |
223 | 2 | this.skipEmptyArray = skipEmptyArray; |
224 | 2 | return this; |
225 | |
} |
226 | |
|
227 | |
public MapperBuilder setTreatByteArrayAsBase64(final boolean treatByteArrayAsBase64) { |
228 | 1 | this.treatByteArrayAsBase64 = treatByteArrayAsBase64; |
229 | 1 | return this; |
230 | |
} |
231 | |
|
232 | |
} |