/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.json;
import com.liferay.portal.json.jabsorb.serializer.LiferayJSONSerializer;
import com.liferay.portal.json.jabsorb.serializer.LiferaySerializer;
import com.liferay.portal.json.jabsorb.serializer.LocaleSerializer;
import com.liferay.portal.kernel.json.JSONArray;
import com.liferay.portal.kernel.json.JSONDeserializer;
import com.liferay.portal.kernel.json.JSONException;
import com.liferay.portal.kernel.json.JSONFactory;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.json.JSONSerializer;
import com.liferay.portal.kernel.json.JSONTransformer;
import com.liferay.portal.kernel.json.JSONValidator;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.security.pacl.DoPrivileged;
import com.liferay.portal.kernel.util.ClassUtil;
import com.liferay.portal.kernel.util.Validator;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import org.jabsorb.serializer.MarshallException;
import org.json.JSONML;
/**
* @author Brian Wing Shun Chan
*/
@DoPrivileged
public class JSONFactoryImpl implements JSONFactory {
public JSONFactoryImpl() {
JSONInit.init();
_jsonSerializer = new LiferayJSONSerializer();
try {
_jsonSerializer.registerDefaultSerializers();
_jsonSerializer.registerSerializer(new LiferaySerializer());
_jsonSerializer.registerSerializer(new LocaleSerializer());
}
catch (Exception e) {
_log.error(e, e);
}
}
@Override
public String convertJSONMLArrayToXML(String jsonml) {
try {
org.json.JSONArray jsonArray = new org.json.JSONArray(jsonml);
return JSONML.toString(jsonArray);
}
catch (Exception e) {
if (_log.isWarnEnabled()) {
_log.warn(e, e);
}
throw new IllegalStateException("Unable to convert to XML", e);
}
}
@Override
public String convertJSONMLObjectToXML(String jsonml) {
try {
org.json.JSONObject jsonObject = new org.json.JSONObject(jsonml);
return JSONML.toString(jsonObject);
}
catch (Exception e) {
if (_log.isWarnEnabled()) {
_log.warn(e, e);
}
throw new IllegalStateException("Unable to convert to XML", e);
}
}
@Override
public String convertXMLtoJSONMLArray(String xml) {
try {
org.json.JSONArray jsonArray = JSONML.toJSONArray(xml);
return jsonArray.toString();
}
catch (Exception e) {
if (_log.isWarnEnabled()) {
_log.warn(e, e);
}
throw new IllegalStateException("Unable to convert to JSONML", e);
}
}
@Override
public String convertXMLtoJSONMLObject(String xml) {
try {
org.json.JSONObject jsonObject = JSONML.toJSONObject(xml);
return jsonObject.toString();
}
catch (Exception e) {
if (_log.isWarnEnabled()) {
_log.warn(e, e);
}
throw new IllegalStateException("Unable to convert to JSONML", e);
}
}
@Override
public JSONTransformer createJavaScriptNormalizerJSONTransformer(
List<String> javaScriptAttributes) {
throw new UnsupportedOperationException(
"Temporally disabled until alloy-taglib.jar is updated");
}
@Override
public JSONArray createJSONArray() {
return new JSONArrayImpl();
}
@Override
public JSONArray createJSONArray(String json) throws JSONException {
return new JSONArrayImpl(json);
}
@Override
public <T> JSONDeserializer<T> createJSONDeserializer() {
return new JSONDeserializerImpl<>();
}
@Override
public JSONObject createJSONObject() {
return new JSONObjectImpl();
}
@Override
public JSONObject createJSONObject(String json) throws JSONException {
return new JSONObjectImpl(json);
}
@Override
public JSONSerializer createJSONSerializer() {
return new JSONSerializerImpl();
}
@Override
public JSONValidator createJSONValidator(String jsonSchema)
throws JSONException {
return new JSONValidatorImpl(jsonSchema);
}
@Override
public Object deserialize(JSONObject jsonObj) {
return deserialize(jsonObj.toString());
}
@Override
public Object deserialize(String json) {
try {
return _jsonSerializer.fromJSON(json);
}
catch (Exception e) {
if (_log.isWarnEnabled()) {
_log.warn(e, e);
}
throw new IllegalStateException("Unable to deserialize object", e);
}
}
@Override
public String getNullJSON() {
return _NULL_JSON;
}
@Override
public JSONObject getUnmodifiableJSONObject() {
return _unmodifiableJSONObject;
}
@Override
public Object looseDeserialize(String json) {
try {
JSONDeserializer<?> jsonDeserializer = createJSONDeserializer();
return jsonDeserializer.deserialize(json);
}
catch (Exception e) {
if (_log.isWarnEnabled()) {
_log.warn(e, e);
}
throw new IllegalStateException("Unable to deserialize object", e);
}
}
@Override
public <T> T looseDeserialize(String json, Class<T> clazz) {
JSONDeserializer<?> jsonDeserializer = createJSONDeserializer();
jsonDeserializer.use(null, clazz);
return (T)jsonDeserializer.deserialize(json);
}
@Override
public String looseSerialize(Object object) {
JSONSerializer jsonSerializer = createJSONSerializer();
return jsonSerializer.serialize(object);
}
@Override
public String looseSerialize(
Object object, JSONTransformer jsonTransformer, Class<?> clazz) {
JSONSerializer jsonSerializer = createJSONSerializer();
jsonSerializer.transform(jsonTransformer, clazz);
return jsonSerializer.serialize(object);
}
@Override
public String looseSerialize(Object object, String... includes) {
JSONSerializer jsonSerializer = createJSONSerializer();
jsonSerializer.include(includes);
return jsonSerializer.serialize(object);
}
@Override
public String looseSerializeDeep(Object object) {
JSONSerializer jsonSerializer = createJSONSerializer();
return jsonSerializer.serializeDeep(object);
}
@Override
public String looseSerializeDeep(
Object object, JSONTransformer jsonTransformer, Class<?> clazz) {
JSONSerializer jsonSerializer = createJSONSerializer();
jsonSerializer.transform(jsonTransformer, clazz);
return jsonSerializer.serializeDeep(object);
}
@Override
public String serialize(Object object) {
try {
return _jsonSerializer.toJSON(object);
}
catch (MarshallException me) {
if (_log.isWarnEnabled()) {
_log.warn(me, me);
}
throw new IllegalStateException("Unable to serialize object", me);
}
}
@Override
public String serializeThrowable(Throwable throwable) {
JSONObject jsonObject = createJSONObject();
if (throwable instanceof InvocationTargetException) {
throwable = throwable.getCause();
}
String throwableMessage = throwable.getMessage();
if (Validator.isNull(throwableMessage)) {
throwableMessage = throwable.toString();
}
JSONObject errorJSONObject = createJSONObject();
errorJSONObject.put("message", throwableMessage);
errorJSONObject.put("type", ClassUtil.getClassName(throwable));
jsonObject.put("error", errorJSONObject);
jsonObject.put("exception", throwableMessage);
jsonObject.put("throwable", throwable.toString());
if (throwable.getCause() == null) {
return jsonObject.toString();
}
Throwable rootCauseThrowable = throwable;
while (rootCauseThrowable.getCause() != null) {
rootCauseThrowable = rootCauseThrowable.getCause();
}
JSONObject rootCauseJSONObject = createJSONObject();
throwableMessage = rootCauseThrowable.getMessage();
if (Validator.isNull(throwableMessage)) {
throwableMessage = rootCauseThrowable.toString();
}
rootCauseJSONObject.put("message", throwableMessage);
rootCauseJSONObject.put(
"type", ClassUtil.getClassName(rootCauseThrowable));
jsonObject.put("rootCause", rootCauseJSONObject);
return jsonObject.toString();
}
private static final String _NULL_JSON = "{}";
private static final Log _log = LogFactoryUtil.getLog(
JSONFactoryImpl.class);
private final org.jabsorb.JSONSerializer _jsonSerializer;
private final JSONObject _unmodifiableJSONObject =
new UnmodifiableJSONObjectImpl();
}