org.eclipse.sw360.portal.portlets.Sw360Portlet.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.sw360.portal.portlets.Sw360Portlet.java

Source

/*
 * Copyright Siemens AG, 2013-2017. Part of the SW360 Portal Project.
 * With contributions by Bosch Software Innovations GmbH, 2016.
 *
 * SPDX-License-Identifier: EPL-1.0
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 */

package org.eclipse.sw360.portal.portlets;

import com.google.common.base.Joiner;
import com.google.common.base.Predicate;
import com.google.common.collect.FluentIterable;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.servlet.SessionMessages;
import com.liferay.portal.util.PortalUtil;
import com.liferay.util.bridges.mvc.MVCPortlet;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.thrift.TException;
import org.eclipse.sw360.datahandler.thrift.*;
import org.eclipse.sw360.datahandler.thrift.licenses.License;
import org.eclipse.sw360.datahandler.thrift.licenses.LicenseService;
import org.eclipse.sw360.datahandler.thrift.users.RequestedAction;
import org.eclipse.sw360.datahandler.thrift.users.User;
import org.eclipse.sw360.datahandler.thrift.users.UserService;
import org.eclipse.sw360.portal.common.ErrorMessages;
import org.eclipse.sw360.portal.common.PortalConstants;

import javax.portlet.*;
import java.io.IOException;
import java.util.*;

import static com.google.common.base.Strings.isNullOrEmpty;

abstract public class Sw360Portlet extends MVCPortlet {

    private final int MAX_LENGTH_USERS_IN_DISPLAY = 100;

    private static final Logger log = Logger.getLogger(Sw360Portlet.class);

    protected final ThriftClients thriftClients;

    protected Sw360Portlet() {
        thriftClients = new ThriftClients();
    }

    public Sw360Portlet(ThriftClients thriftClients) {
        this.thriftClients = thriftClients;
    }

    @Override
    public void doView(RenderRequest request, RenderResponse response) throws IOException, PortletException {
        super.doView(request, response);
    }

    protected void addBreadcrumbEntry(PortletRequest request, String name, PortletURL url) {
        PortalUtil.addPortletBreadcrumbEntry(
                PortalUtil.getOriginalServletRequest(PortalUtil.getHttpServletRequest(request)), name,
                url.toString());
    }

    protected void renderRequestSummary(PortletRequest request, ActionResponse response,
            RequestSummary requestSummary) {
        StringBuilder successMsg = new StringBuilder();
        successMsg.append(requestSummary.requestStatus.toString());

        if (requestSummary.isSetTotalAffectedElements() || requestSummary.isSetTotalElements()
                || requestSummary.isSetMessage())
            successMsg.append(": ");
        if (requestSummary.isSetTotalAffectedElements() && requestSummary.isSetTotalElements()) {
            successMsg.append(requestSummary.totalAffectedElements).append(" affected of ")
                    .append(requestSummary.totalElements).append(" total. ");
        } else if (requestSummary.isSetTotalElements()) {
            successMsg.append(requestSummary.totalElements).append(" total Elements. ");
        } else if (requestSummary.isSetTotalAffectedElements()) {
            successMsg.append(requestSummary.totalAffectedElements).append(" total affected elements. ");
        }

        if (requestSummary.isSetMessage())
            successMsg.append(requestSummary.getMessage());

        SessionMessages.add(request, "request_processed", successMsg.toString());
    }

    protected void renderRequestSummary(PortletRequest request, MimeResponse response,
            RequestSummary requestSummary) {
        JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
        jsonObject.put("result", requestSummary.requestStatus.toString());
        if (requestSummary.isSetTotalAffectedElements())
            jsonObject.put("totalAffectedObjects", requestSummary.totalAffectedElements);
        if (requestSummary.isSetTotalElements())
            jsonObject.put("totalObjects", requestSummary.totalElements);
        if (requestSummary.isSetMessage())
            jsonObject.put("message", requestSummary.message);

        try {
            writeJSON(request, response, jsonObject);
        } catch (IOException e) {
            log.error("Problem rendering RequestStatus", e);
        }
    }

