/* Copyright (c) 2014, Effektif GmbH.
*
* Licensed 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 com.effektif.workflow.impl.json;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.Type;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* An API that implements logic for mapping model classes to and from JSON.
*
* @author Tom Baeyens
*/
public class JsonStreamMapper {
ObjectMapper objectMapper;
Mappings mappings;
boolean pretty;
public JsonStreamMapper() {
this.objectMapper = new ObjectMapper();
}
public JsonStreamMapper pretty() {
this.pretty = true;
return this;
}
public <T> T readString(String jsonString, Class<T> clazz) {
return readString(jsonString, (Type)clazz);
}
public <T> T readString(String jsonString, Type type) {
if (jsonString==null || "".equals(jsonString.trim())) {
return null;
}
Reader reader = new StringReader(jsonString);
return read(reader, type);
}
public <T> T read(Reader reader, Class<T> clazz) {
return read(reader, (Type)clazz);
}
public <T> T read(Reader reader, Type type) {
try {
Object beanJsonObject = parseJson(reader);
if (beanJsonObject==null) {
return null;
}
return readJsonObject(beanJsonObject, type);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public Object parseJson(Reader reader) {
try {
return objectMapper.readValue(reader, Object.class);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public <T> T readJsonObject(Object jsonObject, Type type) {
if (jsonObject==null) {
return null;
}
JsonStreamReader jsonStreamReader = new JsonStreamReader(mappings);
return (T) jsonStreamReader.readObject(jsonObject, type);
}
public <T> String write(T o) {
StringWriter stringWriter = new StringWriter();
write(o, stringWriter);
return stringWriter.toString();
}
public <T> void write(T bean, Writer writer) {
try {
JsonGenerator jgen = new JsonFactory().createGenerator(writer);
if (pretty) {
jgen.setPrettyPrinter(new DefaultPrettyPrinter());
}
JsonStreamWriter jsonStreamWriter = new JsonStreamWriter(mappings,jgen);
jsonStreamWriter.writeObject(bean);
jgen.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public Mappings getMappings() {
return mappings;
}
public void setMappings(Mappings mappings) {
this.mappings = mappings;
}
}