package org.nuxeo.mule.mapper; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import org.nuxeo.ecm.automation.client.model.PropertyList; import org.nuxeo.ecm.automation.client.model.PropertyMap; import org.nuxeo.mule.metadata.DataSenseHelper; /** * Simple wrapper around a map to automatically translate field names for Mule * DataSense * * This also includes the logic for unwrapping Nuxeo complex properties * (PropertyMap and PropertyList). * * ex: 'dc:description' becomes 'dc__description' * * @author <a href="mailto:tdelprat@nuxeo.com">Tiry</a> * */ public class MuleTranslatedMap extends HashMap<String, Object> implements Map<String, Object> { private static final long serialVersionUID = 1L; @Override public boolean containsKey(Object key) { return super.containsKey(DataSenseHelper.getNuxeoFieldName((String) key)); } @Override public Object get(Object key) { Object value = super.get(DataSenseHelper.getNuxeoFieldName((String) key)); return value; } @Override public Object put(String key, Object val) { return super.put(DataSenseHelper.getNuxeoFieldName((String) key), val); } @Override public Object remove(Object key) { return super.remove(DataSenseHelper.getNuxeoFieldName((String) key)); } protected Object unwrap(Object value) { if (value instanceof PropertyList) { ArrayList<Object> list = new ArrayList<Object>(); for (Object item : ((PropertyList) value).list()) { list.add(unwrap(item)); } return list; } else if (value instanceof PropertyMap) { MuleTranslatedMap v = new MuleTranslatedMap(); v.putAll(((PropertyMap) value).map()); return v; } else if (value instanceof Map<?, ?>) { MuleTranslatedMap v = new MuleTranslatedMap(); v.putAll((Map<? extends String, ? extends Object>) value); return v; } else { return value; } } @Override public void putAll(Map<? extends String, ? extends Object> map) { for (String key : map.keySet()) { Object value = map.get(key); value = unwrap(value); put(key, value); } } @Override public String toString() { StringBuffer sb = new StringBuffer(); sb.append("{"); for (String k : keySet()) { sb.append(k + ":" + super.get(k) + ", "); } sb.append("}"); return sb.toString(); } }