    protected void renderRequestStatus(PortletRequest request, MimeResponse response, RequestStatus requestStatus) {
        JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
        jsonObject.put("result", requestStatus.toString());
        try {
            writeJSON(request, response, jsonObject);
        } catch (IOException e) {
            log.error("Problem rendering RequestStatus", e);
        }
    }

    protected void renderRemoveModerationRequestStatus(PortletRequest request, MimeResponse response,
            RemoveModeratorRequestStatus status) {
        JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
        jsonObject.put("result", status.toString());
        try {
            writeJSON(request, response, jsonObject);
        } catch (IOException e) {
            log.error("Problem rendering RemoveModerationRequestStatus", e);
        }
    }

    protected void renderRequestStatus(PortletRequest request, ActionResponse response,
            RequestStatus requestStatus) {
        SessionMessages.add(request, "request_processed", requestStatus.toString());
    }

    protected void serveRequestStatus(PortletRequest request, ResourceResponse response,
            RequestStatus requestStatus, String message, Logger log) {
        if (requestStatus != RequestStatus.FAILURE) {
            request.setAttribute(PortalConstants.REQUEST_STATUS, requestStatus.toString());
            // We want failures to call the error method of the AJAX call so we do not send it
            renderRequestStatus(request, response, requestStatus);
        } else {
            log.error(message);
        }
    }

    public static boolean isUserAction(String action) {
        return action.startsWith(PortalConstants.USER_PREFIX);
    }

    public List<User> limitLengthOfUserList(List<User> userList) {
        if (userList.size() < MAX_LENGTH_USERS_IN_DISPLAY) {
            return userList;
        } else {
            return userList.subList(0, MAX_LENGTH_USERS_IN_DISPLAY);
        }
    }

    public void dealWithUserAction(ResourceRequest request, ResourceResponse response, String action)
            throws IOException, PortletException {
        if (PortalConstants.USER_SEARCH.equals(action)) {
            String searchText = request.getParameter(PortalConstants.WHAT);
            String how = request.getParameter(PortalConstants.HOW);

            Boolean multiUsers = false;
            if (!isNullOrEmpty(how)) {
                multiUsers = Boolean.parseBoolean(how);
            }

            try {
                List<User> users;
                UserService.Iface client = thriftClients.makeUserClient();
                if (isNullOrEmpty(searchText)) {
                    users = client.getAllUsers();
                } else {
                    users = client.searchUsers(searchText);
                }
                List<User> truncatedUserList = limitLengthOfUserList(users);
                request.setAttribute(PortalConstants.USER_LIST, truncatedUserList);
                request.setAttribute(PortalConstants.HOW, multiUsers);
                request.setAttribute(PortalConstants.USER_SEARCH_GOT_TRUNCATED,
                        isListTruncated(users, truncatedUserList));
                include("/html/utils/ajax/userListAjax.jsp", request, response, PortletRequest.RESOURCE_PHASE);
            } catch (TException e) {
                log.error("Error getting users", e);
            }

        }
    }

    public Boolean isListTruncated(List<User> fullList, List<User> truncatedList) {
        return (fullList.size() > truncatedList.size());
    }

    public void dealWithLicenseAction(ResourceRequest request, ResourceResponse response, String action)
            throws IOException, PortletException {
        if (PortalConstants.LICENSE_SEARCH.equals(action)) {
            final String searchText = request.getParameter(PortalConstants.WHAT);

            try {
                LicenseService.Iface client = thriftClients.makeLicenseClient();
                List<License> licenses = client.getLicenseSummary();

                licenses = FluentIterable.from(licenses).filter(new Predicate<License>() {
                    @Override
                    public boolean apply(License input) {
                        String fullname = input.getFullname();
                        String shortname = input.getShortname();
                        return (StringUtils.containsIgnoreCase(fullname, searchText)
                                || StringUtils.containsIgnoreCase(shortname, searchText));
                    }
                }).toList();

                request.setAttribute(PortalConstants.LICENSE_LIST, licenses);
                include("/html/utils/ajax/licenseListAjax.jsp", request, response, PortletRequest.RESOURCE_PHASE);
            } catch (TException e) {
                log.error("Error getting licenses", e);
            }

        }
    }

