package org.gcube.portlets.user.workspace.server; import static org.gcube.resources.discovery.icclient.ICFactory.clientFor; import static org.gcube.resources.discovery.icclient.ICFactory.queryFor; import java.io.File; import java.net.URL; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import org.gcube.common.encryption.StringEncrypter; import org.gcube.common.portal.PortalContext; import org.gcube.common.resources.gcore.ServiceEndpoint; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.common.storagehub.model.exceptions.UserNotAuthorizedException; import org.gcube.common.storagehub.model.items.nodes.accounting.AccountEntry; import org.gcube.common.storagehubwrapper.server.StorageHubWrapper; import org.gcube.common.storagehubwrapper.shared.tohl.TrashedItem; import org.gcube.common.storagehubwrapper.shared.tohl.impl.WorkspaceFileVersion; import org.gcube.common.storagehubwrapper.shared.tohl.items.ImageFileItem; import org.gcube.common.storagehubwrapper.shared.tohl.items.PropertyMap; import org.gcube.common.storagehubwrapper.shared.tohl.items.URLFileItem; import org.gcube.common.storagehubwrapper.shared.tohl.items.URLItem; import org.gcube.portal.wssynclibrary.shared.ItemNotSynched; import org.gcube.portal.wssynclibrary.shared.WorkspaceFolderLocked; import org.gcube.portal.wssynclibrary.shared.thredds.Sync_Status; import org.gcube.portal.wssynclibrary.thredds.WorkspaceThreddsSynchronize; import org.gcube.portlets.user.urlshortener.UrlShortener; import org.gcube.portlets.user.workspace.client.ConstantsExplorer; import org.gcube.portlets.user.workspace.client.model.FileGridModel; import org.gcube.portlets.user.workspace.client.model.FileModel; import org.gcube.portlets.user.workspace.client.model.FileTrashedModel; import org.gcube.portlets.user.workspace.client.model.FileVersionModel; import org.gcube.portlets.user.workspace.client.model.FolderModel; import org.gcube.portlets.user.workspace.client.model.GcubeVRE; import org.gcube.portlets.user.workspace.client.model.SubTree; import org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService; import org.gcube.portlets.user.workspace.client.workspace.GWTWorkspaceItem; import org.gcube.portlets.user.workspace.client.workspace.folder.item.GWTExternalUrl; import org.gcube.portlets.user.workspace.server.notifications.tostoragehub.NotificationStorageHubUtil; import org.gcube.portlets.user.workspace.server.notifications.tostoragehub.NotificationsProducerToStorageHub; import org.gcube.portlets.user.workspace.server.reader.ApplicationProfile; import org.gcube.portlets.user.workspace.server.reader.ApplicationProfileReader; import org.gcube.portlets.user.workspace.server.tostoragehub.FormatterUtil; import org.gcube.portlets.user.workspace.server.tostoragehub.ObjectStorageHubToWorkpaceMapper; import org.gcube.portlets.user.workspace.server.tostoragehub.StorageHubToWorkpaceConverter; import org.gcube.portlets.user.workspace.server.util.PortalContextInfo; import org.gcube.portlets.user.workspace.server.util.StringUtil; import org.gcube.portlets.user.workspace.server.util.WsUtil; import org.gcube.portlets.user.workspace.server.util.resource.PropertySpecialFolderReader; import org.gcube.portlets.user.workspace.server.util.scope.ScopeUtilFilter; import org.gcube.portlets.user.workspace.shared.GarbageItem; import org.gcube.portlets.user.workspace.shared.PublicLink; import org.gcube.portlets.user.workspace.shared.SHUBOperationNotAllowedException; import org.gcube.portlets.user.workspace.shared.SessionExpiredException; import org.gcube.portlets.user.workspace.shared.TrashContent; import org.gcube.portlets.user.workspace.shared.TrashOperationContent; import org.gcube.portlets.user.workspace.shared.UserBean; import org.gcube.portlets.user.workspace.shared.WorkspaceOperationResult; import org.gcube.portlets.user.workspace.shared.WorkspaceTrashOperation; import org.gcube.portlets.user.workspace.shared.WorkspaceUserQuote; import org.gcube.portlets.user.workspace.shared.WorkspaceVersioningOperation; import org.gcube.portlets.user.workspace.shared.accounting.GxtAccountingEntryType; import org.gcube.portlets.user.workspace.shared.accounting.GxtAccountingField; import org.gcube.portlets.widgets.workspacesharingwidget.server.notifications.NotificationsProducer; import org.gcube.portlets.widgets.workspacesharingwidget.shared.InfoContactModel; import org.gcube.resources.discovery.client.api.DiscoveryClient; import org.gcube.resources.discovery.client.queries.api.SimpleQuery; import org.gcube.vomanagement.usermanagement.GroupManager; import org.gcube.vomanagement.usermanagement.exception.GroupRetrievalFault; import org.gcube.vomanagement.usermanagement.exception.UserManagementSystemException; import org.gcube.vomanagement.usermanagement.exception.UserRetrievalFault; import org.gcube.vomanagement.usermanagement.impl.LiferayGroupManager; import org.gcube.vomanagement.usermanagement.impl.LiferayUserManager; import org.gcube.vomanagement.usermanagement.model.GCubeGroup; import org.gcube.vomanagement.usermanagement.model.GCubeUser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.gwt.user.server.rpc.RemoteServiceServlet; import com.liferay.portal.service.UserLocalServiceUtil; /** * The Class GWTWorkspaceServiceImpl. * * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) * * Aug 1, 2019 */ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWTWorkspaceService { protected static final String IDENTIFIER_IS_NULL = "Identifier is null"; protected static final String RETRIEVING_ITEM_EITHER_ITEM_DOESN_T_EXIST = " retrieving item. Either the item doesn't exist anymore or you do not have the permission to access it"; private static final long serialVersionUID = 2828885661214875589L; public static final String LAST_OPEN_FOLDER_ATTRIBUTE = "WORKSPACE.LAST_OPEN_FOLDER"; public static final String SELECTION_STATE_ATTRIBUTE = "WORKSPACE.SELECTION_STATE"; protected Logger workspaceLogger = LoggerFactory.getLogger(GWTWorkspaceServiceImpl.class); /** * Gets the notification producer. * * @return the notification producer */ protected NotificationsProducer getNotificationProducer() { return WsUtil.getNotificationProducer(this.getThreadLocalRequest()); } /** * Gets the scope util filter. * * @return the scope util filter */ protected ScopeUtilFilter getScopeUtilFilter() { return WsUtil.getScopeUtilFilter(this.getThreadLocalRequest()); } /** * Checks if is test mode. * * @return true, if is test mode */ protected boolean isTestMode() { return !WsUtil.isWithinPortal(); } /** * Gets the url shortener. * * @return the url shortener */ protected UrlShortener getUrlShortener() { return WsUtil.getUrlShortener(this.getThreadLocalRequest()); } /** * Gets the property special folder reader. * * @return the property special folder reader */ protected PropertySpecialFolderReader getPropertySpecialFolderReader() { String absolutePathProperty = getSpecialFolderPath(); return WsUtil.getPropertySpecialFolderReader(this.getThreadLocalRequest(), absolutePathProperty); } /** * Gets the special folder path. * * @return the Category if there is correspondance, null otherwise */ private String getSpecialFolderPath() { ServletContext servletContext = getServletContext(); String contextPath = servletContext.getRealPath(File.separator); return contextPath + File.separator + "conf" + File.separator + ConstantsExplorer.SPECIALFOLDERNAMEPROPERTIESFILE; } /** * Gets the name for special folder. * * @return the name for special folder */ private String getNameForSpecialFolder() { PropertySpecialFolderReader sfReader = getPropertySpecialFolderReader(); if (sfReader == null) { workspaceLogger.warn("Reader is null, skypping set to special folder name"); return ""; } workspaceLogger .info("Read special folder name: '" + sfReader.getSpecialFolderName() + "', from property file.."); return sfReader.getSpecialFolderName(); } /** * Gets the servlet context path. * * @param protocol * the protocol * @return the servlet context path */ @Override public String getServletContextPath(String protocol) { HttpServletRequest req = getThreadLocalRequest(); String scheme = protocol; String serverName = req.getServerName(); // hostname.com int serverPort = req.getServerPort(); // 80 String contextPath = req.getServletContext().getContextPath(); // /mywebapp // Reconstruct original requesting URL StringBuffer url = new StringBuffer(); url.append(scheme).append("//").append(serverName); if (serverPort != 80 && serverPort != 443) { url.append(":").append(serverPort); } workspaceLogger.debug("server: " + url); workspaceLogger.debug("omitted contextPath: " + contextPath); url.append(contextPath); workspaceLogger.debug("getServletContextPath=" + url.toString()); return url.toString(); } /** * Checks if is item under sync. * * @param itemId * the item id * @return true, if is item under sync * @throws Exception * the exception */ @Override public Boolean isItemUnderSync(String itemId) throws Exception { try { GCubeUser user = PortalContext.getConfiguration().getCurrentUser(this.getThreadLocalRequest()); try { Sync_Status status = WorkspaceThreddsSynchronize.getInstance().getSynchedStatusFromItemProperty(itemId, user.getUsername()); } catch (Exception e) { return false; } // HERE THE ITEM IS SYNCHED SO CHECK IF IT IS LOCKED checkItemLocked(itemId); return false; } catch (WorkspaceFolderLocked e1) { return true; } catch (Exception e) { throw new Exception("Error on checking item " + itemId + " is under sync"); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * getMyLogin() */ /** * Gets the my login. * * @param currentPortletUrl * the current portlet url * @return the my login */ @Override public UserBean getMyLogin(String currentPortletUrl) { PortalContextInfo info = WsUtil.getPortalContext(this.getThreadLocalRequest()); String username = info.getUsername(); String email = info.getUserEmail(); String firstName = "Testing"; String lastName = "User"; if (isWithinPortal() && username != null) { try { LiferayUserManager l = new LiferayUserManager(); GCubeUser user = l.getUserByUsername(username); firstName = user.getFirstName(); lastName = user.getLastName(); email = user.getEmail(); } catch (UserManagementSystemException e) { workspaceLogger.error("UserManagementSystemException for username: " + username); } catch (UserRetrievalFault e) { workspaceLogger.error("UserRetrievalFault for username: " + username); } catch (Exception e) { workspaceLogger.error("Error during getMyLogin for username: " + username, e); } } UserBean us = new UserBean(username, firstName, lastName, email); workspaceLogger.info("Returning myLogin: " + us); return us; } /** * Gets the CLARIN switch board endpoint. * * @return the CLARIN switch board endpoint */ private String getCLARINSwitchBoardEndpoint() { // save the context for this resource String currContext = ScopeProvider.instance.get(); // set the context for this resource ScopeProvider.instance.set("/" + PortalContext.getConfiguration().getInfrastructureName()); // construct the xquery SimpleQuery query = queryFor(ServiceEndpoint.class); query.addCondition( "$resource/Profile/Name/text() eq '" + ConstantsExplorer.CLARIN_SWITCHBOARD_ENDPOINT_NAME + "'"); query.addCondition("$resource/Profile/Category/text() eq '" + ConstantsExplorer.CLARIN_SWITCHBOARD_ENDPOINT_CATEGORY + "'"); DiscoveryClient client = clientFor(ServiceEndpoint.class); List conf = client.submit(query); if (conf == null || conf.isEmpty()) return null; ServiceEndpoint res = conf.get(0); // reset the context ScopeProvider.instance.set(currContext); return res.profile().runtime().hostedOn(); } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * getMyLogin() */ /** * Gets the my first name. * * @return the my first name */ @Override public String getMyFirstName() { if (!isWithinPortal()) return ""; PortalContextInfo info = WsUtil.getPortalContext(this.getThreadLocalRequest()); String username = info.getUsername(); String firstName = ""; if (isWithinPortal() && username != null) { try { LiferayUserManager l = new LiferayUserManager(); GCubeUser user = l.getUserByUsername(username); workspaceLogger.info("My login first name is: " + user.getFirstName()); firstName = user.getFirstName(); } catch (UserManagementSystemException e) { workspaceLogger.error("UserManagementSystemException for username: " + username); } catch (UserRetrievalFault e) { workspaceLogger.error("UserRetrievalFault for username: " + username); } } return firstName; } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * isSessionExpired() */ /** * Checks if is session expired. * * @return true, if is session expired * @throws Exception * the exception */ @Override public boolean isSessionExpired() throws Exception { return WsUtil.isSessionExpired(this.getThreadLocalRequest()); } /** * Checks if is within portal. * * @return true if you're running into the portal, false if in development */ private boolean isWithinPortal() { try { UserLocalServiceUtil.getService(); return true; } catch (Exception ex) { workspaceLogger.trace("Development Mode ON"); return false; } } /** * Gets the workspace from storage hub. * * @return the workspace from storage hub * @throws Exception * the exception */ protected org.gcube.common.storagehubwrapper.server.tohl.Workspace getWorkspaceFromStorageHub() throws Exception { GCubeUser user = PortalContext.getConfiguration().getCurrentUser(this.getThreadLocalRequest()); StorageHubWrapper storageHubWrapper = WsUtil.getStorageHubWrapper(this.getThreadLocalRequest(), null, user); return storageHubWrapper.getWorkspace(); } /** * Gets the storage hub to workpace converter. * * @return the storage hub to workpace converter * @throws Exception * the exception */ protected StorageHubToWorkpaceConverter getStorageHubToWorkpaceConverter() throws Exception { GCubeUser user = PortalContext.getConfiguration().getCurrentUser(this.getThreadLocalRequest()); StorageHubToWorkpaceConverter converter = WsUtil.getStorageHubToWorkpaceConverter(this.getThreadLocalRequest(), null, user); // SETTING ROOT ID JUST ONCE if (converter.getWorkspaceRootId() == null) { org.gcube.common.storagehubwrapper.server.tohl.Workspace ws = getWorkspaceFromStorageHub(); converter.setWorkspaceRootId(ws.getRoot().getId()); } return converter; } /** * Gets the notification producer to storage hub. * * @return the notification producer to storage hub */ protected NotificationsProducerToStorageHub getNotificationProducerToStorageHub() { return WsUtil.getNotificationProducerToStorageHub(this.getThreadLocalRequest()); } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * getRootForTree() */ /** * Gets the root for tree. * * @return the root for tree * @throws Exception * the exception */ @Override public FolderModel getRootForTree() throws Exception { workspaceLogger.trace("getRoot"); try { org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceFolder root = workspace.getRoot(); if (root == null) { workspaceLogger.error("The root is null"); throw new Exception("The root is null"); } workspaceLogger.trace("Root converted, returning..."); StorageHubToWorkpaceConverter converter = getStorageHubToWorkpaceConverter(); return converter.toRootFolder(root); } catch (Exception e) { workspaceLogger.error("Error in server during root retrieving", e); // workspaceLogger.trace("Error in server During root retrieving " + // e); // GWT can't serialize all exceptions throw new Exception("Error during workspace loading, please contact the support. Exception:" + e); } } /** * Delete item. * * @param itemId * the item id * @return the boolean * @throws Exception * the exception */ @Override public Boolean deleteItem(String itemId) throws Exception { org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem theItem = null; try { workspaceLogger.error("called deleteItem: "+itemId); if (itemId == null) throw new Exception(IDENTIFIER_IS_NULL); checkItemLocked(itemId); org.gcube.common.storagehubwrapper.server.tohl.Workspace workspaceSH = getWorkspaceFromStorageHub(); theItem = workspaceSH.getItem(itemId); String itemName = theItem.getName(); String sourceFolderSharedId = null; if (theItem.isShared()) { org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem rootSharedFolder = workspaceSH .getRootSharedFolder(itemId); sourceFolderSharedId = rootSharedFolder.getId(); } // HERE REMOVING THE ITEM workspaceLogger.info("Calling storageHub to delete item with id: " + itemId); workspaceSH.deleteItem(itemId); NotificationsProducerToStorageHub np = getNotificationProducerToStorageHub(); if (sourceFolderSharedId != null) NotificationStorageHubUtil.checkSendNotifyRemovedItemFromShare(this.getThreadLocalRequest(), theItem.isShared(), itemName, itemId, sourceFolderSharedId, workspaceSH, np); return Boolean.TRUE; } catch (WorkspaceFolderLocked e1) { throw new Exception(e1.getMessage()); // } catch (InsufficientPrivilegesException e) { // workspaceLogger.error("Error in server Item remove", e); // String error = "Insufficient Privileges to remove the item"; // throw new Exception(error); // // } catch (ItemNotFoundException e) { // String error = "An error occurred on deleting item. " + ConstantsExplorer.ERROR_ITEM_DOES_NOT_EXIST; // workspaceLogger.error(error, e); // throw new Exception(error); // // //TO STORAGEHUB EXCEPTION // } catch (UserNotAuthorizedException e) { // String error = "Insufficient Privileges to delete the item"; // workspaceLogger.error(error, e); // throw new Exception(error); } catch (Exception e) { workspaceLogger.error("Removing item error:", e); StringBuilder error = new StringBuilder(); if(theItem!=null && theItem.isShared()) { if(theItem.isFolder()) { error.append("Deleting shared folders is not supported. Please unshare it if your intent is to no longer share its content with your coworkers."); }else { error.append("Ops! This operation is not allowed, we're working hard to make this possible soon."); } throw new SHUBOperationNotAllowedException(error.toString()); }else { error.append("Ops an error occurred deleting the item! Either you have not the permission to delete it or a server error occurred. Please, refresh and try again"); throw new Exception(error.toString()); } } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * getFolderChildren(org.gcube.portlets.user.workspace.client.model. * FolderModel) */ /** * Gets the folder children. * * @param folder * the folder * @return the folder children * @throws Exception * the exception * @throws SessionExpiredException * the session expired exception */ @Override public List getFolderChildren(FolderModel folder) throws Exception, SessionExpiredException { org.gcube.common.storagehubwrapper.server.tohl.Workspace shWorkspace; if (isSessionExpired()) throw new SessionExpiredException(); try { if (folder == null) throw new Exception("Folder is null"); workspaceLogger.info("Get FolderChildren called for folder: "+folder.getIdentifier()); shWorkspace = getWorkspaceFromStorageHub(); // REMEMBER wsItem.isRoot() is always false; // REQUIRING ONLY THE FOLDERS List children = shWorkspace .getFilteredChildren(folder.getIdentifier(), org.gcube.common.storagehub.model.items.FolderItem.class); workspaceLogger.info("The children are: "+children.size()); for (org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem workspaceItem : children) { workspaceLogger .trace("The ITEM: " + workspaceItem.getName() + ", is shared: " + workspaceItem.isShared() + ", is folder: " + workspaceItem.isFolder() + " the id: " + workspaceItem.getId()); } StorageHubToWorkpaceConverter converter = getStorageHubToWorkpaceConverter(); List listFileModels = new ArrayList(children.size()); // boolean isParentShared = // workspace.isItemShared(folder.getIdentifier()); //removed for // optimization boolean isParentShared = folder.isShared(); for (org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem workspaceItem : children) { // TO BE SURE IT IS A FOLDER // if(workspaceItem.isFolder()){ workspaceLogger .debug("Converting tree folder: " + workspaceItem.getId() + " name " + workspaceItem.getName()); listFileModels.add(converter.toTreeFileModel(workspaceItem, folder, isParentShared)); // } } boolean isRoot = WsUtil.isRootFolder(folder, converter); workspaceLogger.info("Is the workspace folder "+folder.getName() + "with id: "+folder.getIdentifier()+" the root? "+isRoot); // ADDING VRE FOLDER? if (isRoot) { folder.setIsRoot(true); // ADD VRE FOLDER try { String vreFolderId = shWorkspace.getVREFoldersId(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem baseVREFolder = shWorkspace .getItem(vreFolderId); FileModel specialFolderModel = converter.toTreeFileModel(baseVREFolder, folder, false); specialFolderModel.setSpecialFolder(true); String newName = getNameForSpecialFolder(); if (!newName.isEmpty()) { workspaceLogger.info("Special folder name updated as: " + newName); specialFolderModel.setName(newName); } else workspaceLogger.info("Special folder name is empty, skipping"); listFileModels.add(specialFolderModel); } catch (Exception e) { workspaceLogger.warn( "An error occurred on retrieving special folders for folder id: " + folder.getIdentifier(), e); } } workspaceLogger.info("Returning " + listFileModels.size() + " tree item/s"); /* * int i = 0; for (FileModel fileModel : listFileModels) { * System.out.println(i++ +")"+fileModel); } */ // if(!WsUtil.isWithinPortal()){ // workspaceLogger.trace("Sleeping 4 sec..."); // Thread.sleep(4000); // } return listFileModels; } catch (Exception e) { workspaceLogger.error("Error in server During item retrieving", e); // workspaceLogger.trace("Error in server During item retrieving " + // e); String error = ConstantsExplorer.SERVER_ERROR + RETRIEVING_ITEM_EITHER_ITEM_DOESN_T_EXIST; // GWT can't serialize all exceptions throw new Exception(error); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * getFolderChildrenForFileGrid(org.gcube.portlets.user.workspace.client. * model.FileModel) */ /** * Gets the folder children for file grid. * * @param folder * the folder * @return the folder children for file grid * @throws Exception * the exception * @throws SessionExpiredException * the session expired exceptionworkspaceLogger.info("The children are: "+children.size()); */ @Override public List getFolderChildrenForFileGrid(FileModel folder) throws Exception, SessionExpiredException { if (isSessionExpired()) throw new SessionExpiredException(); try { if (folder == null) throw new Exception("Folder is null"); workspaceLogger.info("Get FolderChildrenForFileGrid called for folder: "+folder.getIdentifier()); org.gcube.common.storagehubwrapper.server.tohl.Workspace shWorkspace = getWorkspaceFromStorageHub(); List children = shWorkspace .getChildren(folder.getIdentifier()); workspaceLogger.info("The children are: "+children.size()); StorageHubToWorkpaceConverter converter = getStorageHubToWorkpaceConverter(); List listFileGridModels = new ArrayList(children.size()); // boolean isParentShared = folder.isShared(); for (org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem workspaceItem : children) { workspaceLogger .debug("Converting grid item: " + workspaceItem.getId() + " name " + workspaceItem.getName()); listFileGridModels.add(converter.toGridFileModel(workspaceItem, folder)); } boolean isRoot = WsUtil.isRootFolder(folder, converter); workspaceLogger.debug("****** IS ROOT? " + isRoot); // ADDING VRE FOLDER? if (isRoot) { folder.setIsRoot(true); // ADD VRE FOLDER try { String vreFolderId = shWorkspace.getVREFoldersId(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem baseVREFolder = shWorkspace.getItem(vreFolderId); FileGridModel specialFolderModel = converter.toGridFileModel(baseVREFolder, folder); specialFolderModel.setSpecialFolder(true); String newName = getNameForSpecialFolder(); if (!newName.isEmpty()) { workspaceLogger.info("Special folder name updated as: " + newName); specialFolderModel.setName(newName); } else workspaceLogger.info("Special folder name is empty, skipping"); listFileGridModels.add(specialFolderModel); } catch (Exception e) { workspaceLogger.warn( "An error occurred on retrieving special folders for folder id: " + folder.getIdentifier(), e); } } return listFileGridModels; } catch (Exception e) { workspaceLogger.error("Error in server During items retrieving", e); String error = ConstantsExplorer.SERVER_ERROR + RETRIEVING_ITEM_EITHER_ITEM_DOESN_T_EXIST; // GWT can't serialize all exceptions throw new Exception(error); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * getFolderChildrenForFileGridById(java.lang.String) */ /** * Gets the folder children for file grid by id. * * @param folderId * the folder id * @return the folder children for file grid by id * @throws Exception * the exception * @throws SessionExpiredException * the session expired exception */ @Override public List getFolderChildrenForFileGridById(String folderId) throws Exception, SessionExpiredException { if (isSessionExpired()) throw new SessionExpiredException(); try { if (folderId == null || folderId.isEmpty()) throw new Exception("Folder id is null or empty"); org.gcube.common.storagehubwrapper.server.tohl.Workspace shWorkspace = getWorkspaceFromStorageHub(); workspaceLogger.trace("get children for Grid by id: " + folderId); List listFileGridModels = new ArrayList(); // BUILDING THE PARENT org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = shWorkspace.getItem(folderId); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceFolder parent; if (wsItem.isFolder()) { workspaceLogger.trace("item id: " + folderId + " is of type: " + wsItem.getType()); parent = (org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceFolder) wsItem; } else { workspaceLogger.trace( "item id: " + folderId + " is not a folder but of type: " + wsItem.getType() + ", get parent"); parent = (org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceFolder) shWorkspace .getItem(wsItem.getParentId()); } if (parent == null) return listFileGridModels; StorageHubToWorkpaceConverter converter = getStorageHubToWorkpaceConverter(); FileGridModel wsParent = converter.toGridFileModel(parent, null); // PARENT BUILT IS SHARED? if (parent.isShared()) { wsParent.setShared(true); wsParent.setShareable(false); } Long startTime = System.currentTimeMillis(); // GET CHILDREN List children = shWorkspace .getChildren(wsParent.getIdentifier()); Long endTime = System.currentTimeMillis() - startTime; String time = String.format("%d msc %d sec", endTime, TimeUnit.MILLISECONDS.toSeconds(endTime)); workspaceLogger.debug("grid getChildren() returning " + children.size() + " elements in " + time); // boolean isParentShared = folder.isShared(); for (org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem workspaceItem : children) { workspaceLogger .debug("Converting grid item: " + workspaceItem.getId() + " name " + workspaceItem.getName()); listFileGridModels.add(converter.toGridFileModel(workspaceItem, wsParent)); } workspaceLogger.info("All converted grid item/s is/are: " + listFileGridModels.size()); return listFileGridModels; } catch (Exception e) { workspaceLogger.error("Error in server During items retrieving", e); String error = ConstantsExplorer.SERVER_ERROR + RETRIEVING_ITEM_EITHER_ITEM_DOESN_T_EXIST; throw new Exception(error); } } /** * Gets the trash content. * * @return the trash content * @throws Exception * the exception */ @Override public List getTrashContent() throws Exception { workspaceLogger.trace("Get TrashContent: "); try { org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem baseTrashFolder = workspace.getTrash(); List trashChildren = workspace .getChildren(baseTrashFolder.getId()); List trashContent = new ArrayList(trashChildren.size()); StorageHubToWorkpaceConverter converter = getStorageHubToWorkpaceConverter(); for (org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem workspaceItem : trashChildren) { if (workspaceItem.isTrashed()) { trashContent.add(converter.toFileTrashedModel((TrashedItem) workspaceItem)); } else workspaceLogger.warn("The item: " + workspaceItem.getId() + " is not trashed"); } return trashContent; } catch (Exception e) { workspaceLogger.error("Error in server TrashConten", e); String error = ConstantsExplorer.SERVER_ERROR + " get Trash content. " + e.getMessage(); throw new Exception(error); } } /** * Update trash content. * * @param operation * the operation * @return the trash content * @throws Exception * the exception */ @Override public TrashContent updateTrashContent(WorkspaceTrashOperation operation) throws Exception { workspaceLogger.info("Updating TrashContent with operation: " + operation); try { org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); TrashContent result = new TrashContent(); switch (operation) { case EMPTY_TRASH: workspace.emptyTrash(); // case RESTORE_ALL: // //listErrors = trash.restoreAll(); // //workspace.re // break; case REFRESH: default: result.setTrashContent(getTrashContent()); // THIS WORKING WITH // STORAGE-HUB return result; } } catch (Exception e) { workspaceLogger.error("Error in server TrashContent", e); String error = ConstantsExplorer.SERVER_ERROR + " update Trash content. " + e.getMessage(); throw new Exception(error); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * executeOperationOnTrash(java.util.List, * org.gcube.portlets.user.workspace.shared.WorkspaceTrashOperation) */ /** * Execute operation on trash. * * @param listTrashItemIds * the list trash item ids * @param operation * the operation * @return the trash operation content * @throws Exception * the exception */ @Override public TrashOperationContent executeOperationOnTrash(List listTrashItemIds, WorkspaceTrashOperation operation) throws Exception { workspaceLogger.info("Get TrashContent, operation: " + operation); if (listTrashItemIds == null || listTrashItemIds.size() == 0) throw new Exception("List of Trash item ids is null or empty"); List listContentError = new ArrayList(); try { org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); // WorkspaceTrashFolder trash = workspace.getTrash(); TrashOperationContent result = new TrashOperationContent(); result.setOperation(operation); List listUpdatedTrashIds = new ArrayList(); switch (operation) { case DELETE_PERMANENTLY: { boolean deleted = false; for (String trashItemId : listTrashItemIds) { try { org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem trashedItem = workspace .getItem(trashItemId); if (trashedItem != null && trashedItem.isTrashed()) { workspace.deleteItem(trashedItem.getId()); listUpdatedTrashIds.add(trashItemId); deleted = true; } } catch (Exception e) { workspaceLogger.warn("Error on DELETE_PERMANENTLY the item : " + trashItemId, e); FileTrashedModel fakeFile = new FileTrashedModel(); fakeFile.setIdentifier(trashItemId); listContentError.add(fakeFile); } } String label = listTrashItemIds.size() > 1 ? "items" : "item"; if (!deleted) throw new Exception( "Sorry, an error occurred on deleting permanently the trash " + label + ", try again"); break; } case RESTORE: { boolean restored = false; for (String trashItemId : listTrashItemIds) { try { org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem trashedItem = workspace .getItem(trashItemId); if (trashedItem != null && trashedItem.isTrashed()) { workspace.restoreThrashItem(trashedItem.getId()); listUpdatedTrashIds.add(trashItemId); restored = true; } } catch (Exception e) { workspaceLogger.warn("Error on RESTORE the item : " + trashItemId, e); FileTrashedModel fakeFile = new FileTrashedModel(); fakeFile.setIdentifier(trashItemId); listContentError.add(fakeFile); } } String label = listTrashItemIds.size() > 1 ? "items" : "item"; if (!restored) throw new Exception("Sorry, an error occurred on restoring the trash " + label + ", try again"); break; } default: break; } if (!listContentError.isEmpty()) { result.setListErrors(listContentError); } result.setListTrashIds(listUpdatedTrashIds); return result; } catch (Exception e) { workspaceLogger.error("Error in server executeOperationOnTrash", e); String error = ConstantsExplorer.SERVER_ERROR + " updating the trash content. " + e.getMessage(); throw new Exception(error); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * deleteListItemsForIds(java.util.List) */ /** * Delete list items for ids. * * @param ids * the ids * @return the list * @throws Exception * the exception */ @Override public List deleteListItemsForIds(List ids) throws Exception { try { if (ids == null) throw new Exception("List identifiers is null"); workspaceLogger.debug("called deleteListItemsForIds with: " + ids.size() +" id/s"); // Workspace workspace = getWorkspace(); org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); String[] items = new String[ids.size()]; items = ids.toArray(items); Map garbage = new HashMap(items.length); // SAVE DATE FOR NOTIFICATIONS for (String itemId : ids) { // NOTIFICATION org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(itemId); checkItemLocked(itemId); // SAVING ATTRIBUTE FOR NOTIFICATION boolean sourceItemIsShared = wsItem.isShared(); String itemName = wsItem.getName(); String sourceFolderSharedId = null; try { if (sourceItemIsShared) { org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem rootSharedFolder = workspace .getRootSharedFolder(itemId); sourceFolderSharedId = rootSharedFolder.getId(); } // REMOVE ITEM garbage.put(itemId, new GarbageItem(sourceItemIsShared, itemName, itemId, sourceFolderSharedId)); } catch (Exception e) { workspaceLogger.warn("Impossible to send notifiaction for item with id: " + itemId); } } // ITEM ID - ERROR Map backendError = workspace.removeItems(items); // GARBAGE ITEM ERROR List frontEndError = new ArrayList(backendError.size()); // REMOVING IDS WHICH HAVE GENERATED AN ERROR for (String idError : backendError.keySet()) { GarbageItem gbi = garbage.get(idError); if (gbi != null) { frontEndError.add(gbi); garbage.remove(idError); } } NotificationsProducerToStorageHub np = getNotificationProducerToStorageHub(); for (String idItem : garbage.keySet()) { GarbageItem item = garbage.get(idItem); workspaceLogger.trace("Check notification for " + item); // IF SOURCE SHARED FOLDER IS NOT NULL if (item.getSourceFolderSharedId() != null) NotificationStorageHubUtil.checkSendNotifyRemovedItemFromShare(this.getThreadLocalRequest(), item.isSourceItemIsShared(), item.getOldItemName(), item.getOldItemName(), item.getSourceFolderSharedId(), workspace, np); } return frontEndError; } catch (WorkspaceFolderLocked e1) { throw new Exception(e1.getMessage()); // } catch (InsufficientPrivilegesException e) { // workspaceLogger.error("Error in server Item remove", e); // String error = "An error occurred on deleting item. " + e.getMessage(); // throw new Exception(error); // // } catch (ItemNotFoundException e) { // String error = "An error occurred on deleting item. " + ConstantsExplorer.ERROR_ITEM_DOES_NOT_EXIST; // workspaceLogger.error(error, e); // throw new Exception(error); } catch (Exception e) { workspaceLogger.error("Error in server Item remove", e); String error = ConstantsExplorer.SERVER_ERROR + " deleting item. " + e.getMessage(); throw new Exception(error); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * createFolder(java.lang.String, java.lang.String, * org.gcube.portlets.user.workspace.client.model.FileModel) */ /** * Creates the folder. * * @param nameFolder * the name folder * @param description * the description * @param parent * the parent * @return the folder model * @throws Exception * the exception */ @Override public FolderModel createFolder(String nameFolder, String description, FileModel parent) throws Exception { if (isSessionExpired()) throw new SessionExpiredException(); try { boolean isParentNull = parent == null; workspaceLogger.debug("Create folder: " + nameFolder + " parent is null? "+isParentNull); if (nameFolder == null) throw new Exception("Folder name is null"); checkItemLocked(parent.getIdentifier()); org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); // Creating the folder org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceFolder wsFolder = workspace.createFolder(nameFolder, description, parent.getIdentifier()); // Getting the parent folder org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceFolder parentFolderDestionation = (org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceFolder) workspace .getItem(parent.getIdentifier()); NotificationsProducerToStorageHub np = getNotificationProducerToStorageHub(); NotificationStorageHubUtil.checkNotifyAddItemToShare(wsFolder, null, parentFolderDestionation, workspace, np); StorageHubToWorkpaceConverter converter = getStorageHubToWorkpaceConverter(); return (FolderModel) converter.toTreeFileModel(wsFolder, parent, parentFolderDestionation.isShared()); } catch (WorkspaceFolderLocked e1) { throw new Exception(e1.getMessage()); // } catch (InsufficientPrivilegesException e) { // String error = "Insufficient Privileges to create the folder"; // workspaceLogger.error(error, e); // throw new Exception(error); // } catch (ItemAlreadyExistException e) { // String error = "An error occurred on creating folder, " + e.getMessage(); // workspaceLogger.error(error, e); // throw new Exception(error); } catch (Exception e) { String error = "Error on creating folder. Either the folder already exist or you do not have the permission to create it"; workspaceLogger.error(error, e); throw new Exception(error); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * moveItems(java.util.List, java.lang.String) */ /** * Move items. * * @param ids * the ids * @param destinationId * the destination id * @return the boolean * @throws Exception * the exception */ @Override public WorkspaceOperationResult moveItems(List ids, String destinationId) throws Exception { workspaceLogger.trace("moveItems " + ids.size() + ", destination: " + destinationId); if (isSessionExpired()) throw new SessionExpiredException(); // boolean error = false; WorkspaceOperationResult results = new WorkspaceOperationResult(); results.setOperationName("Move Items"); try { checkItemLocked(destinationId); org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem folderDestinationItem = workspace .getItem(destinationId); // retrieve folder destination org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceFolder folderDestination = null; if (folderDestinationItem != null && folderDestinationItem.isFolder()) { folderDestination = (org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceFolder) folderDestinationItem; } else throw new Exception("Wrong destination. Either It is not a folder or not exist"); for (String itemId : ids) { org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem sourceItem = null; try { if (itemId == null) throw new Exception(IDENTIFIER_IS_NULL); workspaceLogger.trace("Moving item id: " + itemId + " in the destination: " + destinationId); sourceItem = workspace.getItem(itemId); // GET SOURCE ITEM // BEFORE OF MOVE checkItemLocked(itemId); String sourceRootSharedFolderId = null; boolean sourceItemIsShared = sourceItem.isShared(); // JUST ONCE TO REDUCE THE NUMBER OF CALLS TO STORAGEHUB if (sourceItemIsShared && sourceRootSharedFolderId == null) { org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem sourceShared = workspace .getRootSharedFolder(itemId); sourceRootSharedFolderId = sourceShared.getId(); // GET // SHARED // ID // BEFORE // OF // MOVE } workspaceLogger .debug("Invoking move on source item id: " + itemId + " with name: " + sourceItem.getName() + " shared: " + sourceItemIsShared + " destination: " + destinationId); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem movedItem = workspace.moveItem(itemId, destinationId); // move item workspaceLogger.debug("Moved item: " + movedItem); try { // NOTIFY? NotificationsProducerToStorageHub np = getNotificationProducerToStorageHub(); NotificationStorageHubUtil.checkNotifyAddItemToShare(movedItem, sourceRootSharedFolderId, folderDestination, workspace, np); NotificationStorageHubUtil.checkNotifyMoveItemFromShare(sourceItemIsShared, sourceItem, sourceRootSharedFolderId, folderDestination, workspace, np); } catch (Exception e) { workspaceLogger.error("An error occurred in checkNotify ", e); } } catch (Exception e) { String error = results.getError(); if (error == null) error = "Error on moving:"; error += " "; error += sourceItem != null ? sourceItem.getName() : "item is null"; error += ","; results.setError(error); } } // removing last ',' if (results.getError() != null) results.setError(results.getError().substring(0, results.getError().length() - 1)); workspaceLogger.info("Moved error: " + results.getError()); if (results.getError() != null) results.setError(results.getError() + ". Operation not allowed. Moving to wrong path, either it is a shared folder or you have not the permission to move the item"); return results; } catch (WorkspaceFolderLocked e1) { throw new Exception(e1.getMessage()); // } catch (InsufficientPrivilegesException e) { // workspaceLogger.error("Error in server Item move", e); // String error1 = "An error occurred on moving item. " + e.getMessage(); // throw new Exception(error1); } catch (Exception e) { workspaceLogger.error("Item move error.", e); String error2 = ConstantsExplorer.SERVER_ERROR + " moving item/s. " + e.getMessage(); throw new Exception(error2); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * renameItem(java.lang.String, java.lang.String, java.lang.String) */ /** * Rename item. * * @param itemId * the item id * @param newName * the new name * @param previousName * the previous name * @return the boolean * @throws Exception * the exception */ @Override public Boolean renameItem(String itemId, String newName, String previousName) throws Exception { if (isSessionExpired()) throw new SessionExpiredException(); boolean sourceItemIsShared = false; try { if (itemId == null) throw new Exception(IDENTIFIER_IS_NULL); checkItemLocked(itemId); org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); workspaceLogger.debug("Renaming item with id: " + itemId + " from old name " + previousName + ", to new name: " + newName); //Needed to check if the item is shared org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(itemId); sourceItemIsShared = wsItem.isShared(); wsItem = workspace.renameItem(itemId, newName); workspaceLogger.debug("Item renamed is: " + wsItem); // SEND NOTIFY? if (sourceItemIsShared) { try { List listSharedContact = new ArrayList(); NotificationsProducerToStorageHub np = getNotificationProducerToStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem sourceShared = workspace.getRootSharedFolder(wsItem.getId()); // NotificationsManager nManager = // WsUtil.getNotificationManager(this.getThreadLocalRequest()); listSharedContact = NotificationStorageHubUtil.getListUserSharedByFolderSharedId(sourceShared, workspace); // THE ITEM RENAMED IS A SHARED FOLDER if (NotificationStorageHubUtil.isFolderAndShared(wsItem)) { np.notifyFolderRenamed(listSharedContact, wsItem, previousName, newName, sourceShared.getId()); } else { // THE ITEM RENAMED IS A SHARED ITEM //if (sourceShared instanceof org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceSharedFolder) np.notifyItemRenamed(listSharedContact, previousName, wsItem, (org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceFolder) sourceShared, workspace); } } catch (Exception e) { workspaceLogger.error("An error occurred in checkNotify ", e); return true; } } return true; } catch (WorkspaceFolderLocked e1) { throw new Exception(e1.getMessage()); // } catch (ItemAlreadyExistException e) { // String error = "An error occurred on renaming item, " + e.getMessage(); // workspaceLogger.error(error, e); // throw new Exception(error); // } catch (ItemNotFoundException e2) { // String error = "An error occurred on renaming item. " + ConstantsExplorer.ERROR_ITEM_DOES_NOT_EXIST; // workspaceLogger.error(error, e2); // throw new Exception(error); //TO STORAGEHUB EXCEPTION } catch (UserNotAuthorizedException e) { String error = "Insufficient Privileges to rename the item"; workspaceLogger.error(error, e); throw new Exception(error); } catch (Exception e) { workspaceLogger.error("Renaming item error:", e); StringBuilder error = new StringBuilder(); if(sourceItemIsShared) { error.append("Ops! This operation is not allowed, we're working hard to make this possible soon."); throw new SHUBOperationNotAllowedException(error.toString()); }else { error.append("Ops an error occurred renaming the item! Either you have not the permission to rename it or a server error occurred. Please, refresh and try again"); throw new Exception(error.toString()); } } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * copyItems(java.util.List, java.lang.String) */ /** * Copy items. * * @param idsItem * the ids item * @param destinationFolderId * the destination folder id * @return the workspace operation result * @throws Exception * the exception */ @Override public WorkspaceOperationResult copyItems(List idsItem, String destinationFolderId) throws Exception { workspaceLogger.debug("Copying ids: " + idsItem + " in the destionation folder: " + destinationFolderId); if (isSessionExpired()) throw new SessionExpiredException(); // boolean error = false; WorkspaceOperationResult results = new WorkspaceOperationResult(); results.setOperationName("Copy Items"); try { checkItemLocked(destinationFolderId); org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem sourceItem = null; org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem folderDestinationItem = workspace .getItem(destinationFolderId); NotificationsProducerToStorageHub np = getNotificationProducerToStorageHub(); String sourceRootSharedId = null; for (String itemId : idsItem) { try { sourceItem = workspace.getItem(itemId); // GET SOURCE ITEM // BEFORE COPY // JUST ONCE. THE ROOT SHARED IS THE SAME FOR ALL ITEMS if (sourceItem.isShared() && sourceRootSharedId != null) { org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem sourceShared = workspace .getRootSharedFolder(sourceItem.getId()); sourceRootSharedId = sourceShared.getId(); } workspaceLogger.debug("Copying item with id: " + sourceItem.getId()); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem copiedFile = workspace .copyFile(sourceItem.getId(), destinationFolderId); // copy // item workspaceLogger.debug("Copied item is: " + copiedFile); // final WorkspaceItem workspaceItem, final String // sourceRootSharedFolderId, final WorkspaceFolder // parentFolderItem, // org.gcube.common.storagehubwrapper.server.tohl.Workspace // workspace, NotificationsProducerToStorageHub np) { NotificationStorageHubUtil.checkNotifyAddItemToShare(copiedFile, sourceRootSharedId, (org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceFolder) folderDestinationItem, workspace, np); } catch (Exception e) { String error = results.getError(); if (error == null) error = "Error on copying:"; error += " "; error += sourceItem != null ? sourceItem.getName() : "item is null"; error += ","; results.setError(error); } } // removing last ',' if (results.getError() != null) results.setError(results.getError().substring(0, results.getError().length() - 1)); workspaceLogger.info("Copied error: " + results.getError()); if (results.getError() != null) results.setError(results.getError() + ". Operation not allowed"); return results; } catch (WorkspaceFolderLocked e1) { throw new Exception(e1.getMessage()); // } catch (InsufficientPrivilegesException e) { // String error = "An error occurred on copying item, " + e.getMessage() + ". " + ConstantsExplorer.TRY_AGAIN; // throw new Exception(error); // // } catch (ItemAlreadyExistException e) { // String error = "An error occurred on copying item, " + e.getMessage(); // throw new Exception(error); } catch (Exception e) { workspaceLogger.error("Error in server copyItem by id", e); String error = ConstantsExplorer.SERVER_ERROR + " copying item " + ConstantsExplorer.TRY_AGAIN; throw new Exception(error); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * getPublicLinkForFileItemId(java.lang.String, boolean) */ /** * Gets the public link for file item id. * * @param itemId * the item id * @param shortenUrl * the shorten url * @return the public link for file item id * @throws Exception * the exception */ @Override public PublicLink getPublicLinkForFileItemId(String itemId, boolean shortenUrl) throws Exception { workspaceLogger.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)"); org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(itemId); if (wsItem == null) throw new Exception("Sorry, The Public Link for empty item is unavailable"); if (wsItem.getType().equals(org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItemType.FILE_ITEM)) { URL publicLink = workspace.getPublicLinkForFile(itemId); if (publicLink == null || publicLink.toString() == null) throw new Exception("Sorry, public link on " + wsItem.getName() + " is not available"); String shortURL = null; String httpURL = publicLink.toString(); if (shortenUrl) { shortURL = getShortUrl(httpURL); shortURL = shortURL != null ? shortURL : "not available"; } return new PublicLink(httpURL, shortURL); } else { workspaceLogger.warn("ItemId: " + itemId + " is not a file, sent exception Public Link unavailable"); throw new Exception("Sorry, The Public Link for selected item is unavailable"); } } catch (Exception e) { workspaceLogger.error("Error getPublicLinkForFileItemId for item: " + itemId, e); throw new Exception(e.getMessage()); } } /** * Gets the version history. * * @param fileIdentifier * the file identifier * @return the version history * @throws Exception * the exception */ @Override public List getVersionHistory(String fileIdentifier) throws Exception { workspaceLogger.info("Calling get Version History of: " + fileIdentifier); if (fileIdentifier == null) throw new Exception("File identifier is null"); try { org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(fileIdentifier); if (wsItem.getType().equals(org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItemType.FILE_ITEM)) { List listOfVersions = workspace.getListVersionsForFile(fileIdentifier); StorageHubToWorkpaceConverter converter = getStorageHubToWorkpaceConverter(); workspaceLogger .info("Version list for " + fileIdentifier + " has " + listOfVersions.size() + " item/s"); return converter.toVersionHistory(listOfVersions); } else throw new FileNotVersionedException("Selected file is not versioned"); } catch (Exception e) { if (e instanceof FileNotVersionedException) throw new Exception(e.getMessage()); String error = "An error occurred when getting version history of: " + fileIdentifier + ", try again"; workspaceLogger.error(error); throw new Exception(error); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * getPublicLinkForFileItemIdToVersion(java.lang.String, java.lang.String, * boolean) */ @Override public PublicLink getPublicLinkForFileItemIdToVersion(String itemId, String version, boolean shortenUrl) throws Exception { workspaceLogger.trace("get Public Link For ItemId: " + itemId + " at the version: " + version); try { if (itemId == null) throw new Exception("Sorry, The Public Link for empty item is unavailable (itemId is null)"); org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(itemId); if (wsItem == null) throw new Exception("Sorry, The Public Link for empty item is unavailable"); if (wsItem.getType().equals(org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItemType.FILE_ITEM)) { URL publicLink = workspace.getPublicLinkForFile(itemId, version); if (publicLink == null || publicLink.toString() == null) throw new Exception("Sorry, public link on " + wsItem.getName() + " is not available"); String shortURL = null; String httpURL = publicLink.toString(); if (shortenUrl) { shortURL = getShortUrl(httpURL); shortURL = shortURL != null ? shortURL : ""; } return new PublicLink(httpURL, shortURL); } else { workspaceLogger.warn("ItemId: " + itemId + " is not a file, sent exception Public Link unavailable"); throw new Exception("Sorry, The Public Link for selected item is unavailable"); } } catch (Exception e) { workspaceLogger.error( "Error getPublicLinkForFileItemIdToVersion for item: " + itemId + " at the version: " + version, e); throw new Exception(e.getMessage()); } } /** * Gets the list 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 getListParentsByItemIdentifier(String itemIdentifier, boolean includeItemAsParent) throws Exception { workspaceLogger.debug("called get List Parents by SHUB for id " + itemIdentifier + ", include Item As (Last) Parent: " + includeItemAsParent); if (isSessionExpired()) throw new SessionExpiredException(); if (itemIdentifier == null) return new ArrayList(); // empty list try { org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); StorageHubToWorkpaceConverter converter = getStorageHubToWorkpaceConverter(); List parents = workspace.getParentsById(itemIdentifier); workspaceLogger.info("The Parents returned by SHUB are: " + parents.size()); if(workspaceLogger.isTraceEnabled()) { workspaceLogger.trace("They are: "); for (org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem workspaceItem : parents) { workspaceLogger.trace(workspaceItem.getName()); } } if(parents.size()==0) { //IT IS THE ROOT workspaceLogger.info("The item id "+itemIdentifier+" is the root, returning empty list"); return new ArrayList(1); } String nameSpecialFolder = getNameForSpecialFolder(); List arrayParents = new ArrayList(parents.size()); //loop from last to first index of list of parents int lastIndex = parents.size()-1; for (int i=lastIndex; i>=0; i--) { org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsFolder = parents.get(i); workspaceLogger.trace("Adding the item "+ wsFolder.getName()+" at index "+i+" to list of parent"); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem parent = null; if(i breadcrumbs = new ArrayList(arrayParents.size() - 1); for (int i = 1; i < arrayParents.size(); i++) { breadcrumbs.add(arrayParents.get(i)); } return breadcrumbs; } else return arrayParents; } catch (Exception e) { workspaceLogger.error("Error in get List Parents By Item Identifier ", e); e.printStackTrace(); throw new Exception(e.getMessage()); } } /** * Check item locked. * * @param itemId the item id * @return true, if successful * @throws WorkspaceFolderLocked the workspace folder locked * @throws Exception the exception */ private boolean checkItemLocked(String itemId) throws WorkspaceFolderLocked, Exception { if (itemId == null || itemId.isEmpty()) throw new Exception(IDENTIFIER_IS_NULL); org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = null; org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = null; try { workspace = getWorkspaceFromStorageHub(); wsItem = workspace.getItem(itemId); // IF THE ITEM IS A FOLDER, CHECKING IT if (wsItem.isFolder()) WorkspaceThreddsSynchronize.getInstance().checkItemSynched(wsItem.getId()); else { // IF THE ITEM IS A FILE, CHECKING ITS PARENT String parentId = wsItem.getParentId(); if(parentId==null) { workspaceLogger.warn("I'm not able to check the lock because the parent id is null"); }else { WorkspaceThreddsSynchronize.getInstance().checkItemSynched(parentId); } } // in this case the folder is synched but not locked return false; } catch (ItemNotSynched e1) { // in this case the folder is not synched; return false; } catch (WorkspaceFolderLocked e2) { // in this case the folder synching is on-going and the folder is // locked; String msg = "The folder"; msg += wsItem != null ? ": " + wsItem.getName() : ""; msg += " is locked by a sync. You can not change its content"; workspaceLogger.warn(msg, e2); throw new WorkspaceFolderLocked(itemId, msg); // } catch (InternalErrorException | ItemNotFoundException | HomeNotFoundException // | WorkspaceFolderNotFoundException e) { // workspaceLogger.warn(e); // throw new Exception("Sorry an error occurred during checking is folder locked, Refresh and try again"); } catch (Exception e) { workspaceLogger .warn("Was there an Exception HL side? Ignoring it.. returning false (that means item not locked)"); return false; } } /* (non-Javadoc) * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService#getItemForFileGrid(java.lang.String) */ @Override public FileGridModel getItemForFileGrid(String itemId) throws Exception { try { if (itemId == null) throw new Exception(IDENTIFIER_IS_NULL); org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(itemId); StorageHubToWorkpaceConverter converter = getStorageHubToWorkpaceConverter(); FileModel parentModel = null; if(wsItem.getParentId()!=null) { org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem parent = workspace.getItem(wsItem.getParentId()); parentModel = converter.toTreeFileModel(parent, null, parent.isShared()); } return converter.toGridFileModel(wsItem, parentModel); } catch (Exception e) { workspaceLogger.error("Error in server during item retrieving, getItemForFileGrid", e); String error = ConstantsExplorer.SERVER_ERROR + RETRIEVING_ITEM_EITHER_ITEM_DOESN_T_EXIST; throw new Exception(error); } } /* (non-Javadoc) * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService#getItemForFileTree(java.lang.String) */ @Override public FileModel getItemForFileTree(String itemId) throws Exception { try { if (itemId == null) throw new Exception(IDENTIFIER_IS_NULL); org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(itemId); StorageHubToWorkpaceConverter converter = getStorageHubToWorkpaceConverter(); FileModel parentModel = null; org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem parent = null; if(wsItem.getParentId()!=null) { parent = workspace.getItem(wsItem.getParentId()); parentModel = converter.toTreeFileModel(parent, null, parent.isShared()); } return converter.toTreeFileModel(wsItem, parentModel, parent!=null?parent.isShared():false); } catch (Exception e) { workspaceLogger.error("Error in server during item retrieving, getItemForFileGrid", e); String error = ConstantsExplorer.SERVER_ERROR + RETRIEVING_ITEM_EITHER_ITEM_DOESN_T_EXIST; throw new Exception(error); } } /* (non-Javadoc) * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService#getImageById(java.lang.String, boolean, boolean) */ @Override public GWTWorkspaceItem getImageById(String identifier, boolean isInteralImage, boolean fullDetails) throws Exception { if (identifier == null) throw new Exception(IDENTIFIER_IS_NULL); try { workspaceLogger.debug("get image by id: " + identifier); org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(identifier); if(wsItem instanceof ImageFileItem) { ImageFileItem imageFile = (ImageFileItem) wsItem; PortalContextInfo context = WsUtil.getPortalContext(this.getThreadLocalRequest()); GCubeUser user = PortalContext.getConfiguration().getCurrentUser(this.getThreadLocalRequest()); return ObjectStorageHubToWorkpaceMapper.buildGWTWorkspaceImage(imageFile, isInteralImage, fullDetails, context.getCurrGroupId() + "", user.getUserId() + ""); }else { throw new Exception("The input id is not an image"); } } catch (Exception e) { workspaceLogger.error("Error in server get image by id", e); throw new Exception(e.getMessage()); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * getUrlById(java.lang.String, boolean, boolean) */ /** * Gets the url by id. * * @param identifier * the identifier * @param isInternalUrl * the is internal url * @param fullDetails * the full details * @return the url by id * @throws Exception * the exception */ @Override public GWTWorkspaceItem getUrlById(String identifier, boolean isInternalUrl, boolean fullDetails) throws Exception { try { if (identifier == null) throw new Exception(IDENTIFIER_IS_NULL); workspaceLogger.debug("get URL by id: " + identifier); org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(identifier); // workspace if(wsItem instanceof org.gcube.common.storagehubwrapper.shared.tohl.impl.URLFileItem) { URLFileItem fileItem = (URLFileItem) wsItem; return ObjectStorageHubToWorkpaceMapper.buildGWTWorspaceUrl(workspace, fileItem, isInternalUrl, fullDetails); }else if (wsItem instanceof URLItem){ URLItem urlFile = (URLItem) wsItem; return new GWTExternalUrl(urlFile.getValue().toString()); }else { throw new Exception("The input id is not a FILE or a URL"); } } catch (Exception e) { workspaceLogger.error("Error in server get image by id ", e); // workspaceLogger.trace("Error in server get image by id " + e); // GWT can't serialize all exceptions throw new Exception(e.getMessage()); } } /** * Sets the value in session. * * @param name * the name * @param value * the value * @throws Exception * the exception */ @Override public void setValueInSession(String name, String value) throws Exception { try { this.getThreadLocalRequest().getSession().setAttribute(name, value); workspaceLogger.trace("set value in session with name: " + name + ", value: " + value); } catch (Exception e) { workspaceLogger.error("setValueInSession", e); throw new Exception(e.getMessage()); } } /* (non-Javadoc) * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService#getItemCreationDateById(java.lang.String) */ @Override public Date getItemCreationDateById(String itemId) throws Exception { workspaceLogger.trace("get Item Creation Date By ItemId " + itemId); try { if (itemId == null) throw new Exception(IDENTIFIER_IS_NULL); workspaceLogger.debug("getItemCreationDateById by id: " + itemId); org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(itemId); Calendar cl = wsItem.getCreationTime(); if (cl != null) return cl.getTime(); return null; } catch (Exception e) { workspaceLogger.error("get Item Creation Date By ItemId ", e); throw new Exception(e.getMessage()); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * loadSizeByItemId(java.lang.String) */ /** * Load size by item id. * * @param itemId * the item id * @return the long * @throws Exception * the exception */ @Override public Long loadSizeByItemId(String itemId) throws Exception { if (itemId == null) throw new Exception(IDENTIFIER_IS_NULL); workspaceLogger.info("get Size By ItemId " + itemId); try { org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(itemId); Long size = new Long(-1); if (wsItem instanceof org.gcube.common.storagehubwrapper.shared.tohl.impl.FileItem) { // ITEM org.gcube.common.storagehubwrapper.shared.tohl.impl.FileItem fileItem = (org.gcube.common.storagehubwrapper.shared.tohl.impl.FileItem) wsItem; size = new Long(fileItem.getSize()); } else if (wsItem instanceof org.gcube.common.storagehubwrapper.shared.tohl.impl.WorkspaceFolder) { // FOLDER org.gcube.common.storagehubwrapper.shared.tohl.impl.WorkspaceFolder theFolder = (org.gcube.common.storagehubwrapper.shared.tohl.impl.WorkspaceFolder) wsItem; //TODO ASK TO LUCIO; //size = theFolder.getSize(); } else if (wsItem instanceof org.gcube.common.storagehubwrapper.shared.tohl.impl.WorkspaceSharedFolder) { // SHARED FOLDER org.gcube.common.storagehubwrapper.shared.tohl.impl.WorkspaceSharedFolder theFolder = (org.gcube.common.storagehubwrapper.shared.tohl.impl.WorkspaceSharedFolder) wsItem; //TODO ASK TO LUCIO; //size = theFolder.getSize(); } workspaceLogger.info("returning size: " + size); return size; } catch (Exception e) { workspaceLogger.error("get Size By ItemId ", e); throw new Exception(e.getMessage()); } } /* (non-Javadoc) * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService#loadLastModificationDateById(java.lang.String) */ @Override public Date loadLastModificationDateById(String itemId) throws Exception { if (itemId == null) throw new Exception(IDENTIFIER_IS_NULL); workspaceLogger.trace("get last modification date ItemId " + itemId); try { org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(itemId); Date lastModification = null; if (wsItem.getLastModificationTime() != null) { lastModification = wsItem.getLastModificationTime().getTime(); } return lastModification; } catch (Exception e) { workspaceLogger.error("get last modification date ItemId ", e); throw new Exception(e.getMessage()); } } /* (non-Javadoc) * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService#getParentByItemId(java.lang.String) */ //TODO NEED TO TEST IT @Override public FileModel getParentByItemId(String identifier) throws Exception { if (identifier == null) throw new Exception(IDENTIFIER_IS_NULL); workspaceLogger.trace("get Parent By Item Identifier " + identifier); try { org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(identifier); workspaceLogger.trace("workspace has returned item name: " + wsItem.getName()); FileModel parentModel = null; if(wsItem!=null && wsItem.getParentId()!=null) { org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem parent = workspace.getItem(wsItem.getParentId()); StorageHubToWorkpaceConverter converter = getStorageHubToWorkpaceConverter(); parentModel = converter.toTreeFileModel(parent, null, parent.isShared()); } workspaceLogger.trace("parent not found - retuning"); return parentModel; } catch (Exception e) { workspaceLogger.error("Error in get Parent By Item Identifier", e); e.printStackTrace(); throw new Exception(e.getMessage()); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * getShortUrl(java.lang.String) */ /** * Gets the short url. * * @param longUrl * the long url * @return the short url * @throws Exception * the exception */ @Override public String getShortUrl(String longUrl) throws Exception { workspaceLogger.trace("get short url for " + longUrl); UrlShortener shortener = getUrlShortener(); try { if (shortener != null && shortener.isAvailable()) return shortener.shorten(longUrl); return longUrl; } catch (Exception e) { workspaceLogger.error("Error get short url for ", e); return null; } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * getLinkForSendToSwitchBoard(java.lang.String) */ /** * Gets the link for send to switch board. * * @param itemId * the item id * @return the link for send to switch board * @throws Exception * the exception */ @Override public String getLinkForSendToSwitchBoard(String itemId) throws Exception { String fallbackValue = ConstantsExplorer.CLARIN_SWITCHBOARD_ENDPOINT_FALLBACK; String sbEndpoint = ""; try { sbEndpoint = getCLARINSwitchBoardEndpoint(); } catch (Exception e) { workspaceLogger.error( "Could not find CLARINSwitchBoardEndpoint on IS, returning fallback value: " + fallbackValue); sbEndpoint = fallbackValue; } String URI = getPublicLinkForFileItemId(itemId, false).getCompleteURL(); workspaceLogger.debug("Got LinkForSendToSwitchBoard: " + URI + " encoding ..."); String encodedURI = URLEncoder.encode(getPublicLinkForFileItemId(itemId, false).getCompleteURL(), "UTF-8"); workspaceLogger.debug("LinkForSendToSwitchBoard: " + encodedURI + " encoded ..."); return new StringBuilder(sbEndpoint).append(encodedURI).toString(); } /* (non-Javadoc) * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService#getItemDescriptionById(java.lang.String) */ @Override public String getItemDescriptionById(String identifier) throws Exception { workspaceLogger.info("Getting ItemDescriptionById: " + identifier); if (identifier == null || identifier.isEmpty()) { workspaceLogger.warn("Getting ItemDescriptionById identifier is null or empty, returning null"); return null; } try { org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(identifier); workspaceLogger.trace("workspace has returned item name: " + wsItem.getName()); return wsItem.getDescription(); } catch (Exception e) { workspaceLogger.error("Error in server ItemDescriptionById: ", e); String error = ConstantsExplorer.SERVER_ERROR + " getting description for item id: " + identifier; throw new Exception(error); } } /* (non-Javadoc) * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService#getUserWorkspaceSize() */ @Override public String getUserWorkspaceSize() throws Exception { try { workspaceLogger.info("Getting workspace size.."); org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); long size = workspace.getDiskUsage(); // workspaceLogger.info("Root size is: "+size +" formatting.."); String formatSize = FormatterUtil.formatFileSize(size); workspaceLogger.info("returning workspace size: " + formatSize); return formatSize; } catch (Exception e) { workspaceLogger.error("Error on UserWorkspaceSize", e); String error = ConstantsExplorer.SERVER_ERROR + " getting disk usage"; throw new Exception(error); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * getUserWorkspaceTotalItems() */ /** * Gets the user workspace total items. * * @return the user workspace total items * @throws Exception * the exception */ @Override public long getUserWorkspaceTotalItems() throws Exception { try { workspaceLogger.info("Getting total items.."); org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); long size = workspace.getTotalItems(); workspaceLogger.info("returning total items value: " + size); return size; } catch (Exception e) { workspaceLogger.error("Error on UserWorkspaceSize", e); String error = ConstantsExplorer.SERVER_ERROR + " getting total items"; throw new Exception(error); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * getUserWorkspaceQuote() */ /** * Gets the user workspace quote. * * @return the user workspace quote * @throws Exception * the exception */ @Override public WorkspaceUserQuote getUserWorkspaceQuote() throws Exception { try { workspaceLogger.info("Getting UserWorkspaceQuote.."); org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); long size = workspace.getDiskUsage(); workspaceLogger.info("Root size is: " + size + " formatting.."); String formatSize = FormatterUtil.formatFileSize(size); long total = getUserWorkspaceTotalItems(); WorkspaceUserQuote quote = new WorkspaceUserQuote(); quote.setDiskSpace(size); quote.setDiskSpaceFormatted(formatSize); quote.setTotalItems(total); workspaceLogger.info("returning user quote: " + quote); return quote; } catch (Exception e) { workspaceLogger.error("Error on UserWorkspaceQuote", e); return null; } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * loadGcubeItemProperties(java.lang.String) */ /** * Load gcube item properties. * * @param itemId * the item id * @return the map * @throws Exception * the exception */ @Override public Map loadGcubeItemProperties(String itemId) throws Exception { workspaceLogger.info("Getting GcubeItemProperties for itemId: " + itemId); if (itemId == null || itemId.isEmpty()) { workspaceLogger.warn("Getting GcubeItemProperties identifier is null or empty, returning null"); return null; } try { org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); PropertyMap properties = workspace.getGcubeItemProperties(itemId); StorageHubToWorkpaceConverter converter = getStorageHubToWorkpaceConverter(); Map mapProperties = converter.toSimpleMap(properties); if (mapProperties != null) workspaceLogger.info("Returning " + mapProperties.size() + " properties"); else workspaceLogger.info("Returning null properties"); return mapProperties; } catch (Exception e) { workspaceLogger.error("Error in server GcubeItemProperties: ", e); String error = ConstantsExplorer.SERVER_ERROR + " getting gcube item properties for item id: " + itemId; throw new Exception(error); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * getItemsBySearchName(java.lang.String) */ /** * Gets the items by search name. * * @param text * the text * @param folderId * the folder id * @return the items by search name * @throws Exception * the exception */ @Override public List getItemsBySearchName(String text, String folderId) throws Exception { try { org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); if (folderId == null || folderId.isEmpty()) { workspaceLogger.debug("searching folderId is null, searching from the root folder"); folderId = workspace.getRoot().getId(); } workspaceLogger.info("searching by text: " + text + " in the folder id: " + folderId); List foundItems = workspace.search(text, folderId); if(foundItems==null) { workspaceLogger.info("Searching by SHUB returned null, instancing empty list"); foundItems = new ArrayList(); } workspaceLogger.info("Searching by SHUB returned " + foundItems.size() + " item/s, converting it/them"); StorageHubToWorkpaceConverter converter = getStorageHubToWorkpaceConverter(); List listFileGridModels = new ArrayList(); for (org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem workspaceItem : foundItems) { workspaceLogger.debug("Converting grid item: " + workspaceItem.getId() + " name " + workspaceItem.getName()); listFileGridModels.add(converter.toGridFileModel(workspaceItem, null)); } workspaceLogger.info("Search objects converted is/are: "+listFileGridModels.size()+", returning it/them"); return listFileGridModels; } catch (Exception e) { workspaceLogger.error("Error occured on searching: ", e); throw new Exception("Error occured on searching, please retry or contact the support"); } } /** * Gets the children sub tree to root by identifier. * * @param itemIdentifier * the item identifier * @return the children sub tree to root by identifier * @throws Exception * the exception */ @Override public ArrayList getChildrenSubTreeToRootByIdentifier(String itemIdentifier) throws Exception { throw new Exception("The method getChildrenSubTreeToRootByIdentifier is not implement to interact with SHUB"); } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * itemExistsInWorkpaceFolder(java.lang.String, java.lang.String) */ /** * Item exists in workpace folder. * * @param parentId * the parent id * @param itemName * the item name * @return the string * @throws Exception * the exception */ @Override public String itemExistsInWorkpaceFolder(String parentId, String itemName) throws Exception { workspaceLogger.debug("called itemExistsInWorkpace for name "+itemName+" in the parent Id: " + parentId); if (parentId == null) throw new Exception("I'm not able to perform searching.. the folder id is null"); try { org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); workspaceLogger.info("finding by name: " + itemName + " in the folder id: " + parentId); List foundItems = workspace.find(itemName, parentId); if (foundItems == null || foundItems.isEmpty()) return null; return foundItems.get(0).getId(); // } catch (InternalErrorException e) { // return null; // } catch (ItemNotFoundException e) { // return null; } catch (Exception e) { String error = "Error on searching the item "+itemName+" in the passed folder id"; workspaceLogger.error(error, e); throw new Exception(e.getMessage()); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * getAccountingHistory(java.lang.String) */ /** * Gets the accounting history. * * @param identifier * the identifier * @return the accounting history * @throws Exception * the exception */ @Override public List getAccountingHistory(String identifier) throws Exception { if (identifier == null) throw new Exception("I'm not able to get accounting history... the folder id is null"); try { org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(identifier,true,false,false); List accoutings = wsItem.getAccounting(); StorageHubToWorkpaceConverter converter = getStorageHubToWorkpaceConverter(); List listAccounting = converter.buildGXTAccountingItem(accoutings, GxtAccountingEntryType.ALL); workspaceLogger.debug("get accouting returning size " + listAccounting.size()); return listAccounting; } catch (Exception e) { workspaceLogger.error("Error reading the accounting history for item id: "+identifier, e); String error = ConstantsExplorer.SERVER_ERROR + " getting accounting History. " + ConstantsExplorer.TRY_AGAIN; throw new Exception(error); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * getListOfVREsForLoggedUser() */ /** * Gets the list of vr es for logged user. * * @return the list of vr es for logged user * @throws Exception * the exception */ @Override public List getListOfVREsForLoggedUser() throws Exception { workspaceLogger.debug("getListOfVREsForLoggedUser...: "); // PortalContextInfo context = // WsUtil.getPortalContext(this.getThreadLocalRequest()); GCubeUser user = PortalContext.getConfiguration().getCurrentUser(this.getThreadLocalRequest()); long userId = user.getUserId(); // Instanciate the manager GroupManager groupManager = new LiferayGroupManager(); List listOfVres = new ArrayList(); if (isTestMode()) { listOfVres.add(new GcubeVRE("devVRE", "/gcube/devsec/devVRE")); listOfVres.add(new GcubeVRE("NextNext", "/gcube/devNext/NextNext")); return listOfVres; } try { List listOfGroups = groupManager.listGroupsByUser(userId); for (GCubeGroup gCubeGroup : listOfGroups) { if (groupManager.isVRE(gCubeGroup.getGroupId())) { GcubeVRE gcubeVRE = new GcubeVRE(gCubeGroup.getGroupName(), groupManager.getInfrastructureScope(gCubeGroup.getGroupId())); listOfVres.add(gcubeVRE); } } } catch (UserRetrievalFault | UserManagementSystemException | GroupRetrievalFault e) { workspaceLogger.error("Error occurred server-side getting VRE folders: ", e); throw new Exception("Sorry, an error occurred server-side getting VRE folders, try again later"); } workspaceLogger.info("Returning list of VREs: " + listOfVres); return listOfVres; } /** * Gets the HTML gcube item properties. * * @param itemId * the item id * @return The Gcube Item Properties in HTML format if itemId is a GcubeItem * and contains properties, null otherwise * @throws Exception * the exception */ @Override public String getHTMLGcubeItemProperties(String itemId) throws Exception { workspaceLogger.info("getting HTMLGcubeItemProperties for itemId: " + itemId); if (itemId == null || itemId.isEmpty()) { workspaceLogger.warn("Error on getting GcubeItemProperties the identifier is null or empty, returning null"); return null; } try { org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(itemId); StorageHubToWorkpaceConverter converter = getStorageHubToWorkpaceConverter(); return converter.getGcubeItemPropertiesForGcubeItemAsHTML(wsItem); } catch (Exception e) { workspaceLogger.error("Error in server FormattedGcubeItemProperties: ", e); String error = ConstantsExplorer.SERVER_ERROR + " getting gcube item properties for item id: " + itemId; throw new Exception(error); } } /** * Gets the accounting readers. * * @param identifier * the identifier * @return the accounting readers * @throws Exception * the exception */ @Override public List getAccountingReaders(String identifier) throws Exception { if (identifier == null || identifier.isEmpty()) { workspaceLogger.warn("Error on getting accounting history to readers, identifier is null, returning null"); return null; } workspaceLogger.debug("reading accounting history only to "+ GxtAccountingEntryType.READ+" for id: " + identifier); try { org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(identifier,true,false,false); List accoutings = wsItem.getAccounting(); StorageHubToWorkpaceConverter converter = getStorageHubToWorkpaceConverter(); List listOfReadFromAccounting = converter.buildGXTAccountingItem(accoutings, GxtAccountingEntryType.READ); workspaceLogger.info("list of "+GxtAccountingEntryType.READ+" into accounting are:" + listOfReadFromAccounting.size()); return listOfReadFromAccounting; } catch (Exception e) { workspaceLogger.error("Error get accounting readers ", e); String error = ConstantsExplorer.SERVER_ERROR + " getting account. " + ConstantsExplorer.TRY_AGAIN; throw new Exception(error); } } /** * Sets the gcube item properties. * * @param itemId * the item id * @param properties * the properties * @throws Exception * the exception */ @Override public void setGcubeItemProperties(String itemId, Map properties) throws Exception { workspaceLogger.info("Set GcubeItemProperties for itemId: " + itemId); if (itemId == null || itemId.isEmpty()) { workspaceLogger.warn("Set GcubeItemProperties, identifier is null or empty, returning"); throw new Exception("The item id is null or empty"); } try { org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(itemId); if (wsItem instanceof org.gcube.common.storagehubwrapper.shared.tohl.impl.GcubeItem) { workspaceLogger.info("Adding " + properties.size() + " properties to GCubeItem: " + itemId); Map mapObjs = properties==null?null:new HashMap(properties.size()); mapObjs.putAll(properties); workspace.updateMetadata(itemId, mapObjs); } else throw new NoGcubeItemTypeException("The item is not a Gcube Item"); } catch (NoGcubeItemTypeException e) { workspaceLogger.error("Error on settingss properties to GcubeItem: ", e); throw new Exception(e.getMessage()); } catch (Exception e) { workspaceLogger.error("Error on settings properties to GcubeItem: ", e); String error = ConstantsExplorer.SERVER_ERROR + " setting gcube item properties for item id: " + itemId; throw new Exception(error); } } /** * Creates the external url. * * @param parentId * the parent id * @param name * the name * @param description * the description * @param url * the url * @return the file model * @throws Exception * the exception */ @Override public FileModel createExternalUrl(String parentId, String name, String description, String url) throws Exception { workspaceLogger.info("Called createExternalUrl [parent: "+parentId+", url: "+url+"]"); try { if (parentId == null) { workspaceLogger.error("Error on creating url. Parent ID is null"); throw new Exception("Parent ID is null"); } checkItemLocked(parentId); org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsFolderParent = workspace.getItem(parentId); StorageHubToWorkpaceConverter converter = getStorageHubToWorkpaceConverter(); FileModel parentModel = converter.toTreeFileModel(wsFolderParent, null, wsFolderParent.isShared()); workspaceLogger.debug("creating the URL..."); URLItem ext = workspace.createURL(name, description, url, parentId); workspaceLogger.info("created URL file: " + ext.getName()); FileModel urlFile = converter.toTreeFileModel(ext, parentModel, wsFolderParent.isShared()); return urlFile; } catch (WorkspaceFolderLocked e1) { throw new Exception(e1.getMessage()); } catch (Exception e) { workspaceLogger.error("Error on creating the URL in the folder id: "+parentId, e); throw new Exception(e.getMessage()); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * markFolderAsPublicForFolderItemId(java.lang.String, boolean) */ /** * Mark folder as public for folder item id. * * @param folderId * the item id * @param setPublic * the set public * @return the public link * @throws SessionExpiredException * the session expired exception * @throws Exception * the exception */ @Override public PublicLink markFolderAsPublicForFolderItemId(String folderId, boolean setPublic) throws SessionExpiredException, Exception { workspaceLogger.info("called markFolderAsPublicForFolderItemId on folder id: " + folderId +" setPublic: "+setPublic); if (isSessionExpired()) throw new SessionExpiredException(); try { org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); String folderLink = null; try { //Changing access to.. if needed boolean newStatus = workspace.setFolderAsPublic(folderId, setPublic); workspaceLogger.info("The folder "+folderId+" has the public status at " +newStatus+ " on SHUB"); //If the folder was published if (newStatus) { workspaceLogger.info("SHUB returned the folder link id: " + folderId); ApplicationProfileReader apReader = new ApplicationProfileReader("Workspace-Explorer-App", "org.gcube.portlets.user.workspaceexplorerapp.server.WorkspaceExplorerAppServiceImpl"); ApplicationProfile ap = apReader.readProfileFromInfrastrucure(); String encriptedFId = StringEncrypter.getEncrypter().encrypt(folderId); workspaceLogger.info("Encrypted folder Id: " + encriptedFId); String encodedFId = StringUtil.base64EncodeStringURLSafe(encriptedFId); workspaceLogger.info("Encoded in Base 64: " + encodedFId); workspaceLogger.info("Application profile returning url: " + ap.getUrl()); folderLink = ap.getUrl() + "?folderId=" + encodedFId; String shortURL = null; try { shortURL = getShortUrl(folderLink); shortURL = shortURL != null ? shortURL : "not available"; } catch (Exception e) { workspaceLogger.warn("Short url error, skipping"); shortURL = "not available"; } PublicLink pubL = new PublicLink(folderLink, shortURL); workspaceLogger.info("Returning the: "+pubL); return pubL; } workspaceLogger.info("The folder has the public status at "+setPublic+" so returning Public Link as null"); return null; }catch (Exception e) { workspaceLogger.error("Error on changing access to folder as public: "+setPublic, e); String error = ConstantsExplorer.SERVER_ERROR + " changing access to folder id: " + folderId; throw new Exception(error); } } catch (Exception e) { workspaceLogger.error("Error on getting the folder id: "+folderId, e); throw new Exception(e.getMessage()); } } /* * (non-Javadoc) * * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService# * getImagesForFolder(java.lang.String, java.lang.String) */ /** * Gets the images for folder. * * @param folderId * the folder id * @param currentImageId * the current image id * @return the images for folder * @throws Exception * the exception */ @Override public List getImagesForFolder(String folderId, String currentImageId) throws Exception { if (folderId == null) return null; try { workspaceLogger.debug("get images for folder id: " + folderId); org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(folderId); List images = new ArrayList(); if (wsItem.isFolder()) { org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceFolder folder = (org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceFolder) wsItem; List children = workspace.getChildren(folder.getId()); // GWTWorkspaceBuilder builder = getGWTWorkspaceBuilder(); PortalContextInfo context = WsUtil.getPortalContext(this.getThreadLocalRequest()); GCubeUser user = PortalContext.getConfiguration().getCurrentUser(this.getThreadLocalRequest()); for (org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem workspaceItem : children) { boolean foundCurrentImage = false; //IS AN IMAGE? if (workspaceItem instanceof ImageFileItem) { try { ImageFileItem imageFileItem = (ImageFileItem) workspaceItem; GWTWorkspaceItem image = null; image = ObjectStorageHubToWorkpaceMapper.buildGWTWorkspaceImage(imageFileItem, true, false, context.getCurrGroupId() + "", user.getUserId() + ""); image.setId(workspaceItem.getId()); if (image != null) { if (!foundCurrentImage && image.getId().compareTo(currentImageId) == 0) { workspaceLogger.debug(image.getName() + " is the current displaying image so adding to list as first element"); images.add(0, image); foundCurrentImage = true; } else { workspaceLogger.debug("Adding thumbnail name to list: " + image.getName()); images.add(image); } } }catch (Exception e) { workspaceLogger.warn("Error on managing the file item: "+workspaceItem.getId() +" as an "+ImageFileItem.class.getName()); } } } } if(workspaceLogger.isTraceEnabled()) { workspaceLogger.trace("Returning list of images for folder: "+folderId); for (GWTWorkspaceItem gwtWorkspaceItem : images) { workspaceLogger.trace(gwtWorkspaceItem.toString()); } } workspaceLogger.info("Returning " + images.size() + " images for folder id: " + folderId); return images; } catch (Exception e) { workspaceLogger.error("Error in server get images by folder id: " + folderId, e); throw new Exception(e.getMessage()); } } /** * Perform operation on versioned file. * * @param fileId * the file id * @param olderVersionIDs * the older version i ds * @param operation * the operation * @return the list * @throws Exception * the exception */ @Override public List performOperationOnVersionedFile(String fileId, List olderVersionIDs, WorkspaceVersioningOperation operation) throws Exception { workspaceLogger.info("Called perform operation on Versioned File Id: " + fileId + ", Ids Version: " + olderVersionIDs + " perform operation: " + operation); if (fileId == null || olderVersionIDs == null || olderVersionIDs.size() == 0) throw new Exception("Versioned File id or List of versioned file is null"); try { org.gcube.common.storagehubwrapper.server.tohl.Workspace workspace = getWorkspaceFromStorageHub(); org.gcube.common.storagehubwrapper.shared.tohl.WorkspaceItem wsItem = workspace.getItem(fileId); if (wsItem instanceof org.gcube.common.storagehubwrapper.shared.tohl.items.FileItem) { //org.gcube.common.storagehubwrapper.shared.tohl.items.FileItem fileItem = (org.gcube.common.storagehubwrapper.shared.tohl.items.FileItem) wsItem; switch (operation) { case DOWNLOAD: { // IMPLEMENTED CLIENT-SIDE break; } case DELETE_ALL_OLDER_VERSIONS: { throw new Exception(operation+" must be implemented on SHUB-side"); // MUST BE OPTIMIZED HL-SIDE // for (String olderVersionId : olderVersionIDs) { //// fileItem.removeVersion(olderVersionId); // throw new Exception(operation+" must be implemented on SHUB-side"); // workspaceLogger.info("Version " + olderVersionId + " of file id: " + fileId + " removed"); // } // return getVersionHistory(fileId); } case REFRESH: { return getVersionHistory(fileId); } case DELETE_PERMANENTLY: { throw new Exception(operation+" must be implemented on SHUB-side"); // for (String olderVersionId : olderVersionIDs) { // fileItem.removeVersion(olderVersionId); // workspaceLogger.info("Version " + olderVersionId + " of file id: " + fileId + " removed"); // } // return getVersionHistory(fileId); } default: { break; } } return getVersionHistory(fileId); } else throw new FileNotVersionedException("Selected file is not versioned"); } catch (Exception e) { workspaceLogger.error("Error during performing operation on versioned file with id: " + fileId, e); String error = ConstantsExplorer.SERVER_ERROR + " updating versioning of file id: " + fileId; throw new Exception(error); } } }