added support to show feeds related to user's statistics
fixed time for comments/posts: the year is now present if the comment/post was made before the current one git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/user/news-feed@130961 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
6c96eafa46
commit
4b3cd43ef4
|
@ -1,4 +1,13 @@
|
||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
|
<Changeset component="org.gcube.portlets-user.news-feed.2-1-0"
|
||||||
|
date="2016-10-29">
|
||||||
|
<Change>Support to show feeds related to user's statistics added
|
||||||
|
</Change>
|
||||||
|
<Change>Fixed time for comments/posts: the year is present only if the
|
||||||
|
comment/post
|
||||||
|
was made before the current one
|
||||||
|
</Change>
|
||||||
|
</Changeset>
|
||||||
<Changeset component="org.gcube.portlets-user.news-feed.2-0-0"
|
<Changeset component="org.gcube.portlets-user.news-feed.2-0-0"
|
||||||
date="2016-06-29">
|
date="2016-06-29">
|
||||||
<Change>Updated for Liferay 6.2.5</Change>
|
<Change>Updated for Liferay 6.2.5</Change>
|
||||||
|
|
2
pom.xml
2
pom.xml
|
@ -13,7 +13,7 @@
|
||||||
<groupId>org.gcube.portlets.user</groupId>
|
<groupId>org.gcube.portlets.user</groupId>
|
||||||
<artifactId>news-feed</artifactId>
|
<artifactId>news-feed</artifactId>
|
||||||
<packaging>war</packaging>
|
<packaging>war</packaging>
|
||||||
<version>2.0.0-SNAPSHOT</version>
|
<version>2.1.0-SNAPSHOT</version>
|
||||||
|
|
||||||
<name>gCube News Feed Portlet</name>
|
<name>gCube News Feed Portlet</name>
|
||||||
<description>
|
<description>
|
||||||
|
|
|
@ -6,6 +6,7 @@ import java.util.HashSet;
|
||||||
import org.gcube.portal.databook.shared.Comment;
|
import org.gcube.portal.databook.shared.Comment;
|
||||||
import org.gcube.portal.databook.shared.EnhancedFeed;
|
import org.gcube.portal.databook.shared.EnhancedFeed;
|
||||||
import org.gcube.portal.databook.shared.Like;
|
import org.gcube.portal.databook.shared.Like;
|
||||||
|
import org.gcube.portal.databook.shared.ShowUserStatisticAction;
|
||||||
import org.gcube.portlets.user.newsfeed.shared.MoreFeedsBean;
|
import org.gcube.portlets.user.newsfeed.shared.MoreFeedsBean;
|
||||||
import org.gcube.portlets.user.newsfeed.shared.OperationResult;
|
import org.gcube.portlets.user.newsfeed.shared.OperationResult;
|
||||||
import org.gcube.portlets.user.newsfeed.shared.UserSettings;
|
import org.gcube.portlets.user.newsfeed.shared.UserSettings;
|
||||||
|
@ -31,6 +32,8 @@ public interface NewsService extends RemoteService {
|
||||||
|
|
||||||
ArrayList<EnhancedFeed> getFeedsByQuery(String query, int from, int quantity);
|
ArrayList<EnhancedFeed> getFeedsByQuery(String query, int from, int quantity);
|
||||||
|
|
||||||
|
ArrayList<EnhancedFeed> getFeedsRelatedToUserStatistics(ShowUserStatisticAction action, int from, int quantity);
|
||||||
|
|
||||||
MoreFeedsBean getMoreFeeds(int from, int quantity);
|
MoreFeedsBean getMoreFeeds(int from, int quantity);
|
||||||
|
|
||||||
boolean like(String feedid, String feedText, String feedOwnerId);
|
boolean like(String feedid, String feedText, String feedOwnerId);
|
||||||
|
|
|
@ -6,6 +6,7 @@ import java.util.HashSet;
|
||||||
import org.gcube.portal.databook.shared.Comment;
|
import org.gcube.portal.databook.shared.Comment;
|
||||||
import org.gcube.portal.databook.shared.EnhancedFeed;
|
import org.gcube.portal.databook.shared.EnhancedFeed;
|
||||||
import org.gcube.portal.databook.shared.Like;
|
import org.gcube.portal.databook.shared.Like;
|
||||||
|
import org.gcube.portal.databook.shared.ShowUserStatisticAction;
|
||||||
import org.gcube.portlets.user.newsfeed.shared.MoreFeedsBean;
|
import org.gcube.portlets.user.newsfeed.shared.MoreFeedsBean;
|
||||||
import org.gcube.portlets.user.newsfeed.shared.OperationResult;
|
import org.gcube.portlets.user.newsfeed.shared.OperationResult;
|
||||||
import org.gcube.portlets.user.newsfeed.shared.UserSettings;
|
import org.gcube.portlets.user.newsfeed.shared.UserSettings;
|
||||||
|
@ -66,5 +67,8 @@ public interface NewsServiceAsync {
|
||||||
|
|
||||||
void getFeedsByQuery(String query, int from, int quantity,
|
void getFeedsByQuery(String query, int from, int quantity,
|
||||||
AsyncCallback<ArrayList<EnhancedFeed>> callback);
|
AsyncCallback<ArrayList<EnhancedFeed>> callback);
|
||||||
|
|
||||||
|
void getFeedsRelatedToUserStatistics(ShowUserStatisticAction action, int from, int quantity,
|
||||||
|
AsyncCallback<ArrayList<EnhancedFeed>> callback);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ import org.gcube.portal.databook.shared.Feed;
|
||||||
import org.gcube.portal.databook.shared.FeedType;
|
import org.gcube.portal.databook.shared.FeedType;
|
||||||
import org.gcube.portal.databook.shared.Like;
|
import org.gcube.portal.databook.shared.Like;
|
||||||
import org.gcube.portal.databook.shared.PrivacyLevel;
|
import org.gcube.portal.databook.shared.PrivacyLevel;
|
||||||
|
import org.gcube.portal.databook.shared.ShowUserStatisticAction;
|
||||||
import org.gcube.portal.databook.shared.UserInfo;
|
import org.gcube.portal.databook.shared.UserInfo;
|
||||||
import org.gcube.portlets.user.gcubewidgets.client.ClientScopeHelper;
|
import org.gcube.portlets.user.gcubewidgets.client.ClientScopeHelper;
|
||||||
import org.gcube.portlets.user.newsfeed.client.FilterType;
|
import org.gcube.portlets.user.newsfeed.client.FilterType;
|
||||||
|
@ -123,6 +124,7 @@ public class NewsFeedPanel extends Composite {
|
||||||
public static final String COMMENT_LABEL = "Reply";
|
public static final String COMMENT_LABEL = "Reply";
|
||||||
public static final String SHARE_FWD_LABEL = "Share";
|
public static final String SHARE_FWD_LABEL = "Share";
|
||||||
private static final int SEARCHED_FEEDS_TO_SHOW = 10;
|
private static final int SEARCHED_FEEDS_TO_SHOW = 10;
|
||||||
|
private static final int FEEDS_RELATED_TO_USER_STATISTICS_TO_SHOW = 10;
|
||||||
|
|
||||||
private String vreLabel;
|
private String vreLabel;
|
||||||
|
|
||||||
|
@ -141,6 +143,12 @@ public class NewsFeedPanel extends Composite {
|
||||||
// the current query (if isSearch is true)
|
// the current query (if isSearch is true)
|
||||||
protected String currentQuery;
|
protected String currentQuery;
|
||||||
|
|
||||||
|
// is the user seeing her statistics?
|
||||||
|
private boolean isFeedsRelatedToStatistics = false;
|
||||||
|
|
||||||
|
// the feeds related to user statistics to show
|
||||||
|
protected ShowUserStatisticAction relatedFeedsToUserStatisticsToShow;
|
||||||
|
|
||||||
private LoadingText loadingIcon = new LoadingText();
|
private LoadingText loadingIcon = new LoadingText();
|
||||||
private Image loadingImage;
|
private Image loadingImage;
|
||||||
private UserInfo myUserInfo;
|
private UserInfo myUserInfo;
|
||||||
|
@ -271,6 +279,7 @@ public class NewsFeedPanel extends Composite {
|
||||||
newsPanel.add(loadingIcon);
|
newsPanel.add(loadingIcon);
|
||||||
CheckSession.getInstance().startPolling();
|
CheckSession.getInstance().startPolling();
|
||||||
isSearch = false;
|
isSearch = false;
|
||||||
|
isFeedsRelatedToStatistics = false;
|
||||||
|
|
||||||
newsService.getUserSettings(new AsyncCallback<UserSettings>() {
|
newsService.getUserSettings(new AsyncCallback<UserSettings>() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -322,7 +331,21 @@ public class NewsFeedPanel extends Composite {
|
||||||
isSearch = true;
|
isSearch = true;
|
||||||
showFeedsSearch(query, 0, SEARCHED_FEEDS_TO_SHOW);
|
showFeedsSearch(query, 0, SEARCHED_FEEDS_TO_SHOW);
|
||||||
filterPanel.removeFilterSelected();
|
filterPanel.removeFilterSelected();
|
||||||
}
|
}else if(getShowUserStatisticParam() != null){
|
||||||
|
String action = "";
|
||||||
|
try {
|
||||||
|
action = Encoder.decode(getShowUserStatisticParam());
|
||||||
|
relatedFeedsToUserStatisticsToShow = ShowUserStatisticAction.valueOf(action);
|
||||||
|
} catch (Exception e) {
|
||||||
|
newsPanel.clear();
|
||||||
|
newsPanel.add(new HTML("<div class=\"nofeed-message\"><div style=\"padding-top: 90px;\">" +
|
||||||
|
"We're sorry, it seems you used an invalid character</div>"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
isFeedsRelatedToStatistics = true;
|
||||||
|
showUserStatisticsRelatedFeeds(relatedFeedsToUserStatisticsToShow, 0, FEEDS_RELATED_TO_USER_STATISTICS_TO_SHOW);
|
||||||
|
filterPanel.removeFilterSelected();
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
showAllUpdatesFeeds();
|
showAllUpdatesFeeds();
|
||||||
}
|
}
|
||||||
|
@ -334,8 +357,8 @@ public class NewsFeedPanel extends Composite {
|
||||||
showFeedTimelineSource = result.isShowTimelineSourceLabel();
|
showFeedTimelineSource = result.isShowTimelineSourceLabel();
|
||||||
isInfrastructure = true;
|
isInfrastructure = true;
|
||||||
}
|
}
|
||||||
// else
|
// else
|
||||||
// mainPanel.addStyleName("framed");
|
// mainPanel.addStyleName("framed");
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -399,6 +422,14 @@ public class NewsFeedPanel extends Composite {
|
||||||
return Window.Location.getParameter(Encoder.encode(GCubeSocialNetworking.HASHTAG_OID));
|
return Window.Location.getParameter(Encoder.encode(GCubeSocialNetworking.HASHTAG_OID));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if some user statistic related feeds must be shown
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String getShowUserStatisticParam(){
|
||||||
|
return Window.Location.getParameter(Encoder.encode(GCubeSocialNetworking.SHOW_STATISTICS_ACTION_OID));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* check if it has to show the feeds given a query
|
* check if it has to show the feeds given a query
|
||||||
* @return
|
* @return
|
||||||
|
@ -568,6 +599,85 @@ public class NewsFeedPanel extends Composite {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a user wants to show some feeds related to her statistics
|
||||||
|
*/
|
||||||
|
private void showUserStatisticsRelatedFeeds(final ShowUserStatisticAction relatedFeedsToUserStatisticsToShow, final int from, final int to) {
|
||||||
|
|
||||||
|
// show loader while waiting
|
||||||
|
showLoader();
|
||||||
|
|
||||||
|
// stop asking for feeds
|
||||||
|
doStopFeedsTimer();
|
||||||
|
|
||||||
|
final String actionToPrint = relatedFeedsToUserStatisticsToShow.getHumanFriendlyAction();
|
||||||
|
|
||||||
|
newsService.getUserSettings(new AsyncCallback<UserSettings>() {
|
||||||
|
@Override
|
||||||
|
public void onFailure(Throwable caught) {
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void onSuccess(UserSettings result) {
|
||||||
|
if (result.getUserInfo().getUsername().equals(NewsConstants.TEST_USER)) {
|
||||||
|
doShowSessionExpired();
|
||||||
|
} else {
|
||||||
|
/**
|
||||||
|
* this check avoids the 2 tabs open in 2 different scope, if the previous tab was open at VRE Level and then antoher
|
||||||
|
* is open at infra level the first tab stops checking for updates
|
||||||
|
*/
|
||||||
|
if (result.getCurrentScope().compareTo(currentScope) == 0) {
|
||||||
|
newsService.getFeedsRelatedToUserStatistics(relatedFeedsToUserStatisticsToShow, from, to, new AsyncCallback<ArrayList<EnhancedFeed>>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSuccess(ArrayList<EnhancedFeed> feeds) {
|
||||||
|
|
||||||
|
filterPanelWrapper.setVisible(false);
|
||||||
|
newsPanel.clear();
|
||||||
|
if (feeds != null) {
|
||||||
|
|
||||||
|
GWT.log("Retrieved " + feeds.size() + " hits for search.");
|
||||||
|
if (feeds.size() == 0) {
|
||||||
|
newsPanel.add(new ResultsFor("Results for ", actionToPrint));
|
||||||
|
newsPanel.add(new HTML("<div class=\"nofeed-message\" style=\"height: 200px;\">" +
|
||||||
|
"Sorry, looks like we found no match for action : " + actionToPrint +"</div>"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
newsPanel.setHeight("");
|
||||||
|
newsPanel.setHorizontalAlignment(HasAlignment.ALIGN_LEFT);
|
||||||
|
newsPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_TOP);
|
||||||
|
newsPanel.add(new ResultsFor("Results for ", actionToPrint));
|
||||||
|
for (EnhancedFeed feed : feeds) {
|
||||||
|
newsPanel.add(new TweetTemplate(false, showFeedTimelineSource, myUserInfo, feed, eventBus)); //in the view
|
||||||
|
// save them (they will be used when asking more feeds)
|
||||||
|
allUpdates.add(feed);
|
||||||
|
}
|
||||||
|
if (feeds.size() < 5) {
|
||||||
|
newsPanel.add(new Image(spacer));
|
||||||
|
}
|
||||||
|
|
||||||
|
// add widget to lookup more feeds: if the size of the returned data is less
|
||||||
|
// than the required disable this feature.
|
||||||
|
if(feeds.size() == FEEDS_RELATED_TO_USER_STATISTICS_TO_SHOW){
|
||||||
|
showMoreWidget = new ShowMoreFeeds(eventBus);
|
||||||
|
showMoreUpdatesPanel.add(showMoreWidget);
|
||||||
|
newsPanel.add(showMoreUpdatesPanel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
showProblems();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void onFailure(Throwable caught) {
|
||||||
|
showProblems();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when a user search something
|
* Called when a user search something
|
||||||
*/
|
*/
|
||||||
|
@ -578,7 +688,7 @@ public class NewsFeedPanel extends Composite {
|
||||||
|
|
||||||
// stop asking for feeds
|
// stop asking for feeds
|
||||||
doStopFeedsTimer();
|
doStopFeedsTimer();
|
||||||
|
|
||||||
newsService.getUserSettings(new AsyncCallback<UserSettings>() {
|
newsService.getUserSettings(new AsyncCallback<UserSettings>() {
|
||||||
@Override
|
@Override
|
||||||
public void onFailure(Throwable caught) {
|
public void onFailure(Throwable caught) {
|
||||||
|
@ -784,7 +894,7 @@ public class NewsFeedPanel extends Composite {
|
||||||
newsPanel.setHeight("");
|
newsPanel.setHeight("");
|
||||||
newsPanel.setHorizontalAlignment(HasAlignment.ALIGN_LEFT);
|
newsPanel.setHorizontalAlignment(HasAlignment.ALIGN_LEFT);
|
||||||
newsPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_TOP);
|
newsPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_TOP);
|
||||||
|
|
||||||
for (EnhancedFeed feed : feeds) {
|
for (EnhancedFeed feed : feeds) {
|
||||||
newsPanel.add(new TweetTemplate(false, showFeedTimelineSource, myUserInfo, feed, eventBus)); //in the view
|
newsPanel.add(new TweetTemplate(false, showFeedTimelineSource, myUserInfo, feed, eventBus)); //in the view
|
||||||
allUpdates.add(feed); //in the model
|
allUpdates.add(feed); //in the model
|
||||||
|
@ -850,7 +960,7 @@ public class NewsFeedPanel extends Composite {
|
||||||
|
|
||||||
// clear panel
|
// clear panel
|
||||||
showMoreUpdatesPanel.clear();
|
showMoreUpdatesPanel.clear();
|
||||||
|
|
||||||
// check if we can ask for other data
|
// check if we can ask for other data
|
||||||
if(feeds.size() == SEARCHED_FEEDS_TO_SHOW){
|
if(feeds.size() == SEARCHED_FEEDS_TO_SHOW){
|
||||||
GWT.log("It seems there are no more feeds for this query. Stop asking further");
|
GWT.log("It seems there are no more feeds for this query. Stop asking further");
|
||||||
|
@ -870,6 +980,50 @@ public class NewsFeedPanel extends Composite {
|
||||||
"Please try again in a short while.</div>"));
|
"Please try again in a short while.</div>"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}else if(isFeedsRelatedToStatistics){
|
||||||
|
GWT.log("Going to request more feeds for this user's statisics");
|
||||||
|
|
||||||
|
// start position
|
||||||
|
int start = allUpdates.size();
|
||||||
|
|
||||||
|
GWT.log("StartingPoint = " + start);
|
||||||
|
newsService.getFeedsRelatedToUserStatistics(relatedFeedsToUserStatisticsToShow, start, FEEDS_RELATED_TO_USER_STATISTICS_TO_SHOW , new AsyncCallback<ArrayList<EnhancedFeed>>() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(ArrayList<EnhancedFeed> feeds){
|
||||||
|
newsPanel.remove(showMoreUpdatesPanel);
|
||||||
|
if (feeds != null) {
|
||||||
|
GWT.log("There are " + feeds.size() + " more feeds");
|
||||||
|
|
||||||
|
for (EnhancedFeed feed : feeds) {
|
||||||
|
// avoid to insert same data
|
||||||
|
if(!isFeedPresent(feed)){
|
||||||
|
newsPanel.add(new TweetTemplate(false, showFeedTimelineSource, myUserInfo, feed, eventBus)); //in the view
|
||||||
|
allUpdates.add(feed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear panel
|
||||||
|
showMoreUpdatesPanel.clear();
|
||||||
|
|
||||||
|
// check if we can ask for other data
|
||||||
|
if(feeds.size() == FEEDS_RELATED_TO_USER_STATISTICS_TO_SHOW){
|
||||||
|
GWT.log("It seems there are no more feeds for this query. Stop asking further");
|
||||||
|
showMoreWidget = new ShowMoreFeeds(eventBus);
|
||||||
|
showMoreUpdatesPanel.add(showMoreWidget);
|
||||||
|
newsPanel.add(showMoreUpdatesPanel);
|
||||||
|
}else{
|
||||||
|
showMoreWidget = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void onFailure(Throwable caught) {
|
||||||
|
showMoreUpdatesPanel.clear();
|
||||||
|
newsPanel.add(new HTML("<div class=\"nofeed-message\">" +
|
||||||
|
"Ops! There were problems while retrieving your feeds!. <br> " +
|
||||||
|
"Please try again in a short while.</div>"));
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
package org.gcube.portlets.user.newsfeed.client.ui;
|
package org.gcube.portlets.user.newsfeed.client.ui;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
import org.gcube.common.portal.GCubePortalConstants;
|
import org.gcube.common.portal.GCubePortalConstants;
|
||||||
import org.gcube.common.portal.PortalContext;
|
|
||||||
import org.gcube.portal.databook.client.GCubeSocialNetworking;
|
import org.gcube.portal.databook.client.GCubeSocialNetworking;
|
||||||
import org.gcube.portal.databook.client.util.Encoder;
|
import org.gcube.portal.databook.client.util.Encoder;
|
||||||
import org.gcube.portal.databook.shared.Comment;
|
import org.gcube.portal.databook.shared.Comment;
|
||||||
|
@ -32,7 +33,7 @@ public class SingleComment extends Composite {
|
||||||
interface SingleCommentUiBinder extends UiBinder<Widget, SingleComment> {
|
interface SingleCommentUiBinder extends UiBinder<Widget, SingleComment> {
|
||||||
}
|
}
|
||||||
private static final int MAX_SHOWTEXT_LENGTH = 450;
|
private static final int MAX_SHOWTEXT_LENGTH = 450;
|
||||||
|
|
||||||
private boolean isUsers = false;
|
private boolean isUsers = false;
|
||||||
private TweetTemplate owner;
|
private TweetTemplate owner;
|
||||||
private String myCommentid;
|
private String myCommentid;
|
||||||
|
@ -56,7 +57,7 @@ public class SingleComment extends Composite {
|
||||||
myCommentid = toShow.getKey();
|
myCommentid = toShow.getKey();
|
||||||
avatarImage.setPixelSize(30, 30);
|
avatarImage.setPixelSize(30, 30);
|
||||||
avatarImage.setUrl(toShow.getThumbnailURL());
|
avatarImage.setUrl(toShow.getThumbnailURL());
|
||||||
|
|
||||||
//check if the user has his own avatar
|
//check if the user has his own avatar
|
||||||
if (toShow.getThumbnailURL().endsWith("img_id=0") || !toShow.getThumbnailURL().contains("?")) { //it means no avatar is set
|
if (toShow.getThumbnailURL().endsWith("img_id=0") || !toShow.getThumbnailURL().contains("?")) { //it means no avatar is set
|
||||||
avatarImage.setVisible(false);
|
avatarImage.setVisible(false);
|
||||||
|
@ -75,15 +76,15 @@ public class SingleComment extends Composite {
|
||||||
avatarReplacement.setInitials(toShow.getUserid(), f, s);
|
avatarReplacement.setInitials(toShow.getUserid(), f, s);
|
||||||
avatarReplacement.setVisible(true);
|
avatarReplacement.setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
String commentToShow = toShow.getText();
|
String commentToShow = toShow.getText();
|
||||||
|
|
||||||
//replace the < & and >
|
//replace the < & and >
|
||||||
commentToShow = commentToShow.replaceAll("<","<").replaceAll(">",">");
|
commentToShow = commentToShow.replaceAll("<","<").replaceAll(">",">");
|
||||||
commentToShow = commentToShow.replaceAll("&","&");
|
commentToShow = commentToShow.replaceAll("&","&");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (commentToShow.length() > MAX_SHOWTEXT_LENGTH) {
|
if (commentToShow.length() > MAX_SHOWTEXT_LENGTH) {
|
||||||
final int TEXT_TO_SHOW_LENGHT = (commentToShow.length() < 700) ? (commentToShow.length() - (commentToShow.length() / 3)) : 700;
|
final int TEXT_TO_SHOW_LENGHT = (commentToShow.length() < 700) ? (commentToShow.length() - (commentToShow.length() / 3)) : 700;
|
||||||
commentToShow = commentToShow.substring(0, TEXT_TO_SHOW_LENGHT) + "...";
|
commentToShow = commentToShow.substring(0, TEXT_TO_SHOW_LENGHT) + "...";
|
||||||
|
@ -92,14 +93,33 @@ public class SingleComment extends Composite {
|
||||||
final String profilePageURL = GCubePortalConstants.PREFIX_GROUP_URL + ClientScopeHelper.extractOrgFriendlyURL(Location.getHref()) +GCubePortalConstants.USER_PROFILE_FRIENDLY_URL;
|
final String profilePageURL = GCubePortalConstants.PREFIX_GROUP_URL + ClientScopeHelper.extractOrgFriendlyURL(Location.getHref()) +GCubePortalConstants.USER_PROFILE_FRIENDLY_URL;
|
||||||
|
|
||||||
commentText.setHTML("<a class=\"link\" href=\"" + profilePageURL + "?"+
|
commentText.setHTML("<a class=\"link\" href=\"" + profilePageURL + "?"+
|
||||||
Encoder.encode(GCubeSocialNetworking.USER_PROFILE_OID)+"="+
|
Encoder.encode(GCubeSocialNetworking.USER_PROFILE_OID)+"="+
|
||||||
Encoder.encode(toShow.getUserid())+"\">"+toShow.getFullName()+
|
Encoder.encode(toShow.getUserid())+"\">"+toShow.getFullName()+
|
||||||
"</a> " + commentToShow);
|
"</a> " + commentToShow);
|
||||||
if(toShow.isEdit())
|
|
||||||
timeArea.setHTML(DateTimeFormat.getFormat("MMMM dd, h:mm a").format(toShow.getTime()) +
|
// Comment's data
|
||||||
" (Last edit on " + DateTimeFormat.getFormat("MMMM dd, h:mm a").format(toShow.getLastEditTime()) + ")");
|
Date now = new Date();
|
||||||
|
String formattedTime;
|
||||||
|
String formattedTimeEdit = null;
|
||||||
|
|
||||||
|
if(now.getYear() != toShow.getTime().getYear())
|
||||||
|
formattedTime = DateTimeFormat.getFormat("MMMM dd yyyy, h:mm a").format(toShow.getTime());
|
||||||
else
|
else
|
||||||
timeArea.setHTML(DateTimeFormat.getFormat("MMMM dd, h:mm a").format(toShow.getTime()));
|
formattedTime = DateTimeFormat.getFormat("MMMM dd, h:mm a").format(toShow.getTime());
|
||||||
|
|
||||||
|
if(toShow.isEdit()){
|
||||||
|
if(now.getYear() != toShow.getLastEditTime().getYear())
|
||||||
|
formattedTimeEdit = DateTimeFormat.getFormat("MMMM dd yyyy, h:mm a").format(toShow.getLastEditTime());
|
||||||
|
else
|
||||||
|
formattedTimeEdit = DateTimeFormat.getFormat("MMMM dd, h:mm a").format(toShow.getLastEditTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(toShow.isEdit())
|
||||||
|
timeArea.setHTML(formattedTime +
|
||||||
|
" (Last edit on " + formattedTimeEdit + ")");
|
||||||
|
else
|
||||||
|
timeArea.setHTML(formattedTime);
|
||||||
|
|
||||||
if (isUsers) {
|
if (isUsers) {
|
||||||
closeImage.setStyleName("closeImage");
|
closeImage.setStyleName("closeImage");
|
||||||
closeImage.setTitle("Delete");
|
closeImage.setTitle("Delete");
|
||||||
|
@ -107,24 +127,24 @@ public class SingleComment extends Composite {
|
||||||
editImage.setTitle("Edit");
|
editImage.setTitle("Edit");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@UiHandler("seeMore")
|
@UiHandler("seeMore")
|
||||||
void onSeeMoreClick(ClickEvent e) {
|
void onSeeMoreClick(ClickEvent e) {
|
||||||
String commentToShow = myComment.getText();
|
String commentToShow = myComment.getText();
|
||||||
//replace the < & and >
|
//replace the < & and >
|
||||||
commentToShow = commentToShow.replaceAll("<","<").replaceAll(">",">");
|
commentToShow = commentToShow.replaceAll("<","<").replaceAll(">",">");
|
||||||
commentToShow = commentToShow.replaceAll("&","&");
|
commentToShow = commentToShow.replaceAll("&","&");
|
||||||
|
|
||||||
final String profilePageURL = GCubePortalConstants.PREFIX_GROUP_URL + ClientScopeHelper.extractOrgFriendlyURL(Location.getHref()) +GCubePortalConstants.USER_PROFILE_FRIENDLY_URL;
|
final String profilePageURL = GCubePortalConstants.PREFIX_GROUP_URL + ClientScopeHelper.extractOrgFriendlyURL(Location.getHref()) +GCubePortalConstants.USER_PROFILE_FRIENDLY_URL;
|
||||||
|
|
||||||
commentText.setHTML("<a class=\"link\" href=\"" + profilePageURL + "?"+
|
commentText.setHTML("<a class=\"link\" href=\"" + profilePageURL + "?"+
|
||||||
Encoder.encode(GCubeSocialNetworking.USER_PROFILE_OID)+"="+
|
Encoder.encode(GCubeSocialNetworking.USER_PROFILE_OID)+"="+
|
||||||
Encoder.encode(myComment.getUserid())+"\">"+
|
Encoder.encode(myComment.getUserid())+"\">"+
|
||||||
myComment.getFullName()+"</a> " + commentToShow);
|
myComment.getFullName()+"</a> " + commentToShow);
|
||||||
seeMore.setHTML("");
|
seeMore.setHTML("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@UiHandler("closeImage")
|
@UiHandler("closeImage")
|
||||||
void onDeleteCommentClick(ClickEvent e) {
|
void onDeleteCommentClick(ClickEvent e) {
|
||||||
|
@ -161,6 +181,6 @@ public class SingleComment extends Composite {
|
||||||
public String getCommentKey() {
|
public String getCommentKey() {
|
||||||
return myCommentid;
|
return myCommentid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
package org.gcube.portlets.user.newsfeed.client.ui;
|
package org.gcube.portlets.user.newsfeed.client.ui;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -304,11 +305,11 @@ public class TweetTemplate extends Composite {
|
||||||
//replace the < & and >
|
//replace the < & and >
|
||||||
feedText = feedText.replaceAll("<","<").replaceAll(">",">");
|
feedText = feedText.replaceAll("<","<").replaceAll(">",">");
|
||||||
feedText = feedText.replaceAll("&","&");
|
feedText = feedText.replaceAll("&","&");
|
||||||
|
|
||||||
final String profilePageURL = GCubePortalConstants.PREFIX_GROUP_URL + ClientScopeHelper.extractOrgFriendlyURL(Location.getHref()) +GCubePortalConstants.USER_PROFILE_FRIENDLY_URL;
|
final String profilePageURL = GCubePortalConstants.PREFIX_GROUP_URL + ClientScopeHelper.extractOrgFriendlyURL(Location.getHref()) +GCubePortalConstants.USER_PROFILE_FRIENDLY_URL;
|
||||||
|
|
||||||
if (! isAppFeed) {
|
if (! isAppFeed) {
|
||||||
// sharePostArea.setHTML("<a>" + NewsFeedPanel.SHARE_FWD_LABEL + "</a>");
|
// sharePostArea.setHTML("<a>" + NewsFeedPanel.SHARE_FWD_LABEL + "</a>");
|
||||||
contentArea.setHTML("<a class=\"link\" href=\""+profilePageURL
|
contentArea.setHTML("<a class=\"link\" href=\""+profilePageURL
|
||||||
+"?"+
|
+"?"+
|
||||||
Encoder.encode(GCubeSocialNetworking.USER_PROFILE_OID)+"="+
|
Encoder.encode(GCubeSocialNetworking.USER_PROFILE_OID)+"="+
|
||||||
|
@ -357,7 +358,14 @@ public class TweetTemplate extends Composite {
|
||||||
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
String formattedTime = DateTimeFormat.getFormat("MMMM dd, h:mm a").format(feed.getTime());
|
Date now = new Date();
|
||||||
|
String formattedTime;
|
||||||
|
// TODO java.util.Calendar is not yet available in GWT
|
||||||
|
if(now.getYear() != feed.getTime().getYear())
|
||||||
|
formattedTime = DateTimeFormat.getFormat("MMMM dd yyyy, h:mm a").format(feed.getTime());
|
||||||
|
else
|
||||||
|
formattedTime = DateTimeFormat.getFormat("MMMM dd, h:mm a").format(feed.getTime());
|
||||||
|
|
||||||
timeArea.setHTML(formattedTime);
|
timeArea.setHTML(formattedTime);
|
||||||
String formattedTimeWithYear = DateTimeFormat.getFormat("dd MMMM yyyy h:mm a ").format(feed.getTime());
|
String formattedTimeWithYear = DateTimeFormat.getFormat("dd MMMM yyyy h:mm a ").format(feed.getTime());
|
||||||
timeArea.setTitle(formattedTimeWithYear);
|
timeArea.setTitle(formattedTimeWithYear);
|
||||||
|
@ -446,10 +454,10 @@ public class TweetTemplate extends Composite {
|
||||||
//replace the < & and >
|
//replace the < & and >
|
||||||
feedText = feedText.replaceAll("<","<").replaceAll(">",">");
|
feedText = feedText.replaceAll("<","<").replaceAll(">",">");
|
||||||
feedText = feedText.replaceAll("&","&");
|
feedText = feedText.replaceAll("&","&");
|
||||||
|
|
||||||
final String profilePageURL = GCubePortalConstants.PREFIX_GROUP_URL + ClientScopeHelper.extractOrgFriendlyURL(Location.getHref()) +GCubePortalConstants.USER_PROFILE_FRIENDLY_URL;
|
final String profilePageURL = GCubePortalConstants.PREFIX_GROUP_URL + ClientScopeHelper.extractOrgFriendlyURL(Location.getHref()) +GCubePortalConstants.USER_PROFILE_FRIENDLY_URL;
|
||||||
|
|
||||||
|
|
||||||
contentArea.setHTML("<a class=\"link\"href=\"" + profilePageURL + "?"+
|
contentArea.setHTML("<a class=\"link\"href=\"" + profilePageURL + "?"+
|
||||||
Encoder.encode(GCubeSocialNetworking.USER_PROFILE_OID)+"="+
|
Encoder.encode(GCubeSocialNetworking.USER_PROFILE_OID)+"="+
|
||||||
Encoder.encode(myFeed.getFeed().getEntityId())+"\">"+
|
Encoder.encode(myFeed.getFeed().getEntityId())+"\">"+
|
||||||
|
|
|
@ -4,6 +4,7 @@ import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Calendar;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
@ -11,10 +12,10 @@ import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.Map.Entry;
|
|
||||||
|
|
||||||
import javax.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
|
|
||||||
|
@ -37,6 +38,7 @@ import org.gcube.portal.databook.shared.EnhancedFeed;
|
||||||
import org.gcube.portal.databook.shared.Feed;
|
import org.gcube.portal.databook.shared.Feed;
|
||||||
import org.gcube.portal.databook.shared.Like;
|
import org.gcube.portal.databook.shared.Like;
|
||||||
import org.gcube.portal.databook.shared.RangeFeeds;
|
import org.gcube.portal.databook.shared.RangeFeeds;
|
||||||
|
import org.gcube.portal.databook.shared.ShowUserStatisticAction;
|
||||||
import org.gcube.portal.databook.shared.UserInfo;
|
import org.gcube.portal.databook.shared.UserInfo;
|
||||||
import org.gcube.portal.databook.shared.ex.ColumnNameNotFoundException;
|
import org.gcube.portal.databook.shared.ex.ColumnNameNotFoundException;
|
||||||
import org.gcube.portal.databook.shared.ex.FeedIDNotFoundException;
|
import org.gcube.portal.databook.shared.ex.FeedIDNotFoundException;
|
||||||
|
@ -101,7 +103,7 @@ public class NewsServiceImpl extends RemoteServiceServlet implements NewsService
|
||||||
/**
|
/**
|
||||||
* Elasticsearch client
|
* Elasticsearch client
|
||||||
*/
|
*/
|
||||||
private ElasticSearchClientInterface el;
|
private ElasticSearchClientInterface escl;
|
||||||
|
|
||||||
private final static int MAX_FEEDS_NO = 45;
|
private final static int MAX_FEEDS_NO = 45;
|
||||||
|
|
||||||
|
@ -109,10 +111,10 @@ public class NewsServiceImpl extends RemoteServiceServlet implements NewsService
|
||||||
store = new DBCassandraAstyanaxImpl();
|
store = new DBCassandraAstyanaxImpl();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
el = new ElasticSearchClientImpl(null);
|
escl = new ElasticSearchClientImpl(null);
|
||||||
_log.info("Elasticsearch connection created");
|
_log.info("Elasticsearch connection created");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
el = null;
|
escl = null;
|
||||||
_log.error("Unable to create elasticsearch client connection!!!", e);
|
_log.error("Unable to create elasticsearch client connection!!!", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -404,7 +406,7 @@ public class NewsServiceImpl extends RemoteServiceServlet implements NewsService
|
||||||
public ArrayList<EnhancedFeed> getFeedsByQuery(String query, int from, int quantity) {
|
public ArrayList<EnhancedFeed> getFeedsByQuery(String query, int from, int quantity) {
|
||||||
|
|
||||||
// TODO : check this error better
|
// TODO : check this error better
|
||||||
if(el == null){
|
if(escl == null){
|
||||||
|
|
||||||
_log.debug("There is no connection to elasticsearch, sorry.");
|
_log.debug("There is no connection to elasticsearch, sorry.");
|
||||||
return null;
|
return null;
|
||||||
|
@ -442,7 +444,7 @@ public class NewsServiceImpl extends RemoteServiceServlet implements NewsService
|
||||||
}
|
}
|
||||||
|
|
||||||
// query elastic search
|
// query elastic search
|
||||||
List<EnhancedFeed> enhancedFeeds = el.searchInEnhancedFeeds(query, vres, from, quantity);
|
List<EnhancedFeed> enhancedFeeds = escl.searchInEnhancedFeeds(query, vres, from, quantity);
|
||||||
|
|
||||||
// retrieve the ids of liked feeds by the user
|
// retrieve the ids of liked feeds by the user
|
||||||
List<String> likedFeeds = store.getAllLikedFeedIdsByUser(userName);
|
List<String> likedFeeds = store.getAllLikedFeedIdsByUser(userName);
|
||||||
|
@ -841,8 +843,8 @@ public class NewsServiceImpl extends RemoteServiceServlet implements NewsService
|
||||||
ArrayList<EnhancedFeed> toReturn = new ArrayList<EnhancedFeed>();
|
ArrayList<EnhancedFeed> toReturn = new ArrayList<EnhancedFeed>();
|
||||||
ASLSession session = getASLSession();
|
ASLSession session = getASLSession();
|
||||||
String username = session.getUsername();
|
String username = session.getUsername();
|
||||||
|
|
||||||
|
|
||||||
//patch needed for maintaining mention link backward compatibility (they point to /group/data-e-infrastructure-gateway/profile)
|
//patch needed for maintaining mention link backward compatibility (they point to /group/data-e-infrastructure-gateway/profile)
|
||||||
final String LINK_TO_REPLACE = "data-e-infrastructure-gateway";
|
final String LINK_TO_REPLACE = "data-e-infrastructure-gateway";
|
||||||
String siteLandinPagePath = PortalContext.getConfiguration().getSiteLandingPagePath(getThreadLocalRequest());
|
String siteLandinPagePath = PortalContext.getConfiguration().getSiteLandingPagePath(getThreadLocalRequest());
|
||||||
|
@ -1128,4 +1130,80 @@ public class NewsServiceImpl extends RemoteServiceServlet implements NewsService
|
||||||
return toReturn;
|
return toReturn;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArrayList<EnhancedFeed> getFeedsRelatedToUserStatistics(
|
||||||
|
ShowUserStatisticAction action, int from, int quantity) {
|
||||||
|
|
||||||
|
String userid = getASLSession().getUsername();
|
||||||
|
|
||||||
|
if(userid == NewsConstants.TEST_USER)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
try{
|
||||||
|
|
||||||
|
ArrayList<EnhancedFeed> toReturn = new ArrayList<EnhancedFeed>();
|
||||||
|
|
||||||
|
// get reference time
|
||||||
|
Calendar oneYearAgo = Calendar.getInstance();
|
||||||
|
oneYearAgo.set(Calendar.YEAR, oneYearAgo.get(Calendar.YEAR) - 1);
|
||||||
|
|
||||||
|
ArrayList<Feed> feeds = null;
|
||||||
|
|
||||||
|
switch(action){
|
||||||
|
case POSTS_MADE_BY_USER:
|
||||||
|
feeds = (ArrayList<Feed>) store.getRecentFeedsByUserAndDate(userid, oneYearAgo.getTimeInMillis());
|
||||||
|
break;
|
||||||
|
case LIKES_MADE_BY_USER:
|
||||||
|
feeds = (ArrayList<Feed>) store.getRecentLikedFeedsByUserAndDate(userid, oneYearAgo.getTimeInMillis());
|
||||||
|
break;
|
||||||
|
case COMMENTS_MADE_BY_USER:
|
||||||
|
feeds = (ArrayList<Feed>) store.getRecentCommentedFeedsByUserAndDate(userid, oneYearAgo.getTimeInMillis());
|
||||||
|
break;
|
||||||
|
case LIKES_GOT_BY_USER:
|
||||||
|
feeds = (ArrayList<Feed>) store.getRecentFeedsByUserAndDate(userid, oneYearAgo.getTimeInMillis());
|
||||||
|
Iterator<Feed> feedsIteratorLikes = feeds.iterator();
|
||||||
|
while (feedsIteratorLikes.hasNext()) {
|
||||||
|
Feed feed = (Feed) feedsIteratorLikes.next();
|
||||||
|
if(Integer.parseInt(feed.getLikesNo()) == 0)
|
||||||
|
feedsIteratorLikes.remove();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case COMMENTS_GOT_BY_USER:
|
||||||
|
feeds = (ArrayList<Feed>) store.getRecentFeedsByUserAndDate(userid, oneYearAgo.getTimeInMillis());
|
||||||
|
Iterator<Feed> feedsIteratorComments = feeds.iterator();
|
||||||
|
while (feedsIteratorComments.hasNext()) {
|
||||||
|
Feed feed = (Feed) feedsIteratorComments.next();
|
||||||
|
if(Integer.parseInt(feed.getCommentsNo()) == 0)
|
||||||
|
feedsIteratorComments.remove();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default : return toReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
// filter the feeds according the current context
|
||||||
|
Iterator<Feed> iteratorScope = feeds.iterator();
|
||||||
|
|
||||||
|
if(!isInfrastructureScope()){
|
||||||
|
|
||||||
|
String currentScope = getASLSession().getScope();
|
||||||
|
|
||||||
|
while (iteratorScope.hasNext()) {
|
||||||
|
Feed feed = (Feed) iteratorScope.next();
|
||||||
|
if(!feed.getVreid().equals(currentScope))
|
||||||
|
iteratorScope.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// enhance retrieved feeds
|
||||||
|
Collections.sort(feeds, Collections.reverseOrder());
|
||||||
|
return enhanceFeeds(feeds, -1);
|
||||||
|
|
||||||
|
}catch(Exception e){
|
||||||
|
_log.error("Error while retrieving feeds for user " + userid + " and action " + action.toString(), e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue