com.agiletec.plugins.jpcrowdsourcing.aps.system.services.ideainstance.ApiIdeaInstanceInterface.java Source code

Java tutorial

Introduction

Here is the source code for com.agiletec.plugins.jpcrowdsourcing.aps.system.services.ideainstance.ApiIdeaInstanceInterface.java

Source

/*
 * Copyright 2015-Present Entando Inc. (http://www.entando.com) All rights reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
package com.agiletec.plugins.jpcrowdsourcing.aps.system.services.ideainstance;

import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Set;

import javax.ws.rs.core.Response;

import org.apache.commons.lang.StringUtils;
import org.entando.entando.aps.system.services.api.IApiErrorCodes;
import org.entando.entando.aps.system.services.api.model.ApiException;
import org.entando.entando.aps.system.services.api.model.StringApiResponse;
import org.entando.entando.aps.system.services.api.server.IResponseBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.agiletec.aps.system.SystemConstants;
import com.agiletec.aps.system.exception.ApsSystemException;
import com.agiletec.aps.system.services.group.IGroupManager;
import com.agiletec.aps.system.services.page.IPage;
import com.agiletec.aps.system.services.page.IPageManager;
import com.agiletec.aps.system.services.page.Widget;
import com.agiletec.aps.system.services.role.Permission;
import com.agiletec.aps.system.services.user.UserDetails;
import com.agiletec.aps.util.ApsProperties;
import com.agiletec.plugins.jpcrowdsourcing.aps.system.services.common.api.CollaborationAbstractApiInterface;
import com.agiletec.plugins.jpcrowdsourcing.aps.system.services.idea.IIdea;
import com.agiletec.plugins.jpcrowdsourcing.aps.system.services.ideainstance.api.JAXBIdeaInstance;
import com.agiletec.plugins.jpcrowdsourcing.apsadmin.portal.specialwidget.IdeaInstanceWidgetAction;

public class ApiIdeaInstanceInterface extends CollaborationAbstractApiInterface {

    private static final Logger _logger = LoggerFactory.getLogger(ApiIdeaInstanceInterface.class);

    /**
     * GET http://localhost:8080/<portal>/api/rs/en/ideaInstances?
     * @param properties
     * @return
     * @throws Throwable
     */
    public List<String> getIdeaInstancesForApi(Properties properties) throws Throwable {
        List<String> idList = new ArrayList<String>();
        try {
            Collection<String> groupCodes = this.extractGroups(properties);
            String codeParam = properties.getProperty("code");
            if (StringUtils.isNotBlank(codeParam))
                codeParam = URLDecoder.decode(codeParam, "UTF-8");
            idList = this.getIdeaInstanceManager().getIdeaInstances(groupCodes, codeParam);
        } catch (Throwable t) {
            _logger.error("Error extracting ideaInstances", t);
            throw new ApsSystemException("Error extracting ideaInstances", t);
        }
        return idList;
    }

    /**
     * GET http://localhost:8080/<portal>/api/rs/en/ideaInstances?id=1
     * @param properties
     * @return
     * @throws Throwable
     */
    public JAXBIdeaInstance getIdeaInstanceForApi(Properties properties) throws Throwable {
        JAXBIdeaInstance jaxbIdeaInstance = null;
        try {
            String codeParam = properties.getProperty("code");
            if (StringUtils.isNotBlank(codeParam))
                codeParam = URLDecoder.decode(codeParam, "UTF-8");

            UserDetails user = (UserDetails) properties.get(SystemConstants.API_USER_PARAMETER);
            //TODO CREATE ROLE
            List<Integer> ideaStateFilter = new ArrayList<Integer>();
            ideaStateFilter.add(IIdea.STATUS_APPROVED);

            if (null != user && !this.getAuthorizationManager().isAuthOnPermission(user, Permission.SUPERUSER)) {
                ideaStateFilter.clear();
            }
            IdeaInstance ideaInstance = this.getIdeaInstanceManager().getIdeaInstance(codeParam, ideaStateFilter);
            if (null == ideaInstance) {
                throw new ApiException(IApiErrorCodes.API_VALIDATION_ERROR,
                        "IdeaInstance with code '" + codeParam + "' does not exist", Response.Status.CONFLICT);
            }
            if (!isAuthOnInstance(user, ideaInstance)) {
                _logger.warn("the current user is not granted to any group required by instance {}", codeParam);
                throw new ApiException(IApiErrorCodes.API_VALIDATION_ERROR,
                        "IdeaInstance with code '" + codeParam + "' does not exist", Response.Status.CONFLICT);
            }
            jaxbIdeaInstance = new JAXBIdeaInstance(ideaInstance);
        } catch (ApiException ae) {
            throw ae;
        } catch (Throwable t) {
            _logger.error("Error extracting ideaInstance", t);
            throw new ApsSystemException("Error extracting idea instance", t);
        }
        return jaxbIdeaInstance;
    }

    public StringApiResponse addIdeaInstance(JAXBIdeaInstance jaxbIdeaInstance, Properties properties)
            throws Throwable {
        StringApiResponse response = new StringApiResponse();
        try {
            String code = jaxbIdeaInstance.getCode();

            IdeaInstance clone = this.getIdeaInstanceManager().getIdeaInstance(code);
            if (null != clone) {
                throw new ApiException(IApiErrorCodes.API_VALIDATION_ERROR, "Code already in use",
                        Response.Status.CONFLICT);
            }
            Set<String> parsedGroups = this.validateGroups(jaxbIdeaInstance);
            if (null == parsedGroups || parsedGroups.isEmpty()) {
                throw new ApiException(IApiErrorCodes.API_VALIDATION_ERROR, "At least one group is mandatory",
                        Response.Status.CONFLICT);
            }
            IdeaInstance ideainstance = jaxbIdeaInstance.getIdeaInstance();
            ideainstance.setGroups(new ArrayList<String>(parsedGroups));
            this.getIdeaInstanceManager().addIdeaInstance(ideainstance);
            response.setResult(IResponseBuilder.SUCCESS, null);
        } catch (ApiException ae) {
            response.addErrors(ae.getErrors());
            response.setResult(IResponseBuilder.FAILURE, null);
        } catch (Throwable t) {
            _logger.error("Error adding an ideaInstance", t);
            throw t;
        }
        return response;
    }

    public StringApiResponse updateIdeaInstance(JAXBIdeaInstance jaxbIdeaInstance, Properties properties)
            throws Throwable {
        StringApiResponse response = new StringApiResponse();
        try {
            String code = jaxbIdeaInstance.getCode();
            IdeaInstance clone = this.getIdeaInstanceManager().getIdeaInstance(code);
            if (null == clone) {
                throw new ApiException(IApiErrorCodes.API_VALIDATION_ERROR, "No ideaInstance found with id " + code,
                        Response.Status.CONFLICT);
            }
            Set<String> parsedGroups = this.validateGroups(jaxbIdeaInstance);
            if (null == parsedGroups || parsedGroups.isEmpty()) {
                throw new ApiException(IApiErrorCodes.API_VALIDATION_ERROR, "At least one group is mandatory",
                        Response.Status.CONFLICT);
            }
            IdeaInstance ideainstance = jaxbIdeaInstance.getIdeaInstance();
            ideainstance.setGroups(new ArrayList<String>(parsedGroups));
            this.getIdeaInstanceManager().updateIdeaInstance(ideainstance);
            response.setResult(IResponseBuilder.SUCCESS, null);
        } catch (ApiException ae) {
            response.addErrors(ae.getErrors());
            response.setResult(IResponseBuilder.FAILURE, null);
        } catch (Throwable t) {
            _logger.error("Error updating an ideaInstance", t);
            throw t;
        }
        return response;
    }

    public StringApiResponse deleteIdeaInstance(Properties properties) throws Throwable {
        StringApiResponse response = new StringApiResponse();
        try {
            String code = properties.getProperty("code");
            if (StringUtils.isNotBlank(code))
                code = URLDecoder.decode(code, "UTF-8");
            IdeaInstance clone = this.getIdeaInstanceManager().getIdeaInstance(code);
            if (null == clone) {
                throw new ApiException(IApiErrorCodes.API_VALIDATION_ERROR, "No ideaInstance found with id " + code,
                        Response.Status.CONFLICT);
            }
            IPage page = this.getPageWithInstance(code);
            if (null != page) {
                throw new ApiException(IApiErrorCodes.API_VALIDATION_ERROR, "Cannod dete the intance with code '"
                        + code + "'. It's published in page " + page.getCode(), Response.Status.CONFLICT);
            }
            this.getIdeaInstanceManager().deleteIdeaInstance(code);
            response.setResult(IResponseBuilder.SUCCESS, null);
        } catch (ApiException ae) {
            response.addErrors(ae.getErrors());
            response.setResult(IResponseBuilder.FAILURE, null);
        } catch (Throwable t) {
            _logger.error("Error deleting an ideaInstance", t);
            throw t;
        }
        return response;
    }

    private Set<String> validateGroups(JAXBIdeaInstance jaxbIdeaInstance) {
        Set<String> parsedGroups = new HashSet<String>();
        List<String> groups = jaxbIdeaInstance.getGroups();
        if (null == groups || groups.isEmpty())
            return parsedGroups;
        for (int i = 0; i < groups.size(); i++) {
            String groupName = groups.get(i);
            if (null != this.getGroupManager().getGroup(groupName)) {
                parsedGroups.add(groupName);
            }
        }
        return parsedGroups;
    }

    protected IPage getPageWithInstance(String code) {
        IPage page = null;
        try {
            List<IPage> pages = this.getPageManager().getWidgetUtilizers(IdeaInstanceWidgetAction.WIDGET_CODE);
            if (null != pages && !pages.isEmpty()) {
                Iterator<IPage> it = pages.iterator();
                while (it.hasNext()) {
                    IPage currentPage = it.next();
                    Widget[] widgets = currentPage.getWidgets();
                    for (int i = 0; i < widgets.length; i++) {
                        Widget currentWidget = widgets[i];
                        if (null != currentWidget
                                && currentWidget.getType().getCode().equals(IdeaInstanceWidgetAction.WIDGET_CODE)) {
                            ApsProperties config = currentWidget.getConfig();
                            if (null != config) {
                                String value = config
                                        .getProperty(IdeaInstanceWidgetAction.WIDGET_PARAM_IDEA_INSTANCE);
                                if (StringUtils.isNotBlank(value) && value.equals(code)) {
                                    page = currentPage;
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        } catch (Throwable t) {
            _logger.error("Error checking if idea instance is published", t);
            throw new RuntimeException("Error checking if idea instance is published");
        }
        return page;
    }

    protected IIdeaInstanceManager getIdeaInstanceManager() {
        return _ideaInstanceManager;
    }

    public void setIdeaInstanceManager(IIdeaInstanceManager ideaInstanceManager) {
        this._ideaInstanceManager = ideaInstanceManager;
    }

    protected IPageManager getPageManager() {
        return _pageManager;
    }

    public void setPageManager(IPageManager pageManager) {
        this._pageManager = pageManager;
    }

    protected IGroupManager getGroupManager() {
        return _groupManager;
    }

    public void setGroupManager(IGroupManager groupManager) {
        this._groupManager = groupManager;
    }

    private IPageManager _pageManager;
    private IIdeaInstanceManager _ideaInstanceManager;
    private IGroupManager _groupManager;

}