blob: 5802ae8508cad2f2798c3d0a80196aff1cefcca1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.johnzon.mapper;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.json.JsonReaderFactory;
import javax.json.spi.JsonProvider;
import javax.json.stream.JsonGenerator;
import javax.json.stream.JsonGeneratorFactory;
import org.apache.johnzon.mapper.access.AccessMode;
import org.apache.johnzon.mapper.access.FieldAccessMode;
import org.apache.johnzon.mapper.access.FieldAndMethodAccessMode;
import org.apache.johnzon.mapper.access.MethodAccessMode;
import org.apache.johnzon.mapper.converter.BigDecimalConverter;
import org.apache.johnzon.mapper.converter.BigIntegerConverter;
import org.apache.johnzon.mapper.converter.BooleanConverter;
import org.apache.johnzon.mapper.converter.ByteConverter;
import org.apache.johnzon.mapper.converter.CachedDelegateConverter;
import org.apache.johnzon.mapper.converter.CharacterConverter;
import org.apache.johnzon.mapper.converter.ClassConverter;
import org.apache.johnzon.mapper.converter.DateConverter;
import org.apache.johnzon.mapper.converter.DoubleConverter;
import org.apache.johnzon.mapper.converter.FloatConverter;
import org.apache.johnzon.mapper.converter.IntegerConverter;
import org.apache.johnzon.mapper.converter.LongConverter;
import org.apache.johnzon.mapper.converter.ShortConverter;
import org.apache.johnzon.mapper.converter.StringConverter;
public class MapperBuilder {
private static final Map<Class<?>, Converter<?>> DEFAULT_CONVERTERS = new HashMap<Class<?>, Converter<?>>();
static {
//DEFAULT_CONVERTERS.put(Date.class, new DateConverter("yyyy-MM-dd'T'HH:mm:ssZ")); // ISO8601 long RFC822 zone
DEFAULT_CONVERTERS.put(Date.class, new DateConverter("yyyyMMddHHmmssZ")); // ISO8601 short
DEFAULT_CONVERTERS.put(Class.class, new ClassConverter());
DEFAULT_CONVERTERS.put(String.class, new StringConverter());
DEFAULT_CONVERTERS.put(BigDecimal.class, new BigDecimalConverter());
DEFAULT_CONVERTERS.put(BigInteger.class, new BigIntegerConverter());
DEFAULT_CONVERTERS.put(Byte.class, new CachedDelegateConverter<Byte>(new ByteConverter()));
DEFAULT_CONVERTERS.put(Character.class, new CharacterConverter());
DEFAULT_CONVERTERS.put(Double.class, new DoubleConverter());
DEFAULT_CONVERTERS.put(Float.class, new FloatConverter());
DEFAULT_CONVERTERS.put(Integer.class, new IntegerConverter());
DEFAULT_CONVERTERS.put(Long.class, new LongConverter());
DEFAULT_CONVERTERS.put(Short.class, new ShortConverter());
DEFAULT_CONVERTERS.put(Boolean.class, new CachedDelegateConverter<Boolean>(new BooleanConverter()));
DEFAULT_CONVERTERS.put(byte.class, DEFAULT_CONVERTERS.get(Byte.class));
DEFAULT_CONVERTERS.put(char.class, new CharacterConverter());
DEFAULT_CONVERTERS.put(double.class, DEFAULT_CONVERTERS.get(Double.class));
DEFAULT_CONVERTERS.put(float.class, DEFAULT_CONVERTERS.get(Float.class));
DEFAULT_CONVERTERS.put(int.class, DEFAULT_CONVERTERS.get(Integer.class));
DEFAULT_CONVERTERS.put(long.class, DEFAULT_CONVERTERS.get(Long.class));
DEFAULT_CONVERTERS.put(short.class, DEFAULT_CONVERTERS.get(Short.class));
DEFAULT_CONVERTERS.put(boolean.class, DEFAULT_CONVERTERS.get(Boolean.class));
}
private JsonReaderFactory readerFactory;
private JsonGeneratorFactory generatorFactory;
private boolean doCloseOnStreams = false;
private boolean supportHiddenAccess = true;
private boolean supportGetterForCollections = false;
private int version = -1;
private int maxSize = -1;
private int bufferSize = -1;
private String bufferStrategy;
private Comparator<String> attributeOrder = null;
private boolean skipNull = true;
private boolean skipEmptyArray = false;
private boolean supportsComments = false;
protected boolean pretty;
private AccessMode accessMode = new MethodAccessMode(false);
private boolean treatByteArrayAsBase64;
private final Map<Class<?>, Converter<?>> converters = new HashMap<Class<?>, Converter<?>>(DEFAULT_CONVERTERS);
private boolean supportConstructors;
public Mapper build() {
if (readerFactory == null || generatorFactory == null) {
final JsonProvider provider = JsonProvider.provider();
final Map<String, Object> config = new HashMap<String, Object>();
if (maxSize > 0) {
config.put("org.apache.johnzon.max-string-length", maxSize);
}
if (bufferSize > 0) {
config.put("org.apache.johnzon.default-char-buffer", bufferSize);
}
if (bufferStrategy != null) {
config.put("org.apache.johnzon.buffer-strategy", bufferStrategy);
}
if (pretty) {
config.put(JsonGenerator.PRETTY_PRINTING, true);
}
if (generatorFactory == null) {
generatorFactory = provider.createGeneratorFactory(config);
}
config.remove(JsonGenerator.PRETTY_PRINTING); // doesnt mean anything anymore for reader
if (supportsComments) {
config.put("org.apache.johnzon.supports-comments", "true");
}
if (readerFactory == null) {
readerFactory = provider.createReaderFactory(config);
}
}
return new Mapper(
readerFactory, generatorFactory,
doCloseOnStreams,
converters,
version,
attributeOrder,
skipNull, skipEmptyArray,
accessMode,
supportHiddenAccess,
supportConstructors,
treatByteArrayAsBase64);
}
public MapperBuilder setSupportGetterForCollections(final boolean useGetterForCollections) {
this.supportGetterForCollections = useGetterForCollections;
if (supportGetterForCollections) {
accessMode = new MethodAccessMode(supportGetterForCollections);
}
return this;
}
public MapperBuilder setSupportsComments(final boolean supportsComments) {
this.supportsComments = supportsComments;
return this;
}
public MapperBuilder setPretty(final boolean pretty) {
this.pretty = pretty;
return this;
}
public MapperBuilder setBufferSize(final int bufferSize) {
this.bufferSize = bufferSize;
return this;
}
public MapperBuilder setBufferStrategy(final String bufferStrategy) {
this.bufferStrategy = bufferStrategy;
return this;
}
public MapperBuilder setMaxSize(final int size) {
this.maxSize = size;
return this;
}
public MapperBuilder setAccessMode(final AccessMode mode) {
this.accessMode = mode;
return this;
}
public MapperBuilder setAccessModeName(final String mode) {
if ("field".equalsIgnoreCase(mode)) {
this.accessMode = new FieldAccessMode();
} else if ("method".equalsIgnoreCase(mode)) {
this.accessMode = new MethodAccessMode(true);
} else if ("strict-method".equalsIgnoreCase(mode)) {
this.accessMode = new MethodAccessMode(false);
} else if ("both".equalsIgnoreCase(mode)) {
this.accessMode = new FieldAndMethodAccessMode();
} else {
throw new IllegalArgumentException("Mode " + mode + " unsupported");
}
return this;
}
public MapperBuilder setSupportHiddenAccess(final boolean supportHiddenAccess) {
this.supportHiddenAccess = supportHiddenAccess;
return this;
}
public MapperBuilder setAttributeOrder(final Comparator<String> attributeOrder) {
this.attributeOrder = attributeOrder;
return this;
}
public MapperBuilder setReaderFactory(final JsonReaderFactory readerFactory) {
this.readerFactory = readerFactory;
return this;
}
public MapperBuilder setGeneratorFactory(final JsonGeneratorFactory generatorFactory) {
this.generatorFactory = generatorFactory;
return this;
}
public MapperBuilder setDoCloseOnStreams(final boolean doCloseOnStreams) {
this.doCloseOnStreams = doCloseOnStreams;
return this;
}
public MapperBuilder addPropertyEditor(final Class<?> clazz, final Converter<?> converter) {
this.converters.put(clazz, converter);
return this;
}
public MapperBuilder setVersion(final int version) {
this.version = version;
return this;
}
public MapperBuilder setSkipNull(final boolean skipNull) {
this.skipNull = skipNull;
return this;
}
public MapperBuilder setSkipEmptyArray(final boolean skipEmptyArray) {
this.skipEmptyArray = skipEmptyArray;
return this;
}
public MapperBuilder setTreatByteArrayAsBase64(final boolean treatByteArrayAsBase64) {
this.treatByteArrayAsBase64 = treatByteArrayAsBase64;
return this;
}
public MapperBuilder setSupportConstructors(final boolean supportConstructors) {
this.supportConstructors = supportConstructors;
return this;
}
}