/* * Copyright (C) 2003-2007 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. */ package org.exoplatform.social.core.profile; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.exoplatform.container.ExoContainer; import org.exoplatform.container.ExoContainerContext; import org.exoplatform.social.core.identity.model.Profile; import org.exoplatform.social.core.service.ProfileConfig; /** * there should be a configuration file to define the mapping. it might need to create objects other * than string */ public class ProfileMapper { /** * The config. */ private ProfileConfig config; /** * Copy. * * @param infos the infos * @param profile the profile * @throws Exception the exception */ public void copy(Map infos, Profile profile) throws Exception { Iterator it = infos.keySet().iterator(); //remove the fields we are editing while (it.hasNext()) { String key = (String) it.next(); if (key.endsWith(".isEditing")) { profile.setProperty(key.substring(0, key.length() - 10), new ArrayList()); } } //we store some object in this map temporarly the time to reconstruct //the objects. At the end, we transform it to List HashMap tmpMaps = new HashMap<String, HashMap>(); it = infos.keySet().iterator(); while (it.hasNext()) { String key = (String) it.next(); //we skip this element since it is not to be saved if (key.endsWith(".isEditing")) { continue; } Object value = infos.get(key); //need to not do it for forced multivalue if (value instanceof String[]) { if (((String[]) value).length == 1) { value = ((String[]) value)[0]; } } int pos = key.indexOf("."); if (pos > 0) { String nKey = key.substring(0, pos); //remove all the numbers from the key nKey = nKey.replaceAll("[0-9]", ""); //get the id of the key int nId = Integer.parseInt(key.substring(nKey.length(), pos)); Object prop = tmpMaps.get(nKey); if (prop == null) { prop = new HashMap<String, Map>(); tmpMaps.put(nKey, prop); } // will throw an exception if prop is of the wrong type HashMap lProp = (HashMap) prop; Map el = (Map) lProp.get("" + nId); if (el == null) { lProp.put("" + nId, new HashMap<String, String>()); el = (Map) lProp.get("" + nId); } String name = key.substring(pos + 1); this.getConfig(); String type = config.getType(config.getNodeType(nKey), name); if (type.equals("String")) { el.put(name, value.toString()); } else if (value.toString().length() > 0) { if (type.equals("Boolean")) { el.put(name, new Boolean(value.toString())); } else if (type.equals("Double")) { el.put(name, new Double(value.toString())); } else if (type.equals("Long")) { el.put(name, new Long(value.toString())); } } } else { profile.setProperty(key, value); } } // transform the tmpMaps to a list Iterator itTmpMap = tmpMaps.keySet().iterator(); while (itTmpMap.hasNext()) { String key = (String) itTmpMap.next(); HashMap<String, HashMap> value = (HashMap) tmpMaps.get(key); profile.setProperty(key, new ArrayList<HashMap>()); List l = (List) profile.getProperty(key); it = value.values().iterator(); while (it.hasNext()) { l.add(it.next()); } } } /** * Gets the config. * * @return the config */ private ProfileConfig getConfig() { if (config == null) { ExoContainer container = ExoContainerContext.getCurrentContainer(); this.config = (ProfileConfig) container.getComponentInstanceOfType(ProfileConfig.class); } return config; } }