    public static boolean isLicenseAction(String action) {
        return action.startsWith(PortalConstants.LICENSE_PREFIX);
    }

    protected boolean isGenericAction(String action) {
        return isUserAction(action) || isLicenseAction(action);
    }

    protected void dealWithGenericAction(ResourceRequest request, ResourceResponse response, String action)
            throws IOException, PortletException {
        if (isUserAction(action)) {
            dealWithUserAction(request, response, action);
        } else if (isLicenseAction(action)) {
            dealWithLicenseAction(request, response, action);
        } else {
            throw new IllegalStateException("Cannot deal with action " + action + " as generic");
        }
    }

    public void setSessionMessage(PortletRequest request, RequestStatus requestStatus, String type, String verb,
            String name) throws PortletException {
        String statusMessage;
        if (isNullOrEmpty(name)) {
            name = "";
        } else {
            name = " " + name;
        }
        switch (requestStatus) {
        case SUCCESS:
            statusMessage = type + name + " " + verb + "d successfully!";
            SessionMessages.add(request, "request_processed", statusMessage);
            break;
        case SENT_TO_MODERATOR:
            statusMessage = "Moderation request was sent to " + verb + " the " + type + name + "!";
            SessionMessages.add(request, "request_processed", statusMessage);
            break;
        case FAILURE:
            setSW360SessionError(request, ErrorMessages.DOCUMENT_NOT_PROCESSED_SUCCESSFULLY);
            break;
        case IN_USE:
            if (type.equals("License")) {
                setSW360SessionError(request, ErrorMessages.LICENSE_USED_BY_RELEASE);
            } else {
                setSW360SessionError(request, ErrorMessages.DOCUMENT_USED_BY_PROJECT_OR_RELEASE);
            }
            break;
        case FAILED_SANITY_CHECK:
            setSW360SessionError(request, ErrorMessages.UPDATE_FAILED_SANITY_CHECK);
            break;
        default:
            throw new PortletException("Unknown request status");
        }
    }

    public void setSW360SessionError(PortletRequest request, String errorMessage) {
        if (ErrorMessages.allErrorMessages.contains(errorMessage)) {
            SessionErrors.add(request, errorMessage);
        } else {
            SessionErrors.add(request, ErrorMessages.DEFAULT_ERROR_MESSAGE);
        }
        SessionMessages.add(request,
                PortalUtil.getPortletId(request) + SessionMessages.KEY_SUFFIX_HIDE_DEFAULT_ERROR_MESSAGE);
        SessionMessages.add(request,
                PortalUtil.getPortletId(request) + SessionMessages.KEY_SUFFIX_HIDE_DEFAULT_SUCCESS_MESSAGE);
    }

    public void setSessionMessage(PortletRequest request, String successMsg) throws PortletException {
        SessionMessages.add(request, "request_processed", successMsg);
    }

    public void setSessionMessage(PortletRequest request, RequestStatus requestStatus, String type, String verb)
            throws PortletException {
        setSessionMessage(request, requestStatus, type, verb, null);
    }

    protected void addEditDocumentMessage(RenderRequest request, Map<RequestedAction, Boolean> permissions,
            DocumentState documentState) {

        List<String> msgs = new ArrayList<>();
        if (documentState.isSetModerationState()) {
            ModerationState moderationState = documentState.getModerationState();
            switch (moderationState) {
            case PENDING:
                msgs.add("There is a pending Moderation request.");
                break;
            case APPROVED:
                break;
            case REJECTED:
                break;
            case INPROGRESS:
                msgs.add("There is a Moderation request in progress.");
                break;
            }
        }

        if (!permissions.get(RequestedAction.WRITE)) {
            msgs.add("You will create a moderation request if you update.");
        } else if (documentState.isIsOriginalDocument()) {
            msgs.add("You are editing the original document.");
        }

        SessionMessages.add(request, "request_processed", Joiner.on(" ").join(msgs));
    }
}