package io.cattle.platform.object.serialization.impl; import io.cattle.platform.json.JsonMapper; import io.cattle.platform.object.ObjectManager; import io.cattle.platform.object.meta.ObjectMetaDataManager; import io.cattle.platform.object.meta.Relationship; import io.cattle.platform.object.serialization.ObjectSerializer; import io.cattle.platform.object.serialization.ObjectTypeSerializerPostProcessor; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class DefaultObjectSerializerImpl implements ObjectSerializer { JsonMapper jsonMapper; ObjectManager objectManager; ObjectMetaDataManager metaDataManager; Action action; String expression; Map<String, List<ObjectTypeSerializerPostProcessor>> postProcessors; public DefaultObjectSerializerImpl(JsonMapper jsonMapper, ObjectManager objectManager, ObjectMetaDataManager metaDataManager, Map<String, List<ObjectTypeSerializerPostProcessor>> postProcessors, Action action, String expression) { super(); this.jsonMapper = jsonMapper; this.objectManager = objectManager; this.metaDataManager = metaDataManager; this.action = action; this.expression = expression; this.postProcessors = postProcessors; } @Override public Map<String, Object> serialize(Object obj) { Map<String, Object> data = new HashMap<String, Object>(); data.put(action.getName(), marshall(obj, action.getName(), action)); return data; } protected Map<String, Object> marshall(Object obj, String type, Action action) { Map<String, Object> data = obj == null ? null : jsonMapper.writeValueAsMap(obj); if (data != null) { data.put("type", type); } for (Action childAction : action.getChildren()) { Relationship rel = metaDataManager.getRelationship(type, childAction.getName().toLowerCase()); if (rel == null) { throw new IllegalStateException("Failed to find link for [" + childAction.getName() + "]"); } Class<?> clz = rel.getObjectType(); String childType = objectManager.getType(clz); if (rel.isListResult()) { List<Map<String, Object>> childData = new ArrayList<Map<String, Object>>(); for (Object childObject : objectManager.getListByRelationship(obj, rel)) { childData.add(marshall(childObject, childType, childAction)); } if (data != null) { data.put(rel.getName(), childData); } } else { Object childObject = objectManager.getObjectByRelationship(obj, rel); Map<String, Object> childData = marshall(childObject, childType, childAction); if (data != null) { data.put(rel.getName(), childData); } } } List<ObjectTypeSerializerPostProcessor> postProcessorList = postProcessors.get(type); if (postProcessorList != null) { for (ObjectTypeSerializerPostProcessor postProcessor : postProcessorList) { postProcessor.process(obj, type, data); } } return data; } @Override public String getExpression() { return expression; } }