diff --git a/pom.xml b/pom.xml index 19967d6..8a07404 100644 --- a/pom.xml +++ b/pom.xml @@ -55,12 +55,12 @@ - - - - - - + + + + + + @@ -223,6 +223,14 @@ [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) + + + org.gcube.portlets.widgets + ckan-metadata-publisher-widget + [1.0.0-SNAPSHOT,2.0.0-SNAPSHOT) + compile + + org.json diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java index 001a623..441bc1a 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java @@ -693,5 +693,12 @@ public interface GWTWorkspaceService extends RemoteService{ void setGcubeItemProperties(String itemId, Map properties) throws Exception; FileModel getItemForFileTree(String itemId) throws Exception; + + /** + * Allows the user to public onto the data catalogue if he has at least + * the role editor somewhere. + * @return true if he can publish, false otherwise + */ + boolean hasUserRoleAdminOrEditor(); } diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java index 02781fa..f982c60 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java @@ -248,7 +248,7 @@ public interface GWTWorkspaceServiceAsync { */ void getAllContacts(AsyncCallback> callback); -// void sendTo(List listContacts, List listAttachments, String subject, String text, AsyncCallback callback); + // void sendTo(List listContacts, List listAttachments, String subject, String text, AsyncCallback callback); /** * Send to by id. @@ -683,6 +683,11 @@ public interface GWTWorkspaceServiceAsync { void setGcubeItemProperties(String itemId, Map properties, AsyncCallback callback); - + /** + * Allows the user to public onto the data catalogue if he has at least + * the role editor somewhere. + * @return true if he can publish, false otherwise + */ + void hasUserRoleAdminOrEditor(AsyncCallback callback); } diff --git a/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java b/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java index 638865e..1ca4833 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java @@ -12,6 +12,7 @@ import java.util.Map; import java.util.concurrent.TimeUnit; import javax.servlet.ServletContext; +import javax.servlet.http.HttpSession; import org.apache.log4j.Logger; import org.gcube.application.framework.core.session.ASLSession; @@ -40,6 +41,9 @@ import org.gcube.common.homelibrary.home.workspace.search.SearchItem; import org.gcube.common.homelibrary.home.workspace.trash.WorkspaceTrashFolder; import org.gcube.common.homelibrary.home.workspace.trash.WorkspaceTrashItem; import org.gcube.common.scope.api.ScopeProvider; +import org.gcube.datacatalogue.ckanutillibrary.CKanUtilsImpl; +import org.gcube.datacatalogue.ckanutillibrary.models.CkanRolesIntoLiferay; +import org.gcube.datacatalogue.ckanutillibrary.models.RolesIntoOrganization; import org.gcube.portlets.user.workspace.client.ConstantsExplorer; import org.gcube.portlets.user.workspace.client.interfaces.GXTCategoryItemInterface; import org.gcube.portlets.user.workspace.client.model.FileDetailsModel; @@ -79,11 +83,15 @@ import org.gcube.portlets.user.workspace.shared.accounting.GxtAccountingEntryTyp import org.gcube.portlets.user.workspace.shared.accounting.GxtAccountingField; import org.gcube.portlets.user.workspaceapplicationhandler.ApplicationReaderFromGenericResource; import org.gcube.vomanagement.usermanagement.GroupManager; +import org.gcube.vomanagement.usermanagement.RoleManager; import org.gcube.vomanagement.usermanagement.UserManager; 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.LiferayRoleManager; import org.gcube.vomanagement.usermanagement.impl.LiferayUserManager; +import org.gcube.vomanagement.usermanagement.model.GCubeGroup; +import org.gcube.vomanagement.usermanagement.model.GCubeRole; import org.gcube.vomanagement.usermanagement.model.GCubeUser; import com.google.gwt.user.server.rpc.RemoteServiceServlet; @@ -104,6 +112,25 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT public static final String SELECTION_STATE_ATTRIBUTE = "WORKSPACE.SELECTION_STATE"; protected Logger workspaceLogger = Logger.getLogger(GWTWorkspaceServiceImpl.class); + // for the data catalogue + public static final String CKAN_TOKEN_KEY = "ckanToken"; + public static final String CKAN_ROLE = "ckanRole"; // editor, admin, member + + // ckan utils methods + private CKanUtilsImpl instance; + + @Override + public void init(){ + + // retrieve ckan information + try{ + String currentScope = ScopeProvider.instance.get(); + instance = new CKanUtilsImpl(currentScope); + }catch(Exception e){ + workspaceLogger.error("Unable to retrieve ckan information"); + } + } + /** * Gets the GWT workspace builder. * @@ -224,7 +251,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT return gwtroot; } catch (Exception e) { workspaceLogger.error("Error in server during root retrieving", e); -// workspaceLogger.trace("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); @@ -245,11 +272,11 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT Workspace workspace = getWorkspace(); workspaceLogger.trace("on server getRoot for scope: " + scopeId); -// GCUBEScope gcubeScope = null; -// -// if(scopeId.compareTo(ScopeUtilFilter.IDALLSCOPE)!=0){ -// gcubeScope = GCUBEScope.getScope(scopeId); -// } + // GCUBEScope gcubeScope = null; + // + // if(scopeId.compareTo(ScopeUtilFilter.IDALLSCOPE)!=0){ + // gcubeScope = GCUBEScope.getScope(scopeId); + // } WorkspaceFolder root = workspace.getRoot(); @@ -298,7 +325,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT return listFileGridModels; } catch (Exception e) { workspaceLogger.error("Error in server During search retrieving", e); -// workspaceLogger.trace("Error in server During search retrieving " + e); + // workspaceLogger.trace("Error in server During search retrieving " + e); //GWT can't serialize all exceptions throw new Exception("Error during searching, please contact the support."); @@ -354,7 +381,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT } catch (Exception e) { workspaceLogger.error("Error in server During item retrieving", e); -// workspaceLogger.trace("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); @@ -409,7 +436,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT workspaceLogger.info("Folder is root, loading special folders.."); WorkspaceFolder specialFolder = workspace.getMySpecialFolders(); FileGridModel specialFolderModel = builder.buildGXTFileGridModelItem(specialFolder, folder); -// specialFolderModel.setShortcutCategory(GXTCategoryItemInterface.SMF_VRE_FOLDERS); + // specialFolderModel.setShortcutCategory(GXTCategoryItemInterface.SMF_VRE_FOLDERS); specialFolderModel.setSpecialFolder(true); String newName = getNameForSpecialFolder(); @@ -739,7 +766,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT } else workspaceLogger.warn("Notifies added item: "+destinationItem+ "to share doesn't sent because "+destinationSharedFolder+" is not istance of WorkspaceSharedFolder"); -// np.notifyAddedItemToSharing(listContacts, (WorkspaceFolder) folderDestinationItem); + // np.notifyAddedItemToSharing(listContacts, (WorkspaceFolder) folderDestinationItem); } } else @@ -776,7 +803,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT workspaceLogger.trace("checkNotifyMoveItemFromShare source item: "+sourceItem.getName()+" sourceSharedId: "+sourceSharedId + " folder destination: "+folderDestinationItem.getName() +" sourceItemIsShared: "+sourceItemIsShared); -// System.out.println("shareChangeCondition remove item: "+ shareChangeCondition); + // System.out.println("shareChangeCondition remove item: "+ shareChangeCondition); workspaceLogger.trace("shareChangeCondition remove item: "+ shareChangeCondition); @@ -784,20 +811,20 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT //if source Item is shared and folder destination is not shared or shareChangeCondition is true.. notifies removed item to sharing if(sourceItemIsShared && (!folderDestinationItem.isShared() || shareChangeCondition)){ - //get contacts - List listContacts = getListUserSharedByFolderSharedId(sourceSharedId); + //get contacts + List listContacts = getListUserSharedByFolderSharedId(sourceSharedId); - //DEBUG - printContacts(listContacts); - Workspace workspace = getWorkspace(); - WorkspaceItem sourceSharedFolder = workspace.getItem(sourceSharedId); - NotificationsProducer np = getNotificationProducer(); + //DEBUG + printContacts(listContacts); + Workspace workspace = getWorkspace(); + WorkspaceItem sourceSharedFolder = workspace.getItem(sourceSharedId); + NotificationsProducer np = getNotificationProducer(); - if(sourceSharedFolder instanceof WorkspaceSharedFolder){ - np.notifyMovedItemToSharing(listContacts, sourceItem, (WorkspaceSharedFolder) sourceSharedFolder); - workspaceLogger.trace("The notifies was sent correctly"); - }else - workspaceLogger.warn("Notifies moved item: "+sourceItem+ "from share doesn't sent because "+sourceSharedFolder+" is not istance of WorkspaceSharedFolder"); + if(sourceSharedFolder instanceof WorkspaceSharedFolder){ + np.notifyMovedItemToSharing(listContacts, sourceItem, (WorkspaceSharedFolder) sourceSharedFolder); + workspaceLogger.trace("The notifies was sent correctly"); + }else + workspaceLogger.warn("Notifies moved item: "+sourceItem+ "from share doesn't sent because "+sourceSharedFolder+" is not istance of WorkspaceSharedFolder"); } }else @@ -819,7 +846,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT workspaceLogger.trace("Contacts:"); for (InfoContactModel infoContactModel : listContacts) { - workspaceLogger.trace("User: "+infoContactModel); + workspaceLogger.trace("User: "+infoContactModel); } } @@ -1072,10 +1099,10 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT //Category IMAGES if(category.equals(GXTCategoryItemInterface.SMF_IMAGES.toString())){ listWorkspaceItems = workspace.getFolderItems(FolderItemType.IMAGE_DOCUMENT, FolderItemType.EXTERNAL_IMAGE); - //Category BIODIVERSITY + //Category BIODIVERSITY }else if(category.equals(GXTCategoryItemInterface.SMF_BIODIVERSITY.toString())){ -// listWorkspaceItems = workspace.getFolderItems(FolderItemType.AQUAMAPS_ITEM); - //Category DOCUMENTS + // listWorkspaceItems = workspace.getFolderItems(FolderItemType.AQUAMAPS_ITEM); + //Category DOCUMENTS }else if(category.equals(GXTCategoryItemInterface.SMF_DOCUMENTS.toString())){ listWorkspaceItems = workspace.getFolderItems( @@ -1087,13 +1114,13 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT FolderItemType.DOCUMENT ); - //Category LINKS + //Category LINKS }else if(category.equals(GXTCategoryItemInterface.SMF_LINKS.toString())){ -// listWorkspaceItems = workspace.getFolderItems(FolderItemType.EXTERNAL_URL, FolderItemType.URL_DOCUMENT, FolderItemType.EXTERNAL_RESOURCE_LINK); - //Category REPORTS + // listWorkspaceItems = workspace.getFolderItems(FolderItemType.EXTERNAL_URL, FolderItemType.URL_DOCUMENT, FolderItemType.EXTERNAL_RESOURCE_LINK); + //Category REPORTS }else if(category.equals(GXTCategoryItemInterface.SMF_REPORTS.toString())){ listWorkspaceItems = workspace.getFolderItems(FolderItemType.REPORT_TEMPLATE, FolderItemType.REPORT); - //Category TIME SERIES + //Category TIME SERIES }else if(category.equals(GXTCategoryItemInterface.SMF_TIMESERIES.toString())){ listWorkspaceItems = workspace.getFolderItems(FolderItemType.TIME_SERIES); } @@ -1120,22 +1147,22 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT */ private void getListsChildrenByParent(ArrayList listSubTree, WorkspaceItem parent) throws Exception{ - if(parent==null) - return; + if(parent==null) + return; - if(!parent.isFolder()){ - workspaceLogger.warn("getListsChildrenByParent returning: "+parent.getName() +" is not a folder"); - return; - } + if(!parent.isFolder()){ + workspaceLogger.warn("getListsChildrenByParent returning: "+parent.getName() +" is not a folder"); + return; + } - workspaceLogger.trace("getListsChildrenByParent: "+parent.getName()); - GWTWorkspaceBuilder builder = getGWTWorkspaceBuilder(); - FolderModel parentModel = (FolderModel) builder.buildGXTFileModelItem(parent, null); //get folder + workspaceLogger.trace("getListsChildrenByParent: "+parent.getName()); + GWTWorkspaceBuilder builder = getGWTWorkspaceBuilder(); + FolderModel parentModel = (FolderModel) builder.buildGXTFileModelItem(parent, null); //get folder List childrenList = getFolderChildren(parentModel); //get children SubTree subTree = new SubTree(parentModel, childrenList); - listSubTree.add(subTree); - getListsChildrenByParent(listSubTree, parent.getParent()); - } + listSubTree.add(subTree); + getListsChildrenByParent(listSubTree, parent.getParent()); + } /* (non-Javadoc) * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService#createSmartFolder(java.lang.String, java.lang.String, java.lang.String) @@ -1163,7 +1190,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT } catch (Exception e) { workspaceLogger.error("Error in server create smart folder by name: ", e); -// workspaceLogger.trace("Error in server create smart folder by id " + e); + // workspaceLogger.trace("Error in server create smart folder by id " + e); //GWT can't serialize all exceptions throw new Exception(e.getMessage()); } @@ -1316,7 +1343,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT } catch (Exception e) { workspaceLogger.error("Error in server get image by id ", e); -// workspaceLogger.trace("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()); } @@ -1328,7 +1355,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT @Override public FileModel createExternalUrl(FileModel parentFileModel, String name, String description, String url) throws Exception { - try { + try { Workspace workspace = getWorkspace(); if(parentFileModel==null) @@ -1337,12 +1364,12 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT workspaceLogger.trace("create url in parent id: "+parentFileModel.getIdentifier()); //DEBUG -// workspaceLogger.trace("Name " + name); -// workspaceLogger.trace("description " + description); -// workspaceLogger.trace("url " + url); -// workspaceLogger.trace("parentFileModel " + parentFileModel.getIdentifier() + " " + parentFileModel.getName()); -// if(description == null) -// description = ""; + // workspaceLogger.trace("Name " + name); + // workspaceLogger.trace("description " + description); + // workspaceLogger.trace("url " + url); + // workspaceLogger.trace("parentFileModel " + parentFileModel.getIdentifier() + " " + parentFileModel.getName()); + // if(description == null) + // description = ""; ExternalUrl ext = workspace.createExternalUrl(name, description, url, parentFileModel.getIdentifier()); WorkspaceItem parent = workspace.getItem(parentFileModel.getIdentifier()); //get item from workspace @@ -1352,7 +1379,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT } catch (Exception e) { workspaceLogger.error("Error in server create url in parent id ", e); -// workspaceLogger.trace("Error in server create url in parent id " + e); + // workspaceLogger.trace("Error in server create url in parent id " + e); //GWT can't serialize all exceptions throw new Exception(e.getMessage()); } @@ -1449,7 +1476,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT } catch (Exception e) { workspaceLogger.error("Error in server get all scope ", e); e.printStackTrace(); -// workspaceLogger.trace("Error in server get all scope " + e.getMessage()); + // workspaceLogger.trace("Error in server get all scope " + e.getMessage()); //GWT can't serialize all exceptions throw new Exception(e.getMessage()); } @@ -1479,13 +1506,13 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT listContactsModel.add(contact); } -// //TEST USERS -// 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,false)); -// listContactsModel.add(new InfoContactModel("francesco.mangiacrapa", "francesco.mangiacrapa", "Francesco Mangiacrapa",false)); -// listContactsModel.add(new InfoContactModel("massimiliano.assante", "massimiliano.assante", "Massimiliano Assante",false)); + // //TEST USERS + // 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,false)); + // listContactsModel.add(new InfoContactModel("francesco.mangiacrapa", "francesco.mangiacrapa", "Francesco Mangiacrapa",false)); + // listContactsModel.add(new InfoContactModel("massimiliano.assante", "massimiliano.assante", "Massimiliano Assante",false)); workspaceLogger.trace("Home Library User Manager getting list Gcube Group"); listContactsModel.addAll(builder.buildGXTListContactsModelFromGcubeGroup(hlUserManager.getGroups())); @@ -1510,7 +1537,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT } catch (Exception e) { workspaceLogger.error("Error in server get all contacts ", e); -// return new ArrayList(); + // return new ArrayList(); throw new Exception(e.getMessage()); } } @@ -1524,9 +1551,9 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT try { Workspace workspace = getWorkspace(); -// workspaceLogger.trace("######### SEND TO: "); -// workspaceLogger.trace("subject " + subject); -// workspaceLogger.trace("body " + body); + // workspaceLogger.trace("######### SEND TO: "); + // workspaceLogger.trace("subject " + subject); + // workspaceLogger.trace("body " + body); //DEBUG for(String contactId : listContactsId) @@ -1670,7 +1697,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT } catch (Exception e) { workspaceLogger.error("Error in getNewFolderBulkCreator ", e); -// workspaceLogger.trace("Error in getNewFolderBulkCreator " + e.getMessage()); + // workspaceLogger.trace("Error in getNewFolderBulkCreator " + e.getMessage()); throw new Exception(e.getMessage()); } } @@ -1714,7 +1741,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT sharedFolder = workspace.shareFolder(listLogin, folder.getIdentifier()); sharedFolder.setDescription(folder.getDescription()); //SET NEW DESCRIPTION - //USER REMOVED FROM SHARE + //USER REMOVED FROM SHARE DifferenceBetweenInfoContactModel diff2 = new DifferenceBetweenInfoContactModel(listSharedContact, listContacts); List listRemovedUsersFromShare = diff2.getDifferentsContacts(); workspaceLogger.info("List removed user from share has size: "+listRemovedUsersFromShare.size()); @@ -1746,7 +1773,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT if(!sourceFolderIsShared) //if source folder is not already shared np.notifyFolderSharing(listContacts, sharedFolder); else{ -// printContacts(listContacts); + // printContacts(listContacts); np.notifyUpdatedUsersToSharing(listSharedContact, listContacts, sharedFolder); } } @@ -1948,7 +1975,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT FolderModel root = builder.buildGXTFolderModelItemHandleSpecialFolder(wsFolder, null, nameSpecialFolder); List listParents = new ArrayList(1); listParents.add(root); -// workspaceLogger.trace("returning: "+listParents.toString()); + // workspaceLogger.trace("returning: "+listParents.toString()); return listParents; } else{ @@ -1969,7 +1996,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT listParents.add(root); if(parent!=null) listParents.add(parent); -// workspaceLogger.trace("returning: "+listParents.toString()); + // workspaceLogger.trace("returning: "+listParents.toString()); return listParents; default: @@ -2002,8 +2029,8 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT FileModel fileModel = arrayParents[i+1]; fileModel.setParentFileModel(parent); } -// workspaceLogger.trace("list parents returning size: "+arrayParents.length); -// return new ArrayList(Arrays.asList(arrayParents)); + // workspaceLogger.trace("list parents returning size: "+arrayParents.length); + // return new ArrayList(Arrays.asList(arrayParents)); workspaceLogger.trace("list parents returning size: "+arrayParents.length); if(arrayParents[0]==null){ //EXIT BY BREAK IN CASE OF SPECIAL FOLDER List breadcrumbs = new ArrayList(arrayParents.length-1); @@ -2409,10 +2436,10 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT garbage.put(itemId, new GarbageItem(sourceItemIsShared, itemName, itemId, sourceFolderSharedId)); -// workspace.removeItem(itemId); -// //IF SOURCE SHARED FOLDER IS NOT NULL -// if(sourceFolderSharedId!=null) -// NotificationsUtil.checkSendNotifyRemoveItemToShare(this.getThreadLocalRequest().getSession(), sourceItemIsShared, itemName, itemId, sourceFolderSharedId); + // workspace.removeItem(itemId); + // //IF SOURCE SHARED FOLDER IS NOT NULL + // if(sourceFolderSharedId!=null) + // NotificationsUtil.checkSendNotifyRemoveItemToShare(this.getThreadLocalRequest().getSession(), sourceItemIsShared, itemName, itemId, sourceFolderSharedId); } //ITEM ID - ERROR @@ -2483,14 +2510,14 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT //IS ROOT SHARED FOLDER ite = (WorkspaceSharedFolder) wsItem; workspaceLogger.trace("Folder " +ite.getName()+" is a "+WorkspaceSharedFolder.class.getName()); -// ite = (WorkspaceSharedFolder) workspace.getItemByPath(wsItem.getPath()); + // ite = (WorkspaceSharedFolder) workspace.getItemByPath(wsItem.getPath()); }else{ // IS SUB FOLDER OF THE SHARING ite = (WorkspaceFolder) wsItem; workspaceLogger.trace("Folder " +ite.getName()+" is a "+WorkspaceFolder.class.getName()); -// ite = (WorkspaceSharedFolder) workspace.getItem(wsItem.getIdSharedFolder()); + // ite = (WorkspaceSharedFolder) workspace.getItem(wsItem.getIdSharedFolder()); } -// validateACLToUser(ite, listLogins, aclType); + // validateACLToUser(ite, listLogins, aclType); ite.setACL(listLogins, ACLType.valueOf(aclType)); }else throw new Exception("Source item is not shared or shared folder"); @@ -2661,18 +2688,18 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT if (isWithinPortal() && username.compareTo(WsUtil.TEST_USER) != 0) { - 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); - } + 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); + } } return new UserBean(username, firstName, lastName, email); @@ -2810,7 +2837,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT workspaceLogger.trace("Get SharedFolderForId: folder id "+folderId+" is shared"); //TODO REMOVE wsItem.getIdSharedFolder() -// WorkspaceSharedFolder wsFolder = (WorkspaceSharedFolder) workspace.getItem(wsItem.getIdSharedFolder()); + // WorkspaceSharedFolder wsFolder = (WorkspaceSharedFolder) workspace.getItem(wsItem.getIdSharedFolder()); WorkspaceFolder wsFolder = (WorkspaceFolder) wsItem; if(wsFolder!=null){ @@ -2927,18 +2954,18 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT switch (operation) { - case EMPTY_TRASH: - listErrors = trash.emptyTrash(); - break; + case EMPTY_TRASH: + listErrors = trash.emptyTrash(); + break; - case RESTORE_ALL: - listErrors = trash.restoreAll(); - break; + case RESTORE_ALL: + listErrors = trash.restoreAll(); + break; - case REFRESH: - default: - result.setTrashContent(builder.buildGXTListTrashContent(trash)); - return result; + case REFRESH: + default: + result.setTrashContent(builder.buildGXTListTrashContent(trash)); + return result; } trash = workspace.getTrash(); @@ -2987,66 +3014,66 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT switch (operation) { - case DELETE_PERMANENTLY:{ + case DELETE_PERMANENTLY:{ - boolean deleted = false; - for (String trashItemId : listTrashItemIds) { - try{ - WorkspaceTrashItem trashItem = trash.getTrashItemById(trashItemId); - if(trashItem!=null){ - trashItem.deletePermanently(); - 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); + boolean deleted = false; + for (String trashItemId : listTrashItemIds) { + try{ + WorkspaceTrashItem trashItem = trash.getTrashItemById(trashItemId); + if(trashItem!=null){ + trashItem.deletePermanently(); + 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:{ + String label = listTrashItemIds.size()>1?"items":"item"; + if(!deleted) + throw new Exception("Sorry, an error occurred on deleting permanently the trash "+label+", try again"); - boolean restored = false; - for (String trashItemId : listTrashItemIds) { - try{ - WorkspaceTrashItem trashItem = trash.getTrashItemById(trashItemId); - if(trashItem!=null){ - trashItem.restore(); - listUpdatedTrashIds.add(trashItemId); - restored = true; - } + break; + } - }catch (Exception e) { - workspaceLogger.warn("Error on RESTORE the item : "+trashItemId, e); - FileTrashedModel fakeFile = new FileTrashedModel(); - fakeFile.setIdentifier(trashItemId); - listContentError.add(fakeFile); + case RESTORE:{ + + boolean restored = false; + for (String trashItemId : listTrashItemIds) { + try{ + WorkspaceTrashItem trashItem = trash.getTrashItemById(trashItemId); + if(trashItem!=null){ + trashItem.restore(); + 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; } + 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; } -// trash = workspace.getTrash(); -// result.setTrashContent(builder.buildGXTListTrashContent(trash)); + // trash = workspace.getTrash(); + // result.setTrashContent(builder.buildGXTListTrashContent(trash)); if(!listContentError.isEmpty()){ result.setListErrors(listContentError); @@ -3259,7 +3286,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT workspaceLogger.info("Getting workspace size.."); Workspace workspace = getWorkspace(); long size = workspace.getDiskUsage(); -// workspaceLogger.info("Root size is: "+size +" formatting.."); + // workspaceLogger.info("Root size is: "+size +" formatting.."); String formatSize = GWTWorkspaceBuilder.formatFileSize(size); workspaceLogger.info("returning workspace size: "+formatSize); return formatSize; @@ -3388,4 +3415,132 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT throw new Exception(error); } } + + @Override + public boolean hasUserRoleAdminOrEditor() { + ASLSession asl = WsUtil.getAslSession(this.getThreadLocalRequest().getSession()); + String username = asl.getUsername(); + + // check if this information was already into the ASL Session + String role = (String)asl.getAttribute(CKAN_ROLE); + + if(role != null) + switch(role){ + case "editor" : + case "admin" : return true; + default: return false; // member + } + + try{ + + if(!isWithinPortal()){ + workspaceLogger.warn("OUT FROM PORTAL DETECTED RETURNING TRUE"); + asl.setAttribute(CKAN_ROLE, "editor"); + return true; + } + // first of all, check if the user is a sysadmin in the catalog (in this case he can do everything) + boolean isSysAdmin = instance.isSysAdmin(username, getUserCKanTokenFromSession()); + + if(isSysAdmin){ + + workspaceLogger.debug("The user is a sysadmin of the catalog -> he can edit/add"); + asl.setAttribute(CKAN_ROLE, "admin"); + return true; + + }else{ + + // retrieve the liferay's roles for the user + UserManager userManager = new LiferayUserManager(); + RoleManager roleManager = new LiferayRoleManager(); + GroupManager groupManager = new LiferayGroupManager(); + + // we need to iterate over vres + List groups = groupManager.listGroups(); + + for (GCubeGroup gCubeGroup : groups) { + + String groupName = gCubeGroup.getGroupName(); + + // skip if it is not a vre + if(!groupManager.isVRE(gCubeGroup.getGroupId())) + continue; + + List roles = roleManager.listRolesByUserAndGroup(userManager.getUserId(username), groupManager.getGroupId(groupName)); + + // the default one + RolesIntoOrganization correspondentRoleToCheck = RolesIntoOrganization.MEMBER; + String roleToSetInSession = null; + + // NOTE: it is supposed that there is just one role for this person correspondent to the one in the catalog + for (GCubeRole gCubeRole : roles) { + + workspaceLogger.debug("User " + username + " has role " + gCubeRole.getRoleName() + " in " + groupName); + if(gCubeRole.getRoleName().equalsIgnoreCase(CkanRolesIntoLiferay.CATALOG_ADMIN.toString())){ + correspondentRoleToCheck = RolesIntoOrganization.ADMIN; + roleToSetInSession = "admin"; + break; + }else if(gCubeRole.getRoleName().equalsIgnoreCase(CkanRolesIntoLiferay.CATALOG_EDITOR.toString())){ + correspondentRoleToCheck = RolesIntoOrganization.EDITOR; + roleToSetInSession = "editor"; + break; + } + } + + // if the role is member, keep continuing + if(correspondentRoleToCheck.equals(RolesIntoOrganization.MEMBER)) + continue; + + // with this invocation, we check if the role is present in ckan and if it is not it will be added + boolean res = instance.checkRole(username, groupName, correspondentRoleToCheck); + + // set the role in the asl session + if(res){ + + + + + } + return res; + + } + } + }catch(Exception e){ + workspaceLogger.error("Unable to retrieve the role information for this user. Returning FALSE", e); + } + + workspaceLogger.debug("Unable to check the role into ckan organization, returning FALSE"); + + // set the role member into the asl + asl.setAttribute(CKAN_ROLE, "member"); + + // return false + return false; + } + + /** + * Get current user's token. + * + * @return String the ckan user's token + */ + private String getUserCKanTokenFromSession(){ + + HttpSession httpSession = this.getThreadLocalRequest().getSession(); + ASLSession session = WsUtil.getAslSession(httpSession); + String username = session.getUsername(); + workspaceLogger.debug("User in session is " + username); + + String token = null; + if(this.getThreadLocalRequest().getSession().getAttribute(CKAN_TOKEN_KEY) != null) + token = (String)this.getThreadLocalRequest().getSession().getAttribute(CKAN_TOKEN_KEY); + else{ + + token = instance.getApiKeyFromUsername(username); + this.getThreadLocalRequest().getSession().setAttribute(CKAN_TOKEN_KEY, token); + workspaceLogger.debug("Ckan token has been set for user " + username); + } + + workspaceLogger.debug("Found ckan token " + token + " for user " + username); + return token; + + } }