package org.gcube.portlets.user.workspaceexplorerapp.server; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; import org.gcube.common.homelibary.model.items.type.WorkspaceItemType; import org.gcube.common.homelibrary.home.workspace.Workspace; import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder; import org.gcube.common.homelibrary.home.workspace.WorkspaceItem; import org.gcube.common.homelibrary.home.workspace.WorkspaceSharedFolder; import org.gcube.common.homelibrary.home.workspace.exceptions.InsufficientPrivilegesException; import org.gcube.common.homelibrary.home.workspace.exceptions.ItemAlreadyExistException; import org.gcube.common.homelibrary.home.workspace.folder.FolderItem; import org.gcube.portlets.user.workspaceexplorerapp.client.WorkspaceExplorerAppConstants; import org.gcube.portlets.user.workspaceexplorerapp.client.rpc.WorkspaceExplorerAppService; import org.gcube.portlets.user.workspaceexplorerapp.shared.FilterCriteria; import org.gcube.portlets.user.workspaceexplorerapp.shared.Item; import org.gcube.portlets.user.workspaceexplorerapp.shared.ItemCategory; import org.gcube.portlets.user.workspaceexplorerapp.shared.ItemType; import org.gcube.portlets.user.workspaceexplorerapp.shared.WorkspaceNavigatorServiceException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.gwt.user.server.rpc.RemoteServiceServlet; /** * The server side implementation of the RPC service. * * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it * Jun 25, 2015 */ @SuppressWarnings("serial") public class WorkspaceExplorerAppServiceImpl extends RemoteServiceServlet implements WorkspaceExplorerAppService { /** * */ public static final Logger logger = LoggerFactory.getLogger(WorkspaceExplorerAppServiceImpl.class); /** * {@inheritDoc} */ @Override public Item getRoot(List showableTypes, boolean purgeEmpyFolders, FilterCriteria filterCriteria) throws WorkspaceNavigatorServiceException { logger.trace("getRoot showableTypes: "+showableTypes+" purgeEmpyFolders: "+purgeEmpyFolders+" filterCriteria: "+ filterCriteria); try { Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); logger.trace("Start getRoot..."); WorkspaceItem root = workspace.getRoot(); logger.trace("GetRoot - Replyiing root"); long startTime = System.currentTimeMillis(); logger.trace("start time - " + startTime); Item rootItem = ItemBuilder.getItem(null, root, root.getPath(), showableTypes, filterCriteria, true); rootItem.setName(WorkspaceExplorerAppConstants.HOME_LABEL); rootItem.setIsRoot(true); /* SPECIAL FOLDERS Item specialFolders = ItemBuilder.getItem(null, specials, showableTypes, filterCriteria, 2); specialFolders.setShared(true); rootItem.addChild(specialFolders); */ if (purgeEmpyFolders) { rootItem = ItemBuilder.purgeEmptyFolders(rootItem); } logger.trace("Returning:"); Long endTime = System.currentTimeMillis() - startTime; String time = String.format("%d msc %d sec", endTime, TimeUnit.MILLISECONDS.toSeconds(endTime)); logger.info("end time - " + time); 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 Item getFolder(Item item, List showableTypes, boolean purgeEmpyFolders, FilterCriteria filterCriteria) throws WorkspaceNavigatorServiceException { logger.trace("getFolder item: "+item+" showableTypes: "+showableTypes+" purgeEmpyFolders: "+purgeEmpyFolders+" filterCriteria: "+filterCriteria); try { if(item==null || item.getId()==null) throw new Exception("Item id is null"); Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); WorkspaceItem folder = workspace.getItem(item.getId()); logger.trace("GetFolder - Replyiing folder"); long startTime = System.currentTimeMillis(); logger.trace("start time - " + startTime); String path = item.getPath()!=null && !item.getPath().isEmpty()?item.getPath():folder.getPath(); Item itemFolder = ItemBuilder.getItem(null, folder, path, showableTypes, filterCriteria, true); // _log.trace("Only showable types:"); 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.info("end time - " + time); Collections.sort(itemFolder.getChildren(), new ItemComparator()); 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) */ @Override public Item getItemByCategory(ItemCategory category) throws WorkspaceNavigatorServiceException{ logger.trace("GetItemByCategory category: "+category); return null; //TODO // try { // Workspace workspace = WsUtil.getWorkspace(); // Item item = null; // // switch(category){ // case HOME:{ // WorkspaceItem root = workspace.getRoot(); //// String fullName = UserUtil.getUserFullName(session.getUsername()); // String fullName = session.getUsername(); // if(fullName.indexOf(" ")>0){ // fullName = fullName.substring(0, fullName.indexOf(" ")); // }else if(fullName.indexOf(".")>0){ // fullName = fullName.substring(0, fullName.indexOf(".")); // } // item = new Item(null, root.getId(), fullName+"'s", ItemType.FOLDER, root.getPath(), root.getOwner().getPortalLogin(), null, true, true); // break; // } // case VRE_FOLDER:{ // WorkspaceItem folder = workspace.getMySpecialFolders(); // item = new Item(null, folder.getId(), WorkspaceExplorerAppConstants.VRE_FOLDERS_LABEL, ItemType.FOLDER, folder.getPath(), folder.getOwner().getPortalLogin(), 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 Item getMySpecialFolder(List showableTypes, boolean purgeEmpyFolders, FilterCriteria filterCriteria) throws WorkspaceNavigatorServiceException { logger.trace("GetMySpecialFolder showableTypes: "+showableTypes+" purgeEmpyFolders: "+purgeEmpyFolders+" filterCriteria: "+filterCriteria); try { Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); WorkspaceItem folder = workspace.getMySpecialFolders(); long startTime = System.currentTimeMillis(); logger.trace("start time - " + startTime); Item itemFolder = ItemBuilder.getItem(null, folder, folder.getPath(), showableTypes, filterCriteria, true); //OVERRIDING VRE FOLDERS NAME - SET SPECIAL FOLDER /Workspace/MySpecialFolders itemFolder.setName(WorkspaceExplorerAppConstants.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.trace("checkName name: "+name); try { Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); return workspace.isValidName(name); } catch (Exception e) { logger.error("Error during folder retrieving", e); throw new WorkspaceNavigatorServiceException(e.getMessage()); } } /*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 { Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); WorkspaceItem wsItem = workspace.getItem(itemIdentifier); logger.trace("workspace retrieve item name: "+wsItem.getName()); List parents = workspace.getParentsById(itemIdentifier); logger.trace("parents size: "+parents.size()); Item[] arrayParents; if(includeItemAsParent==true && wsItem.isFolder()){ arrayParents = new Item[parents.size()]; arrayParents[parents.size()-1] = ItemBuilder.buildFolderForBreadcrumbs((WorkspaceFolder) wsItem, null); } else { arrayParents = new Item[parents.size()-1]; } /** HANDLE MY_SPECIAL_FOLDER TO AVOID COMPLETE PATH WORKSPACE/MY_SPECIAL_FOLDER * BUT RETURNING ONLY /MY_SPECIAL_FOLDER */ if(wsItem.isFolder()){ if(ItemBuilder.isSpecialFolder((WorkspaceFolder) 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--) { WorkspaceFolder wsParentFolder = (WorkspaceFolder) 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 { Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); WorkspaceItem wsItem = workspace.getItem(itemIdentifier); logger.trace("workspace retrieve item name: "+wsItem.getName()); List parents = workspace.getParentsById(itemIdentifier); logger.trace("parents size: "+parents.size()); Item[] arrayParents; if(includeItemAsParent==true && wsItem.isFolder()){ arrayParents = new Item[parents.size()]; arrayParents[parents.size()-1] = ItemBuilder.buildFolderForBreadcrumbs((WorkspaceFolder) wsItem, null); } else { arrayParents = new Item[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.isFolder()){ if(ItemBuilder.isSpecialFolder((WorkspaceFolder) 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--) { WorkspaceFolder wsParentFolder = (WorkspaceFolder) 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) */ @Override public Long getSizeByItemId(String itemId) throws Exception { logger.info("get Size By ItemId "+ itemId); try { Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); 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) */ @Override public String getMimeType(String itemId) throws Exception { logger.info("get MimeType By ItemId "+ itemId); try { Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); WorkspaceItem wsItem = workspace.getItem(itemId); if(!wsItem.getType().equals(WorkspaceItemType.FOLDER_ITEM)) { return null; } FolderItem folderItem = (FolderItem) wsItem; return folderItem.getMimeType(); } 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); Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); WorkspaceItem wsItem = workspace.getItem(folderId); if(!isASharedFolder(wsItem, false)) { return "OWNER"; } else { return wsItem.getACLUser().toString(); } } 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(WorkspaceItem item, boolean asRoot){ try { if(item!=null && item.isFolder() && item.isShared()){ //IS A SHARED SUB-FOLDER if(asRoot) { return item.getType().equals(WorkspaceItemType.SHARED_FOLDER); //IS ROOT? } return true; } 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) */ @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()); } } /* (non-Javadoc) * @see org.gcube.portlets.user.workspaceexplorerapp.client.rpc.WorkspaceExplorerAppService#createFolder(java.lang.String, java.lang.String, java.lang.String) */ @Override public Item createFolder(String nameFolder, String description, String parentId) throws Exception { logger.debug("creating folder: "+nameFolder +", parent id: "+parentId); try { if(parentId==null || parentId.isEmpty()) throw new Exception("Parent id is null or empty"); if(nameFolder == null) nameFolder = "Empty Folder"; Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); WorkspaceFolder wsFolder = workspace.createFolder(nameFolder, description, parentId); List allTypes = Arrays.asList(ItemType.values()); Item parent = null; try{ String parentPath = wsFolder.getParent()!=null?wsFolder.getParent().getPath():""; parent = ItemBuilder.getItem(null, wsFolder.getParent(), parentPath, allTypes, null, 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(); }catch(Exception e){ logger.error("Get path thown an exception, for id: "+wsFolder.getId()); itemPath= wsFolder.isFolder()?workspace.getRoot().getPath()+"/"+wsFolder.getName():workspace.getRoot().getPath(); } return ItemBuilder.getItem(parent, wsFolder, itemPath, allTypes, null, 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); } } /** * Gets the public link for item id. * * @param itemId the item id * @return the public link for item id * @throws Exception the exception */ @Override public String getPublicLinkForItemId(String itemId) throws Exception{ logger.trace("get Public Link For ItemId: "+ itemId); try{ if(itemId==null) throw new Exception("Sorry, The Public Link for empty item is unavailable (itemId is null)"); Workspace workspace = WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); WorkspaceItem wsItem = workspace.getItem(itemId); if(wsItem==null) throw new Exception("Sorry, The Public Link for empty item is unavailable"); if(wsItem.getType().equals(WorkspaceItemType.FOLDER_ITEM)){ FolderItem folderItem = (FolderItem) wsItem; String uriRequest = folderItem.getPublicLink(false); if(uriRequest==null || uriRequest.isEmpty()) throw new Exception("Sorry, public link on "+folderItem.getName() +" is not available"); return uriRequest; }else{ logger.warn("ItemId: "+ itemId +" is not available, sent exception Public Link unavailable"); throw new Exception("Sorry, The Public Link for selected item is unavailable"); } }catch (Exception e) { logger.error("Error getPublicLinkForItemId for item: "+itemId, e); throw new Exception(e.getMessage()); } } }