diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index 7f23a73..7d33a49 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -4,12 +4,6 @@ - - uses - - - uses - diff --git a/distro/changelog.xml b/distro/changelog.xml index 0fc36e1..c4ba64d 100644 --- a/distro/changelog.xml +++ b/distro/changelog.xml @@ -3,6 +3,7 @@ date="2016-01-22"> Multi-attachment supported Image preview available + Search functionality supported diff --git a/pom.xml b/pom.xml index 3b72c9f..fea15eb 100644 --- a/pom.xml +++ b/pom.xml @@ -74,6 +74,28 @@ accesslogger provided + + com.google.guava + guava + ${guavaVersion} + compile + + + com.ning + compress-lzf + 1.0.3 + compile + + + org.gcube.socialnetworking + social-data-search-client + [1.0.0-SNAPSHOT,2.0.0-SNAPSHOT) + + + xerces + xercesImpl + 2.9.1 + org.gcube.portlets.widgets session-checker @@ -114,22 +136,6 @@ notifications-common-library provided - - com.google.guava - guava - {guavaVersion} - compile - - - org.gcube.socialnetworking - social-data-search-client - [1.0.0-SNAPSHOT,2.0.0-SNAPSHOT) - - - xerces - xercesImpl - 2.11.0 - org.gcube.portlets.widgets user-selection-dialog diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsService.java b/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsService.java index 26f7ce2..d75ef83 100644 --- a/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsService.java +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsService.java @@ -29,7 +29,7 @@ public interface NewsService extends RemoteService { ArrayList getFeedsByHashtag(String hashtag); - ArrayList getFeedsByQuery(String query, int from, int to); + ArrayList getFeedsByQuery(String query, int from, int quantity); MoreFeedsBean getMoreFeeds(int from, int quantity); diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsServiceAsync.java b/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsServiceAsync.java index 997a30e..cd98017 100644 --- a/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsServiceAsync.java +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsServiceAsync.java @@ -64,7 +64,7 @@ public interface NewsServiceAsync { void getFeedsByHashtag(String hashtag, AsyncCallback> callback); - void getFeedsByQuery(String query, int from, int to, + void getFeedsByQuery(String query, int from, int quantity, AsyncCallback> callback); } diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/panels/NewsFeedPanel.java b/src/main/java/org/gcube/portlets/user/newsfeed/client/panels/NewsFeedPanel.java index 679e27f..bc6d3f6 100644 --- a/src/main/java/org/gcube/portlets/user/newsfeed/client/panels/NewsFeedPanel.java +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/panels/NewsFeedPanel.java @@ -119,7 +119,7 @@ public class NewsFeedPanel extends Composite { public static final String LIKED_LABEL = "Favorited"; public static final String COMMENT_LABEL = "Reply"; public static final String SHARE_FWD_LABEL = "Share"; - private static final int SEARCHED_FEEDS_TO_SHOW = 20; + private static final int SEARCHED_FEEDS_TO_SHOW = 10; private String vreLabel; @@ -132,6 +132,12 @@ public class NewsFeedPanel extends Composite { private boolean isFirstTweet = false; + // is user searching for something? + private boolean isSearch = false; + + // the current query (if isSearch is true) + protected String currentQuery; + private LoadingText loadingIcon = new LoadingText(); private Image loadingImage; private UserInfo myUserInfo; @@ -261,6 +267,7 @@ public class NewsFeedPanel extends Composite { loadingImage = new Image(loading); newsPanel.add(loadingIcon); CheckSession.getInstance().startPolling(); + isSearch = false; newsService.getUserSettings(new AsyncCallback() { @Override @@ -298,10 +305,10 @@ public class NewsFeedPanel extends Composite { filterPanel.removeFilterSelected(); } else if (getSearchParam() != null) { - // TODO String query = ""; try { query = Encoder.decode(getSearchParam()); + currentQuery = query; } catch (Exception e) { newsPanel.clear(); newsPanel.add(new HTML("
" + @@ -309,6 +316,7 @@ public class NewsFeedPanel extends Composite { return; } // show + isSearch = true; showFeedsSearch(query, 0, SEARCHED_FEEDS_TO_SHOW); filterPanel.removeFilterSelected(); } @@ -387,7 +395,7 @@ public class NewsFeedPanel extends Composite { private String getHashtagParam() { return Window.Location.getParameter(Encoder.encode(GCubeSocialNetworking.HASHTAG_OID)); } - + /** * check if it has to show the feeds given a query * @return @@ -395,7 +403,7 @@ public class NewsFeedPanel extends Composite { private String getSearchParam() { return Window.Location.getParameter(Encoder.encode(GCubeSocialNetworking.SEARCH_OID)); } - + /** * used from notification referrals (see this Post) * @param feedKey @@ -555,21 +563,25 @@ public class NewsFeedPanel extends Composite { } }); } - + /** * Called when a user search something */ private void showFeedsSearch(final String query, final int from, final int to) { + + // show loader while waiting showLoader(); + + // stop asking for feeds + doStopFeedsTimer(); + newsService.getUserSettings(new AsyncCallback() { @Override public void onFailure(Throwable caught) { - doStopFeedsTimer(); } @Override public void onSuccess(UserSettings result) { if (result.getUserInfo().getUsername().equals(NewsConstants.TEST_USER)) { - doStopFeedsTimer(); doShowSessionExpired(); } else { /** @@ -583,6 +595,8 @@ public class NewsFeedPanel extends Composite { 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", query)); newsPanel.add(new HTML("
" + @@ -595,10 +609,21 @@ public class NewsFeedPanel extends Composite { newsPanel.add(new ResultsFor("results for", query)); 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() == SEARCHED_FEEDS_TO_SHOW){ + showMoreUpdatesPanel.setHorizontalAlignment(HasAlignment.ALIGN_CENTER); + showMoreWidget = new ShowMoreFeeds(eventBus); + showMoreUpdatesPanel.add(showMoreWidget); + newsPanel.add(showMoreUpdatesPanel); + } } } else { showProblems(); @@ -640,7 +665,7 @@ public class NewsFeedPanel extends Composite { // one or more feed belongs to user himself if(tt.isUser()){ try{ - + NewsFeed.pageBusAdapter.PageBusPublish(PageBusEvents.postIncrement, "", Defaults.STRING_JSONIZER); int numComments = tt.numberOfComments(); @@ -792,44 +817,95 @@ public class NewsFeedPanel extends Composite { * called when a user scroll down the page to the bottom */ protected void doShowMoreUpdates() { + showMoreUpdatesPanel.remove(0); loadingImage.getElement().getStyle().setMargin(10, Unit.PX); showMoreUpdatesPanel.add(loadingIcon); - int from = (fromStartingPoint == null) ? allUpdates.size()+1 : fromStartingPoint; - final int quantity = 10; - GWT.log("StartingPoint = " + from); - newsService.getMoreFeeds(from, quantity, new AsyncCallback() { - @Override - public void onSuccess(MoreFeedsBean rangeFeeds) { - newsPanel.remove(showMoreUpdatesPanel); - if (rangeFeeds.getFeeds() != null) { - fromStartingPoint = rangeFeeds.getLastReturnedFeedTimelineIndex(); - int c = 1; - for (EnhancedFeed feed : rangeFeeds.getFeeds()) { - if (!isFeedPresent(feed)) { //avoid possible duplicates - newsPanel.add(new TweetTemplate(false, showFeedTimelineSource, myUserInfo, feed, eventBus)); //in the view - allUpdates.add(feed); //in the model + if(isSearch){ + + GWT.log("Going to request more feeds for this search"); + + // start position + int start = allUpdates.size(); + + GWT.log("StartingPoint = " + start); + newsService.getFeedsByQuery(currentQuery, start, SEARCHED_FEEDS_TO_SHOW , new AsyncCallback>() { + @Override + public void onSuccess(ArrayList 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); + } } - c++; - } - if (c >= quantity) { //there could be more feeds - GWT.log("there could be more feeds"); + + // clear panel showMoreUpdatesPanel.clear(); - showMoreWidget = new ShowMoreFeeds(eventBus); - showMoreUpdatesPanel.add(showMoreWidget); - newsPanel.add(showMoreUpdatesPanel); + + // check if we can ask for other data + if(feeds.size() == SEARCHED_FEEDS_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("
" + - "Ops! There were problems while retrieving your feeds!.
" + - "Please try again in a short while.
")); - } - }); + @Override + public void onFailure(Throwable caught) { + showMoreUpdatesPanel.clear(); + newsPanel.add(new HTML("
" + + "Ops! There were problems while retrieving your feeds!.
" + + "Please try again in a short while.
")); + } + }); + } + else{ + + int from = (fromStartingPoint == null) ? allUpdates.size()+1 : fromStartingPoint; + + final int quantity = 10; + GWT.log("StartingPoint = " + from); + newsService.getMoreFeeds(from, quantity, new AsyncCallback() { + @Override + public void onSuccess(MoreFeedsBean rangeFeeds) { + newsPanel.remove(showMoreUpdatesPanel); + if (rangeFeeds.getFeeds() != null) { + fromStartingPoint = rangeFeeds.getLastReturnedFeedTimelineIndex(); + int c = 1; + for (EnhancedFeed feed : rangeFeeds.getFeeds()) { + if (!isFeedPresent(feed)) { //avoid possible duplicates + newsPanel.add(new TweetTemplate(false, showFeedTimelineSource, myUserInfo, feed, eventBus)); //in the view + allUpdates.add(feed); //in the model + } + c++; + } + if (c >= quantity) { //there could be more feeds + GWT.log("there could be more feeds"); + showMoreUpdatesPanel.clear(); + showMoreWidget = new ShowMoreFeeds(eventBus); + showMoreUpdatesPanel.add(showMoreWidget); + newsPanel.add(showMoreUpdatesPanel); + } + } + } + @Override + public void onFailure(Throwable caught) { + showMoreUpdatesPanel.clear(); + newsPanel.add(new HTML("
" + + "Ops! There were problems while retrieving your feeds!.
" + + "Please try again in a short while.
")); + } + }); + } } /** * @param widget the widget to check diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/server/NewsServiceImpl.java b/src/main/java/org/gcube/portlets/user/newsfeed/server/NewsServiceImpl.java index 6c79142..618dfba 100644 --- a/src/main/java/org/gcube/portlets/user/newsfeed/server/NewsServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/newsfeed/server/NewsServiceImpl.java @@ -386,7 +386,7 @@ public class NewsServiceImpl extends RemoteServiceServlet implements NewsService } @Override - public ArrayList getFeedsByQuery(String query, int from, int to) { + public ArrayList getFeedsByQuery(String query, int from, int quantity) { // TODO : check this error better if(el == null){ @@ -425,7 +425,7 @@ public class NewsServiceImpl extends RemoteServiceServlet implements NewsService } // query elastic search - List enhancedFeeds = el.searchInEnhancedFeeds(query, vres, from, to); + List enhancedFeeds = el.searchInEnhancedFeeds(query, vres, from, quantity); // retrieve the ids of liked feeds by the user List likedFeeds = store.getAllLikedFeedIdsByUser(userName);