added notification for user "mentions"

git-svn-id: https://svn.research-infrastructures.eu/d4science/gcube/trunk/portlets/user/share-updates@73585 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Massimiliano Assante 2013-04-18 09:44:10 +00:00
parent 8530439672
commit 153bf3f40f
3 changed files with 140 additions and 81 deletions

View File

@ -65,6 +65,12 @@
<version>[1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT)</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.gcube.applicationsupportlayer</groupId>
<artifactId>aslsocial</artifactId>
<version>[0.1.0-SNAPSHOT, 1.0.0-SNAPSHOT)</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.gcube.core</groupId>
<artifactId>gcf</artifactId>

View File

@ -0,0 +1,37 @@
package org.gcube.portlets.user.shareupdates.server;
import java.util.ArrayList;
import org.gcube.applicationsupportlayer.social.NotificationsManager;
import org.gcube.common.core.utils.logging.GCUBEClientLog;
/**
*
* @author Massimiliano Assante ISTI-CNR
*
*/
public class MentionNotificationsThread implements Runnable {
private static GCUBEClientLog _log = new GCUBEClientLog(MentionNotificationsThread.class);
private String postText;
private String postId;
private NotificationsManager nm;
private ArrayList<String> userIds;
public MentionNotificationsThread(String postId, String postText, NotificationsManager nm, ArrayList<String> userIds) {
super();
this.postId = postId;
this.postText = postText;
this.nm = nm;
this.userIds = userIds;
}
@Override
public void run() {
for (String userIdToNotify : userIds) {
boolean result = nm.notifyUserTag(userIdToNotify, postId, postText);
_log.trace("Sending Notification for post mention to: " + userIdToNotify + " result?"+ result);
}
}
}

View File

@ -19,6 +19,8 @@ import javax.net.ssl.X509TrustManager;
import org.apache.commons.validator.routines.UrlValidator;
import org.gcube.application.framework.core.session.ASLSession;
import org.gcube.application.framework.core.session.SessionManager;
import org.gcube.applicationsupportlayer.social.ApplicationNotificationsManager;
import org.gcube.applicationsupportlayer.social.NotificationsManager;
import org.gcube.common.core.utils.logging.GCUBEClientLog;
import org.gcube.portal.custom.communitymanager.OrganizationsUtil;
import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper;
@ -112,8 +114,8 @@ public class ShareUpdateServiceImpl extends RemoteServiceServlet implements Shar
if (user == null) {
_log.warn("USER IS NULL setting test.user and Running OUTSIDE PORTAL");
user = "test.user";
// user = "massimiliano.assante";
// SessionManager.getInstance().getASLSession(sessionID, user).setScope("/gcube/devsec/devVRE");
user = "massimiliano.assante";
SessionManager.getInstance().getASLSession(sessionID, user).setScope("/gcube/devsec/devVRE");
withinPortal = false;
}
else {
@ -122,84 +124,7 @@ public class ShareUpdateServiceImpl extends RemoteServiceServlet implements Shar
System.out.println("SessionID = " + sessionID);
return SessionManager.getInstance().getASLSession(sessionID, user);
}
/**
* this method extractPeopleTags from the user post
* @param postText text with tagged people: txt .. <input with the actual person profile
* @return
*/
private ArrayList<String> extractPeopleTags(String postText) {
ArrayList<String> toReturn = new ArrayList<String>();
String toParse = "<html><head></head><body>" + postText + "</body></html>";
HtmlCleaner cleaner = new HtmlCleaner();
// parse the string HTML
TagNode pageData = cleaner.clean(toParse);
TagNode[] inputElements = pageData.getElementsByName("input", true);
if (inputElements != null) {
for (int i = 0; i < inputElements.length; i++) {
System.out.println("Found input " + inputElements[i].getAttributes().get("value"));
toReturn.add(inputElements[i].getAttributes().get("value"));
}
} else {
_log.trace("No person tags in this post");
}
return toReturn;
}
/**
* remove all the html and leave the text
* @param html
* @return the text inside the html
*/
private static String html2text(String html) {
return Jsoup.parse(html).text().replace("&nbsp;"," ");
}
/**
* this method is used when posting a feed
*
* It converts the tagged people <input with the actual person profile link, not trivial
*
* @param postText is the html you get from the contentDIV smartarea sth like:
* text text text <input .... value="Massimiliano Assante" ... type="text"><span> etc etc</span>
*
* @return a String ready to be posted
*/
private String transformPost(String postText) {
ArrayList<String> taggedPeople = extractPeopleTags(postText);
if (taggedPeople == null || taggedPeople.size() == 0) { //there are no tagged people, remove html and go
String escapedFeedText = escapeHtml(postText); //here escape html to avoid xss attacks
String html = "<html><head></head><body>" + escapedFeedText + "</body></html>";
return html2text(html);
} else {
_log.trace("postText curing: " + postText);
// this is needed to reconstruct the place of people tags, selfexplaining i think
int i = 0;
while (postText.contains("<input")) {
//the replacing does not affect html but affects the While guard
postText = postText.replaceFirst("<input", "_usr_place_holder_["+i+"]<br");
i++;
}
String html = "<html><head></head><body>" + postText + "</body></html>";
String postWithPlaceHolders = html2text(html);
_log.trace("before cure: " + postWithPlaceHolders);
/*
* at this point you have the html removed and somthing like "text text text _usr_place_holder_[0] text text text _usr_place_holder_[1]"
* you need to replace _usr_place_holder_[i](s) with the people with same index in taggedPeople ArrayList
*/
String escapedFeedText = escapeHtml(postWithPlaceHolders); //here escape html to avoid xss attacks
ArrayList<String> usernames = getSelectedUserIds(taggedPeople);
i = 0;
for (String tagged : taggedPeople) {
String username = (i < usernames.size()) ? usernames.get(i) : "";
String taggedHTML = "<a class=\"link\" href=\""+GCubeSocialNetworking.USER_PROFILE_LINK+"?uid="+ username + "\">"+tagged+"</a> ";
escapedFeedText = escapedFeedText.replace("_usr_place_holder_["+i+"]", taggedHTML);
i++;
}
_log.trace("After cure: " + escapedFeedText);
return escapedFeedText;
}
}
/**
*
@ -207,7 +132,8 @@ public class ShareUpdateServiceImpl extends RemoteServiceServlet implements Shar
public ClientFeed share(String postText, FeedType feedType, PrivacyLevel pLevel, String vreId, String linkTitle, String linkDesc, String url, String urlThumbnail, String host) {
String escapedFeedText = transformPost(postText);
String username = getASLSession().getUsername();
ASLSession session = getASLSession();
String username = session.getUsername();
String email = username+"@isti.cnr.it";
String fullName = username+" FULL";
String thumbnailURL = "images/Avatar_default.png";
@ -257,13 +183,103 @@ public class ShareUpdateServiceImpl extends RemoteServiceServlet implements Shar
}
if (!result) return null;
//everything went fine
ClientFeed cf = new ClientFeed(toShare.getKey(), toShare.getType().toString(), username, feedDate, toShare.getUri(),
replaceAmpersand(toShare.getDescription()), fullName, email, thumbnailURL, toShare.getLinkTitle(), toShare.getLinkDescription(),
toShare.getUriThumbnail(), toShare.getLinkHost());
//send the notification to the mentioned users
ArrayList<String> mentionedUserIds = getSelectedUserIds(extractPeopleTags(postText));
if (mentionedUserIds != null && mentionedUserIds.size() > 0) {
NotificationsManager nm = new ApplicationNotificationsManager(session);
Thread thread = new Thread(new MentionNotificationsThread(toShare.getKey(), postText, nm, mentionedUserIds));
thread.start();
}
return cf;
}
/**
* this method is used when posting a feed
*
* It converts the tagged people <input with the actual person profile link, not trivial
*
* @param postText is the html you get from the contentDIV smartarea sth like:
* text text text <input .... value="Massimiliano Assante" ... type="text"><span> etc etc</span>
*
* @return a String ready to be posted
*/
private String transformPost(String postText) {
ArrayList<String> taggedPeople = extractPeopleTags(postText);
if (taggedPeople == null || taggedPeople.size() == 0) { //there are no tagged people, remove html and go
String escapedFeedText = escapeHtml(postText); //here escape html to avoid xss attacks
String html = "<html><head></head><body>" + escapedFeedText + "</body></html>";
return html2text(html);
} else {
_log.trace("postText curing: " + postText);
// this is needed to reconstruct the place of people tags, selfexplaining i think
int i = 0;
while (postText.contains("<input")) {
//the replacing does not affect html but affects the While guard
postText = postText.replaceFirst("<input", "_usr_place_holder_["+i+"]<br");
i++;
}
String html = "<html><head></head><body>" + postText + "</body></html>";
String postWithPlaceHolders = html2text(html);
_log.trace("before cure: " + postWithPlaceHolders);
/*
* at this point you have the html removed and somthing like "text text text _usr_place_holder_[0] text text text _usr_place_holder_[1]"
* you need to replace _usr_place_holder_[i](s) with the people with same index in taggedPeople ArrayList
*/
String escapedFeedText = escapeHtml(postWithPlaceHolders); //here escape html to avoid xss attacks
ArrayList<String> usernames = getSelectedUserIds(taggedPeople);
i = 0;
for (String tagged : taggedPeople) {
String username = (i < usernames.size()) ? usernames.get(i) : "";
String taggedHTML = "<a class=\"link\" href=\""+GCubeSocialNetworking.USER_PROFILE_LINK+"?uid="+ username + "\">"+tagged+"</a> ";
escapedFeedText = escapedFeedText.replace("_usr_place_holder_["+i+"]", taggedHTML);
i++;
}
_log.trace("After cure: " + escapedFeedText);
return escapedFeedText;
}
}
/**
* this method extractPeopleTags from the user post
* @param postText text with tagged people: txt .. <input with the actual person profile
* @return
*/
private ArrayList<String> extractPeopleTags(String postText) {
ArrayList<String> toReturn = new ArrayList<String>();
String toParse = "<html><head></head><body>" + postText + "</body></html>";
HtmlCleaner cleaner = new HtmlCleaner();
// parse the string HTML
TagNode pageData = cleaner.clean(toParse);
TagNode[] inputElements = pageData.getElementsByName("input", true);
if (inputElements != null) {
for (int i = 0; i < inputElements.length; i++) {
System.out.println("Found input " + inputElements[i].getAttributes().get("value"));
toReturn.add(inputElements[i].getAttributes().get("value"));
}
} else {
_log.trace("No person tags in this post");
}
return toReturn;
}
/**
* remove all the html and leave the text
* @param html
* @return the text inside the html
*/
private static String html2text(String html) {
return Jsoup.parse(html).text().replace("&nbsp;"," ");
}
private UserSettings getUserSettingsFromSession() {
return (UserSettings) getASLSession().getAttribute(UserInfo.USER_INFO_ATTR);
}