001/* 002 * Copyright 2022 Anyware Services 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.ametys.plugins.forms.helper; 017 018import java.util.ArrayList; 019import java.util.HashMap; 020import java.util.List; 021import java.util.Map; 022 023import org.apache.avalon.framework.component.Component; 024import org.apache.avalon.framework.service.ServiceException; 025import org.apache.avalon.framework.service.ServiceManager; 026import org.apache.avalon.framework.service.Serviceable; 027import org.apache.commons.lang3.StringUtils; 028 029import org.ametys.cms.workflow.AmetysObjectCheckRightsCondition; 030import org.ametys.core.right.RightManager; 031import org.ametys.core.user.UserIdentity; 032import org.ametys.plugins.forms.dao.FormDAO; 033import org.ametys.plugins.forms.dao.FormEntryDAO; 034import org.ametys.plugins.forms.repository.Form; 035import org.ametys.plugins.forms.repository.FormEntry; 036import org.ametys.plugins.workflow.support.WorkflowHelper; 037import org.ametys.plugins.workflow.support.WorkflowProvider; 038import org.ametys.runtime.plugin.component.AbstractLogEnabled; 039 040import com.opensymphony.workflow.Workflow; 041import com.opensymphony.workflow.loader.ActionDescriptor; 042import com.opensymphony.workflow.loader.WorkflowDescriptor; 043 044/** 045 * The helper to handle admin dashboard 046 */ 047public class FormAdminDashboardHelper extends AbstractLogEnabled implements Serviceable, Component 048{ 049 /** Avalon ROLE. */ 050 public static final String ROLE = FormAdminDashboardHelper.class.getName(); 051 052 /** The workflow provider */ 053 protected WorkflowProvider _workflowProvider; 054 055 /** The form DAO */ 056 protected FormDAO _formDAO; 057 058 /** The right manager */ 059 protected RightManager _rightManager; 060 061 /** The form entry DAO */ 062 protected FormEntryDAO _formEntryDAO; 063 064 /** The workflow helper component */ 065 protected WorkflowHelper _workflowHelper; 066 067 public void service(ServiceManager manager) throws ServiceException 068 { 069 _workflowProvider = (WorkflowProvider) manager.lookup(WorkflowProvider.ROLE); 070 _formDAO = (FormDAO) manager.lookup(FormDAO.ROLE); 071 _rightManager = (RightManager) manager.lookup(RightManager.ROLE); 072 _formEntryDAO = (FormEntryDAO) manager.lookup(FormEntryDAO.ROLE); 073 _workflowHelper = (WorkflowHelper) manager.lookup(WorkflowHelper.ROLE); 074 } 075 076 /** 077 * The list of form to admin for current user 078 * @param siteName the sitename 079 * @param currentUser the current user 080 * @return the list of form to admin for current user 081 */ 082 public List<Form> getFormToAdmin(String siteName, UserIdentity currentUser) 083 { 084 return _formDAO.getForms(siteName) 085 .stream() 086 .filter(Form::hasWorkflow) 087 .filter(f -> _formEntryDAO.hasHandleDataRightOnForm(currentUser, f)) 088 .filter(f -> this._hasAtLeastOneEntryToDoAction(f, currentUser)) 089 .toList(); 090 } 091 092 /** 093 * <code>true</code> if the form has an entry that the user can do action 094 * @param form the form 095 * @param user the user 096 * @return <code>true</code> if the form has an entry that the user can do action 097 */ 098 protected boolean _hasAtLeastOneEntryToDoAction(Form form, UserIdentity user) 099 { 100 return form.getEntries() 101 .stream() 102 .anyMatch(this::hasAvailableActions); 103 } 104 105 /** 106 * <code>true</code> if the entry has available actions for current user 107 * @param entry the entry 108 * @return <code>true</code> if the entry has available actions for current user 109 */ 110 public boolean hasAvailableActions(FormEntry entry) 111 { 112 return _getAvailableActions(entry).length > 0; 113 } 114 115 /** 116 * Get available actions for current user filter by its type 117 * @param entry the entry 118 * @param types the types of actions. Empty to get all available actions 119 * @return the available actions for current user 120 */ 121 public List<ActionDescriptor> getAvailableActions(FormEntry entry, List<String> types) 122 { 123 List<ActionDescriptor> actions = new ArrayList<>(); 124 125 WorkflowDescriptor workflowDescriptor = _workflowHelper.getWorkflowDescriptor(entry.getForm().getWorkflowName()); 126 for (int actionId : _getAvailableActions(entry)) 127 { 128 ActionDescriptor action = workflowDescriptor.getAction(actionId); 129 Map<String, Object> metaAttributes = action.getMetaAttributes(); 130 String actionType = (String) metaAttributes.getOrDefault("action-type", StringUtils.EMPTY); 131 if (types.isEmpty() || types.contains(actionType)) 132 { 133 actions.add(action); 134 } 135 136 } 137 138 return actions; 139 } 140 141 private int[] _getAvailableActions(FormEntry entry) 142 { 143 Map<String, Object> inputs = new HashMap<>(); 144 inputs.put(AmetysObjectCheckRightsCondition.AMETYS_OBJECT_KEY, entry); 145 146 Workflow workflow = _workflowProvider.getAmetysObjectWorkflow(entry); 147 return workflow.getAvailableActions(entry.getWorkflowId(), inputs); 148 } 149}