/*
* 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.identity.model;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.exoplatform.social.core.identity.provider.OrganizationIdentityProvider;
import org.exoplatform.social.core.identity.provider.SpaceIdentityProvider;
import org.exoplatform.social.core.model.AvatarAttachment;
import org.exoplatform.social.core.service.LinkProvider;
/**
* The Class Profile.
*/
public class Profile {
/** gender key. */
public static final String GENDER = "gender";
/** username key. */
public static final String USERNAME = "username";
/** firstname key. */
public static final String FIRST_NAME = "firstName";
/** lastname key. */
public static final String LAST_NAME = "lastName";
/** lastname key. */
public static final String FULL_NAME = "fullName";
/** email key. */
public static final String EMAIL = "email";
/**
* property of type {@link AvatarAttachment} that contains the avatar
*/
public static final String AVATAR = "avatar";
/**
* url of the avatar (can be used instead of {@link #AVATAR})
*/
public static final String AVATAR_URL = "avatarUrl";
/** EXPERIENCE. */
public static final String EXPERIENCES = "experiences";
/** COMPANY. */
public static final String EXPERIENCES_COMPANY = "company";
/** POSITION. */
public static final String EXPERIENCES_POSITION = "position";
/** POSITION. */
public static final String EXPERIENCES_SKILLS = "skills";
/** START DATE OF EXPERIENCE. */
public static final String EXPERIENCES_START_DATE = "startDate";
/** END DATE OF EXPERIENCE. */
public static final String EXPERIENCES_END_DATE = "endDate";
/** CURRENT OR PAST EXPERIENCE. */
public static final String EXPERIENCES_IS_CURRENT = "isCurrent";
/** DESCRIPTION OF EXPERIENCE. */
public static final String EXPERIENCES_DESCRIPTION = "description";
/** POSITION. */
public static final String POSITION = "position";
/**
* An optional url for this profile
*/
@Deprecated
public static final String URL = "Url";
/** PHONES key. */
public static final String CONTACT_PHONES = "phones";
/** IMS key. */
public static final String CONTACT_IMS = "ims";
/** URLS key. */
public static final String CONTACT_URLS = "urls";
/** url postfix */
public static final String URL_POSTFIX = "Url";
/** Resized subfix */
public static final String RESIZED_SUBFIX = "RESIZED_";
/** Types of updating of profile. */
public static enum UpdateType
{
POSITION,
BASIC_INFOR,
CONTACT,
EXPERIENCES,
AVATAR
};
/** The properties. */
private final Map<String, Object> properties = new HashMap<String, Object>();
private static final Map<UpdateType, String[]> updateTypes = new HashMap<UpdateType, String[]>();
static {
updateTypes.put(UpdateType.POSITION, new String[] {POSITION});
updateTypes.put(UpdateType.BASIC_INFOR, new String[] {FIRST_NAME, LAST_NAME, EMAIL});
updateTypes.put(UpdateType.CONTACT, new String[] {GENDER, CONTACT_PHONES, CONTACT_IMS, CONTACT_URLS});
updateTypes.put(UpdateType.EXPERIENCES, new String[] {EXPERIENCES});
updateTypes.put(UpdateType.AVATAR, new String[] {AVATAR, AVATAR_URL});
}
/** The identity. */
private final Identity identity;
/** The id. */
private String id;
/** The last loaded time */
private long lastLoaded;
/** Indicates whether or not the profile has been modified locally */
private boolean hasChanged;
/** Indicates the type of profile are being modified locally */
private UpdateType updateType;
/**
* Instantiates a new profile.
*
* @param identity the identity
*/
public Profile(final Identity identity) {
this.identity = identity;
}
/**
* Gets the identity.
*
* @return the identity
*/
public final Identity getIdentity() {
return identity;
}
/**
* Gets the id.
*
* @return the id
*/
public final String getId() {
return id;
}
/**
* Sets the id.
*
* @param id the new id
*/
public final void setId(final String id) {
this.id = id;
}
/**
* Gets the last loaded time.
*
* @return the last loaded time
*/
public final long getLastLoaded() {
return lastLoaded;
}
/**
* Sets the last loaded time.
*
* @param lastLoaded the new last loaded time
*/
public final void setLastLoaded(final long lastLoaded) {
this.lastLoaded = lastLoaded;
}
/**
* Indicates whether or not the profile has been modified locally.
*
* @return <code>true</code> if it has been modified locally, <code>false</code> otherwise.
*/
public final boolean hasChanged() {
return hasChanged;
}
/**
* Clear the has changed flag.
*/
public final void clearHasChanged() {
setHasChanged(false);
}
/**
* Gets type of update.
* @return the updated type for a profile
* @since 1.2.0-GA
*/
public UpdateType getUpdateType() {
return updateType;
}
/**
* Sets type of update.
*
* @param updateType
* @since 1.2.0-GA
*/
protected void setUpdateType(String updateType) {
for (UpdateType key : updateTypes.keySet()) {
String[] updateTypeValues = updateTypes.get(key);
for (String value : updateTypeValues) {
if(value.equals(updateType)) {
this.updateType = key;
break;
}
}
}
}
/**
* Sets the value of the property <code>hasChanged<code>.
*
* @param hasChanged the new hasChanged
*/
private void setHasChanged(final boolean hasChanged) {
this.hasChanged = hasChanged;
}
/**
* Gets the property.
*
* @param name the name
* @return the property
*/
public final Object getProperty(final String name) {
return properties.get(name);
}
/**
* Sets the property.
*
* @param name the name
* @param value the value
*/
public final void setProperty(final String name, final Object value) {
// TODO : remove with Profile.URL
if (URL.equals(name)) {
return;
}
properties.put(name, value);
setHasChanged(true);
setUpdateType(name);
}
/**
* Contains.
*
* @param name the name
* @return true, if successful
*/
public final boolean contains(final String name) {
return properties.containsKey(name);
}
/**
* Gets the properties.
*
* @return the properties
*/
public final Map<String, Object> getProperties() {
return properties;
}
/**
* Removes the property.
*
* @param name the name
*/
public final void removeProperty(final String name) {
properties.remove(name);
setHasChanged(true);
}
/**
* Gets the property value.
*
* @param name the name
* @return the property value
* @deprecated use {@link #getProperty(String)}. Will be removed at 1.3.x
* @return
*/
public final Object getPropertyValue(final String name) {
return getProperty(name);
}
/**
* Gets the full name.
*
* @return the full name
*/
public final String getFullName() {
String first = (String) getProperty(FIRST_NAME);
String last = (String) getProperty(LAST_NAME);
String all = (first != null) ? first : "";
all += (last != null) ? " " + last : "";
return all;
}
/**
* Get this profile URL
*
* @return this profile URL
*/
public final String getUrl() {
if (OrganizationIdentityProvider.NAME.equals(identity.getProviderId())) {
return LinkProvider.getUserProfileUri(identity.getRemoteId());
} else if (SpaceIdentityProvider.NAME.equals(identity.getProviderId())) {
return LinkProvider.getSpaceUri(identity.getRemoteId());
}
return null;
}
/**
* Gets email address of this profile.
*
* @return email in String format
*/
public final String getEmail() {
return (String)getProperty(EMAIL);
}
/**
* Add or modify properties of the profile
*
* @param props
*/
public final void addOrModifyProperties(final Map<String, Object> props) {
Iterator<Map.Entry<String, Object>> it = props.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Object> entry = it.next();
String key = entry.getKey();
// we skip all the property that are jcr related
if (key.contains(":")) {
continue;
}
setProperty(key, entry.getValue());
}
setHasChanged(true);
}
/**
* Gets avatar url
*
* @return avatar image source
* @deprecated use {@link #getAvatarUrl()}. Will be removed at 1.3.x
*/
public final String getAvatarImageSource() {
return (String) getProperty(Profile.AVATAR_URL);
}
/**
* Gets avatar url
*
* @return avatar image source
* @since 1.2.0-GA
*/
public final String getAvatarUrl() {
return (String) getProperty(Profile.AVATAR_URL);
}
/**
* Gets position
*
* @return position
* @since 1.2.0-GA
*/
public final String getPosition() {
return (String) getProperty(Profile.POSITION);
}
/*
* Get uuid, identity, properties of profile
* @see java.lang.Object#toString()
*/
@Override
public final String toString() {
return "[uuid : " + id + " identity : " + identity.getId() + " properties: " + properties;
}
}