use of com.axelor.apps.base.db.ICalendar in project axelor-open-suite by axelor.
the class BatchCalendarSynchronization method process.
@Override
protected void process() {
final Company company = batch.getBaseBatch().getCompany();
;
final List<ICalendar> calendars = repo.all().filter("self.user.activeCompany = :company AND self.isValid = TRUE").bind("company", company).fetch();
for (ICalendar calendar : calendars) {
try {
iCalendarService.sync(calendar, batch.getBaseBatch().getAllEvents(), batch.getBaseBatch().getSynchronizationDuration());
incrementDone();
} catch (Exception e) {
e.printStackTrace();
incrementAnomaly();
}
}
}
use of com.axelor.apps.base.db.ICalendar in project axelor-open-suite by axelor.
the class ICalendarService method removeEventFromIcal.
public void removeEventFromIcal(ICalendarEvent event) throws MalformedURLException, ICalendarException {
if (event.getCalendar() != null && !Strings.isNullOrEmpty(event.getUid())) {
ICalendar calendar = event.getCalendar();
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(), getCalendarDecryptPassword(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());
if (target != null)
removeCalendar(collection, target.getUid().getValue());
}
} else {
throw new AxelorException(TraceBackRepository.CATEGORY_CONFIGURATION_ERROR, I18n.get(IExceptionMessage.CALENDAR_NOT_VALID));
}
} catch (Exception e) {
throw new ICalendarException(e);
} finally {
store.disconnect();
}
}
}
use of com.axelor.apps.base.db.ICalendar in project axelor-open-suite by axelor.
the class ICalendarService method doSync.
@Transactional(rollbackOn = { Exception.class })
protected ICalendar doSync(ICalendar calendar, CalDavCalendarCollection collection, LocalDateTime startDate, LocalDateTime endDate) throws IOException, URISyntaxException, ParseException, ObjectStoreException, ConstraintViolationException, DavException, ParserConfigurationException, ParserException, AxelorException {
final boolean keepRemote = calendar.getKeepRemote() == Boolean.TRUE;
final Map<String, VEvent> modifiedRemoteEvents = new HashMap<>();
final List<ICalendarEvent> modifiedLocalEvents = getICalendarEvents(calendar);
final Set<String> allRemoteUids = new HashSet<>();
final Set<VEvent> updatedEvents = new HashSet<>();
List<VEvent> events = null;
Instant lastSynchro = null;
if (calendar.getLastSynchronizationDateT() != null) {
lastSynchro = calendar.getLastSynchronizationDateT().toInstant(OffsetDateTime.now().getOffset());
} else {
lastSynchro = LocalDateTime.MIN.toInstant(OffsetDateTime.now().getOffset());
}
if (startDate == null || endDate == null) {
events = ICalendarStore.getModifiedEvents(collection, null, allRemoteUids);
} else {
events = ICalendarStore.getModifiedEventsInRange(collection, lastSynchro, allRemoteUids, startDate, endDate);
}
if (CollectionUtils.isEmpty(events) && CollectionUtils.isEmpty(modifiedLocalEvents)) {
throw new AxelorException(TraceBackRepository.CATEGORY_CONFIGURATION_ERROR, I18n.get(IExceptionMessage.CALENDAR_NO_EVENTS_FOR_SYNC_ERROR));
}
if (events != null) {
for (VEvent item : events) {
modifiedRemoteEvents.put(item.getUid().getValue(), item);
}
}
for (ICalendarEvent item : modifiedLocalEvents) {
VEvent source = createVEvent(item);
VEvent target = modifiedRemoteEvents.get(source.getUid().getValue());
// If uid is empty, the event is new
if (StringUtils.isBlank(item.getUid())) {
item.setUid(source.getUid().getValue());
Calendar cal = newCalendar();
cal.getComponents().add(source);
collection.addCalendar(cal);
allRemoteUids.add(item.getUid());
} else // else it has been modified
{
// if target is null, then it hasn't been modified or it has been deleted
if (target == null) {
target = source;
} else {
updateEvent(source, target, keepRemote);
// modifiedRemoteEvents.remove(target.getUid().getValue());
}
updatedEvents.add(target);
}
}
// corresponding ICalendarEvent
for (Map.Entry<String, VEvent> entry : modifiedRemoteEvents.entrySet()) {
findOrCreateEvent(entry.getValue(), calendar);
}
// update remote events
for (VEvent item : updatedEvents) {
Calendar cal = newCalendar();
cal.getComponents().add(item);
// collection.updateCalendar(cal);
try {
collection.addCalendar(cal);
} catch (Exception e) {
TraceBackService.trace(e);
}
}
// remove deleted remote events
removeDeletedEventsInRange(allRemoteUids, calendar, startDate, endDate);
return calendar;
}
use of com.axelor.apps.base.db.ICalendar in project axelor-open-suite by axelor.
the class ICalendarController method exportCalendar.
public void exportCalendar(ActionRequest request, ActionResponse response) throws IOException, ParseException {
ICalendar cal = request.getContext().asType(ICalendar.class);
Path tempPath = MetaFiles.createTempFile(cal.getName(), ".ics");
Beans.get(ICalendarService.class).export(cal, tempPath.toFile());
Beans.get(MetaFiles.class).attach(new FileInputStream(tempPath.toFile()), cal.getName() + ".ics", cal);
response.setReload(true);
}
use of com.axelor.apps.base.db.ICalendar in project axelor-open-suite by axelor.
the class ICalendarController method importCalendarFile.
public void importCalendarFile(ActionRequest request, ActionResponse response) throws IOException, ParserException {
ImportConfiguration imp = request.getContext().asType(ImportConfiguration.class);
Object object = request.getContext().get("_id");
ICalendar cal = null;
if (object != null) {
Long id = Long.valueOf(object.toString());
cal = Beans.get(ICalendarRepository.class).find(id);
}
if (cal == null) {
cal = new ICalendar();
}
File data = MetaFiles.getPath(imp.getDataMetaFile()).toFile();
Beans.get(ICalendarService.class).load(cal, data);
response.setCanClose(true);
response.setReload(true);
}
Aggregations