/* * 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; }