/* * Copyright (C) 2003-2010 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.service; import org.apache.commons.lang.Validate; import org.exoplatform.container.PortalContainer; import org.exoplatform.container.xml.InitParams; import org.exoplatform.portal.mop.SiteType; import org.exoplatform.portal.webui.util.Util; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.social.core.identity.model.Identity; import org.exoplatform.social.core.identity.model.Profile; import org.exoplatform.social.core.identity.provider.OrganizationIdentityProvider; import org.exoplatform.social.core.identity.provider.SpaceIdentityProvider; import org.exoplatform.social.core.manager.IdentityManager; import org.exoplatform.social.core.model.AvatarAttachment; import org.exoplatform.social.core.space.model.Space; import org.exoplatform.social.core.space.spi.SpaceService; import org.exoplatform.web.application.RequestContext; import org.exoplatform.web.url.navigation.NavigationResource; import org.exoplatform.web.url.navigation.NodeURL; public class LinkProvider { public static final String RESOURCE_URL = "/social-resources"; public static final String JAVASCRIPT_RESOURCE_URL = RESOURCE_URL + "/javascript"; public static final String PROFILE_DEFAULT_AVATAR_URL = RESOURCE_URL + "/skin/ShareImages/Avatar.gif"; public static final String SPACE_DEFAULT_AVATAR_URL = RESOURCE_URL + "/skin/ShareImages/SpaceImages/SpaceLogoDefault_61x61.gif"; public static final String HAS_CONNECTION_ICON = RESOURCE_URL + "/skin/social/webui/UIManageUsers/DefaultSkin/background/StatusIcon.png"; public static final String WAITING_CONFIRMATION_ICON = RESOURCE_URL + "/skin/social/webui/UIManageUsers/DefaultSkin/background/WaittingConfirm.png"; public static final String SPACE_MANAGER_ICON = RESOURCE_URL + "/skin/social/webui/UIManageSpaces/DefaultSkin/background/Manager.png"; public static final String SPACE_MEMBER_ICON = RESOURCE_URL + "/skin/social/webui/UIManageSpaces/DefaultSkin/background/Member.png"; public static final String SPACE_WAITING_CONFIRM_ICON = RESOURCE_URL + "/skin/social/webui/UIManageSpaces/DefaultSkin/background/WaitingConfirm.png"; public static final String ROUTE_DELIMITER = "/"; private static IdentityManager identityManager; private static Log LOG = ExoLogger.getLogger(LinkProvider.class); /** * Hacks for unit test to work. */ public static String DEFAULT_PORTAL_OWNER = "classic"; /** * Constructor with parameter to inject the default portal owner name * @param params * @since 1.2.0 GA */ public LinkProvider(InitParams params){ if(params.getValueParam("predefinedOwner") != null) DEFAULT_PORTAL_OWNER = params.getValueParam("predefinedOwner").getValue(); } /** * Returns the uri link to space profile. * * @param prettyName * @return the uri link to space * @since 1.2.0 GA */ public static String getSpaceUri(final String prettyName) { SpaceService spaceService = getSpaceService(); Space space = spaceService.getSpaceByPrettyName(prettyName); RequestContext ctx = RequestContext.getCurrentInstance(); NodeURL nodeURL = ctx.createURL(NodeURL.TYPE); NavigationResource resource = new NavigationResource(SiteType.GROUP, space.getGroupId(), space.getUrl()); return nodeURL.setResource(resource).toString(); } /** * Returns the uri link to user profile. * * @param username * @return the uri link to user profile */ public static String getProfileUri(final String username) { return buildProfileUri(username, null, null); } /** * Returns the uri link to user profile in a portalOwner. * * @param username * @param portalOwner * @return the uri link to user profile */ public static String getProfileUri(final String username, final String portalOwner) { return buildProfileUri(username, null, portalOwner); } /** * Returns tag <a> with a link to profile of userName. * * @param username * @return tag <a> with a link to profile of userName */ public static String getProfileLink(final String username) { return getProfileLink(username, null); } /** * Returns tag <a> with a link to profile of userName on portalName. * * @param username * @param portalOwner * @return tag <a> with a link to profile of userName on portalName */ public static String getProfileLink(final String username, final String portalOwner) { Identity identity = getIdentityManager().getOrCreateIdentity(OrganizationIdentityProvider.NAME, username, true); Validate.notNull(identity, "Identity must not be null."); return "<a href=\"" + buildProfileUri(identity.getRemoteId(), null, portalOwner) + "\" target=\"_parent\">" + identity.getProfile().getFullName() + "</a>"; } /** * Gets absolute profile uri of userName * * @param userName * @param portalName * @param portalOwner * @param host * @return absolute profile uri of userName */ public static String getAbsoluteProfileUrl(final String userName, final String portalName, final String portalOwner, final String host) { return host + buildProfileUri(userName, portalName, portalOwner); } /** * Gets activity link of user; remoteId should be the id name. For * example: root * * @param remoteId * @return */ public static String getUserActivityUri(final String remoteId) { return getActivityUri(OrganizationIdentityProvider.NAME,remoteId); } /** * Gets connections link of user; remoteId should be the id name. For * example: root * * @param remoteId * @return */ public static String getUserConnectionsUri(final String remoteId) { return getBaseUri(null, null) + "/connections/all-people" + ROUTE_DELIMITER + remoteId; } /** * Gets connections link of user; remoteId should be the id name. For * example: root * * @param remoteId * @return */ public static String getUserConnectionsYoursUri(final String remoteId) { return getBaseUri(null, null) + "/connections/network" + ROUTE_DELIMITER + remoteId; } /** * Gets profile link of user; remoteId should be the id name. For * example: root * * @param remoteId * @return */ public static String getUserProfileUri(final String remoteId) { return getBaseUri(null, null) + "/profile" + ROUTE_DELIMITER + remoteId; } /** * Gets activity link of space or user; remoteId should be the id name. For * example: organization:root or space:abc_def. * * @param providerId * @param remoteId * @return */ public static String getActivityUri(final String providerId, final String remoteId) { final String prefix = getBaseUri(null, null) + "/"; if (providerId.equals(OrganizationIdentityProvider.NAME)) { return prefix + "activities" + ROUTE_DELIMITER + remoteId; } else if (providerId.equals(SpaceIdentityProvider.NAME)) { return prefix + ROUTE_DELIMITER + remoteId; } else { LOG.warn("Failed to getActivityLink with providerId: " + providerId); } return null; } /** * Builds avatar image uri from avatarAttachment. * * @param avatarAttachment * @return uri */ public static String buildAvatarImageUri(final AvatarAttachment avatarAttachment) { return buildAvatarImageUri(PortalContainer.getInstance(), avatarAttachment); } /** * Gets url of avatar. * * @param space * @return * @since 1.2.0-GA */ public static String buildAvatarImageUri(final Space space) { return buildAvatarImageUri(space.getAvatarAttachment()); } /** * Gets url of avatar from identity name. * * @param identityName * @return * @since 1.2.0-GA */ public static String buildAvatarImageUri(final String identityName) { return String.format( "/rest/jcr/repository/social/production/soc:providers/soc:space/soc:%s/soc:profile/soc:avatar", identityName); } /** * Builds avatar image uri from avatarAttachment. * * @param container * @param avatarAttachment * @return url to avatar */ private static String buildAvatarImageUri(final PortalContainer container, final AvatarAttachment avatarAttachment) { String avatarUrl = null; try { if (avatarAttachment != null) { final String repository = ((RepositoryService) container.getComponentInstanceOfType(RepositoryService.class)). getCurrentRepository().getConfiguration().getName(); avatarUrl = "/" + container.getRestContextName() + "/jcr/" + repository + "/" + avatarAttachment.getWorkspace() + avatarAttachment.getDataPath() + "/?upd=" + avatarAttachment.getLastModified(); avatarUrl = escapeJCRSpecialCharacters(avatarUrl); } } catch (Exception e) { LOG.warn("Failed to build avatar url from avatar attachment for: " + e.getMessage()); } return avatarUrl; } /** * Gets avatar image uri of profile in a portalContainer. * * @param profile * @param portalContainer * @return null or an url if available * @deprecated use {@link Profile#getAvatarUrl()}. Will be removed at 1.3.x */ public static String getAvatarImageSource(final PortalContainer portalContainer, final Profile profile) { final AvatarAttachment avatarAttachment = (AvatarAttachment) profile.getProperty(Profile.AVATAR); if (avatarAttachment != null) { return buildAvatarImageUri(portalContainer, avatarAttachment); } return null; } /** * Gets avatar image uri of profile. * * @param profile * @return null or an url if available * @deprecated use {@link Profile#getAvatarUrl()}. Will be removed at 1.3.x */ public static String getAvatarImageSource(final Profile profile) { String avatarUrl = (String) profile.getProperty(Profile.AVATAR_URL); if (avatarUrl != null) { return avatarUrl; } final AvatarAttachment avatarAttachment = (AvatarAttachment) profile.getProperty(Profile.AVATAR); if (avatarAttachment != null) { avatarUrl = buildAvatarImageUri(avatarAttachment); profile.setProperty(Profile.AVATAR_URL, avatarUrl); getIdentityManager().saveProfile(profile); return avatarUrl; } return null; } /** * Builds profile uri from userName and portalOwner. * * @param userName * @param portalName * @param portalOwner * @return profile uri */ private static String buildProfileUri(final String userName, final String portalName, String portalOwner) { if(portalOwner == null || portalOwner.trim().length() == 0) portalOwner = DEFAULT_PORTAL_OWNER; return getBaseUri(portalName, portalOwner) + "/profile" + ROUTE_DELIMITER + userName; } /** * Builds profile uri from userName and portalName and portalOwner. * * @param portalName * @param portalOwner * @return */ private static String getBaseUri(final String portalName, String portalOwner) { return "/" + getPortalName(portalName) + "/" + getPortalOwner(portalOwner); } /** * Escapes jcr special characters. * * @param string * @return */ public static String escapeJCRSpecialCharacters(String string) { if (string == null) { return null; } return string.replace("[", "%5B").replace("]", "%5D").replace(":", "%3A"); } /** * Gets IdentityManager instance. * * @return identityManager */ private static IdentityManager getIdentityManager() { if (LinkProvider.identityManager == null) { LinkProvider.identityManager = (IdentityManager) PortalContainer.getInstance() .getComponentInstanceOfType(IdentityManager.class); } return LinkProvider.identityManager; } /** * Gets the space service. * * @return * @since 1.2.2 */ private static SpaceService getSpaceService() { return (SpaceService) PortalContainer.getInstance().getComponentInstanceOfType(SpaceService.class); } /** * Gets portal owner, if parameter is null or "", the method return default portal owner. * * @param portalOwner * @return portalOwner */ private static String getPortalOwner(String portalOwner) { if (portalOwner == null || portalOwner.trim().length() == 0) { try { return Util.getPortalRequestContext().getPortalOwner(); } catch (Exception e) { return DEFAULT_PORTAL_OWNER; } } return portalOwner; } /** * Gets portal owner, if parameter is null or "", the method return default portal owner * * @param portalName * @return portalName */ private static String getPortalName(String portalName) { if (portalName == null || portalName.trim().length() == 0) { return PortalContainer.getCurrentPortalContainerName(); } return portalName; } }