package org.infinispan.server.websocket.json;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.codehaus.jackson.map.ObjectMapper;
import org.infinispan.server.websocket.logging.Log;
import org.infinispan.util.logging.LogFactory;
/**
* Json Object implementation. This is the only link between POJOs and particular JSON library implementation.
*
* @author Sebastian Laskawiec
*/
public class JsonObject implements Map<String, Object> {
private static final Log logger = LogFactory.getLog(MethodHandles.lookup().lookupClass(), Log.class);
private static final ObjectMapper objectMapper = new ObjectMapper();
private final Map<String, Object> internalStructure;
private JsonObject(Map<String, Object> internalStructure) {
this.internalStructure = internalStructure;
}
public static JsonObject fromString(final String json) throws JsonConversionException {
try {
@SuppressWarnings("unchecked")
Map<String, Object> readValue = objectMapper.readValue(json, Map.class);
return new JsonObject(readValue);
} catch (Exception e) {
throw logger.unableToConvertFromStringToJson(json, e);
}
}
public static JsonObject fromObject(final Object o) throws JsonConversionException {
try {
@SuppressWarnings("unchecked")
Map<String, Object> convertValue = objectMapper.convertValue(o, Map.class);
return new JsonObject(convertValue);
} catch (Exception e) {
throw logger.unableToConvertFromObjectToJson(o, e);
}
}
public static JsonObject fromMap(Map<String, Object> map) {
return new JsonObject(map);
}
public static JsonObject createNew() {
return new JsonObject(new HashMap<String, Object>());
}
@Override
public String toString() {
try {
return objectMapper.writeValueAsString(internalStructure);
} catch (IOException e) {
throw logger.unableToConvertFromJsonToString(e);
}
}
@Override
public int size() {
return internalStructure.size();
}
@Override
public boolean isEmpty() {
return internalStructure.isEmpty();
}
@Override
public boolean containsKey(Object key) {
return internalStructure.containsKey(key);
}
@Override
public boolean containsValue(Object value) {
return internalStructure.containsValue(value);
}
@Override
public Object get(Object key) {
return internalStructure.get(key);
}
@Override
public Object put(String key, Object value) {
return internalStructure.put(key, value);
}
@Override
public Object remove(Object key) {
return internalStructure.remove(key);
}
@Override
public void putAll(Map<? extends String, ?> m) {
internalStructure.putAll(m);
}
@Override
public void clear() {
internalStructure.clear();
}
@Override
public Set<String> keySet() {
return internalStructure.keySet();
}
@Override
public Collection<Object> values() {
return internalStructure.values();
}
@Override
public Set<Entry<String, Object>> entrySet() {
return internalStructure.entrySet();
}
}