From 2314d58df5dfb84f6b369c4b0f972ab1981b87d4 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Wed, 19 Aug 2015 11:11:07 +0200 Subject: [PATCH] OO-1647: update / remove / add ical token in configuration cache --- .../commons/calendar/ICalTokenGenerator.java | 61 ++++++---- .../commons/calendar/model/ICalToken.java | 6 + .../ui/CalendarConfigurationController.java | 107 ++++++++++++++---- 3 files changed, 128 insertions(+), 46 deletions(-) diff --git a/src/main/java/org/olat/commons/calendar/ICalTokenGenerator.java b/src/main/java/org/olat/commons/calendar/ICalTokenGenerator.java index ec11d5748c8..d8cfaf950cc 100644 --- a/src/main/java/org/olat/commons/calendar/ICalTokenGenerator.java +++ b/src/main/java/org/olat/commons/calendar/ICalTokenGenerator.java @@ -331,19 +331,21 @@ public class ICalTokenGenerator { * @param identity * @return authentication token */ - public static String regenerateIcalAuthToken(String calendarType, String calendarID, Identity identity) { - - if (!calendarType.equals(ICalFileCalendarManager.TYPE_USER)) { - // get the resourceable - OLATResourceable resourceable = getResourceable(calendarType, calendarID); - if (resourceable == null) { - return null; - } - return regenerateIcalAuthToken(resourceable, identity); - } else { - return regenerateIcalAuthToken(identity); - } - } + public static FeedLink regenerateIcalAuthToken(String calendarType, String calendarID, Identity identity) { + String authToken; + if (!calendarType.equals(ICalFileCalendarManager.TYPE_USER)) { + // get the resourceable + OLATResourceable resourceable = getResourceable(calendarType, calendarID); + if (resourceable == null) { + return null; + } + authToken = regenerateIcalAuthToken(resourceable, identity); + } else { + authToken = regenerateIcalAuthToken(identity); + } + String path = constructIcalFeedPath(calendarType, identity.getName(), authToken, calendarID); + return new FeedLink(authToken, path); + } /** * return the ical feed link for the calendar. @@ -353,12 +355,10 @@ public class ICalTokenGenerator { * @param identity * @return */ - public static String getIcalFeedLink(String calendarType, String calendarID, Identity identity) { - - // get the authentication token - String authToken = getIcalAuthToken(calendarType, calendarID, identity, true); - - return constructIcalFeedPath(calendarType, identity.getName(), authToken, calendarID); + public static FeedLink getIcalFeedLink(String calendarType, String calendarID, Identity identity) { + String authToken = getIcalAuthToken(calendarType, calendarID, identity, true); + String path = constructIcalFeedPath(calendarType, identity.getName(), authToken, calendarID); + return new FeedLink(authToken, path); } /** @@ -368,7 +368,7 @@ public class ICalTokenGenerator { * @param identity * @return */ - public static boolean existIcalFeedLink(String calendarType, String calendarID, Identity identity) { + public static boolean existIcalFeedLink(String calendarType, String calendarID, Identity identity) { Property tokenProperty = null; if (!calendarType.equals(ICalFileCalendarManager.TYPE_USER)) { // find the property for the resourceable @@ -380,5 +380,24 @@ public class ICalTokenGenerator { tokenProperty = pm.findProperty(identity, null, null, PROP_CAT_ICALTOKEN, PROP_NAME_ICALTOKEN); } return tokenProperty != null; - } + } + + public static class FeedLink { + + private final String token; + private final String link; + + public FeedLink(String token, String link) { + this.token = token; + this.link = link; + } + + public String getToken() { + return token; + } + + public String getLink() { + return link; + } + } } diff --git a/src/main/java/org/olat/commons/calendar/model/ICalToken.java b/src/main/java/org/olat/commons/calendar/model/ICalToken.java index 4bde3689ac3..1d234a99ce9 100644 --- a/src/main/java/org/olat/commons/calendar/model/ICalToken.java +++ b/src/main/java/org/olat/commons/calendar/model/ICalToken.java @@ -36,6 +36,12 @@ public class ICalToken { this.token = token; this.resourceId = resourceId; } + + public ICalToken(ICalToken iCalToken, String token) { + this.type = iCalToken.getType(); + this.token = token; + this.resourceId = iCalToken.getResourceId(); + } public String getType() { return type; diff --git a/src/main/java/org/olat/commons/calendar/ui/CalendarConfigurationController.java b/src/main/java/org/olat/commons/calendar/ui/CalendarConfigurationController.java index 495d61cd45d..3c997f638f3 100644 --- a/src/main/java/org/olat/commons/calendar/ui/CalendarConfigurationController.java +++ b/src/main/java/org/olat/commons/calendar/ui/CalendarConfigurationController.java @@ -33,6 +33,7 @@ import java.util.Map; import org.olat.commons.calendar.CalendarManager; import org.olat.commons.calendar.CalendarManagerFactory; import org.olat.commons.calendar.ICalTokenGenerator; +import org.olat.commons.calendar.ICalTokenGenerator.FeedLink; import org.olat.commons.calendar.model.ICalToken; import org.olat.commons.calendar.model.KalendarConfig; import org.olat.commons.calendar.ui.components.KalendarRenderWrapper; @@ -64,6 +65,7 @@ public class CalendarConfigurationController extends BasicController { private static final Object CMD_ICAL_REMOVE_FEED = "rmif"; private static final String PARAM_ID = "id"; + private ICalTokens iCalTokens; private VelocityContainer configVC; private List<KalendarRenderWrapper> calendars; @@ -79,9 +81,10 @@ public class CalendarConfigurationController extends BasicController { setTranslator(Util.createPackageTranslator(CalendarManager.class, ureq.getLocale())); configVC = new VelocityContainer("calEdit", VELOCITY_ROOT + "/calConfig.html", getTranslator(), this); - setCalendars(calendars); configVC.contextPut("insideManager", insideManager); configVC.contextPut("identity", ureq.getIdentity()); + + setCalendars(calendars); putInitialPanel(configVC); } @@ -94,12 +97,13 @@ public class CalendarConfigurationController extends BasicController { this.calendars = calendars; configVC.contextPut("calendars", calendars); - Map<ICalTokenKey, ICalToken> tokenMap = new HashMap<>(); + ICalTokens newICalTokens = new ICalTokens(getIdentity().getKey()); List<ICalToken> tokens = ICalTokenGenerator.getICalAuthTokens(getIdentity()); for(ICalToken token:tokens) { - tokenMap.put(new ICalTokenKey(token.getType(), token.getResourceId()), token); + newICalTokens.put(new ICalTokenKey(token.getType(), token.getResourceId()), token); } - configVC.contextPut("icalTokens", new ICalTokens(getIdentity().getKey(), tokenMap)); + configVC.contextPut("icalTokens", newICalTokens); + iCalTokens = newICalTokens; } @Override @@ -115,13 +119,7 @@ public class CalendarConfigurationController extends BasicController { String calendarID = ureq.getParameter(PARAM_ID); fireEvent(ureq, new KalendarGUIImportEvent(calendarID)); } else if (command.equals(CMD_TOGGLE_DISPLAY)) { - String calendarID = ureq.getParameter(PARAM_ID); - KalendarRenderWrapper calendarWrapper = findKalendarRenderWrapper(calendarID); - KalendarConfig config = calendarWrapper.getKalendarConfig(); - config.setVis(!config.isVis()); - CalendarManagerFactory.getInstance().getCalendarManager().saveKalendarConfigForIdentity( - config, calendarWrapper.getKalendar(), ureq); - fireEvent(ureq, Event.CHANGED_EVENT); + doToogleDisplay(ureq, ureq.getParameter(PARAM_ID)); } else if (command.equals(CMD_CHOOSE_COLOR)) { doOpenColorChooser(ureq, ureq.getParameter(PARAM_ID)); } else if (command.equals(CMD_ICAL_FEED)) { @@ -175,13 +173,21 @@ public class CalendarConfigurationController extends BasicController { removeAsListenerAndDispose(exportController); KalendarRenderWrapper calendarWrapper = findKalendarRenderWrapper(calendarID); - String calFeedLink = ICalTokenGenerator.getIcalFeedLink(calendarWrapper.getKalendar().getType(), calendarID, getIdentity()); - exportController = new CalendarExportController(getLocale(), getWindowControl(), calFeedLink); + FeedLink calFeedLink = ICalTokenGenerator.getIcalFeedLink(calendarWrapper.getKalendar().getType(), calendarID, getIdentity()); + exportController = new CalendarExportController(getLocale(), getWindowControl(), calFeedLink.getLink()); listenTo(exportController); cmc = new CloseableModalController(getWindowControl(), translate("close"), exportController.getInitialComponent()); listenTo(cmc); cmc.activate(); + + String type = calendarWrapper.getKalendar().getType(); + if(CalendarManager.TYPE_USER.equals(type)) { + iCalTokens.update(new ICalTokenKey(type, getIdentity().getKey()), calFeedLink.getToken()); + } else { + iCalTokens.update(new ICalTokenKey(type, Long.valueOf(calendarID)), calFeedLink.getToken()); + } + configVC.setDirty(true); } private void doOpenColorChooser(UserRequest ureq, String calendarID) { @@ -203,8 +209,15 @@ public class CalendarConfigurationController extends BasicController { KalendarRenderWrapper calendarWrapper = colorChooser.getCalendarWrapper(); KalendarConfig config = calendarWrapper.getKalendarConfig(); config.setCss(choosenColor); - CalendarManagerFactory.getInstance().getCalendarManager().saveKalendarConfigForIdentity( - config, calendarWrapper.getKalendar(), ureq); + CalendarManagerFactory.getInstance().getCalendarManager().saveKalendarConfigForIdentity(config, calendarWrapper.getKalendar(), ureq); + fireEvent(ureq, Event.CHANGED_EVENT); + } + + private void doToogleDisplay(UserRequest ureq, String calendarID) { + KalendarRenderWrapper calendarWrapper = findKalendarRenderWrapper(calendarID); + KalendarConfig config = calendarWrapper.getKalendarConfig(); + config.setVis(!config.isVis()); + CalendarManagerFactory.getInstance().getCalendarManager().saveKalendarConfigForIdentity(config, calendarWrapper.getKalendar(), ureq); fireEvent(ureq, Event.CHANGED_EVENT); } @@ -213,23 +226,35 @@ public class CalendarConfigurationController extends BasicController { removeAsListenerAndDispose(exportController); KalendarRenderWrapper calendarWrapper = findKalendarRenderWrapper(calendarId); - ICalTokenGenerator.regenerateIcalAuthToken(calendarWrapper.getKalendar().getType(), calendarId, getIdentity()); - String calFeedLink = ICalTokenGenerator.getIcalFeedLink(calendarWrapper.getKalendar().getType(), calendarId, getIdentity()); + FeedLink calFeedLink = ICalTokenGenerator.regenerateIcalAuthToken(calendarWrapper.getKalendar().getType(), calendarId, getIdentity()); - exportController = new CalendarExportController(getLocale(), getWindowControl(), calFeedLink); + exportController = new CalendarExportController(getLocale(), getWindowControl(), calFeedLink.getLink()); listenTo(exportController); cmc = new CloseableModalController(getWindowControl(), translate("close"), exportController.getInitialComponent()); cmc.activate(); listenTo(cmc); - //update token + String type = calendarWrapper.getKalendar().getType(); + if(CalendarManager.TYPE_USER.equals(type)) { + iCalTokens.update(new ICalTokenKey(type, getIdentity().getKey()), calFeedLink.getToken()); + } else { + iCalTokens.update(new ICalTokenKey(type, Long.valueOf(calendarId)), calFeedLink.getToken()); + } + configVC.setDirty(true); } private void doRemoveToken(String calendarId) { KalendarRenderWrapper calendarWrapper = findKalendarRenderWrapper(calendarId); ICalTokenGenerator.destroyIcalAuthToken(calendarWrapper.getKalendar().getType(), calendarId, getIdentity()); - //remove tokens + + String type = calendarWrapper.getKalendar().getType(); + if(CalendarManager.TYPE_USER.equals(type)) { + iCalTokens.remove(new ICalTokenKey(type, getIdentity().getKey())); + } else { + iCalTokens.remove(new ICalTokenKey(type, Long.valueOf(calendarId))); + } + configVC.setDirty(true); } private KalendarRenderWrapper findKalendarRenderWrapper(String calendarID) { @@ -243,11 +268,33 @@ public class CalendarConfigurationController extends BasicController { public static class ICalTokens { private final Long identityKey; - private final Map<ICalTokenKey, ICalToken> tokenMap; + private final Map<ICalTokenKey, ICalToken> tokenMap = new HashMap<>(); - public ICalTokens(Long identityKey, Map<ICalTokenKey, ICalToken> tokenMap) { + public ICalTokens(Long identityKey) { this.identityKey = identityKey; - this.tokenMap = tokenMap; + } + + public void put(ICalTokenKey key, ICalToken token) { + synchronized(tokenMap) { + tokenMap.put(key, token); + } + } + + public void remove(ICalTokenKey key) { + synchronized(tokenMap) { + tokenMap.remove(key); + } + } + + public void update(ICalTokenKey key, String newToken) { + ICalToken token = tokenMap.get(key); + synchronized(tokenMap) { + if(token != null) { + tokenMap.put(key, new ICalToken(token, newToken)); + } else { + tokenMap.put(key, new ICalToken(key.getType(), newToken, key.getResourceId())); + } + } } public boolean hasIcalFeed(KalendarRenderWrapper wrapper) { @@ -259,8 +306,10 @@ public class CalendarConfigurationController extends BasicController { calendarId = Long.valueOf(wrapper.getKalendar().getCalendarID()); } ICalTokenKey tokenKey = new ICalTokenKey(type, calendarId); - ICalToken token = tokenMap.get(tokenKey); - return token != null && StringHelper.containsNonWhitespace(token.getToken()); + synchronized(tokenMap) { + ICalToken token = tokenMap.get(tokenKey); + return token != null && StringHelper.containsNonWhitespace(token.getToken()); + } } } @@ -273,6 +322,14 @@ public class CalendarConfigurationController extends BasicController { this.type = type; this.resourceId = resourceId; } + + public String getType() { + return type; + } + + public Long getResourceId() { + return resourceId; + } @Override public int hashCode() { -- GitLab