package org.gcube.portlets.widgets.workspacesharingwidget.server; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.gcube.application.framework.core.session.ASLSession; import org.gcube.common.homelibrary.home.HomeLibrary; import org.gcube.common.homelibrary.home.exceptions.HomeNotFoundException; import org.gcube.common.homelibrary.home.exceptions.InternalErrorException; import org.gcube.common.homelibrary.home.workspace.Workspace; import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder; import org.gcube.common.homelibrary.home.workspace.WorkspaceItem; import org.gcube.common.homelibrary.home.workspace.WorkspaceItemType; import org.gcube.common.homelibrary.home.workspace.WorkspaceSharedFolder; import org.gcube.common.homelibrary.home.workspace.accessmanager.ACLType; import org.gcube.common.homelibrary.home.workspace.exceptions.InsufficientPrivilegesException; import org.gcube.common.homelibrary.home.workspace.exceptions.ItemAlreadyExistException; import org.gcube.common.homelibrary.home.workspace.exceptions.WorkspaceFolderNotFoundException; import org.gcube.common.homelibrary.home.workspace.exceptions.WrongDestinationException; import org.gcube.common.homelibrary.home.workspace.usermanager.GCubeGroup; import org.gcube.common.portal.PortalContext; import org.gcube.portlets.widgets.workspacesharingwidget.client.ConstantsSharing; import org.gcube.portlets.widgets.workspacesharingwidget.client.rpc.WorkspaceSharingService; import org.gcube.portlets.widgets.workspacesharingwidget.server.notifications.NotificationsProducer; import org.gcube.portlets.widgets.workspacesharingwidget.server.notifications.NotificationsUtil; import org.gcube.portlets.widgets.workspacesharingwidget.server.util.ScopeUtility; import org.gcube.portlets.widgets.workspacesharingwidget.server.util.UserUtil; import org.gcube.portlets.widgets.workspacesharingwidget.server.util.WsUtil; import org.gcube.portlets.widgets.workspacesharingwidget.shared.CredentialModel; import org.gcube.portlets.widgets.workspacesharingwidget.shared.FileModel; import org.gcube.portlets.widgets.workspacesharingwidget.shared.InfoContactModel; import org.gcube.portlets.widgets.workspacesharingwidget.shared.SessionExpiredException; import org.gcube.portlets.widgets.workspacesharingwidget.shared.WorkspaceACL; import org.gcube.portlets.widgets.workspacesharingwidget.shared.system.VO; import org.gcube.portlets.widgets.workspacesharingwidget.shared.system.VRE; import org.gcube.vomanagement.usermanagement.GroupManager; import org.gcube.vomanagement.usermanagement.UserManager; import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayGroupManager; import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayUserManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.gwt.user.server.rpc.RemoteServiceServlet; /** * The server side implementation of the RPC service. */ @SuppressWarnings("serial") public class WorkspaceSharingServiceImpl extends RemoteServiceServlet implements WorkspaceSharingService { protected static Logger logger = LoggerFactory.getLogger(WorkspaceSharingServiceImpl.class); protected GWTWorkspaceSharingBuilder getGWTWorkspaceBuilder() { return WsUtil.getGWTWorkspaceSharingBuilder(this.getThreadLocalRequest().getSession()); } protected Workspace getWorkspace() throws InternalErrorException, HomeNotFoundException, WorkspaceFolderNotFoundException { return WsUtil.getWorkspace(this.getThreadLocalRequest().getSession()); } protected NotificationsProducer getNotificationProducer(){ return WsUtil.getNotificationProducer(WsUtil.getAslSession(this.getThreadLocalRequest().getSession())); } protected ScopeUtility getScopeUtilFilter(){ return WsUtil.getScopeUtilFilter(this.getThreadLocalRequest().getSession()); } protected boolean isTestMode(){ return WsUtil.withoutPortal; } @Override public List getAllContacts(boolean readGroupsFromHL, boolean readGroupsFromPortal) throws Exception { try { ASLSession aslSession = WsUtil.getAslSession(this.getThreadLocalRequest().getSession()); //THIS FORCE THE SESSION CREATION logger.info("Get all contacts"); // WorkspaceItem parent = workspace.getItem(parentFileModel.getIdentifier()); //get item from workspace // workspace.getAllScope(); GWTWorkspaceSharingBuilder builder = getGWTWorkspaceBuilder(); if(isTestMode()){ logger.warn("WORKSPACE PORTLET IS IN TEST MODE - RETURN TEST USERS AND GROUPS"); List listContactsModel = new ArrayList(); // //TEST USERS listContactsModel.add(new InfoContactModel("federico.defaveri", "federico.defaveri", "Federico de Faveri", false)); listContactsModel.add(new InfoContactModel("antonio.gioia", "antonio.gioia", "Antonio Gioia", false)); listContactsModel.add(new InfoContactModel("fabio.sinibaldi", "fabio.sinibaldi", "Fabio Sinibaldi", false)); listContactsModel.add(new InfoContactModel("pasquale.pagano", "pasquale.pagano", "Pasquale Pagano", false)); // listContactsModel.add(new InfoContactModel(WsUtil.TEST_USER, WsUtil.TEST_USER, WsUtil.TEST_USER_FULL_NAME)); listContactsModel.add(new InfoContactModel("francesco.mangiacrapa", "francesco.mangiacrapa", "Francesco Mangiacrapa", false)); listContactsModel.add(new InfoContactModel("massimiliano.assante", "massimiliano.assante", "Massimiliano Assante", false)); listContactsModel.add(new InfoContactModel("valentina.marioli", "valentina.marioli", "Valentina Marioli", false)); listContactsModel.add(new InfoContactModel("leonardo.candela", "leonardo.candela", "Leonardo Candela", false)); listContactsModel.add(new InfoContactModel("/gube/devsec/devVRE", "/gube/devsec/devVRE", "devVRE", true)); // listContactsModel.addAll(getFakeGroups()); return listContactsModel; } UserManager userManag = new LiferayUserManager(); GroupManager gm = new LiferayGroupManager(); String groupId = gm.getRootVO().getGroupId(); logger.trace("Liferay User Manager getting list users by group: "+groupId); List listContactsModel = builder.buildGXTListContactsModelFromUserModel(userManag.listUsersByGroup(groupId)); if(readGroupsFromHL){ logger.info("Reading group names from HL.."); org.gcube.common.homelibrary.home.workspace.usermanager.UserManager hlUserManager = HomeLibrary.getHomeManagerFactory().getUserManager(); logger.trace("Home Library User Manager getting list Gcube Group"); List groups = hlUserManager.getGroups(); if(groups!=null){ logger.info("Read group names from HL, return "+groups.size()+" groups, converting"); listContactsModel.addAll(builder.buildGXTListContactsModelFromGcubeGroup(groups)); }else logger.warn("Read group names from HL, return list null, skipping"); } if(readGroupsFromPortal){ logger.info("Reading group names as scopes from Infrastructure.."); PortalContext context = PortalContext.getConfiguration(); logger.info("context.getInfrastructureName(): "+context.getInfrastructureName()); logger.info("aslSession.getGroupName(): "+ aslSession.getGroupName()); logger.info("aslSession.getScope().toString(): "+ aslSession.getScope()); try{ ScopeUtility scopeUtility = new ScopeUtility(aslSession.getScope()); if(scopeUtility.getVoName()!=null){ logger.info("VO name is not null, trying to calculate List VO"); List lsVOs = WsUtil.getVresFromInfrastructure(context.getInfrastructureName(), scopeUtility.getVoName()); // String voPath = ConstantsSharing.PATH_SEPARATOR+context.getInfrastructureName() + ConstantsSharing.PATH_SEPARATOR + aslSession.getGroupName() + ConstantsSharing.PATH_SEPARATOR; listContactsModel.addAll(builder.buildGXTListContactsModelFromVOs(lsVOs, scopeUtility.getVo())); }else logger.warn("VO name is null, skipping list VO "+ aslSession.getGroupName()); }catch(Exception e){ logger.warn("An error occurred on recovering vo name, skipping list VO "+ aslSession.getGroupName()); } } logger.info("Get all contacts returning a list having size: "+listContactsModel.size()); return listContactsModel; } catch (Exception e) { logger.error("Error in server get all contacts ", e); // return new ArrayList(); throw new Exception(e.getMessage()); } } @Override public List getListUserSharedByFolderSharedId(String folderSharedId) throws Exception{ logger.info("getListUserSharedByFolderSharedId "+ folderSharedId); try { Workspace workspace = getWorkspace(); WorkspaceItem wsItem = workspace.getItem(folderSharedId); if(NotificationsUtil.isASharedFolder(wsItem)){ WorkspaceSharedFolder wsFolder = (WorkspaceSharedFolder) wsItem; GWTWorkspaceSharingBuilder builder = getGWTWorkspaceBuilder(); List listPortalLogin = wsFolder.getUsers(); logger.info("getListUserSharedByFolderSharedId return "+ listPortalLogin.size() + " user"); if(isTestMode()) return builder.buildGxtInfoContactFromPortalLoginTestMode(listPortalLogin); return builder.buildGxtInfoContactsFromPortalLogins(listPortalLogin); } else{ logger.info("the item with id: "+folderSharedId+ " is not "+WorkspaceItemType.SHARED_FOLDER); //DEBUG //System.out.println("the item with id: "+folderSharedId+ " is not "+WorkspaceItemType.SHARED_FOLDER); } return new ArrayList(); } catch (Exception e) { logger.error("Error in getListUserSharedByItemId ", e); throw new Exception(e.getMessage()); } } @Override public InfoContactModel getOwnerByItemId(String itemId) throws Exception { logger.info("get Owner By ItemId "+ itemId); try { Workspace workspace = getWorkspace(); WorkspaceItem wsItem = workspace.getItem(itemId); GWTWorkspaceSharingBuilder builder = getGWTWorkspaceBuilder(); return builder.buildGXTInfoContactModel(wsItem.getOwner()); } catch (Exception e) { logger.error("Error in getOwnerByItemId ", e); throw new Exception(e.getMessage()); } } /** * * @return * @throws Exception */ @Override public List getACLs() throws Exception{ try { GWTWorkspaceSharingBuilder builder = getGWTWorkspaceBuilder(); return builder.getWorkspaceACLFromACLs(Arrays.asList(ACLType.values())); } catch (Exception e) { logger.error("Error in server get ACLs", e); String error = ConstantsSharing.SERVER_ERROR +" get ACL rules. "+e.getMessage(); throw new Exception(error); } } @Override public String getMyLogin(){ ASLSession asl = WsUtil.getAslSession(this.getThreadLocalRequest().getSession()); return asl.getUsername(); } @Override public FileModel getFileModelByWorkpaceItemId(String itemId) throws Exception { try { // System.out.println("Get file model by itemId: "+itemId); if(itemId == null || itemId.isEmpty()) throw new Exception("Identifier is null or empty"); Workspace workspace = getWorkspace(); logger.info("Get file model by itemId: "+itemId); WorkspaceItem wsItem = workspace.getItem(itemId); GWTWorkspaceSharingBuilder builder = getGWTWorkspaceBuilder(); // Long startTime = System.currentTimeMillis(); // // Long endTime = System.currentTimeMillis() - startTime; // String time = String.format("%d msc %d sec", endTime, TimeUnit.MILLISECONDS.toSeconds(endTime)); // logger.debug("get child for Grid by id returning element in " + time); logger.info("Getting folder parent"); WorkspaceFolder folderParent = null; if(wsItem!=null) folderParent = wsItem.getParent(); //BUILD PARENT else throw new Exception("Workspace item not found"); FileModel parent = null; if(folderParent!=null){ logger.info("Folder parent has id: "+folderParent.getId() + " and name: "+folderParent.getName()); parent = builder.buildGXTFileModelItem(folderParent, null); } else logger.info("Folder parent for item: "+wsItem.getId() +" is null"); //BUILD ITEM return builder.buildGXTFileModelItem(wsItem, parent); } catch (Exception e) { logger.error("Error in server during item retrieving, getFileModelByWorkpaceItemId", e); String error = ConstantsSharing.SERVER_ERROR + " retrieving the item from workspace, "+e.getMessage(); throw new Exception(error); } } /* (non-Javadoc) * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService#isSessionExpired() */ @Override public boolean isSessionExpired() throws Exception { return WsUtil.isSessionExpired(this.getThreadLocalRequest().getSession()); } // DEBUG private void printContacts(List listContacts) { boolean testMode = isTestMode(); if (testMode) System.out.println("Contacts: "); else logger.debug("Contacts:"); for (InfoContactModel infoContactModel : listContacts) { if (testMode) System.out.println("User: " + infoContactModel); else logger.debug("User: " + infoContactModel); } } @Override public boolean shareFolder(FileModel folder, List listContacts, boolean isNewFolder, WorkspaceACL acl) throws Exception { if(isSessionExpired()) throw new SessionExpiredException(); try { Workspace workspace = getWorkspace(); logger.info("sharing item id: "+ folder.getIdentifier() + " name: "+ folder.getName() // + " parent name: " + folder.getParentFileModel().getName() + " listContacts size: " + listContacts.size()); // //DEBUG //System.out.println("shareFolder "+ folder.getIdentifier() + " name: "+ folder.getName() + " parent name: " + folder.getParentFileModel().getName() + " listContacts size: " + listContacts.size()); // for (InfoContactModel infoContactModel : listContacts) { // System.out.println("share with "+ infoContactModel.getLogin()); // } printContacts(listContacts); List listLogin = UserUtil.getListLoginByInfoContactModel(listContacts); WorkspaceSharedFolder sharedFolder = null; List listSharedContact = null; boolean sourceFolderIsShared = folder.isShared(); if(sourceFolderIsShared){ //if source folder is already share... retrieve old list of sharing to notify listSharedContact = getListUserSharedByFolderSharedId(folder.getIdentifier()); } if(listLogin.size()>0){ if(!isNewFolder){ sharedFolder = workspace.shareFolder(listLogin, folder.getIdentifier()); sharedFolder.setDescription(folder.getDescription()); //SET NEW DESCRIPTION } else sharedFolder = workspace.createSharedFolder(folder.getName(), folder.getDescription(), listLogin, folder.getParentFileModel().getIdentifier()); } boolean created = sharedFolder==null?false:true; if(acl!=null) setACLs(sharedFolder.getId(), listLogin, acl.getId().toString()); if(created){ NotificationsProducer np = getNotificationProducer(); if(!sourceFolderIsShared) {//if source folder is not already shared //TODO ADD NOTIFICATION // np.notifyFolderSharing(listContacts, sharedFolder); }else{ /*System.out.println("SHARED CONTACS: "); printContacts(listSharedContact); System.out.println("NEW CONTACS: "); printContacts(listContacts);*/ //TODO ADD NOTIFICATION // np.notifyAddedUsersToSharing(listSharedContact, listContacts, sharedFolder); } } return created; } catch (InsufficientPrivilegesException e) { logger.error("Error in shareFolder ", e); String error = "An error occurred on creating shared folder. "+ e.getMessage(); throw new Exception(error); } catch (ItemAlreadyExistException e) { logger.error("Error in shareFolder ", e); String error = "An error occurred on creating shared folder. "+ e.getMessage(); throw new Exception(error); } catch (WrongDestinationException e) { logger.error("Error in shareFolder ", e); String error = "An error occurred on creating shared folder. "+ e.getMessage(); throw new Exception(error); } catch (Exception e) { logger.error("Error in shareFolder ", e); e.printStackTrace(); String error = ConstantsSharing.SERVER_ERROR+" sharing item."; throw new Exception(error); } } public void setACLs(String folderId, List listLogins, String aclType) throws Exception{ try { if(folderId == null) throw new Exception("Folder id is null"); if(listLogins==null || listLogins.size()==0) throw new Exception("List Logins is null or empty"); logger.info("Setting ACL for folder id: "+folderId); logger.info("ACL type is: "+aclType); Workspace workspace = getWorkspace(); WorkspaceItem wsItem = workspace.getItem(folderId); if(wsItem.isShared() && (wsItem.getType().equals(WorkspaceItemType.SHARED_FOLDER))){ WorkspaceSharedFolder ite = (WorkspaceSharedFolder) workspace.getItemByPath(wsItem.getPath()); ite.setACL(listLogins, ACLType.valueOf(aclType)); }else throw new Exception("Source item is not shared or shared folder"); logger.info("Setting ACL completed, retuning"); } catch (Exception e) { logger.info("Error in set ACLs", e); String error = ConstantsSharing.SERVER_ERROR +" setting permissions. "+e.getMessage(); throw new Exception(error); } } /* (non-Javadoc) * @see org.gcube.portlets.widgets.workspacesharingwidget.client.rpc.WorkspaceSharingService#getInfoContactModelsFromCredential(java.util.List) */ @Override public List getInfoContactModelsFromCredential(List listAlreadySharedContact) throws Exception { if(listAlreadySharedContact==null || listAlreadySharedContact.size()==0) throw new Exception("Credentials list is null or empty"); GWTWorkspaceSharingBuilder builder = getGWTWorkspaceBuilder(); List listContacts = new ArrayList(listAlreadySharedContact.size()); for (CredentialModel credentialModel : listAlreadySharedContact) { if(!credentialModel.isGroup()){ InfoContactModel contact = builder.buildGxtInfoContactFromPortalLogin(credentialModel.getLogin()); contact.setReferenceCredential(credentialModel); listContacts.add(contact); } } return listContacts; } /** * DEBUG * @return */ private List getFakeGroups(){ List listContactsModel = new ArrayList(); PortalContext context = PortalContext.getConfiguration(); System.out.println("context.getInfrastructureName(): "+context.getInfrastructureName()); // System.out.println("context.getVOsAsString(): "+context.getVOsAsString()); List vos = WsUtil.getVresFromInfrastructure(context.getInfrastructureName(), "devsec"); for (VO vo : vos) { System.out.println("vo name "+vo.getName()); for (VRE vre : vo.getVres()) { System.out.println("vre name "+vre.getName()); listContactsModel.add(new InfoContactModel(vre.getName(), vre.getName(), vre.getName(), true)); } } return listContactsModel; } public static void main(String[] args) { WorkspaceSharingServiceImpl impl = new WorkspaceSharingServiceImpl(); PortalContext context = PortalContext.getConfiguration(); try { String nameVO = "devsec"; String vrePath = ConstantsSharing.PATH_SEPARATOR+context.getInfrastructureName() + ConstantsSharing.PATH_SEPARATOR + nameVO + ConstantsSharing.PATH_SEPARATOR; List lsVOs = WsUtil.getVresFromInfrastructure(context.getInfrastructureName(), nameVO); GWTWorkspaceSharingBuilder builder = new GWTWorkspaceSharingBuilder(); List groups = builder.buildGXTListContactsModelFromVOs(lsVOs, vrePath); for (VO vo : lsVOs) { System.out.println(vo.getName()); for (VRE vre : vo.getVres()) { System.out.println("VRE: "+vre.getName()); } } for (InfoContactModel infoContactModel : groups) { System.out.println(infoContactModel); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }