use of org.olat.core.util.coordinate.SyncerExecutor in project openolat by klemens.
the class GlossaryItemManager method getGlossaryItemListByVFSItem.
// FIXME: VFSItem should be capable of returning an identifier, instead of casting to LocalFolderImpl implement a getIdentifier for it!
public ArrayList<GlossaryItem> getGlossaryItemListByVFSItem(final VFSContainer glossaryFolder) {
final String glossaryKey = ((LocalFolderImpl) glossaryFolder).getBasefile().toString();
if (glossaryCache == null) {
glossaryCache = coordinatorManager.getCoordinator().getCacher().getCache(GlossaryItemManager.class.getSimpleName(), "glossary");
}
// try to load from cache
ArrayList<GlossaryItem> glossaryItemList = glossaryCache.get(glossaryKey);
if (glossaryItemList != null) {
if (isLogDebugEnabled()) {
logDebug("Loading glossary from cache.", null);
}
return glossaryItemList;
}
// load from filesystem
coordinatorManager.getCoordinator().getSyncer().doInSync(glossaryEventBus, new SyncerExecutor() {
@SuppressWarnings("synthetic-access")
public void execute() {
ArrayList<GlossaryItem> glossaryItemListTemp = new ArrayList<GlossaryItem>();
if (isLogDebugEnabled()) {
logDebug("Loading glossary from filesystem. Glossary folder: " + glossaryFolder, null);
}
glossaryItemListTemp = loadGlossaryItemListFromFile(getGlossaryFile(glossaryFolder));
glossaryCache.put(glossaryKey, glossaryItemListTemp);
}
});
// return value from cache, as it was put in there before
return glossaryCache.get(glossaryKey);
}
use of org.olat.core.util.coordinate.SyncerExecutor in project openolat by klemens.
the class CollaborationTools method createOrUpdateProperty.
/**
* creates the property if non-existing, or updates the existing property to
* the supplied values. Real changes are made persistent immediately.
*
* @param selectedTool
* @param toolValue
*/
private void createOrUpdateProperty(final String selectedTool, final boolean toolValue) {
Boolean cv = cacheToolStates.get(selectedTool);
if (cv != null && cv.booleanValue() == toolValue) {
// nice, cache saved a needless update
return;
}
// handle Boolean Values via String Field in Property DB Table
final String toolValueStr = toolValue ? TRUE : FALSE;
final PropertyManager pm = PropertyManager.getInstance();
coordinatorManager.getCoordinator().getSyncer().doInSync(ores, new SyncerExecutor() {
@Override
public void execute() {
// was: synchronized (CollaborationTools.class) {
Property property = getPropertyOf(selectedTool);
if (property == null) {
// not existing -> create it
property = pm.createPropertyInstance(null, null, ores, PROP_CAT_BG_COLLABTOOLS, selectedTool, null, null, toolValueStr, null);
} else {
// if existing -> update to desired value
property.setStringValue(toolValueStr);
}
// create a room if needed
if (toolValue && TOOL_OPENMEETINGS.equals(selectedTool)) {
openOpenMeetingsRoom();
}
// property becomes persistent
pm.saveProperty(property);
}
});
this.dirty = true;
cacheToolStates.put(selectedTool, Boolean.valueOf(toolValue));
}
use of org.olat.core.util.coordinate.SyncerExecutor in project openolat by klemens.
the class ClusterAdminControllerCluster method event.
@Override
protected void event(UserRequest ureq, Component source, Event event) {
if (source == syncLong) {
// sync on a olatresourceable and hold the lock for 5 seconds.
CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(ORES_TEST, new SyncerExecutor() {
public void execute() {
sleep(5000);
}
});
// the runnable is executed within the same thread->
getWindowControl().setInfo("done syncing on the test olatresourceable for 5 seconds");
} else if (source == syncShort) {
// sync on a olatresourceable and hold the lock for 1 second.
CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(ORES_TEST, new SyncerExecutor() {
public void execute() {
sleep(1000);
}
});
// the runnable is executed within the same thread->
getWindowControl().setInfo("done syncing on the test olatresourceable for 1 second");
} else if (source == testPerf) {
// send 1000 (short) messages over the cluster bus
int cnt = 1000;
long start = System.nanoTime();
for (int i = 0; i < cnt; i++) {
clusBus.fireEventToListenersOf(new MultiUserEvent("jms-perf-test-" + i + " of " + cnt), ORES_TEST);
}
long stop = System.nanoTime();
long dur = stop - start;
double inmilis = dur / 1000000;
double avg = dur / cnt;
double avgmilis = avg / 1000000;
getWindowControl().setInfo("sending " + cnt + " messages took " + inmilis + " ms, avg per messages was " + avg + " ns = " + avgmilis + " ms");
} else if (source == testCachePut) {
CacheWrapper<String, String> cw = CoordinatorManager.getInstance().getCoordinator().getCacher().getCache(this.getClass().getSimpleName(), "cachetest");
// we explicitly use put and not putSilent to show that a put invalidates (and thus removes) this key of this cache in all other cluster nodes.
cw.update("akey", "hello");
updateCacheInfo();
} else if (source == testCachePut2) {
// we explicitly use put and not putSilent to show that a put invalidates (and thus removes) this key of this cache in all other cluster nodes.
CacheWrapper<String, String> cw = CoordinatorManager.getInstance().getCoordinator().getCacher().getCache(this.getClass().getSimpleName(), "cachetest");
cw.update("akey", "world");
updateCacheInfo();
} else if (source == testSFUPerf) {
// acquire a sync 1000x times (does internally a select-for-update on the database)
int cnt = 1000;
long start = System.nanoTime();
for (int i = 0; i < cnt; i++) {
CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(ORES_TEST, new SyncerExecutor() {
public void execute() {
// empty
}
});
}
long stop = System.nanoTime();
long dur = stop - start;
double inmilis = dur / 1000000;
double avg = dur / cnt;
double avgmilis = avg / 1000000;
getWindowControl().setInfo("acquiring " + cnt + " locks for syncing (using db's \"select for update\") took " + inmilis + " ms, avg per messages was " + avg + " ns = " + avgmilis + " ms");
} else if (source == releaseAllLocksFor) {
// let a user search pop up
usc = new UserSearchController(ureq, getWindowControl(), true);
listenTo(usc);
getWindowControl().pushAsModalDialog(usc.getInitialComponent());
} else if ((source == nodeInfoVc) && (event.getCommand().equals("switchToNode"))) {
String nodeIdStr = ureq.getHttpReq().getParameter("nodeId");
if (nodeIdStr.length() == 1) {
nodeIdStr = "0" + nodeIdStr;
}
Cookie[] cookies = ureq.getHttpReq().getCookies();
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
if ("JSESSIONID".equals(cookie.getName())) {
String redirectedButInvalidSessionId = cookie.getValue();
redirectedButInvalidSessionId = redirectedButInvalidSessionId.substring(0, redirectedButInvalidSessionId.length() - 2) + nodeIdStr;
logInfo("redirecting session to node " + nodeIdStr + ", new sessionid=" + redirectedButInvalidSessionId, null);
cookie.setValue(redirectedButInvalidSessionId);
replaceCookie(ureq.getHttpReq(), ureq.getHttpResp(), cookie);
// OLAT-5165: make sure we can always bypass the dmz reject mechanism (for 5min that is)
Cookie newCookie = new Cookie("bypassdmzreject", String.valueOf(System.currentTimeMillis()));
// 5min lifetime
newCookie.setMaxAge(5 * 60);
newCookie.setPath(WebappHelper.getServletContextPath());
newCookie.setSecure(ureq.getHttpReq().isSecure());
newCookie.setComment("cookie allowing olat admin users to bypass dmz rejects");
ureq.getHttpResp().addCookie(newCookie);
OncePanel oncePanel = new OncePanel("refresh");
oncePanel.setContent(createVelocityContainer("refresh"));
mainVc.put("refresh", oncePanel);
break;
}
}
} else if (source == toggleStartStop) {
clusBus.resetStats();
updatePerfInfos();
} else if (source == resetStats) {
clusBus.resetStats();
updatePerfInfos();
}
}
use of org.olat.core.util.coordinate.SyncerExecutor in project openolat by klemens.
the class DENManager method doEnroll.
/**
* Enrolls an user into a specific calendar event
* @param identity
* @param event
* @param course
* @param courseNode
* @param allowOverfill
* @return status
*/
public DENStatus doEnroll(final Identity identity, final KalendarEvent event, final OLATResourceable ores, final DENCourseNode courseNode, final boolean allowOverfill) {
final DENStatus status = new DENStatus();
ICourse course = CourseFactory.loadCourse(ores);
CalendarManager calManager = CoreSpringFactory.getImpl(CalendarManager.class);
final Kalendar cal = calManager.getCourseCalendar(course).getKalendar();
OLATResourceable calRes = calManager.getOresHelperFor(cal);
// reload calendar events
final List<KalendarEvent> denEvents = getDENEvents(ores.getResourceableId(), courseNode.getIdent());
CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(calRes, new SyncerExecutor() {
public void execute() {
boolean error = false;
// try to find choosen calendar event in the reloaded event list
KalendarEvent reloadEvent = event;
for (Iterator<KalendarEvent> iterator = denEvents.iterator(); iterator.hasNext(); ) {
KalendarEvent kalendarEvent = iterator.next();
if (event.getID().equals(kalendarEvent.getID())) {
reloadEvent = kalendarEvent;
break;
} else if (!iterator.hasNext()) {
// cannot find reloaded calendar event
status.setEnrolled(false);
status.setErrorMessage(DENStatus.ERROR_GENERAL);
error = true;
}
}
Collection<KalendarEvent> collEvents = cal.getEvents();
// check if date is already full
if (!error && !allowOverfill && isDateFull(reloadEvent)) {
status.setEnrolled(false);
status.setErrorMessage(DENStatus.ERROR_FULL);
error = true;
}
// check if identity is already enrolled
if (!error && isAlreadyEnrolled(identity, collEvents, courseNode)) {
status.setEnrolled(false);
status.setErrorMessage(DENStatus.ERROR_ALREADY_ENROLLED);
error = true;
}
// enroll in event
if (!error) {
if (reloadEvent.getParticipants() != null && reloadEvent.getParticipants().length > 0) {
int currLength = reloadEvent.getParticipants().length;
// one to add
String[] partsNew = new String[currLength + 1];
String[] partsOld = reloadEvent.getParticipants();
for (int i = 0; i < partsOld.length; i++) {
partsNew[i] = partsOld[i];
}
partsNew[partsNew.length - 1] = identity.getName();
reloadEvent.setParticipants(partsNew);
} else {
String[] partsNew = new String[] { identity.getName() };
reloadEvent.setParticipants(partsNew);
}
// save calendar event
boolean successfullyDone = calManager.updateEventAlreadyInSync(cal, reloadEvent);
if (!successfullyDone) {
status.setEnrolled(false);
status.setErrorMessage(DENStatus.ERROR_PERSISTING);
}
status.setEnrolled(true);
}
}
});
// success
return status;
}
use of org.olat.core.util.coordinate.SyncerExecutor in project openolat by klemens.
the class ChecklistManager method deleteChecklist.
/**
* Delete checklist.
* @param checklist
*/
public void deleteChecklist(final Checklist cl) {
final DB db = DBFactory.getInstance();
OLATResourceable ores = OresHelper.createOLATResourceableInstance(Checklist.class, cl.getKey());
CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(ores, new SyncerExecutor() {
public void execute() {
Checklist checklist = (Checklist) db.loadObject(cl);
db.deleteObject(checklist);
}
});
}
Aggregations