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.time.ZonedDateTime;
019import java.util.ArrayList;
020import java.util.HashMap;
021import java.util.List;
022import java.util.Map;
023
024import org.apache.avalon.framework.parameters.Parameters;
025import org.apache.avalon.framework.service.ServiceException;
026import org.apache.avalon.framework.service.ServiceManager;
027import org.apache.cocoon.acting.ServiceableAction;
028import org.apache.cocoon.environment.ObjectModelHelper;
029import org.apache.cocoon.environment.Redirector;
030import org.apache.cocoon.environment.Request;
031import org.apache.cocoon.environment.SourceResolver;
032
033import org.ametys.core.cocoon.ActionResultGenerator;
034import org.ametys.core.util.DateUtils;
035import org.ametys.plugins.messagingconnector.EventRecurrenceTypeEnum;
036import org.ametys.plugins.repository.AmetysObjectResolver;
037import org.ametys.plugins.workspaces.calendars.CalendarDAO;
038import org.ametys.plugins.workspaces.calendars.events.CalendarEvent;
039import org.ametys.plugins.workspaces.calendars.events.CalendarEventDAO;
040import org.ametys.plugins.workspaces.calendars.events.CalendarEventJSONHelper;
041import org.ametys.plugins.workspaces.calendars.events.CalendarEventOccurrence;
042import org.ametys.plugins.workspaces.calendars.helper.RecurrentEventHelper;
043import org.ametys.plugins.workspaces.calendars.jcr.JCRCalendarEvent;
044import org.ametys.plugins.workspaces.project.ProjectManager;
045
046/**
047 * Action providing an event of a project.
048 */
049public class GetEvent extends ServiceableAction
050{
051    /** The object resolver */
052    protected AmetysObjectResolver _resolver;
053
054    /** Calendar manager for workspaces */
055    protected CalendarDAO _calendarDAO;
056
057    /** Calendar event manager for workspaces */
058    protected CalendarEventDAO _calendarEventDAO;
059    
060    /** Calendar event JSON helper */
061    protected CalendarEventJSONHelper _calendarEventJSONHelper;
062
063    /** The project manager */
064    protected ProjectManager _projectManager;
065    
066    @Override
067    public void service(ServiceManager smanager) throws ServiceException
068    {
069        super.service(smanager);
070        _calendarDAO = (CalendarDAO) smanager.lookup(CalendarDAO.ROLE);
071        _calendarEventDAO = (CalendarEventDAO) smanager.lookup(CalendarEventDAO.ROLE);
072        _resolver = (AmetysObjectResolver) smanager.lookup(AmetysObjectResolver.ROLE);
073        _calendarEventJSONHelper = (CalendarEventJSONHelper) smanager.lookup(CalendarEventJSONHelper.ROLE);
074        _projectManager = (ProjectManager) smanager.lookup(ProjectManager.ROLE);
075    }
076
077    @Override
078    public Map act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws Exception
079    {
080        Request request = ObjectModelHelper.getRequest(objectModel);
081        
082        Map<String, Object> result = new HashMap<>();
083        request.setAttribute(ActionResultGenerator.MAP_REQUEST_ATTR, result);
084        
085        String eventId = request.getParameter("eventId");
086        String occurrenceDateAsString = request.getParameter("occurrenceDate");
087        if (eventId == null)
088        {
089            return EMPTY_MAP;
090        }
091        
092        CalendarEvent event = _calendarEventDAO.getCalenderEventById(eventId);
093        if (event != null)
094        {
095            //get the working days
096            List<Integer> workingDayStrings = RecurrentEventHelper.getWorkingDays();
097            List<String> icsWorkingDays = new ArrayList<>();
098            
099            if (occurrenceDateAsString != null)
100            {
101                ZonedDateTime occurrenceDate = DateUtils.parseZonedDateTime(occurrenceDateAsString);
102                List<CalendarEventOccurrence> occurrences = event.getOccurrences(occurrenceDate, occurrenceDate.plusDays(1));
103                
104                if (!occurrences.isEmpty() && event instanceof JCRCalendarEvent jcrEvent)
105                {
106                    jcrEvent.setStartDate(occurrences.get(0).getStartDate());
107                    jcrEvent.setEndDate(occurrences.get(0).getEndDate());
108                    jcrEvent.setRecurrenceType(EventRecurrenceTypeEnum.NEVER.toString());
109                }
110                else
111                {
112                    // If no occurrence is found for the given date, it means that the event is not occurring on this date, so we return an empty map
113                    return EMPTY_MAP;
114                }
115            }
116            
117            for (Integer day : workingDayStrings)
118            {
119                switch (day)
120                {
121                    case java.util.Calendar.MONDAY:
122                        icsWorkingDays.add("MO");
123                        break;
124                    case java.util.Calendar.TUESDAY:
125                        icsWorkingDays.add("TU");
126                        break;
127                    case java.util.Calendar.WEDNESDAY:
128                        icsWorkingDays.add("WE");
129                        break;
130                    case java.util.Calendar.THURSDAY:
131                        icsWorkingDays.add("TH");
132                        break;
133                    case java.util.Calendar.FRIDAY:
134                        icsWorkingDays.add("FR");
135                        break;
136                    case java.util.Calendar.SATURDAY:
137                        icsWorkingDays.add("SA");
138                        break;
139                    case java.util.Calendar.SUNDAY:
140                        icsWorkingDays.add("SU");
141                        break;
142                    default:
143                        break;
144                }
145            }
146            
147            result.put("events", _calendarEventJSONHelper.eventAsJson(event, true));
148            result.put("workingDays", icsWorkingDays);
149        }
150
151        return EMPTY_MAP;
152    }
153    
154}