001/*
002 *  Copyright 2023 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.workspaces.calendars.actions;
017
018import java.util.ArrayList;
019import java.util.HashMap;
020import java.util.List;
021import java.util.Map;
022
023import org.apache.avalon.framework.parameters.Parameters;
024import org.apache.avalon.framework.service.ServiceException;
025import org.apache.avalon.framework.service.ServiceManager;
026import org.apache.cocoon.acting.ServiceableAction;
027import org.apache.cocoon.environment.ObjectModelHelper;
028import org.apache.cocoon.environment.Redirector;
029import org.apache.cocoon.environment.Request;
030import org.apache.cocoon.environment.SourceResolver;
031
032import org.ametys.core.cocoon.ActionResultGenerator;
033import org.ametys.plugins.repository.AmetysObject;
034import org.ametys.plugins.repository.AmetysObjectResolver;
035import org.ametys.plugins.workspaces.calendars.CalendarDAO;
036import org.ametys.plugins.workspaces.calendars.events.CalendarEvent;
037import org.ametys.plugins.workspaces.calendars.events.CalendarEventJSONHelper;
038import org.ametys.plugins.workspaces.calendars.helper.RecurrentEventHelper;
039import org.ametys.plugins.workspaces.calendars.task.TaskCalendar;
040import org.ametys.plugins.workspaces.calendars.task.TaskCalendarEvent;
041import org.ametys.plugins.workspaces.project.ProjectManager;
042import org.ametys.plugins.workspaces.project.objects.Project;
043import org.ametys.plugins.workspaces.tasks.Task;
044
045/**
046 * Action providing an event of a project.
047 */
048public class GetEvent extends ServiceableAction
049{
050    /** The object resolver */
051    protected AmetysObjectResolver _resolver;
052
053    /** Calendar manager for workspaces */
054    protected CalendarDAO _calendarDAO;
055    
056    /** Calendar event JSON helper */
057    protected CalendarEventJSONHelper _calendarEventJSONHelper;
058
059    /** The project manager */
060    protected ProjectManager _projectManager;
061    
062    @Override
063    public void service(ServiceManager smanager) throws ServiceException
064    {
065        super.service(smanager);
066        _calendarDAO = (CalendarDAO) smanager.lookup(CalendarDAO.ROLE);
067        _resolver = (AmetysObjectResolver) smanager.lookup(AmetysObjectResolver.ROLE);
068        _calendarEventJSONHelper = (CalendarEventJSONHelper) smanager.lookup(CalendarEventJSONHelper.ROLE);
069        _projectManager = (ProjectManager) smanager.lookup(ProjectManager.ROLE);
070    }
071
072    @Override
073    public Map act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws Exception
074    {
075        Request request = ObjectModelHelper.getRequest(objectModel);
076        
077        Map<String, Object> result = new HashMap<>();
078        request.setAttribute(ActionResultGenerator.MAP_REQUEST_ATTR, result);
079        
080        String eventId = request.getParameter("eventId");
081        if (eventId == null)
082        {
083            return EMPTY_MAP;
084        }
085        
086        CalendarEvent event = _getEvent(eventId);
087        if (event != null)
088        {
089            //get the working days
090            List<Integer> workingDayStrings = RecurrentEventHelper.getWorkingDays();
091            List<String> icsWorkingDays = new ArrayList<>();
092            for (Integer day : workingDayStrings)
093            {
094                switch (day)
095                {
096                    case java.util.Calendar.MONDAY:
097                        icsWorkingDays.add("MO");
098                        break;
099                    case java.util.Calendar.TUESDAY:
100                        icsWorkingDays.add("TU");
101                        break;
102                    case java.util.Calendar.WEDNESDAY:
103                        icsWorkingDays.add("WE");
104                        break;
105                    case java.util.Calendar.THURSDAY:
106                        icsWorkingDays.add("TH");
107                        break;
108                    case java.util.Calendar.FRIDAY:
109                        icsWorkingDays.add("FR");
110                        break;
111                    case java.util.Calendar.SATURDAY:
112                        icsWorkingDays.add("SA");
113                        break;
114                    case java.util.Calendar.SUNDAY:
115                        icsWorkingDays.add("SU");
116                        break;
117                    default:
118                        break;
119                }
120            }
121            
122            result.put("events", _calendarEventJSONHelper.eventAsJson(event, false, true));
123            result.put("workingDays", icsWorkingDays);
124        }
125
126        return EMPTY_MAP;
127    }
128    
129    private CalendarEvent _getEvent(String eventId)
130    {
131        AmetysObject object = _resolver.resolveById(eventId);
132        if (object instanceof CalendarEvent event)
133        {
134            return event;
135        }
136        else if (object instanceof Task task)
137        {
138            Project project = _projectManager.getParentProject(task);
139            TaskCalendar taskCalendar = _calendarDAO.getTaskCalendar(project, true);
140            return taskCalendar != null ? new TaskCalendarEvent(taskCalendar, task) : null;
141        }
142        
143        return null;
144    }
145}