/**
  * Assumes the input map always has String keys and the values are of types: String, Version,
  * Long, Double or List of the previous types. Lists are copied and Version objects are converted
  * to String objects.
  */
 private static Map<String, Object> newAttributesMapDTO(Map<String, Object> map) {
   Map<String, Object> dto = new HashMap<String, Object>(map);
   /* Lists are copied and Version objects are converted to String objects. */
   for (Map.Entry<String, Object> entry : dto.entrySet()) {
     Object value = entry.getValue();
     if (value instanceof Version) {
       entry.setValue(String.valueOf(value));
       continue;
     }
     if (value instanceof List) {
       List<Object> newList = new ArrayList<Object>((List<?>) value);
       for (ListIterator<Object> iter = newList.listIterator(); iter.hasNext(); ) {
         Object element = iter.next();
         if (element instanceof Version) {
           iter.set(String.valueOf(element));
         }
       }
       entry.setValue(newList);
       continue;
     }
   }
   return dto;
 }