PerformFISH-Apps-portlet/src/main/java/org/gcube/portlets/user/performfish/CompanyPrivateRepository.java

196 lines
8.6 KiB
Java

package org.gcube.portlets.user.performfish;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletRequestDispatcher;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import javax.portlet.WindowState;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
import org.gcube.common.homelibary.model.versioning.WorkspaceVersion;
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.exceptions.ItemNotFoundException;
import org.gcube.common.homelibrary.home.workspace.folder.items.ExternalFile;
import org.gcube.common.storagehub.client.StreamDescriptor;
import org.gcube.common.storagehub.client.plugins.AbstractPlugin;
import org.gcube.common.storagehub.client.proxies.ItemManagerClient;
import org.gcube.portlets.user.performfish.bean.Farm;
import org.gcube.portlets.user.performfish.util.PFISHConstants;
import org.gcube.portlets.user.performfish.util.Utils;
import org.gcube.portlets.user.performfish.util.comparators.WSItemComparator;
import org.gcube.portlets.user.performfish.util.db.DBUtil;
import org.gcube.portlets.user.performfish.util.db.DatabaseConnection;
import org.gcube.vomanagement.usermanagement.RoleManager;
import org.gcube.vomanagement.usermanagement.impl.LiferayRoleManager;
import org.gcube.vomanagement.usermanagement.model.GCubeTeam;
import org.gcube.vomanagement.usermanagement.model.GCubeUser;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.servlet.ServletResponseUtil;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.util.PortalUtil;
import com.liferay.util.bridges.mvc.MVCPortlet;
/**
* Portlet implementation class CompanyPrivateRepository
*/
public class CompanyPrivateRepository extends MVCPortlet {
private static com.liferay.portal.kernel.log.Log _log = LogFactoryUtil.getLog(CompanyFarmRepository.class);
@Override
public void render(RenderRequest request, RenderResponse response)
throws PortletException, IOException {
_log.info(" This is render method of CompanyPrivateRepository");
try {
_log.info(" initialise of CompanyPrivateRepository done");
long groupId = PortalUtil.getScopeGroupId(request);
GCubeTeam theCompany = Utils.checkBelongingToOneCompanyOnly(request, response, this);
boolean isCompanyAdmin = Utils.isCompanyAdmin( Utils.getCurrentUser(request), groupId, theCompany);
if (theCompany != null && isCompanyAdmin) { //check is Admin
request.setAttribute("theCompany", theCompany);
String currentContext = Utils.getCurrentContext(request);
GCubeUser currentUser = Utils.getCurrentUser(request);
RoleManager rm = new LiferayRoleManager();
//check folder exists
Utils.getWSCompanyFolder(currentUser.getUsername(), currentContext, theCompany);
//look for company farms
Connection conn = DatabaseConnection.getInstance(Utils.getCurrentContext(groupId)).getConnection();
List<Farm> companyFarms = DBUtil.listFarmsByCompanyId(conn, theCompany.getTeamId());
LinkedHashMap<Farm, List<ExternalFile>> theFiles = new LinkedHashMap<>();
for (Farm farm : companyFarms) {
GCubeTeam theFarm = rm.getTeam(farm.getFarmId());
farm.setName(theFarm.getTeamName());
WorkspaceFolder farmFolder = Utils.getWSFarmFolder(
currentUser.getUsername(),
currentContext,
theCompany, theFarm);
List<WorkspaceItem> farmItems = farmFolder.getChildren(true);
Collections.sort(farmItems, new WSItemComparator());
List<ExternalFile> farmFiles = new ArrayList<>();
for (WorkspaceItem workspaceItem : farmItems) {
if (workspaceItem instanceof ExternalFile) {
ExternalFile file = (ExternalFile) workspaceItem;
farmFiles.add(file);
}
}
theFiles.put(farm, farmFiles);
}
request.setAttribute("companyPrivateFiles", theFiles); //pass to the JSP
String imageUrl = Utils.getCompanyLogoURL(theCompany.getTeamName(), groupId, request);
request.setAttribute("companyLogoURL", imageUrl); //pass to logo URL to the JSP
//display the view.jsp
super.render(request, response);
}
else {
PortletRequestDispatcher dispatcher = getPortletContext().getRequestDispatcher(Utils.NOT_ADMIN_PAGE_PATH);
dispatcher.include(request, response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void displayVersions(ActionRequest request, ActionResponse response) throws Exception {
String itemId = ParamUtil.getString(request, "fileItem");
if (itemId == null || itemId.compareTo("")==0) {
SessionErrors.add(request.getPortletSession(),"form-error");
return;
}
HttpServletRequest httpReq = PortalUtil.getHttpServletRequest(request);
GCubeUser currentUser = Utils.getCurrentUser(httpReq);
String context = Utils.getCurrentContext(httpReq);
Workspace ws = Utils.getWS(currentUser.getUsername(), context) ;
WorkspaceItem theItem = ws.getItem(itemId);
if (theItem instanceof ExternalFile) {
ExternalFile file = (ExternalFile) theItem;
List<WorkspaceVersion> versions = file.getVersionHistory();
request.setAttribute("versions", versions); //pass to the JSP
} else {
response.setRenderParameter("jspPage", PFISHConstants.OPERATION_ERROR_PATH);
}
request.setAttribute("itemId", itemId);
request.setAttribute("itemName", theItem.getName());
response.setWindowState(WindowState.MAXIMIZED);
response.setRenderParameter("jspPage", "/html/farmrepository/show_all_versions.jsp");
}
public void serveResource(ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws IOException, PortletException {
//if download file
String fileToDownloadId = ParamUtil.getString(resourceRequest, "fileToDownloadId", null);
//if download version
String versionDownloadItemId = ParamUtil.getString(resourceRequest, "versionDownloadItemId", null);
String versionDownloadName = ParamUtil.getString(resourceRequest, "versionDownloadName", null);
setAuthorizationToken(resourceRequest);
//check if is a file download
if (fileToDownloadId != null) {
String selectedItemId = fileToDownloadId;
try {
ItemManagerClient client = AbstractPlugin.item().build();
StreamDescriptor streamDescr = client.download(selectedItemId);
HttpServletResponse httpRes = PortalUtil.getHttpServletResponse(resourceResponse);
HttpServletRequest httpReq = PortalUtil.getHttpServletRequest(resourceRequest);
ServletResponseUtil.sendFile(httpReq,httpRes, streamDescr.getFileName(), streamDescr.getStream(), "application/download");
streamDescr.getStream().close();
} catch (Exception e) {
e.printStackTrace();
}
}
else if (versionDownloadItemId != null && versionDownloadName != null) { //check if download version
GCubeUser currentUser = Utils.getCurrentUser(resourceRequest);
String context = Utils.getCurrentContext(resourceRequest);
Workspace ws = Utils.getWS(currentUser.getUsername(), context) ;
WorkspaceItem theItem;
try {
theItem = ws.getItem(versionDownloadItemId);
if (theItem instanceof ExternalFile) {
ExternalFile file = (ExternalFile) theItem;
InputStream is = file.downloadVersion(versionDownloadName);
HttpServletResponse httpRes = PortalUtil.getHttpServletResponse(resourceResponse);
HttpServletRequest httpReq = PortalUtil.getHttpServletRequest(resourceRequest);
ServletResponseUtil.sendFile(httpReq,httpRes, versionDownloadName+"_"+file.getName(), is, "application/download");
}
} catch (ItemNotFoundException | InternalErrorException e) {
e.printStackTrace();
}
}
}
/**
* set the authorization token in Thread local and return the current {@link AuthorizedUser} instance
* @param request
* @return
*/
private void setAuthorizationToken(ResourceRequest request) {
GCubeUser currentUser = Utils.getCurrentUser(request);
String scope = Utils.getCurrentContext(request);
String authorizationToken = Utils.getCurrentUserToken(scope, currentUser.getUsername());
SecurityTokenProvider.instance.set(authorizationToken);
}
}