package org.gcube.portlets.widgets.wsexplorer.server; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.portal.PortalContext; import org.gcube.common.storagehub.client.plugins.AbstractPlugin; import org.gcube.common.storagehub.client.proxies.WorkspaceManagerClient; import org.gcube.common.storagehub.model.items.FolderItem; import org.gcube.common.storagehub.model.items.Item; import org.gcube.common.storagehub.model.items.SharedFolder; import org.gcube.common.storagehub.model.items.VreFolder; import org.gcube.portlets.widgets.wsexplorer.client.WorkspaceExplorerConstants; import org.gcube.portlets.widgets.wsexplorer.client.rpc.WorkspaceExplorerService; import org.gcube.portlets.widgets.wsexplorer.server.stohub.Whorespace; import org.gcube.portlets.widgets.wsexplorer.shared.FilterCriteria; import org.gcube.portlets.widgets.wsexplorer.shared.ItemCategory; import org.gcube.portlets.widgets.wsexplorer.shared.ItemDTO; import org.gcube.portlets.widgets.wsexplorer.shared.ItemInterface; import org.gcube.portlets.widgets.wsexplorer.shared.ItemType; import org.gcube.portlets.widgets.wsexplorer.shared.SearchedFolder; import org.gcube.portlets.widgets.wsexplorer.shared.WorkspaceNavigatorServiceException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.gwt.user.server.rpc.RemoteServiceServlet; /** * The Class WorkspaceExplorerServiceImpl. * * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it * @author Massimiliano Assante, CNR-ISTI */ @SuppressWarnings("serial") public class WorkspaceExplorerServiceImpl extends RemoteServiceServlet implements WorkspaceExplorerService { public static final Logger logger = LoggerFactory.getLogger(WorkspaceExplorerServiceImpl.class); /** * {@inheritDoc} */ @Override public ItemDTO getRoot(List showableTypes, boolean purgeEmpyFolders, FilterCriteria filterCriteria) throws WorkspaceNavigatorServiceException { logger.trace("getRoot showableTypes: "+showableTypes+" purgeEmpyFolders: "+purgeEmpyFolders+" filterCriteria: "+ filterCriteria); try { PortalContext pContext = PortalContext.getConfiguration(); String userName = pContext.getCurrentUser(getThreadLocalRequest()).getUsername(); String scope = pContext.getCurrentScope(getThreadLocalRequest()); String authorizationToken = pContext.getCurrentUserToken(scope, userName); SecurityTokenProvider.instance.set(authorizationToken); logger.trace("Start getRoot..."); Item root = Whorespace.getRoot(getThreadLocalRequest()); logger.trace("GetRoot - Replyiing root"); long startTime = System.currentTimeMillis(); logger.trace("start time - " + startTime); ItemDTO rootItem = ItemBuilder.getItem(null, root, root.getPath(), showableTypes, filterCriteria, true, false); rootItem.setName(WorkspaceExplorerConstants.HOME_LABEL); rootItem.setIsRoot(true); if (purgeEmpyFolders) { rootItem = ItemBuilder.purgeEmptyFolders(rootItem); } logger.trace("Returning:"); Long endTime = System.currentTimeMillis() - startTime; logger.debug("end time - " + String.format("%d msc %d sec", endTime - startTime, TimeUnit.MILLISECONDS.toSeconds(endTime))); Collections.sort(rootItem.getChildren(), new ItemComparator()); logger.info("Returning children size: "+rootItem.getChildren().size()); return rootItem; } catch (Exception e) { logger.error("Error during root retrieving", e); throw new WorkspaceNavigatorServiceException("Sorry, an error occurred when performing get root"); } } /** * {@inheritDoc} */ @Override public ItemDTO getFolder(ItemInterface item, List showableTypes, boolean purgeEmpyFolders, FilterCriteria filterCriteria, boolean loadGcubeProperties) throws WorkspaceNavigatorServiceException { logger.trace("getFolder folderId: "+item.getId()+" showableTypes: "+showableTypes+" purgeEmpyFolders: "+purgeEmpyFolders+" filterCriteria: "+filterCriteria); try { PortalContext pContext = PortalContext.getConfiguration(); String userName = pContext.getCurrentUser(getThreadLocalRequest()).getUsername(); String scope = pContext.getCurrentScope(getThreadLocalRequest()); String authorizationToken = pContext.getCurrentUserToken(scope, userName); SecurityTokenProvider.instance.set(authorizationToken); Item folder = Whorespace.getItem(getThreadLocalRequest(), item.getId()); logger.trace("GetFolder - Replying folder"); //TO AVOID SLOW CALL getPATH() String folderPath = item.getPath()!=null && !item.getPath().isEmpty()?item.getPath():folder.getPath(); ItemDTO itemFolder = ItemBuilder.getItem(null, folder, folderPath, showableTypes, filterCriteria, true, loadGcubeProperties); // _log.trace("Only showable types:"); if (purgeEmpyFolders) { itemFolder = ItemBuilder.purgeEmptyFolders(itemFolder); } Collections.sort(itemFolder.getChildren(), new ItemComparator()); logger.info("Returning children size: "+itemFolder.getChildren().size()); return itemFolder; } catch (Exception e) { logger.error("Error during folder retrieving", e); throw new WorkspaceNavigatorServiceException("Sorry, an error occurred when performing get folder"); } } /* (non-Javadoc) * @see org.gcube.portlets.widgets.wsexplorer.client.rpc.WorkspaceExplorerService#getItemByCategory(org.gcube.portlets.widgets.wsexplorer.shared.ItemCategory) */ /** * Gets the item by category. * * @param category the category * @return the item by category * @throws WorkspaceNavigatorServiceException the workspace navigator service exception */ @Override public ItemDTO getItemByCategory(ItemCategory category) throws WorkspaceNavigatorServiceException{ logger.trace("GetItemByCategory category: "+category); PortalContext pContext = PortalContext.getConfiguration(); String userName = pContext.getCurrentUser(getThreadLocalRequest()).getUsername(); String scope = pContext.getCurrentScope(getThreadLocalRequest()); String authorizationToken = pContext.getCurrentUserToken(scope, userName); SecurityTokenProvider.instance.set(authorizationToken); try { ItemDTO item = null; switch(category){ case HOME:{ Item root = Whorespace.getRoot(getThreadLocalRequest()); String fullName = pContext.getCurrentUser(getThreadLocalRequest()).getFullname(); if(fullName.indexOf(" ")>0){ fullName = fullName.substring(0, fullName.indexOf(" ")); }else if(fullName.indexOf(".")>0){ fullName = fullName.substring(0, fullName.indexOf(".")); } item = new ItemDTO(null, root.getId(), fullName+"'s", ItemType.FOLDER, root.getPath(), root.getOwner(), null, true, true); break; } case VRE_FOLDER:{ String vreFolderId = Whorespace.getVREFoldersId(getThreadLocalRequest()); Item folder = Whorespace.getItem(getThreadLocalRequest(), vreFolderId); item = new ItemDTO(null, folder.getId(), WorkspaceExplorerConstants.VRE_FOLDERS_LABEL, ItemType.FOLDER, folder.getPath(), folder.getOwner(), null, true, false); //SET SPECIAL FOLDER /Workspace/MySpecialFolders item.setSpecialFolder(true); break; } } return item; } catch (Exception e) { logger.error("Error during get item by category", e); throw new WorkspaceNavigatorServiceException("Sorry, an error occurred when performing get item by category"); } } /** * {@inheritDoc} */ @Override public ItemDTO getMySpecialFolder(List showableTypes, boolean purgeEmpyFolders, FilterCriteria filterCriteria) throws WorkspaceNavigatorServiceException { logger.trace("GetMySpecialFolder showableTypes: "+showableTypes+" purgeEmpyFolders: "+purgeEmpyFolders+" filterCriteria: "+filterCriteria); try { PortalContext pContext = PortalContext.getConfiguration(); String userName = pContext.getCurrentUser(getThreadLocalRequest()).getUsername(); String scope = pContext.getCurrentScope(getThreadLocalRequest()); String authorizationToken = pContext.getCurrentUserToken(scope, userName); SecurityTokenProvider.instance.set(authorizationToken); String vreFolderId = Whorespace.getVREFoldersId(getThreadLocalRequest()); Item folder = Whorespace.getItem(getThreadLocalRequest(), vreFolderId); long startTime = System.currentTimeMillis(); logger.trace("start time - " + startTime); ItemDTO itemFolder = ItemBuilder.getItem(null, folder, folder.getPath(), showableTypes, filterCriteria, true, false); //OVERRIDING VRE FOLDERS NAME - SET SPECIAL FOLDER /Workspace/MySpecialFolders itemFolder.setName(WorkspaceExplorerConstants.VRE_FOLDERS_LABEL); itemFolder.setSpecialFolder(true); logger.trace("Builded MySpecialFolder: "+itemFolder); logger.trace("Only showable types:"); //printName("", folderItem); if (purgeEmpyFolders) { itemFolder = ItemBuilder.purgeEmptyFolders(itemFolder); } logger.trace("Returning:"); Long endTime = System.currentTimeMillis() - startTime; String time = String.format("%d msc %d sec", endTime, TimeUnit.MILLISECONDS.toSeconds(endTime)); logger.trace("end time - " + time); //printName("", folderItem); Collections.sort(itemFolder.getChildren(), new ItemComparator()); return itemFolder; } catch (Exception e) { logger.error("Error during special folders retrieving", e); throw new WorkspaceNavigatorServiceException("Sorry, an error occurred when performing get My Special Folder"); } } /** * {@inheritDoc} */ @Override public boolean checkName(String name) throws WorkspaceNavigatorServiceException { logger.warn("checkName name NOT IMPLEMENTED: "+name); return true; //TODO: } /*protected void printName(String indentation, Item item) { if(item!=null){ _log.trace(indentation+item.getName()); for (Item child:item.getChildren()) printName(indentation+"\t", child); } }*/ /** * Gets Breadcrumbs (the list of parents) by item identifier. * * @param itemIdentifier the item identifier * @param includeItemAsParent - if parameter is true and item passed in input is a folder, the folder is included in path returned as last parent * @return the list parents by item identifier * @throws Exception the exception */ @Override public List getBreadcrumbsByItemIdentifier(String itemIdentifier, boolean includeItemAsParent) throws Exception { logger.trace("ListParents By Item Identifier "+ itemIdentifier); try { Item wsItem = Whorespace.getItem(getThreadLocalRequest(), itemIdentifier); logger.trace("workspace retrieve item name: "+wsItem.getName()); List parents = new ArrayList<>(); Item whileItem = wsItem; while (whileItem.getParentId() != null) { parents.add(whileItem); whileItem = Whorespace.getItem(getThreadLocalRequest(), whileItem.getParentId()); } // List parents = workspace.getParentsById(itemIdentifier); logger.trace("parents size: "+parents.size()); ItemDTO[] arrayParents; if(includeItemAsParent==true && wsItem instanceof FolderItem){ arrayParents = new ItemDTO[parents.size()]; arrayParents[parents.size()-1] = ItemBuilder.buildFolderForBreadcrumbs((FolderItem) wsItem, null); } else { arrayParents = new ItemDTO[parents.size()-1]; } /** HANDLE MY_SPECIAL_FOLDER TO AVOID COMPLETE PATH WORKSPACE/MY_SPECIAL_FOLDER * BUT RETURNING ONLY /MY_SPECIAL_FOLDER */ if(wsItem instanceof FolderItem){ if(ItemBuilder.isSpecialFolder((FolderItem) wsItem)){ return new ArrayList(Arrays.asList(arrayParents)); } } //CONVERTING PATH logger.trace("converting path from second-last.."); for (int i = parents.size()-2; i >= 0; i--) { FolderItem wsParentFolder = (FolderItem) parents.get(i); arrayParents[i] = ItemBuilder.buildFolderForBreadcrumbs(wsParentFolder, null); if(arrayParents[i].isSpecialFolder()){ //SKIP HOME PARENT FOR MY_SPECIAL_FOLDER logger.info("arrayParents index "+i+" is special folder, exit"); break; } } //SET PARENTS logger.trace("setting parents.."); for(int i=0; i breadcrumbs = new ArrayList(arrayParents.length-1); for (int i=1; i(Arrays.asList(arrayParents)); } } catch (Exception e) { logger.error("Error in get List Parents By Item Identifier ", e); throw new Exception("Sorry, an error occurred during path retrieving!"); } } /** * Gets the parents by item identifier to limit. * * @param itemIdentifier the item identifier * @param parentLimit the parent limit * @param includeItemAsParent the include item as parent * @return the parents by item identifier to limit * @throws Exception the exception */ @Override public List getBreadcrumbsByItemIdentifierToParentLimit(String itemIdentifier, String parentLimit, boolean includeItemAsParent) throws Exception { logger.trace("getBreadcrumbsByItemIdentifierToParentLimit by Item Identifier " + itemIdentifier +" and limit: "+parentLimit); try { Item wsItem = Whorespace.getItem(getThreadLocalRequest(), itemIdentifier); logger.trace("workspace retrieve item name: "+wsItem.getName()); List parents = new ArrayList<>(); Item whileItem = wsItem; while (whileItem.getParentId() != null) { parents.add(whileItem); whileItem = Whorespace.getItem(getThreadLocalRequest(), whileItem.getParentId()); } logger.trace("workspace retrieve item name: "+wsItem.getName()); //List parents = workspace.getParentsById(itemIdentifier); logger.trace("parents size: "+parents.size()); ItemDTO[] arrayParents; if(includeItemAsParent==true && wsItem instanceof FolderItem){ arrayParents = new ItemDTO[parents.size()]; arrayParents[parents.size()-1] = ItemBuilder.buildFolderForBreadcrumbs((FolderItem) wsItem, null); } else { arrayParents = new ItemDTO[parents.size()-1]; } parentLimit = parentLimit!=null?parentLimit:""; /** HANDLE MY_SPECIAL_FOLDER TO AVOID COMPLETE PATH WORKSPACE/MY_SPECIAL_FOLDER * BUT RETURNING ONLY /MY_SPECIAL_FOLDER */ if( wsItem instanceof FolderItem){ if(ItemBuilder.isSpecialFolder((FolderItem) wsItem)){ logger.debug("item id is special folder, returning"); return new ArrayList(Arrays.asList(arrayParents)); } if(itemIdentifier.compareTo(parentLimit)==0){ logger.debug("item and parent limit are identical element, returning"); return new ArrayList(Arrays.asList(arrayParents)); } } //CONVERTING PATH logger.trace("converting path from second-last.."); for (int i = parents.size()-2; i >= 0; i--) { FolderItem wsParentFolder = (FolderItem) parents.get(i); arrayParents[i] = ItemBuilder.buildFolderForBreadcrumbs(wsParentFolder, null); if(arrayParents[i].isSpecialFolder()){ //SKIP HOME PARENT FOR MY_SPECIAL_FOLDER logger.info("arrayParents index "+i+" is special folder, break"); break; }else if(parentLimit.compareTo(arrayParents[i].getId())==0){ logger.info("reached parent limit "+parentLimit+", break"); break; } } //SET PARENTS logger.trace("setting parents.."); for(int i=0; i breadcrumbs = new ArrayList(); for (int i=1; i(Arrays.asList(arrayParents)); } } catch (Exception e) { logger.error("Error in get List Parents By Item Identifier ", e); throw new Exception("Sorry, an error occurred during path retrieving!"); } } /* (non-Javadoc) * @see org.gcube.portlets.widgets.wsexplorer.client.rpc.WorkspaceExplorerService#loadSizeByItemId(java.lang.String) */ /** * Gets the size by item id. * * @param itemId the item id * @return the size by item id * @throws Exception the exception */ @Override public Long getSizeByItemId(String itemId) throws Exception { //TODO: implementation missing return 0L; // logger.info("get Size By ItemId "+ itemId); // try { // // Workspace workspace = getWorkspace(); // WorkspaceItem wsItem = workspace.getItem(itemId); // Long size = new Long(-1); // // if(wsItem instanceof FolderItem){ //ITEM // FolderItem folderItem = (FolderItem) wsItem; // size = new Long(folderItem.getLength()); // } else if (wsItem instanceof WorkspaceFolder ){ //FOLDER // WorkspaceFolder theFolder = (WorkspaceFolder) wsItem; // size = theFolder.getSize(); // } else if (wsItem instanceof WorkspaceSharedFolder){ //SHARED FOLDER // WorkspaceSharedFolder theFolder = (WorkspaceSharedFolder) wsItem; // size = theFolder.getSize(); // } // logger.info("returning size: " +size); // return size; // // } catch (Exception e) { // logger.error("get Size By ItemId ", e); // throw new Exception(e.getMessage()); // } } /* (non-Javadoc) * @see org.gcube.portlets.widgets.wsexplorer.client.rpc.WorkspaceExplorerService#getMimeType(java.lang.String) */ /** * Gets the mime type. * * @param itemId the item id * @return the mime type * @throws Exception the exception */ @Override public String getMimeType(String itemId) throws Exception { logger.info("get MimeType By ItemId "+ itemId); try { Item wsItem = Whorespace.getItem(getThreadLocalRequest(), itemId); logger.trace("workspace retrieve item name: "+wsItem.getName()); if(! (wsItem instanceof FolderItem)) { return null; } FolderItem folderItem = (FolderItem) wsItem; //TODO:folderItem.getMimeType(); return "unknown"; } catch (Exception e) { logger.error("get MimeType By ItemId ", e); throw new Exception(e.getMessage()); } } /** * Gets the user acl for folder id. * * @param folderId the folder id * @return the user acl for folder id * @throws Exception the exception */ @Override public String getUserACLForFolderId(String folderId) throws Exception{ try { logger.info("Get user ACL to FOLDER id: "+folderId); Item wsItem = Whorespace.getItem(getThreadLocalRequest(), folderId); logger.trace("workspace retrieve item name: "+wsItem.getName()); if(!isASharedFolder(wsItem, false)) { return "OWNER"; } else { return "NOT IMPLEMENTED";//TODO } } catch (Exception e) { logger.error("Error in server get UserACLForFolderId", e); String error = "An error occurred when getting ACL rules for selected folder. "+e.getMessage(); throw new Exception(error); } } /** * Checks if is a shared folder. * * @param item the item * @param asRoot the as root * @return true, if is a shared folder */ private boolean isASharedFolder(Item item, boolean asRoot){ try { if (item instanceof SharedFolder || item instanceof VreFolder) { SharedFolder folder = (SharedFolder) item; if (folder.isVreFolder()) return true; return true; } else if (item instanceof FolderItem) { return false; } return false; }catch(Exception e){ logger.error("Error in server isASharedFolder", e); return false; } } /* (non-Javadoc) * @see org.gcube.portlets.widgets.wsexplorer.client.rpc.WorkspaceExplorerService#getFormattedSizeByItemId(java.lang.String, org.gcube.portlets.widgets.wsexplorer.shared.SizeFormatter) */ /** * Gets the readable size by item id. * * @param itemId the item id * @return the readable size by item id * @throws Exception the exception */ @Override public String getReadableSizeByItemId(String itemId) throws Exception { try{ logger.info("getFormattedSize ByItemId "+ itemId); long size = getSizeByItemId(itemId); return StringUtil.readableFileSize(size); } catch (Exception e) { logger.error("getFormattedSize By ItemId ", e); throw new Exception(e.getMessage()); } } /** * Creates the folder. * * @param nameFolder the name folder * @param description the description * @param parentId the parent id * @return the item * @throws Exception the exception */ @Override public ItemDTO createFolder(String nameFolder, String description, String parentId) throws Exception { logger.debug("creating folder: "+nameFolder +", parent id: "+parentId); //TODO return null; // try { // // if(parentId==null || parentId.isEmpty()) // throw new Exception("Parent id is null or empty"); // // if(nameFolder == null) // nameFolder = "Empty Folder"; // // Workspace workspace = getWorkspace(); // WorkspaceFolder wsFolder = workspace.createFolder(nameFolder, description, parentId); // //// _log.info("Path returned by HL: "+wsFolder.getPath()); // // List allTypes = Arrays.asList(ItemType.values()); // // ItemDTO parent = null; // try{ // String parentPath = wsFolder.getParent()!=null?wsFolder.getParent().getPath():""; // parent = ItemBuilder.getItem(null, wsFolder.getParent(), parentPath, allTypes, null, false, false); // }catch(Exception e){ // logger.error("Get parent thown an exception, is it the root id? "+parentId); // } // // //TODO PATCH TO AVOID PROBLEM ON GETPATH. FOR EXAMPLE WHEN PARENT IS ROOT // String itemPath = null; // try{ // itemPath = wsFolder.getPath(); // logger.info("itemPath: "+itemPath); // }catch(Exception e){ // logger.error("Get path thrown an exception, for id: "+wsFolder.getId() +" name: "+wsFolder.getName(), e); //// itemPath= wsFolder.isFolder()?workspace.getRoot().getPath()+"/"+wsFolder.getName():workspace.getRoot().getPath(); // //PATCH TO RETURN ABSOLUTE PATH // itemPath= workspace.getRoot().getPath()+"/"+wsFolder.getName(); // logger.warn("returning base path: "+itemPath); // } // // return ItemBuilder.getItem(parent, wsFolder, itemPath, allTypes, null, false, false); // // } catch(InsufficientPrivilegesException e){ // String error = "Insufficient Privileges to create the folder"; // logger.error(error, e); // throw new Exception(error); // } catch (ItemAlreadyExistException e) { // String error = "An error occurred on creating folder, " +e.getMessage(); // logger.error(error, e); // throw new Exception(error); // } catch (Exception e) { // String error = "An error occurred on the sever during creating folder. Try again"; // logger.error(error, e); // throw new Exception(error); // } } /* (non-Javadoc) * @see org.gcube.portlets.widgets.wsexplorer.client.rpc.WorkspaceExplorerService#getGcubePropertiesForWorspaceId(java.lang.String) */ /** * Gets the gcube properties for worspace id. * * @param id the id * @return the gcube properties for worspace id * @throws Exception the exception */ @Override public Map getGcubePropertiesForWorspaceId(String id) throws Exception { logger.trace("getGcubePropertiesForWorspaceId "+id); //TODO return null; // try { // // if(id==null || id.isEmpty()){ // logger.info(id +" is null or empty returing empty map as GcubeProperties"); // return new HashMap(1); // } // // Workspace workspace = getWorkspace(); // WorkspaceItem item = workspace.getItem(id); // // return ItemBuilder.getGcubePropertiesForItem(item); // // } catch (Exception e) { // logger.error("Error during folder retrieving", e); // throw new WorkspaceNavigatorServiceException("Sorry, an error occurred when performing get folder"); // } } /* (non-Javadoc) * @see org.gcube.portlets.widgets.wsexplorer.client.rpc.WorkspaceExplorerService#getFolder(org.gcube.portlets.widgets.wsexplorer.shared.Item, java.util.List, boolean, org.gcube.portlets.widgets.wsexplorer.shared.FilterCriteria, boolean, int, int) */ @Override public SearchedFolder getFolder( ItemDTO item, List showableTypes, boolean purgeEmpyFolders, FilterCriteria filterCriteria, boolean loadGcubeProperties, final int startIndex, final int limit, final int serverStartIndex) throws WorkspaceNavigatorServiceException { logger.trace("getFolder folderId: "+item.getId()+" showableTypes: "+showableTypes+" purgeEmpyFolders: "+purgeEmpyFolders+" filterCriteria: "+filterCriteria); try { Item folder = Whorespace.getItem(getThreadLocalRequest(), item.getId()); int searchStartIndex = startIndex < serverStartIndex? serverStartIndex : startIndex; //logger.trace("GetFolder - Replyiing folder"); logger.debug("MyLg getFolder searchIndex: "+searchStartIndex+", limit: "+limit); //long startTime = System.currentTimeMillis(); //logger.trace("start time - " + startTime); //TO AVOID SLOW CALL getPATH() String folderPath = item.getPath()!=null && !item.getPath().isEmpty()?item.getPath():folder.getPath(); ItemDTO itemFolderToReturn = ItemBuilder.getItem(null, folder, folderPath, showableTypes, filterCriteria, true, loadGcubeProperties, searchStartIndex, limit); SearchedFolder sf = new SearchedFolder(itemFolderToReturn, startIndex, limit, searchStartIndex, false); int currentListCount = sf.getFolder().getChildren().size(); logger.debug("MyLg Total item returning is: "+currentListCount); FolderItem hlFolder = (FolderItem) folder; int folderChildrenCount = Whorespace.getItemChildrenCount(getThreadLocalRequest(), hlFolder.getId()); logger.debug("MyLg Folder children count is: "+folderChildrenCount); if(currentListCount == limit || folderChildrenCount==0){ logger.debug("Page completed returning "+currentListCount+ " items"); int offset = searchStartIndex+limit; Collections.sort(sf.getFolder().getChildren(), new ItemComparator()); sf.setServerSearchFinished(offset>folderChildrenCount || folderChildrenCount == 0); logger.debug("is Search finished: "+sf.isServerSearchFinished()); return sf; } ArrayList childrenToReturn = new ArrayList(limit); childrenToReturn.addAll(sf.getFolder().getChildren()); int offsetStartIndex = searchStartIndex; boolean pageOffsetOut = false; while(currentListCount < limit && !sf.isServerSearchFinished() && !pageOffsetOut){ //&& SEARCH NOT ULTIMATED logger.debug("MyLg new WHILE Items count: "+currentListCount+" is less than limit.."); int newstartIndex = offsetStartIndex+limit+1; logger.debug("MyLg NewStartIndex is startIndex+limit: "+newstartIndex); //THERE ARE OTHER CHILDREN OVER NEW START INDEX if(newstartIndex < folderChildrenCount){ //newLimit = limit - childrenToReturn.size(); logger.debug("MyLg getting items with index start: "+newstartIndex + ", limit: "+limit); ItemDTO newItemFolder = ItemBuilder.getItem(null, folder, folderPath, showableTypes, filterCriteria, true, loadGcubeProperties, newstartIndex, limit); int diff = limit - currentListCount; //How items are remaining //int offset = 0; logger.debug("MyLg new search start: "+newstartIndex + ", diff: "+diff+ ", retrieved: "+newItemFolder.getChildren().size()); if(diff >= newItemFolder.getChildren().size()){ logger.debug("MyLg Adding sublist from 0 to 'diff' "+diff+" to children"); childrenToReturn.addAll(newItemFolder.getChildren().subList(0, newItemFolder.getChildren().size())); //offset = diff; }else{ logger.debug("MyLg PageOffsetOut, the sublist size: "+newItemFolder.getChildren().size()+ " is greather than (limit-currentListCount)"+diff+" leaving WHILE..."); //childrenToReturn.addAll(newItemFolder.getChildren().subList(0, newItemFolder.getChildren().size())); //offset = newItemFolder.getChildren().size(); pageOffsetOut = true; } offsetStartIndex = newstartIndex; currentListCount = childrenToReturn.size(); //int realServerEndIndex = newstartIndex+offset; logger.debug("MyLg New items count is: "+currentListCount + " serverEndIndex: "+offsetStartIndex); sf.setServerEndIndex(offsetStartIndex); }else{ logger.debug("MyLg New start index (oldStartIndex+limit) is grather than folder children count, search is finished"); sf.setServerSearchFinished(true); } } sf.getFolder().setChildren(childrenToReturn); //sf.setServerEndIndex(sf.getServerEndIndex()); if (purgeEmpyFolders) { itemFolderToReturn = ItemBuilder.purgeEmptyFolders(sf.getFolder()); } //logger.debug("Returning: "+itemFolder.getChildren().size() + " items"); //Long endTime = System.currentTimeMillis() - startTime; //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); // } Collections.sort(itemFolderToReturn.getChildren(), new ItemComparator()); logger.debug("Returning: "+sf); return sf; } catch (Exception e) { logger.error("Error during folder retrieving", e); throw new WorkspaceNavigatorServiceException("Sorry, an error occurred when performing get folder"); } } @Override public int getFolderChildrenCount(ItemDTO item){ return Whorespace.getItemChildrenCount(getThreadLocalRequest(), item.getId()); } }