This repository has been archived on 2021-11-25. You can view files and clone it, but cannot push or open issues or pull requests.
vmereports-manager-portlet/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/DocLibraryUtil.java

312 lines
9.8 KiB
Java

package org.gcube.portlets.user.reportgenerator.server.servlet;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.gcube.application.framework.core.session.ASLSession;
import org.gcube.common.core.utils.logging.GCUBELog;
import org.gcube.portal.custom.communitymanager.OrganizationsUtil;
import org.gcube.portlets.admin.wfdocslibrary.shared.PermissionType;
import org.gcube.portlets.admin.wfdocslibrary.shared.Step;
import org.gcube.portlets.admin.wfdocslibrary.shared.WfRole;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.model.Organization;
import com.liferay.portal.model.ResourceConstants;
import com.liferay.portal.model.Role;
import com.liferay.portal.model.User;
import com.liferay.portal.service.CompanyLocalServiceUtil;
import com.liferay.portal.service.OrganizationLocalServiceUtil;
import com.liferay.portal.service.PermissionLocalServiceUtil;
import com.liferay.portal.service.ResourceLocalServiceUtil;
import com.liferay.portal.service.ServiceContext;
import com.liferay.portal.service.UserLocalServiceUtil;
import com.liferay.portlet.documentlibrary.NoSuchFolderException;
import com.liferay.portlet.documentlibrary.model.DLFileEntry;
import com.liferay.portlet.documentlibrary.model.DLFolder;
import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;
public class DocLibraryUtil {
public static final String WORKFLOWS_FOLDER = "Workflow Documents";
/**
*
*/
private static GCUBELog log = new GCUBELog(DocLibraryUtil.class);
/**
* write the Report File (payload) into Liferay DocLibrary in the workflowdocs folder
* @param roles
* @param start each Step contains a Map<WfRole, ArrayList<PermissionType>> that is needed in the writeFileIntoDocLibrary
* @param fileName
* @param buffer the payload as byte array
*/
public static boolean writeFileIntoDocLibrary(ASLSession session, List<Role> roles, Step start, String fileName, byte[] buffer) {
long docfolderid = -1;
try {
docfolderid = getWfFolder(session);
long userId = getUserId(session);
//write the file into doclib
DLFileEntry fileEntry = DLFileEntryLocalServiceUtil.addFileEntry(
userId,
getGroupID(session),
docfolderid,
fileName,
fileName,
"workflow document",
"",
"",
buffer,
new ServiceContext());
log.debug("Wrote file into DocumentLibrary");
//get the file entry resource id
long resourceId = ResourceLocalServiceUtil.getResource(fileEntry.getCompanyId(),
DLFileEntry.class.getName(), ResourceConstants.SCOPE_INDIVIDUAL, String.valueOf(fileEntry.getFileEntryId())).getResourceId();
//set the permission on the file for each role
for (Role role : roles) {
String[] actionIds = getPermissionsFromWfStep(role, start);
PermissionLocalServiceUtil.setRolePermissions(role.getRoleId(), actionIds, resourceId);
log.debug("set the permissions for Role: " + role.getName());
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
log.debug(" WROTE INTO DOCsLib and ADDING permissions for name: " + fileName);
return true;
}
public static DLFileEntry updateFileIntoDocLibrary(ASLSession session, String workflowid, byte[] buffer) {
long docfolderid = -1;
DLFileEntry fileEntry = null;
try {
fileEntry = getFileEntry(session, workflowid);
docfolderid = getWfFolder(session);
long userId = getUserId(session);
String fileName = fileEntry.getTitle();
log.debug("Update file into DocumentLibrary with Name: " + fileName);
DLFileEntryLocalServiceUtil.updateFileEntry(
userId,
getGroupID(session),
docfolderid,
fileEntry.getName(),
fileEntry.getName(),
fileName,
fileEntry.getDescription(),
"",
true,
"",
buffer,
new ServiceContext());
log.debug("Update file into DocumentLibrary");
} catch (Exception e) {
e.printStackTrace();
return null;
}
return fileEntry;
}
public static boolean deleteFileFromDocLibrary(ASLSession session, String workflowid) {
DLFileEntry fileEntry = null;
try {
fileEntry = getFileEntry(session, workflowid);
DLFileEntryLocalServiceUtil.deleteDLFileEntry(fileEntry);
log.debug("Deleted");
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
*
* @param session
* @param workflowid
* @return
* @throws Exception
* @throws SystemException
* @throws PortalException
*/
public static InputStream getFileEntryAsStream(ASLSession session, String workflowid) throws Exception {
String titleWithExtension = workflowid+".zip";
DLFileEntry fileEntry = DLFileEntryLocalServiceUtil.getFileEntryByTitle(getGroupID(session), getWfFolder(session),
titleWithExtension);
return DLFileEntryLocalServiceUtil.getFileAsStream(fileEntry.getCompanyId(),
getUserId(session), getGroupID(session), getWfFolder(session), fileEntry.getName());
}
public static DLFileEntry getFileEntry(ASLSession session, String workflowid) throws PortalException, SystemException, Exception {
String titleWithExtension = workflowid+".zip";
return DLFileEntryLocalServiceUtil.getFileEntryByTitle(getGroupID(session), getWfFolder(session),
titleWithExtension);
}
/**
*
* @param role is the liferay role, for convention is created as ROLENAME_WFID e.g. EDITOR_123
* @param step containts the permissions attached to each role (just the name, e.g. EDITOR)
* @return the permissions to apply
*/
public static String[] getPermissionsFromWfStep(Role role, Step step) {
ArrayList<PermissionType> toConvert = new ArrayList<PermissionType>();
for (WfRole steprole : step.getPermissions().keySet()) {
System.out.println("Steprole: "+ steprole.getRolename());
String name = role.getName().split("_")[0]; //e.g. EDITOR <- EDITOR_123
System.out.println("role Name: "+ name);
if (steprole.getRolename().equals(name)) {
toConvert = step.getPermissions().get(steprole);
}
}
String[] toReturn = new String[toConvert.size()];
int i = 0;
for (PermissionType p : toConvert) {
toReturn[i] = getLRActionIdFromWfPermissionType(p);
i++;
}
return toReturn;
}
/**
* check the existence of the WFFolder or create it if not exists
* @param session
* @return true is everything goes ok
* @throws PortalException
* @throws SystemException
*/
public static long getWfFolder(ASLSession session) throws Exception {
long parentFolderId = 0;
DLFolder folder = null;
if (! wfFolderExists(session)) {
folder = DLFolderLocalServiceUtil.addFolder(getUserId(session), getGroupID(session), parentFolderId, WORKFLOWS_FOLDER, "Folder for Workflow Documents", new ServiceContext());
log.debug("Folder for WorkflowDocs created: /" + WORKFLOWS_FOLDER);
} else
folder = DLFolderLocalServiceUtil.getFolder( getGroupID(session), parentFolderId, WORKFLOWS_FOLDER);
return folder.getFolderId();
}
/**
*
* @param session the ASL Session instance
* @return true if the workflow docs exists
*/
public static boolean wfFolderExists(ASLSession session) {
try {
long groupid = getGroupID(session);
long parentfolder = 0;
if (DLFolderLocalServiceUtil.getFolder(groupid, parentfolder, "Workflow Documents") != null)
return true;
else
return false;
}
catch (NoSuchFolderException ex) {
log.debug("Folder does not exists");
return false;
}
catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
*
* @param session
* @return
* @throws PortalException
* @throws SystemException
*/
public static long getGroupID(ASLSession session) throws PortalException, SystemException {
long organizationid = session.getGroupId();
Organization myOrg = OrganizationLocalServiceUtil.getOrganization(organizationid);
return myOrg.getGroup().getGroupId();
}
/**
*
* @return the company webid
* @throws PortalException
* @throws SystemException
*/
public static long getCompanyID() throws PortalException, SystemException {
return OrganizationsUtil.getCompany().getCompanyId();
}
/**
*
* @param session the ASL Session instance
* @return the list of the root folders
* @throws SystemException .
* @throws PortalException .
*/
public static List<DLFolder> getFolders(ASLSession session) throws SystemException, PortalException {
long companyid = getCompanyID();
List<DLFolder> folders = null;
folders = DLFolderLocalServiceUtil.getFolders(companyid);
for (DLFolder folder : folders) {
log.debug("Folder name: " + folder.getName() + " ID: " + folder.getFolderId() + " Parent: " + folder.getParentFolderId() + " Groupid: " + folder.getGroupId());
}
return folders;
}
/**
*
* @param session the ASL Session instance
* @return the userid in the liferay system
*/
public static long getUserId(ASLSession session) {
List<User> users = null;
long userId = 0;
try {
users = UserLocalServiceUtil.getUsers(0, UserLocalServiceUtil.getUsersCount());
} catch (SystemException e) {
e.printStackTrace();
}
for(User user: users){
if(user.getScreenName().equalsIgnoreCase(session.getUsername())){
userId = user.getUserId();
break;
}
}
return userId;
}
/**
* needed to convert Workflows permission into Lifearay permissions (ActionIDs)
* @param type
* @return
*/
private static String getLRActionIdFromWfPermissionType(PermissionType type) {
switch (type) {
case EDIT_PERMISSIONS:
return "PERMISSIONS";
case VIEW:
return "VIEW";
case UPDATE:
return "UPDATE";
case DELETE:
return "DELETE";
case ADD_DISCUSSION:
return "ADD_DISCUSSION";
case DELETE_DISCUSSION:
return "DELETE_DISCUSSION";
case UPDATE_DISCUSSION:
return "UPDATE_DISCUSSION";
default:
return "";
}
}
}