package jp.aegif.nemaki.util.spring.aspect.log.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.chemistry.opencmis.commons.PropertyIds;
import org.apache.chemistry.opencmis.commons.data.Ace;
import org.apache.chemistry.opencmis.commons.data.Acl;
import org.apache.chemistry.opencmis.commons.data.CmisExtensionElement;
import org.apache.chemistry.opencmis.commons.data.FailedToDeleteData;
import org.apache.chemistry.opencmis.commons.data.ObjectData;
import org.apache.chemistry.opencmis.commons.data.ObjectInFolderContainer;
import org.apache.chemistry.opencmis.commons.data.ObjectInFolderData;
import org.apache.chemistry.opencmis.commons.data.ObjectInFolderList;
import org.apache.chemistry.opencmis.commons.data.ObjectList;
import org.apache.chemistry.opencmis.commons.data.ObjectParentData;
import org.apache.chemistry.opencmis.commons.data.Properties;
import org.apache.chemistry.opencmis.commons.data.PropertyData;
import org.apache.chemistry.opencmis.commons.server.CallContext;
import org.apache.commons.collections.MapUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
public class CustomToStringImpl {
public String parse(Object obj){
if(obj == null){
return "null";
}else if(obj instanceof CallContext){
return parseCallContext((CallContext)obj);
}else if(obj instanceof ObjectData){
return parseObjectData((ObjectData)obj);
}else if(obj instanceof ObjectInFolderData){
return parseObjectInFolderData((ObjectInFolderData)obj);
}else if(obj instanceof ObjectInFolderContainer){
return parseObjectInFolderContainer((ObjectInFolderContainer)obj);
}else if(obj instanceof ObjectInFolderList){
return parseObjectInFolderList((ObjectInFolderList)obj);
}else if(obj instanceof ObjectList){
return parseObjectList((ObjectList)obj);
}else if(obj instanceof ObjectParentData){
return parseObjectParentData((ObjectParentData)obj);
}else if(obj instanceof Properties){
return parseProperties((Properties)obj);
}else if(obj instanceof FailedToDeleteData){
return parseFailedToDeleteData((FailedToDeleteData)obj);
}else if(obj instanceof Acl){
return parseAcl((Acl)obj);
}else if(obj instanceof List){
return parseList((List)obj);
}else{
return obj.toString();
}
}
private String parseList(List list){
List<String>result = new ArrayList<String>();
for(Object elm : list){
result.add(parse(elm));
}
return result.toString();
}
private String parseCallContext(CallContext callContext){
if(callContext == null){
return "";
}else{
StringBuilder sb = new StringBuilder();
sb.append("CallContext[repositoryId=")
.append(callContext.getRepositoryId())
.append(", userId=")
.append(callContext.getUsername())
.append("]");
return sb.toString();
}
}
private String parseObjectData(ObjectData od){
ObjectMapper mapper = new ObjectMapper();
ObjectNode json = mapper.createObjectNode();
json.put(PropertyIds.OBJECT_ID, od.getId());
Map<String, PropertyData<?>>properties = od.getProperties().getProperties();
convetPropertyToJson(json, PropertyIds.NAME, properties);
convetPropertyToJson(json, PropertyIds.OBJECT_TYPE_ID, properties);
return json.toString();
}
private String parseObjectInFolderData(ObjectInFolderData oifd){
ObjectData od = ((ObjectInFolderData)oifd).getObject();
return parseObjectData(od);
}
private String parseObjectInFolderContainer(ObjectInFolderContainer oifc){
ObjectData od = ((ObjectInFolderContainer)oifc).getObject().getObject();
return parseObjectData(od);
}
private String parseObjectInFolderList(ObjectInFolderList list){
List<String> result = new ArrayList<String>();
Iterator<ObjectInFolderData> itr = list.getObjects().iterator();
while(itr.hasNext()){
result.add(parseObjectInFolderData(itr.next()));
}
return result.toString();
}
private String parseObjectList(ObjectList ol){
List<ObjectData>list = ol.getObjects();
if(list == null){
return "null";
}else{
return parseList(list);
}
}
private String parseObjectParentData(ObjectParentData opd){
ObjectData od = ((ObjectParentData)opd).getObject();
return parseObjectData(od);
}
private String parseFailedToDeleteData(FailedToDeleteData ftdd){
if(ftdd.getIds() == null){
return "null";
}else{
return ftdd.getIds().toString();
}
}
private String parseAcl(Acl acl){
Map<String, String>map = new HashMap<String, String>();
List<Ace> aces = acl.getAces();
if(aces == null){
map.put("aces", null);
}else{
List<String> list = new ArrayList<String>();
for(Ace ace : aces){
list.add(parseAce(ace));
}
map.put("aces", list.toString());
}
List<CmisExtensionElement> exts = acl.getExtensions();
if(exts == null){
map.put("extensions", null);
}else{
map.put("extensions", exts.toString());
}
return map.toString();
}
private String parseAce(Ace ace){
Map<String, String>map = new HashMap<String, String>();
if(ace == null){
return "null";
}else{
map.put("principalId", ace.getPrincipalId());
List<String> permissions = ace.getPermissions();
if(permissions == null){
map.put("permissions", null);
}else{
map.put("permissions", permissions.toString());
}
List<CmisExtensionElement> exts = ace.getExtensions();
if(exts == null){
map.put("extensions", null);
}else{
map.put("extensions", exts.toString());
}
return map.toString();
}
}
private String parseProperties(Properties properties){
Map<String, PropertyData<?>> map = properties.getProperties();
Map<String, Object>_map = new HashMap<String, Object>();
if(MapUtils.isNotEmpty(map)){
for(Entry<String, PropertyData<?>> e : map.entrySet()){
Object values = e.getValue().getValues();
_map.put(e.getKey(), values);
}
}
return _map.toString();
}
public String parseArguments(Object[] list){
List<String>result = new ArrayList<String>();
if(list == null){
return null;
}else{
for(int i=0; i<list.length; i++){
result.add(this.parse(list[i]));
}
return result.toString();
}
}
private void convetPropertyToJson(ObjectNode json, String key, Map<String, PropertyData<?>> properties){
PropertyData<?> pd = properties.get(key);
if(pd != null && pd.getFirstValue() != null){
json.put(key, pd.getFirstValue().toString());
}
}
}