From 23b8f43e871317ec4cc440c6984c8369e24b9a2c Mon Sep 17 00:00:00 2001 From: Francesco Mangiacrapa Date: Thu, 13 Jul 2017 10:37:12 +0000 Subject: [PATCH] Completed [Feature #9114] Add pagination to Workspace Explorer git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/widgets/workspace-explorer@151055 82a268e6-3cf1-43bd-a215-b396298e98cf --- ...kspaceResourcesExplorerPanelPaginated.java | 20 +- .../view/WorkspaceExplorerPaginated.java | 182 ++++++++++++------ .../server/WorkspaceExplorerServiceImpl.java | 14 +- 3 files changed, 150 insertions(+), 66 deletions(-) diff --git a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/explore/WorkspaceResourcesExplorerPanelPaginated.java b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/explore/WorkspaceResourcesExplorerPanelPaginated.java index af20e4c..a3207e8 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/explore/WorkspaceResourcesExplorerPanelPaginated.java +++ b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/explore/WorkspaceResourcesExplorerPanelPaginated.java @@ -3,9 +3,6 @@ */ package org.gcube.portlets.widgets.wsexplorer.client.explore; -import static org.gcube.portlets.widgets.wsexplorer.client.explore.WorkspaceResourcesExplorerPanel.ITEMS_PER_PAGE; -import static org.gcube.portlets.widgets.wsexplorer.client.explore.WorkspaceResourcesExplorerPanel.ITEM_START_INDEX; - import java.util.List; import org.gcube.portlets.widgets.wsexplorer.client.event.BreadcrumbClickEvent; @@ -96,6 +93,23 @@ public class WorkspaceResourcesExplorerPanelPaginated extends WorkspaceResources initPanel(""); } + + /** + * Purge cache. It performs cache purge. + */ + public void purgeCache(){ + wsExplorer.purgeCache(); + } + + /** + * Hard refresh. It performs a purge of cached page and reload the folder passed in input + * @throws Exception + */ + public void hardRefresh() throws Exception{ + wsExplorer.purgeCache(); + super.refreshRootFolderView(); + } + /** * Inits the panel. * diff --git a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/view/WorkspaceExplorerPaginated.java b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/view/WorkspaceExplorerPaginated.java index 11de742..fbb1d38 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/view/WorkspaceExplorerPaginated.java +++ b/src/main/java/org/gcube/portlets/widgets/wsexplorer/client/view/WorkspaceExplorerPaginated.java @@ -4,6 +4,7 @@ package org.gcube.portlets.widgets.wsexplorer.client.view; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import org.gcube.portlets.widgets.wsexplorer.client.Util; @@ -44,10 +45,6 @@ public class WorkspaceExplorerPaginated extends WorkspaceExplorer{ private Boolean newLoading = false; - private Boolean justTest = false; - - //private ListDataProvider dataProvider = new ListDataProvider(); - private MyCustomDataProvider dataProvider = new MyCustomDataProvider(); protected boolean loadGcubeProperties = false; @@ -56,6 +53,8 @@ public class WorkspaceExplorerPaginated extends WorkspaceExplorer{ private int serverStartIndex = 0; + private HashMap cachedPage = new HashMap(); + /** * Instantiates a new workspace explorer paginated. * @@ -159,18 +158,16 @@ public class WorkspaceExplorerPaginated extends WorkspaceExplorer{ if(newLoading){ GWT.log("Cleaning all data..."); newStartIndex = 0; + serverStartIndex = 0; GWT.log("Store reset performed start index is: "+newStartIndex); getAsycnDataProvider().updateRowCount(WorkspaceExplorerConstants.ITEMS_PER_PAGE, false); } - perfomGetFolderChildren(item, loadGcubeProperties, newStartIndex, limit, purgeEmpyFolders, showableTypesParam); + perfomGetFolderChildren(item, loadGcubeProperties, newStartIndex, limit, serverStartIndex, purgeEmpyFolders, showableTypesParam); } - - - /** * Perfom get folder children. * @@ -178,12 +175,22 @@ public class WorkspaceExplorerPaginated extends WorkspaceExplorer{ * @param loadGcubeProperties the load gcube properties * @param startIdx the start idx * @param limit the limit + * @param serSI the server start index to use * @param purgeEmpyFolders the purge empy folders * @param showableTypesParam the showable types param */ - private void perfomGetFolderChildren(final Item item, boolean loadGcubeProperties, final int startIdx, final int limit, boolean purgeEmpyFolders, List showableTypesParam){ + private void perfomGetFolderChildren(final Item item, boolean loadGcubeProperties, final int startIdx, final int limit, final int serSI, boolean purgeEmpyFolders, List showableTypesParam){ GWT.log("loading workspace folder by item id from server: "+item.getId()); - WorkspaceExplorerConstants.workspaceNavigatorService.getFolder(item, showableTypesParam, purgeEmpyFolders, filterCriteria, loadGcubeProperties, startIdx, limit, serverStartIndex, new AsyncCallback() { + + SearchedFolder page = getCachePage(item, startIdx, limit); + if(page!=null){ + setNewPageResult(page); + serverStartIndex = page.getServerEndIndex(); + GWT.log("Using cached page, serverStartIndex: "+serverStartIndex); + return; + } + + WorkspaceExplorerConstants.workspaceNavigatorService.getFolder(item, showableTypesParam, purgeEmpyFolders, filterCriteria, loadGcubeProperties, startIdx, limit, serSI, new AsyncCallback() { @Override public void onFailure(Throwable caught) { @@ -195,56 +202,112 @@ public class WorkspaceExplorerPaginated extends WorkspaceExplorer{ @Override public void onSuccess(SearchedFolder result) { - - serverStartIndex = result.getServerEndIndex(); - - if(item.getName()==null || item.getName().isEmpty()) - item.setName(result.getFolder().getName()); - - //GWT.log("Returned "+result.getChildren().size() +" children"); - //getItTables().updateItems(result.getChildren(), true); - - if(newLoading){ - getCellTable().setVisibleRangeAndClearData(new Range(result.getClientStartIndex(), WorkspaceExplorerConstants.ITEMS_PER_PAGE), false); - } - - SelectionModel sm = getCellTable().getSelectionModel(); - - if(sm instanceof SingleSelectionModel){ - SingleSelectionModel ssm = (SingleSelectionModel) sm; - ssm.clear(); - } - - getAsycnDataProvider().updateRowData(result.getClientStartIndex(), result.getFolder().getChildren()); - - if(result.getFolder().getChildren().size()==0){ - getCellTable().setLoadingIndicator(new Label("No data")); - }else{ - getCellTable().setLoadingIndicator(orginalLoadingIndicator); - } - - - //getCellTable().setVisibleRangeAndClearData(new Range(startIdx, result.getChildren()).), false); - //getAsycnDataProvider().getDataDisplays(). - GWT.log("Updating row data startIndex: "+result.getClientStartIndex() + " children size: "+result.getFolder().getChildren().size()); - GWT.log("getAsycnDataProvider().getDataDisplays().size(): "+getCellTable().getRowCount()); - - if(result.isServerSearchFinished()){ - GWT.log("Search finished!!!"); - getAsycnDataProvider().updateRowCount(getCellTable().getRowCount(), true); - } - //getCellTable().setPageSize(result.getChildren().size()+1); - //getCellTable().setVisibleRange(startIdx, result.getChildren().size()); - //getCellTable().redraw(); - //GWT.log("cellTable size: "+getCellTable().getRowCount()); - setDisplayingFolderItem(result.getFolder()); - newLoading = false; - + setNewPageResult(result); + setCachePage(item, result); } }); } + /** + * Sets the new page result. + * + * @param result the new new page result + */ + private void setNewPageResult(SearchedFolder result){ + + serverStartIndex = result.getServerEndIndex(); + + if(result.getFolder().getName()==null || result.getFolder().getName().isEmpty()) + result.getFolder().setName(result.getFolder().getName()); + + if(newLoading){ + getCellTable().setVisibleRangeAndClearData(new Range(result.getClientStartIndex(), WorkspaceExplorerConstants.ITEMS_PER_PAGE), false); + } + + SelectionModel sm = getCellTable().getSelectionModel(); + + if(sm instanceof SingleSelectionModel){ + SingleSelectionModel ssm = (SingleSelectionModel) sm; + ssm.clear(); + } + + getAsycnDataProvider().updateRowData(result.getClientStartIndex(), result.getFolder().getChildren()); + + if(result.getFolder().getChildren().size()==0){ + getCellTable().setLoadingIndicator(new Label("No data")); + }else{ + getCellTable().setLoadingIndicator(orginalLoadingIndicator); + } + + //getCellTable().setVisibleRangeAndClearData(new Range(startIdx, result.getChildren()).), false); + //getAsycnDataProvider().getDataDisplays(). + GWT.log("Updating row data startIndex: "+result.getClientStartIndex() + " children size: "+result.getFolder().getChildren().size()); + GWT.log("getAsycnDataProvider().getDataDisplays().size(): "+getCellTable().getRowCount()); + + if(result.isServerSearchFinished()){ + GWT.log("Search finished!!!"); + getAsycnDataProvider().updateRowCount(getCellTable().getRowCount(), true); + } + //getCellTable().setPageSize(result.getChildren().size()+1); + //getCellTable().setVisibleRange(startIdx, result.getChildren().size()); + //getCellTable().redraw(); + //GWT.log("cellTable size: "+getCellTable().getRowCount()); + setDisplayingFolderItem(result.getFolder()); + newLoading = false; + + } + + + /** + * Sets the cache page. + * + * @param item the item + * @param result the result + */ + private void setCachePage(Item item, SearchedFolder result){ + + String key = getCacheKey(item, result.getClientStartIndex(), result.getLimit()); + + if(key!=null){ + GWT.log("Caching result with key: "+key); + cachedPage.put(key, result); + } + } + + + /** + * Gets the cache page. + * + * @param item the item + * @param startIdx the start idx + * @param limit the limit + * @return the cache page + */ + private SearchedFolder getCachePage(Item item, int startIdx, int limit){ + + String key = getCacheKey(item, startIdx, limit); + + return cachedPage.get(key); + } + + + /** + * Gets the cache key. + * + * @param item the item + * @param startIdx the start idx + * @param limit the limit + * @return the cache key + */ + private String getCacheKey(Item item, int startIdx, int limit){ + + if(item==null || startIdx<0 || limit< 0) + return null; + + return item.getId() + "["+startIdx + "-" +limit+"]"; + } + /** * Inits the pagination. * @@ -321,4 +384,13 @@ public class WorkspaceExplorerPaginated extends WorkspaceExplorer{ } + + + /** + * Purge cache. + */ + public void purgeCache() { + cachedPage.clear(); + } + } diff --git a/src/main/java/org/gcube/portlets/widgets/wsexplorer/server/WorkspaceExplorerServiceImpl.java b/src/main/java/org/gcube/portlets/widgets/wsexplorer/server/WorkspaceExplorerServiceImpl.java index 41c1c3d..76e8052 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsexplorer/server/WorkspaceExplorerServiceImpl.java +++ b/src/main/java/org/gcube/portlets/widgets/wsexplorer/server/WorkspaceExplorerServiceImpl.java @@ -729,9 +729,7 @@ public class WorkspaceExplorerServiceImpl extends RemoteServiceServlet implement if(currentListCount == limit || folderChildrenCount==0){ logger.debug("Page completed returning "+currentListCount+ " items"); int offset = searchStartIndex+limit; - - //Collections.sort(sf.getFolder().getChildren(), new ItemComparator()); - + Collections.sort(sf.getFolder().getChildren(), new ItemComparator()); sf.setServerSearchFinished(offset>folderChildrenCount || folderChildrenCount == 0); logger.debug("is Search finished: "+sf.isServerSearchFinished()); return sf; @@ -789,12 +787,12 @@ public class WorkspaceExplorerServiceImpl extends RemoteServiceServlet implement //String time = String.format("%d msc %d sec", endTime, TimeUnit.MILLISECONDS.toSeconds(endTime)); //logger.debug("end time - " + time); - int i = 0; - for (Item item2 : sf.getFolder().getChildren()) { - logger.debug(++i+") "+item2); - } +// int i = 0; +// for (Item item2 : sf.getFolder().getChildren()) { +// logger.debug(++i+") "+item2); +// } - //Collections.sort(itemFolderToReturn.getChildren(), new ItemComparator()); + Collections.sort(itemFolderToReturn.getChildren(), new ItemComparator()); logger.debug("Returning: "+sf); return sf;