/** * Axelor Business Solutions * * Copyright (C) 2016 Axelor (<http://axelor.com>). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.axelor.apps.crm.service; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.io.Writer; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.text.ParseException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.httpclient.protocol.Protocol; import org.apache.jackrabbit.webdav.client.methods.DeleteMethod; import org.joda.time.LocalDateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.axelor.app.AppSettings; import com.axelor.apps.base.db.ICalendarEvent; import com.axelor.apps.base.db.ICalendarUser; import com.axelor.apps.base.db.Team; import com.axelor.apps.base.db.repo.ICalendarEventRepository; import com.axelor.apps.base.db.repo.ICalendarUserRepository; import com.axelor.apps.base.ical.ICalendarException; import com.axelor.apps.base.ical.ICalendarService; import com.axelor.apps.base.ical.ICalendarStore; import com.axelor.apps.crm.db.Calendar; import com.axelor.apps.crm.db.CalendarManagement; import com.axelor.apps.crm.db.Event; import com.axelor.apps.crm.db.ICalendar; import com.axelor.apps.crm.db.repo.CalendarRepository; import com.axelor.apps.crm.db.repo.EventRepository; import com.axelor.apps.crm.exception.IExceptionMessage; import com.axelor.apps.message.db.EmailAddress; import com.axelor.apps.message.db.repo.EmailAddressRepository; import com.axelor.auth.db.User; import com.axelor.exception.AxelorException; import com.axelor.exception.db.IException; import com.axelor.i18n.I18n; import com.axelor.inject.Beans; import com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.google.inject.Inject; import com.google.inject.persist.Transactional; import net.fortuna.ical4j.connector.FailedOperationException; import net.fortuna.ical4j.connector.ObjectStoreException; import net.fortuna.ical4j.connector.dav.CalDavCalendarCollection; import net.fortuna.ical4j.connector.dav.PathResolver; import net.fortuna.ical4j.data.CalendarBuilder; import net.fortuna.ical4j.data.CalendarOutputter; import net.fortuna.ical4j.data.ParserException; import net.fortuna.ical4j.model.Component; import net.fortuna.ical4j.model.ConstraintViolationException; import net.fortuna.ical4j.model.DateTime; import net.fortuna.ical4j.model.Parameter; import net.fortuna.ical4j.model.Property; import net.fortuna.ical4j.model.PropertyList; import net.fortuna.ical4j.model.ValidationException; import net.fortuna.ical4j.model.component.VEvent; import net.fortuna.ical4j.model.property.Attendee; import net.fortuna.ical4j.model.property.Clazz; import net.fortuna.ical4j.model.property.DtEnd; import net.fortuna.ical4j.model.property.DtStart; import net.fortuna.ical4j.model.property.Organizer; import net.fortuna.ical4j.model.property.Transp; import net.fortuna.ical4j.model.property.Trigger; import net.fortuna.ical4j.model.property.XProperty; public class CalendarService extends ICalendarService{ private final Logger log = LoggerFactory.getLogger(CalendarService.class); static final String X_WR_CALNAME = "X-WR-CALNAME"; @Inject protected CalendarRepository calendarRepo; public static class GenericPathResolver extends PathResolver { private String principalPath; private String userPath; public String principalPath() { return principalPath; } public void setPrincipalPath(String principalPath) { this.principalPath = principalPath; } @Override public String getPrincipalPath(String username) { return principalPath + "/" + username + "/"; } public String userPath() { return userPath; } public void setUserPath(String userPath) { this.userPath = userPath; } @Override public String getUserPath(String username) { return userPath + "/" + username; } } public PathResolver getPathResolver(int typeSelect) { switch (typeSelect) { case ICalendar.ICAL_SERVER : return PathResolver.ICAL_SERVER; case ICalendar.CALENDAR_SERVER : return PathResolver.CALENDAR_SERVER; case ICalendar.GCAL : return PathResolver.GCAL; case ICalendar.ZIMBRA : return PathResolver.ZIMBRA; case ICalendar.KMS : return PathResolver.KMS; case ICalendar.CGP : return PathResolver.CGP; case ICalendar.CHANDLER : return PathResolver.CHANDLER; default: return null; } } public Protocol getProtocol(boolean isSslConnection) { if(isSslConnection) { return Protocol.getProtocol("https"); } else { return Protocol.getProtocol("http"); } } @Transactional public void importCalendar(Calendar cal, File file) throws IOException, ParserException { log.debug("Import calendar {} ::: {}", cal.getName(), file.getName()); this.loadCRM(cal, file); calendarRepo.save(cal); } @Transactional public void loadCRM(Calendar calendar, File file) throws IOException, ParserException { Preconditions.checkNotNull(calendar, "calendar can't be null"); Preconditions.checkNotNull(file, "input file can't be null"); Preconditions.checkArgument(file.exists(), "no such file: " + file); final Reader reader = new FileReader(file); try { loadCRM(calendar, reader); } finally { reader.close(); } } @Transactional public void loadCRM(Calendar calendar, Reader reader) throws IOException, ParserException { Preconditions.checkNotNull(calendar, "calendar can't be null"); Preconditions.checkNotNull(reader, "reader can't be null"); final CalendarBuilder builder = new CalendarBuilder(); final net.fortuna.ical4j.model.Calendar cal = builder.build(reader); if (calendar.getName() == null && cal.getProperty(X_WR_CALNAME) != null) { calendar.setName(cal.getProperty(X_WR_CALNAME).getValue()); } for (Object item : cal.getComponents(Component.VEVENT)) { Event event = findOrCreateEventCRM((VEvent) item); calendar.addEventsCrm(event); } } @Transactional protected Event findOrCreateEventCRM(VEvent vEvent) { String uid = vEvent.getUid().getValue(); DtStart dtStart = vEvent.getStartDate(); DtEnd dtEnd = vEvent.getEndDate(); EventRepository repo = Beans.get(EventRepository.class); Event event = repo.all().filter("self.uid = ?1", uid).fetchOne(); if (event == null) { event = new Event(); event.setUid(uid); } if(event.getTypeSelect() == null || event.getTypeSelect() == 0){ event.setTypeSelect(EventRepository.TYPE_EVENT); } event.setStartDateTime(new LocalDateTime(dtStart.getDate())); event.setEndDateTime(new LocalDateTime(dtEnd.getDate())); event.setAllDay(!(dtStart.getDate() instanceof DateTime)); event.setSubject(getValue(vEvent, Property.SUMMARY)); event.setDescription(getValue(vEvent, Property.DESCRIPTION)); event.setLocation(getValue(vEvent, Property.LOCATION)); event.setGeo(getValue(vEvent, Property.GEO)); event.setUrl(getValue(vEvent, Property.URL)); event.setSubjectTeam(event.getSubject()); if(Clazz.PRIVATE.getValue().equals(getValue(vEvent, Property.CLASS))){ event.setVisibilitySelect(ICalendarEventRepository.VISIBILITY_PRIVATE); } else{ event.setVisibilitySelect(ICalendarEventRepository.VISIBILITY_PUBLIC); } if(Transp.TRANSPARENT.getValue().equals(getValue(vEvent, Property.TRANSP))){ event.setDisponibilitySelect(ICalendarEventRepository.DISPONIBILITY_AVAILABLE); } else{ event.setDisponibilitySelect(ICalendarEventRepository.DISPONIBILITY_BUSY); } if(event.getVisibilitySelect() == ICalendarEventRepository.VISIBILITY_PRIVATE){ event.setSubjectTeam(I18n.get("Available")); if(event.getDisponibilitySelect() == ICalendarEventRepository.DISPONIBILITY_BUSY){ event.setSubjectTeam(I18n.get("Busy")); } } ICalendarUser organizer = findOrCreateUser(vEvent.getOrganizer(), event); if (organizer != null) { event.setOrganizer(organizer); iCalendarUserRepository.save(organizer); } for (Object item : vEvent.getProperties(Property.ATTENDEE)) { ICalendarUser attendee = findOrCreateUser((Property) item, event); if (attendee != null) { event.addAttendee(attendee); iCalendarUserRepository.save(attendee); } } return event; } protected ICalendarUser findOrCreateUser(Property source, Event event) { URI addr = null; if (source instanceof Organizer) { addr = ((Organizer) source).getCalAddress(); } if (source instanceof Attendee) { addr = ((Attendee) source).getCalAddress(); } if (addr == null) { return null; } String email = mailto(addr.toString(), true); ICalendarUserRepository repo = Beans.get(ICalendarUserRepository.class); ICalendarUser user = null; if (source instanceof Organizer) { user = repo.all().filter("self.email = ?1", email).fetchOne(); } else{ user = repo.all().filter("self.email = ?1 AND self.event.id = ?2", email, event.getId()).fetchOne(); } if (user == null) { user = new ICalendarUser(); user.setEmail(email); user.setName(email); EmailAddress emailAddress = Beans.get(EmailAddressRepository.class).findByAddress(email); if(emailAddress != null && emailAddress.getPartner() != null && emailAddress.getPartner().getUser() != null){ user.setUser(emailAddress.getPartner().getUser()); } } if (source.getParameter(Parameter.CN) != null) { user.setName(source.getParameter(Parameter.CN).getValue()); } if(source.getParameter(Parameter.PARTSTAT) != null){ String role = source.getParameter(Parameter.PARTSTAT).getValue(); if(role.equals("TENTATIVE")){ user.setStatusSelect(ICalendarUserRepository.STATUS_MAYBE); } else if(role.equals("ACCEPTED")){ user.setStatusSelect(ICalendarUserRepository.STATUS_YES); } else if(role.equals("DECLINED")){ user.setStatusSelect(ICalendarUserRepository.STATUS_NO); } } return user; } public ICalendarUser findOrCreateUser(User user) { String email = null; if (user.getPartner() != null && user.getPartner().getEmailAddress() != null && !Strings.isNullOrEmpty(user.getPartner().getEmailAddress().getAddress())) { email = user.getPartner().getEmailAddress().getAddress(); } else if (!Strings.isNullOrEmpty(user.getEmail())) { email = user.getEmail(); } else { return null; } ICalendarUserRepository repo = Beans.get(ICalendarUserRepository.class); ICalendarUser icalUser = null; icalUser = repo.all().filter("self.email = ?1 AND self.user.id = ?2", email, user.getId()).fetchOne(); if (icalUser == null) { icalUser = repo.all().filter("self.user.id = ?1", user.getId()).fetchOne(); } if (icalUser == null) { icalUser = repo.all().filter("self.email = ?1", email).fetchOne(); } if (icalUser == null) { icalUser = new ICalendarUser(); icalUser.setEmail(email); icalUser.setName(user.getFullName()); EmailAddress emailAddress = Beans.get(EmailAddressRepository.class).findByAddress(email); if(emailAddress != null && emailAddress.getPartner() != null && emailAddress.getPartner().getUser() != null){ icalUser.setUser(emailAddress.getPartner().getUser()); } } return icalUser; } // public void createVCard() { // // List<Property> props = new ArrayList<Property>(); // props.add(new Source(URI.create("ldap://ldap.example.com/cn=Babs%20Jensen,%20o=Babsco,%20c=US"))); // props.add(new Name("Babs Jensen's Contact Information")); // props.add(Kind.INDIVIDUAL); // // add a custom property.. // props.add(new Property("test") { // @Override // public String getValue() { // return null; // } // // @Override // public void validate() throws ValidationException { // } // }); // // VCard vcard = new VCard(props); // return vcard; // } public boolean testConnect(Calendar cal) throws MalformedURLException, ObjectStoreException { boolean connected = false; PathResolver RESOLVER = getPathResolver(cal.getTypeSelect()); Protocol protocol = getProtocol(cal.getIsSslConnection()); URL url = new URL(protocol.getScheme(), cal.getUrl(), cal.getPort(), ""); ICalendarStore store = new ICalendarStore(url, RESOLVER); try { connected = store.connect(cal.getLogin(), cal.getPassword()); } finally { store.disconnect(); } return connected; } public void export(Calendar calendar) throws IOException, ValidationException, ParseException { String path = AppSettings.get().get("file.upload.dir"); if (!path.endsWith("/")) { path += "/"; } String name = calendar.getName(); if (!name.endsWith(".ics")) { name += ".ics"; } FileOutputStream fout = new FileOutputStream(path + name ); Preconditions.checkNotNull(calendar, "calendar can't be null"); Preconditions.checkNotNull(calendar.getEventsCrm(), "can't export empty calendar"); net.fortuna.ical4j.model.Calendar cal = newCalendar(); cal.getProperties().add(new XProperty(X_WR_CALNAME, calendar.getName())); for (ICalendarEvent item : calendar.getEventsCrm()) { VEvent event = createVEvent(item); cal.getComponents().add(event); } CalendarOutputter outputter = new CalendarOutputter(); outputter.output(cal, fout); } public File export(net.fortuna.ical4j.model.Calendar calendar) throws IOException, ValidationException, ParseException { String path = AppSettings.get().get("file.upload.dir"); if (!path.endsWith("/")) { path += "/"; } String name = calendar.getProperty(X_WR_CALNAME).getValue(); if (!name.endsWith(".ics")) { name += ".ics"; } File file = new File(path + name ); Writer writer = new FileWriter(file); CalendarOutputter outputter = new CalendarOutputter(); outputter.output(calendar, writer); writer.close(); return file; } @Transactional public void sync(Calendar calendar) throws ICalendarException, MalformedURLException { PathResolver RESOLVER = getPathResolver(calendar.getTypeSelect()); Protocol protocol = getProtocol(calendar.getIsSslConnection()); URL url = new URL(protocol.getScheme(), calendar.getUrl(), calendar.getPort(), ""); ICalendarStore store = new ICalendarStore(url, RESOLVER); try { if(calendar.getLogin() != null && calendar.getPassword() != null && store.connect(calendar.getLogin(), calendar.getPassword())){ List<CalDavCalendarCollection> colList = store.getCollections(); if(!colList.isEmpty()){ calendar = doSync(calendar, colList.get(0)); calendarRepo.save(calendar); } } else{ throw new AxelorException(String.format(I18n.get(IExceptionMessage.CALENDAR_NOT_VALID)), IException.CONFIGURATION_ERROR); } } catch (Exception e) { throw new ICalendarException(e); } finally { store.disconnect(); } } @SuppressWarnings("unchecked") protected Calendar doSync(Calendar calendar, CalDavCalendarCollection collection) throws IOException, URISyntaxException, ParseException, ObjectStoreException, ConstraintViolationException { final String[] names = { Property.UID, Property.URL, Property.SUMMARY, Property.DESCRIPTION, Property.DTSTART, Property.DTEND, Property.ORGANIZER, Property.CLASS, Property.TRANSP, Property.ATTENDEE }; final boolean keepRemote = calendar.getKeepRemote() == Boolean.TRUE; final Map<String, VEvent> remoteEvents = new HashMap<>(); final Map<VEvent, Integer> localEvents = new HashMap<>(); final Set<String> synced = new HashSet<>(); for (VEvent item : ICalendarStore.getEvents(collection)) { remoteEvents.put(item.getUid().getValue(), item); } for (ICalendarEvent item : calendar.getEventsCrm()) { VEvent source = createVEvent(item); VEvent target = remoteEvents.get(source.getUid().getValue()); if (target == null && Strings.isNullOrEmpty(item.getUid())) { target = source; } if(target != null){ if (keepRemote) { VEvent tmp = target; target = source; source = tmp; } else{ if(source.getLastModified() != null && target.getLastModified() != null){ LocalDateTime lastModifiedSource = new LocalDateTime(source.getLastModified().getDateTime()); LocalDateTime lastModifiedTarget = new LocalDateTime(target.getLastModified().getDateTime()); if(lastModifiedSource.isBefore(lastModifiedTarget)){ VEvent tmp = target; target = source; source = tmp; } } else if(target.getLastModified() != null){ VEvent tmp = target; target = source; source = tmp; } } Event item2 = (Event) item; localEvents.put(target, item2.getTypeSelect()); // Associate event with typeSelect for further use synced.add(target.getUid().getValue()); if (source == target) { continue; } for (String name : names) { if(!name.equals(Property.ATTENDEE)){ Property s = source.getProperty(name); Property t = target.getProperty(name); PropertyList items = target.getProperties(); if (s == null && t == null) { continue; } else if (t == null) { t = s; items.add(t); } else if (s == null) { target.getProperties().remove(t); } else { t.setValue(s.getValue()); } } else{ PropertyList sourceList = source.getProperties(Property.ATTENDEE); PropertyList targetList = target.getProperties(Property.ATTENDEE); target.getProperties().removeAll(targetList); target.getProperties().addAll(sourceList); target.getProperties(); } } } } for (String uid : remoteEvents.keySet()) { if (!synced.contains(uid)) { VEvent vEvent = remoteEvents.get(uid); // adds startDate of vEvent to the Trigger if it exists in vEvent if (!vEvent.getAlarms().isEmpty()) { Trigger t = (Trigger) vEvent.getAlarms().getComponent("VALARM").getProperty("TRIGGER"); if (t.getDateTime() == null) { DtStart start = (DtStart) vEvent.getProperty("DTSTART"); t.setDateTime((DateTime) start.getDate()); } } localEvents.put(vEvent, 2); // events imported from remote calendar are by default 'meetings' (typeSelect = 2) } } // update local events final List<Event> iEvents = new ArrayList<>(); for (Map.Entry<VEvent, Integer> item : localEvents.entrySet()) { Event iEvent = findOrCreateEventCRM(item.getKey()); iEvent.setTypeSelect(item.getValue()); // set 'typeSelect' to new event created iEvents.add(iEvent); } calendar.getEventsCrm().clear(); for (Event event : iEvents) { calendar.addEventsCrm(event); } // update remote events for (VEvent item : localEvents.keySet()) { if (!synced.contains(item.getUid().getValue())) { continue; } net.fortuna.ical4j.model.Calendar cal = newCalendar(); cal.getComponents().add(item); collection.addCalendar(cal); } return calendar; } public void removeEventFromIcal(Event event) throws MalformedURLException, ICalendarException{ if(event.getCalendarCrm() != null && !Strings.isNullOrEmpty(event.getUid())){ Calendar calendar = event.getCalendarCrm(); PathResolver RESOLVER = getPathResolver(calendar.getTypeSelect()); Protocol protocol = getProtocol(calendar.getIsSslConnection()); URL url = new URL(protocol.getScheme(), calendar.getUrl(), calendar.getPort(), ""); ICalendarStore store = new ICalendarStore(url, RESOLVER); try { if(store.connect(calendar.getLogin(), calendar.getPassword())){ List<CalDavCalendarCollection> colList = store.getCollections(); if(!colList.isEmpty()){ CalDavCalendarCollection collection = colList.get(0); final Map<String, VEvent> remoteEvents = new HashMap<>(); for (VEvent item : ICalendarStore.getEvents(collection)) { remoteEvents.put(item.getUid().getValue(), item); } VEvent target = remoteEvents.get(event.getUid()); removeCalendar(collection,target.getUid().getValue()); } } else{ throw new AxelorException(String.format(I18n.get(IExceptionMessage.CALENDAR_NOT_VALID)), IException.CONFIGURATION_ERROR); } } catch (Exception e) { throw new ICalendarException(e); } finally { store.disconnect(); } } } public net.fortuna.ical4j.model.Calendar removeCalendar(CalDavCalendarCollection collection,String uid) throws FailedOperationException, ObjectStoreException { net.fortuna.ical4j.model.Calendar calendar = collection.getCalendar(uid); DeleteMethod deleteMethod = new DeleteMethod( collection.getPath() + uid + ".ics"); try { collection.getStore().getClient().execute(deleteMethod); } catch (IOException e) { throw new ObjectStoreException(e); } if (!deleteMethod.succeeded()) { throw new FailedOperationException(deleteMethod.getStatusLine().toString()); } return calendar; } public net.fortuna.ical4j.model.Calendar getCalendar(String uid, Calendar calendar) throws ICalendarException, MalformedURLException{ net.fortuna.ical4j.model.Calendar cal = null; PathResolver RESOLVER = getPathResolver(calendar.getTypeSelect()); Protocol protocol = getProtocol(calendar.getIsSslConnection()); URL url = new URL(protocol.getScheme(), calendar.getUrl(), calendar.getPort(), ""); ICalendarStore store = new ICalendarStore(url, RESOLVER); try { if(store.connect(calendar.getLogin(), calendar.getPassword())){ List<CalDavCalendarCollection> colList = store.getCollections(); if(!colList.isEmpty()){ CalDavCalendarCollection collection = colList.get(0); cal = collection.getCalendar(uid); } } else{ throw new AxelorException(String.format(I18n.get(IExceptionMessage.CALENDAR_NOT_VALID)), IException.CONFIGURATION_ERROR); } } catch (Exception e) { throw new ICalendarException(e); } finally { store.disconnect(); } return cal; } public List<Long> showSharedEvents(User user){ Team team = user.getActiveTeam(); Set<User> followedUsers = user.getFollowersCalUserSet(); List<Long> eventIdlist = new ArrayList<Long>(); for (User userIt : followedUsers) { for (CalendarManagement calendarManagement : userIt.getCalendarManagementList()) { if((user.equals(calendarManagement.getUser())) || (team != null && team.equals(calendarManagement.getTeam()))){ if(calendarManagement.getAllCalendars()){ List<ICalendarUser> userList = Beans.get(ICalendarUserRepository.class).all().filter("self.user.id = ?1", userIt.getId()).fetch(); List<Event> eventList = Beans.get(EventRepository.class).all().filter("self.user.id = ?1", userIt.getId()).fetch(); for (Event event : eventList) { eventIdlist.add(event.getId()); } List<Calendar> calList = Beans.get(CalendarRepository.class).all().filter("self.user.id = ?1", userIt.getId()).fetch(); for (Calendar calendar : calList) { for (Event event : calendar.getEventsCrm()) { eventIdlist.add(event.getId()); } } for (ICalendarUser iCalendarUser : userList) { eventList = Beans.get(EventRepository.class).all().filter("?1 MEMBER OF self.attendees OR self.organizer.id = ?1", iCalendarUser.getId()).fetch(); for (Event event : eventList) { eventIdlist.add(event.getId()); } } } else{ if(calendarManagement.getErpCalendars()){ List<ICalendarUser> userList = Beans.get(ICalendarUserRepository.class).all().filter("self.user.id = ?1", userIt.getId()).fetch(); List<Event> eventList = Beans.get(EventRepository.class).all().filter("self.user.id = ?1 AND self.calendarCrm is NULL", userIt.getId()).fetch(); for (Event event : eventList) { eventIdlist.add(event.getId()); } for (ICalendarUser iCalendarUser : userList) { eventList = Beans.get(EventRepository.class).all().filter("(?1 MEMBER OF self.attendees OR self.organizer.id = ?1) AND self.calendarCrm is NULL", iCalendarUser.getId()).fetch(); for (Event event : eventList) { eventIdlist.add(event.getId()); } } } if(calendarManagement.getIcalCalendars()){ for (Calendar calendar : calendarManagement.getCalendarSet()) { for (Event event : calendar.getEventsCrm()) { eventIdlist.add(event.getId()); } } } } } } } List<ICalendarUser> userList = Beans.get(ICalendarUserRepository.class).all().filter("self.user.id = ?1", user.getId()).fetch(); List<Event> eventList = Beans.get(EventRepository.class).all().filter("self.user.id = ?1", user.getId()).fetch(); for (Event event : eventList) { eventIdlist.add(event.getId()); } List<Calendar> calList = Beans.get(CalendarRepository.class).all().filter("self.user.id = ?1", user.getId()).fetch(); for (Calendar calendar : calList) { for (Event event : calendar.getEventsCrm()) { eventIdlist.add(event.getId()); } } for (ICalendarUser iCalendarUser : userList) { eventList = Beans.get(EventRepository.class).all().filter("?1 MEMBER OF self.attendees OR self.organizer.id = ?1", iCalendarUser.getId()).fetch(); for (Event event : eventList) { eventIdlist.add(event.getId()); } } return eventIdlist; } public List<Long> showSharedCalendars(User user){ Team team = user.getActiveTeam(); Set<User> followedUsers = user.getFollowersCalUserSet(); List<Long> calendarIdlist = new ArrayList<Long>(); for (User userIt : followedUsers) { for (CalendarManagement calendarManagement : userIt.getCalendarManagementList()) { if((user.equals(calendarManagement.getUser())) || (team != null && team.equals(calendarManagement.getTeam()))){ if(calendarManagement.getAllCalendars()){ List<Calendar> calendarList = Beans.get(CalendarRepository.class).all().filter("self.user.id = ?1", userIt.getId()).fetch(); for (Calendar calendar : calendarList) { calendarIdlist.add(calendar.getId()); } } else if(calendarManagement.getIcalCalendars()){ for (Calendar calendar : calendarManagement.getCalendarSet()) { calendarIdlist.add(calendar.getId()); } } } } } List<Calendar> calList = Beans.get(CalendarRepository.class).all().filter("self.user.id = ?1", user.getId()).fetch(); for (Calendar calendar : calList) { calendarIdlist.add(calendar.getId()); } return calendarIdlist; } }