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
This commit is contained in:
Francesco Mangiacrapa 2017-07-13 10:37:12 +00:00
parent 19b7ef4383
commit 23b8f43e87
3 changed files with 150 additions and 66 deletions

View File

@ -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.
*

View File

@ -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<Item> dataProvider = new ListDataProvider<Item>();
private MyCustomDataProvider<Item> dataProvider = new MyCustomDataProvider<Item>();
protected boolean loadGcubeProperties = false;
@ -56,6 +53,8 @@ public class WorkspaceExplorerPaginated extends WorkspaceExplorer{
private int serverStartIndex = 0;
private HashMap<String, SearchedFolder> cachedPage = new HashMap<String, SearchedFolder>();
/**
* 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<ItemType> showableTypesParam){
private void perfomGetFolderChildren(final Item item, boolean loadGcubeProperties, final int startIdx, final int limit, final int serSI, boolean purgeEmpyFolders, List<ItemType> 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>() {
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<SearchedFolder>() {
@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<? super Item> sm = getCellTable().getSelectionModel();
if(sm instanceof SingleSelectionModel){
SingleSelectionModel<Item> ssm = (SingleSelectionModel<Item>) 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<? super Item> sm = getCellTable().getSelectionModel();
if(sm instanceof SingleSelectionModel){
SingleSelectionModel<Item> ssm = (SingleSelectionModel<Item>) 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();
}
}

View File

@ -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;