/*
* © Copyright IBM Corp. 2014
*
* 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.ibm.sbt.services.client.base;
import java.util.Map.Entry;
import java.util.Set;
import com.ibm.commons.util.AbstractException;
import com.ibm.commons.util.StringUtil;
import com.ibm.commons.util.io.json.JsonGenerator;
import com.ibm.commons.util.io.json.JsonJavaFactory;
import com.ibm.commons.util.io.json.JsonJavaObject;
import com.ibm.commons.util.io.json.JsonParser;
import com.ibm.sbt.services.client.InvalidInputException;
import com.ibm.sbt.services.client.base.datahandlers.JsonDataHandler;
/**
* @author mwallace
*
*/
public class JsonEntity extends BaseEntity {
/**
* Default Constructor.
*/
public JsonEntity() {
}
/**
* Construct an JsonEntity instance.
*
* @param service
* @param jsonObject
*/
public JsonEntity(BaseService service, JsonJavaObject jsonObject) {
super(service, new JsonDataHandler(jsonObject));
}
/**
* Construct an JsonEntity instance.
*
* @param service
* @param dataHandler
*/
public JsonEntity(BaseService service, JsonDataHandler dataHandler) {
super(service, dataHandler);
}
/**
* Construct an JsonEntity instance.
*
* @param service
*/
public JsonEntity(BaseService service) {
super(service, null);
}
/**
* Returns the value of a field as an Object
*
* @return returns false, if the field doesn't exist
*/
public JsonJavaObject getJsonObject(){
if (dataHandler != null) {
Object data = dataHandler.getData();
return (data instanceof JsonJavaObject) ? (JsonJavaObject)data : null;
}
return null;
}
/**
* Returns the value of a field as an Object
*
* @param path
* @return returns false, if the field doesn't exist
*/
public Object getAsObject(String path){
if (fields.containsKey(path)) {
return fields.get(path);
}
if (dataHandler != null) {
return ((JsonDataHandler)dataHandler).getAsObject(path);
}
return null;
}
/**
* Return JSON string representation of current data.
*
* @return {String}
*/
public String toJsonString() {
JsonDataHandler jsonHandler = (JsonDataHandler)getDataHandler();
return (jsonHandler == null) ? null : jsonHandler.getData().toString();
}
/**
* Return JSON string representation of current data.
* @param compact
* @return {String}
*/
public String toJsonString(boolean compact) {
try {
JsonDataHandler jsonHandler = (JsonDataHandler)getDataHandler();
return (jsonHandler == null) ? null : JsonGenerator.toJson(JsonJavaFactory.instanceEx, jsonHandler.getData(), compact);
} catch(Exception ex) {
return "";
}
}
/**
* Build a JSON object using the current fields
*
* @return {JsonJavaObject}
* @throws AbstractException
*/
public JsonJavaObject buildJsonObject() throws AbstractException {
return buildJsonObject(null);
}
/**
* Build a JSON object using the current fields
*
* @return {JsonJavaObject}
* @throws AbstractException
*/
public JsonJavaObject buildJsonObject(String jsonString) throws AbstractException {
JsonJavaObject jsonObject = null;
if (StringUtil.isEmpty(jsonString)) {
jsonObject = new JsonJavaObject();
} else {
jsonObject = (JsonJavaObject)JsonParser.fromJson(JsonJavaFactory.instanceEx, jsonString);
}
if (fields != null) {
Set<Entry<String, Object>> entries = fields.entrySet();
for (Entry<String, Object> entry : entries) {
setValue(jsonObject, entry.getKey(), entry.getValue());
}
}
return jsonObject;
}
/**
* @param jsonObject
* @param path
* @param value
* @throws AbstractException
*/
protected void setValue(JsonJavaObject jsonObject, String path, Object value) throws AbstractException {
String[] pathParts = path.split("/");
JsonJavaObject currObject = jsonObject;
for (int i=0; i<pathParts.length; i++) {
if (i+1 == pathParts.length) {
currObject.put(pathParts[i], value);
} else {
Object nextPart = currObject.get(pathParts[i]);
if (nextPart == null) {
nextPart = new JsonJavaObject();
currObject.put(pathParts[i], nextPart);
} else {
if (!(nextPart instanceof JsonJavaObject)) {
throw new InvalidInputException(null, "Invalid path {0}", path);
}
}
currObject = (JsonJavaObject)nextPart;
}
}
}
}