package com.github.rmannibucau.boon.jaxrs;
import org.boon.json.JsonParserFactory;
import javax.ws.rs.Consumes;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.concurrent.atomic.AtomicReference;
@Provider
@Consumes(MediaType.WILDCARD)
public class BoonJsonMessageBodyReader<T> implements MessageBodyReader<T>{
private final AtomicReference<JsonParserFactory> factory = new AtomicReference<JsonParserFactory>();
private String charset = "UTF-8";
private boolean lax = false;
private boolean chop = false;
private boolean lazyChop = true;
private String fieldAccessType = "FIELD";
private boolean useAnnotations = false;
private JsonParserFactory factory() {
JsonParserFactory value = factory.get();
if (value == null) {
synchronized (factory) {
value = factory.get();
if (value == null) {
value = Boons.createJsonParserFactory(charset, lax, chop, lazyChop, fieldAccessType, useAnnotations);
factory.set(value);
}
}
}
return value;
}
protected void init(final JsonParserFactory factory) {
if (factory != null) {
this.factory.set(factory);
} else {
factory(); // force init
}
}
@Override
public T readFrom(final Class<T> tClass, final Type type, final Annotation[] annotations, final MediaType mediaType,
final MultivaluedMap<String, String> stringStringMultivaluedMap, final InputStream inputStream) throws IOException {
return factory().create().parse(tClass, inputStream);
}
@Override
public boolean isReadable(final Class<?> aClass, final Type type, final Annotation[] annotations, final MediaType mediaType) {
return Jsons.isJson(mediaType) && InputStream.class != aClass && Reader.class != aClass;
}
public void setCharset(final String charset) {
this.charset = charset;
}
public void setLax(final boolean lax) {
this.lax = lax;
}
public void setChop(final boolean chop) {
this.chop = chop;
}
public void setLazyChop(final boolean lazyChop) {
this.lazyChop = lazyChop;
}
public void setFieldAccessType(final String fieldAccessType) {
this.fieldAccessType = fieldAccessType;
}
public void setUseAnnotations(final boolean useAnnotations) {
this.useAnnotations = useAnnotations;
}
}