UIMiniConnectionsPortlet.java
/*
* Copyright (C) 2003-2015 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.exoplatform.social.user.portlet;
import java.util.List;
import javax.portlet.MimeResponse;
import javax.portlet.ResourceRequest;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.exoplatform.social.core.identity.model.Identity;
import org.exoplatform.social.core.identity.model.Profile;
import org.exoplatform.social.core.profile.ProfileFilter;
import org.exoplatform.social.webui.Utils;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.lifecycle.UIApplicationLifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
import org.json.JSONObject;
@ComponentConfig(
lifecycle = UIApplicationLifecycle.class,
template = "app:/groovy/social/portlet/user/UIMiniConnectionsPortlet.gtmpl",
events = {
@EventConfig(listeners = UIMiniConnectionsPortlet.RemoveConnectionActionListener.class)
}
)
public class UIMiniConnectionsPortlet extends UIAbstractUserPortlet {
protected final static int MAX_DISPLAY = 12;
private static final String PROFILE_LOADING_RESOURCE = "profile-loading";
private static final String SIZE_LOADING_RESOURCE = "size-loading";
private static int connectionSize = 0;
public UIMiniConnectionsPortlet() throws Exception {
}
@Override
public void afterProcessRender(WebuiRequestContext context) {
super.afterProcessRender(context);
context.getJavascriptManager().getRequireJS()
.require("SHARED/user-profile", "userprofile").addScripts("userprofile.loadingProfile('" + getId() + "');");
}
private int getAllSize() throws Exception {
return Utils.getRelationshipManager().getConnectionsByFilter(currentProfile.getIdentity(), new ProfileFilter()).getSize();
}
@Override
public void serveResource(WebuiRequestContext context) throws Exception {
super.serveResource(context);
ResourceRequest req = context.getRequest();
MimeResponse res = context.getResponse();
String resourceId = req.getResourceID();
if (PROFILE_LOADING_RESOURCE.equals(resourceId)) {
res.setContentType("text/html");
//
res.getWriter().write(profileListHTML());
} else if (SIZE_LOADING_RESOURCE.equals(resourceId)) {
res.setContentType("application/json");
int size = (connectionSize < MAX_DISPLAY) ? connectionSize : getAllSize();
JSONObject object = new JSONObject();
object.put("size", size);
object.put("showAll", (size > 0));
//
res.getWriter().write(object.toString());
}
}
private String profileListHTML() throws Exception {
StringBuilder html = new StringBuilder("");
List<Identity> identities = Utils.getRelationshipManager().getLastConnections(currentProfile.getIdentity(), MAX_DISPLAY);
connectionSize = identities.size();
for (Identity identity : identities) {
ProfileBean profile = new ProfileBean(identity);
html.append("<a href=\"").append(profile.getProfileURL()).append("\" class=\"avatarXSmall\" data-link=\"")
.append(event("RemoveConnection")).append("\">\n <img alt=\"").append(StringEscapeUtils.escapeHtml(profile.getDisplayName()))
.append("\" src=\"").append(profile.getAvatarURL()).append("\"/>\n</a>\n");
}
return html.toString();
}
public static class RemoveConnectionActionListener extends EventListener<UIMiniConnectionsPortlet> {
@Override
public void execute(Event<UIMiniConnectionsPortlet> event) throws Exception {
event.getRequestContext().addUIComponentToUpdateByAjax(event.getSource());
}
}
protected class ProfileBean {
private final String avatarURL;
private final String displayName;
private final String profileURL;
private final String userId;
public ProfileBean(Identity identity) {
this.userId = identity.getRemoteId();
//
Profile profile = identity.getProfile();
this.displayName = profile.getFullName();
this.profileURL = profile.getUrl();
String avatarURL = profile.getAvatarUrl();
if (StringUtils.isBlank(avatarURL) || avatarURL.equalsIgnoreCase("null")) {
avatarURL = "/eXoSkin/skin/images/system/UserAvtDefault.png";
}
this.avatarURL = avatarURL;
}
public String getUserId() {
return userId;
}
public String getAvatarURL() {
return avatarURL;
}
public String getDisplayName() {
return displayName;
}
public String getProfileURL() {
return profileURL;
}
}
}