diff --git a/src/main/java/org/olat/admin/layout/LayoutAdminController.java b/src/main/java/org/olat/admin/layout/LayoutAdminController.java index 9b83457bda38a121e5929a7e5a7957d46ed566df..fd4d4816c6ae271ca8be9da5ebe3f5f2ab277314 100644 --- a/src/main/java/org/olat/admin/layout/LayoutAdminController.java +++ b/src/main/java/org/olat/admin/layout/LayoutAdminController.java @@ -223,7 +223,7 @@ public class LayoutAdminController extends FormBasicController { layoutModule.setLogoFilename(newLogo.getName()); logoUpload.setInitialFile(newLogo); deleteLogo.setVisible(true); - Windows.getWindows(ureq).getChiefController().wishReload(true); + Windows.getWindows(ureq).getChiefController().wishReload(ureq, true); } } else if(logoLinkTypeEl == source) { @@ -234,7 +234,7 @@ public class LayoutAdminController extends FormBasicController { logoUpload.reset(); deleteLogo.setVisible(false); logoUpload.setInitialFile(null); - Windows.getWindows(ureq).getChiefController().wishReload(true); + Windows.getWindows(ureq).getChiefController().wishReload(ureq, true); } else if(themeSelection == source) { // set new theme in Settings diff --git a/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java b/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java index ae77058bae85a07de02dbd08c20a33ffdd5a9c9c..b808331dc1ea06d30917b5ad64b27683f8bd1a4d 100644 --- a/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java +++ b/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java @@ -50,7 +50,6 @@ import org.olat.core.gui.components.panel.Panel; import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; -import org.olat.core.gui.control.WindowBackOffice; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.id.Identity; @@ -150,8 +149,6 @@ public class ClusterAdminControllerCluster extends BasicController { mainVc.put("busmsgs", busMsgs); // let a thread repeatively dump all messages - //final Formatter f = Formatter.getInstance(ureq.getLocale()); - final WindowBackOffice wbo = getWindowControl().getWindowBackOffice(); Thread pollThread = new Thread(new Runnable(){ public void run() { while (!disposed) { @@ -160,21 +157,18 @@ public class ClusterAdminControllerCluster extends BasicController { } catch (InterruptedException e) { // ignore } - wbo.invokeLater(new Runnable() { - public void run() { - // simple reput the new lists into the velocity container. - // the container is then dirty and automatically rerendered since polling has been turned on here. - busMsgs.contextPut("time", Formatter.formatDatetime(new Date())); - busMsgs.contextPut("recmsgs", clusBus.getListOfReceivedMsgs()); - busMsgs.contextPut("sentmsgs", clusBus.getListOfSentMsgs()); - // also let node infos refresh - updateNodeInfos(); - // also let perf infos refresh - updatePerfInfos(); - // update cache info - updateCacheInfo(); - } - }); + + // simple reput the new lists into the velocity container. + // the container is then dirty and automatically rerendered since polling has been turned on here. + busMsgs.contextPut("time", Formatter.formatDatetime(new Date())); + busMsgs.contextPut("recmsgs", clusBus.getListOfReceivedMsgs()); + busMsgs.contextPut("sentmsgs", clusBus.getListOfSentMsgs()); + // also let node infos refresh + updateNodeInfos(); + // also let perf infos refresh + updatePerfInfos(); + // update cache info + updateCacheInfo(); } }}); pollThread.setDaemon(true); diff --git a/src/main/java/org/olat/core/commons/contextHelp/ContextHelpTopNavController.java b/src/main/java/org/olat/core/commons/contextHelp/ContextHelpTopNavController.java index d1e78ac30949921edc52138ce57cea43e4d66555..09fa64d04acdf40eeb3639519e16b9d04a9f3484 100644 --- a/src/main/java/org/olat/core/commons/contextHelp/ContextHelpTopNavController.java +++ b/src/main/java/org/olat/core/commons/contextHelp/ContextHelpTopNavController.java @@ -25,6 +25,7 @@ import java.util.Locale; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.chiefcontrollers.LanguageChangedEvent; import org.olat.core.commons.fullWebApp.DefaultMinimalTopNavController; +import org.olat.core.commons.fullWebApp.TopNavController; import org.olat.core.dispatcher.impl.StaticMediaDispatcher; import org.olat.core.gui.UserRequest; import org.olat.core.gui.Windows; @@ -64,7 +65,7 @@ import org.olat.search.ui.SearchInputController; * * @author Florian Gnaegi, frentix GmbH, http://www.frentix.com */ -public class ContextHelpTopNavController extends FormBasicController { +public class ContextHelpTopNavController extends FormBasicController implements TopNavController { static final OLATResourceable CHANGE_LANG_RESOURCE = OresHelper.createOLATResourceableType("ContextHelp:ChangeLanguageChannel"); private SingleSelection langSelection; @@ -91,6 +92,11 @@ public class ContextHelpTopNavController extends FormBasicController { initForm(ureq); } + @Override + public void lockResource(OLATResourceable resource) { + // + } + @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { SearchServiceUIFactory searchUIFactory = (SearchServiceUIFactory)CoreSpringFactory.getBean(SearchServiceUIFactory.class); diff --git a/src/main/java/org/olat/core/commons/controllers/impressum/ImpressumAdminController.java b/src/main/java/org/olat/core/commons/controllers/impressum/ImpressumAdminController.java index 7882ecc7244c7d8085750ebfdaae7044b915ad71..4f504b39699bea67be025af2a6caf9a437c15308 100644 --- a/src/main/java/org/olat/core/commons/controllers/impressum/ImpressumAdminController.java +++ b/src/main/java/org/olat/core/commons/controllers/impressum/ImpressumAdminController.java @@ -201,13 +201,13 @@ public class ImpressumAdminController extends FormBasicController { impressumCont.setVisible(enabled); getWindowControl().getWindowBackOffice().getWindow().setDirty(true); - Windows.getWindows(ureq).getChiefController().wishReload(true); + Windows.getWindows(ureq).getChiefController().wishReload(ureq, true); } else if(positionEl == source) { if(positionEl.isOneSelected()) { String key = positionEl.getSelectedKey(); impressumModule.setPosition(key); getWindowControl().getWindowBackOffice().getWindow().setDirty(true); - Windows.getWindows(ureq).getChiefController().wishReload(true); + Windows.getWindows(ureq).getChiefController().wishReload(ureq, true); } } else if(source instanceof FormLink) { FormLink link = (FormLink)source; diff --git a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java index 10e99394f959a06cb31e68a61d704c6a2e05021b..74a4676615da10575e2f3e58622bc99b138fa270 100644 --- a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java +++ b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java @@ -81,7 +81,6 @@ import org.olat.core.gui.control.navigation.SiteInstance; import org.olat.core.gui.control.util.ZIndexWrapper; import org.olat.core.gui.control.winmgr.JSCommand; import org.olat.core.gui.themes.Theme; -import org.olat.core.gui.util.SyntheticUserRequest; import org.olat.core.helpers.Settings; import org.olat.core.id.OLATResourceable; import org.olat.core.id.context.BusinessControlFactory; @@ -846,12 +845,19 @@ public class BaseFullWebappController extends BasicController implements ChiefCo } @Override - public boolean wishReload(boolean erase) { + public boolean wishReload(UserRequest ureq, boolean erase) { boolean screen = getScreenMode().wishScreenModeSwitch(erase); boolean r = (reload == null ? false : reload.booleanValue()); if(erase && reload != null) { reload = null; } + + if(openAssessmentModeConfirmation != null && openAssessmentModeConfirmation.booleanValue()) { + openAssessmentmodeConfirmation(ureq, mode); + r = true; + } + + return r || screen; } @@ -1239,14 +1245,25 @@ public class BaseFullWebappController extends BasicController implements ChiefCo } } + private Boolean openAssessmentModeConfirmation = Boolean.FALSE; + private TransientAssessmentMode mode; + private void asyncLockResource(TransientAssessmentMode mode) { logAudit("Async lock resource for user: " + getIdentity().getName() + " (" + mode.getResource() + ")", null); lockResource(mode.getResource()); - UserRequest ureq = new SyntheticUserRequest(getIdentity(), getLocale()); - modeCtrl = new AssessmentModeUserConfirmationController(ureq, getWindowControl(), Collections.singletonList(mode)); - listenTo(modeCtrl); - modeCtrl.getInitialComponent(); + this.mode = mode; + openAssessmentModeConfirmation = true; + } + + private void openAssessmentmodeConfirmation(UserRequest ureq, TransientAssessmentMode mode) { + if(modeCtrl != null) return; + + if(openAssessmentModeConfirmation != null && openAssessmentModeConfirmation) { + modeCtrl = new AssessmentModeUserConfirmationController(ureq, getWindowControl(), Collections.singletonList(mode)); + listenTo(modeCtrl); + modeCtrl.getInitialComponent(); + } } /** diff --git a/src/main/java/org/olat/core/gui/UserRequestImpl.java b/src/main/java/org/olat/core/gui/UserRequestImpl.java index 2d6b05e5a1c1c59b5d3a45bf5799bc1444f595cd..e498358c5fff7fd12aaa6bc0938aead9f707fb83 100644 --- a/src/main/java/org/olat/core/gui/UserRequestImpl.java +++ b/src/main/java/org/olat/core/gui/UserRequestImpl.java @@ -83,7 +83,6 @@ public class UserRequestImpl implements UserRequest { private boolean isValidDispatchURI; - //fxdiff BAKS-7 Resume function private String uuid; private static int count = 0; @@ -102,15 +101,15 @@ public class UserRequestImpl implements UserRequest { dispatchResult = new DispatchResult(); parseRequest(httpReq); - //fxdiff BAKS-7 Resume function uuid = Integer.toString(++count); } - //fxdiff BAKS-7 Resume function + @Override public String getUuid() { return uuid; } - + + @Override public String getUriPrefix() { return uriPrefix; } @@ -119,6 +118,7 @@ public class UserRequestImpl implements UserRequest { * @param key * @return the value of the parameter with key 'key' */ + @Override public String getParameter(String key) { return params.get(key); } @@ -126,6 +126,7 @@ public class UserRequestImpl implements UserRequest { /** * @return the Set of parameters */ + @Override public Set<String> getParameterSet() { return params.keySet(); } @@ -133,17 +134,18 @@ public class UserRequestImpl implements UserRequest { /** * @return the http request */ + @Override public HttpServletRequest getHttpReq() { return httpReq; } /** - * @return the usersession + * @return The openolat user session */ + @Override public UserSession getUserSession() { - //FIXME:fj:b cache usersession here UserSession result = CoreSpringFactory.getImpl(UserSessionManager.class).getUserSession(getHttpReq()); - if (result==null) { + if (result == null) { log.warn("getUserSession: null, this="+this, new RuntimeException("getUserSession")); } return result; diff --git a/src/main/java/org/olat/core/gui/Windows.java b/src/main/java/org/olat/core/gui/Windows.java index ad750e38c7c301fb3bbf0c10a67a9322a42aee28..36181cf9f8a129676d947060673bc5a9bc8deecf 100644 --- a/src/main/java/org/olat/core/gui/Windows.java +++ b/src/main/java/org/olat/core/gui/Windows.java @@ -30,6 +30,9 @@ import java.io.Serializable; import java.util.Iterator; import java.util.concurrent.atomic.AtomicInteger; +import javax.servlet.http.HttpServletRequest; + +import org.olat.core.CoreSpringFactory; import org.olat.core.gui.components.Window; import org.olat.core.gui.control.ChiefController; import org.olat.core.gui.control.Disposable; @@ -38,6 +41,7 @@ import org.olat.core.gui.util.bandwidth.SlowBandWidthSimulator; import org.olat.core.gui.util.bandwidth.SlowBandWidthSimulatorImpl; import org.olat.core.util.FIFOMap; import org.olat.core.util.UserSession; +import org.olat.core.util.session.UserSessionManager; /** * @author Felix Jost @@ -72,6 +76,14 @@ public class Windows implements Disposable, Serializable { UserSession us = ureq.getUserSession(); return getWindows(us); } + + public static Windows getWindows(HttpServletRequest request) { + UserSession us = CoreSpringFactory.getImpl(UserSessionManager.class).getUserSession(request); + if (us == null) { + return null; + } + return getWindows(us); + } /** * @param us diff --git a/src/main/java/org/olat/core/gui/components/Window.java b/src/main/java/org/olat/core/gui/components/Window.java index cc0f3fdd0e645433c03a43e076e72b0ee345918f..28011bf1a17a2e0cc66e22afb4209626d353f4e1 100644 --- a/src/main/java/org/olat/core/gui/components/Window.java +++ b/src/main/java/org/olat/core/gui/components/Window.java @@ -336,7 +336,7 @@ public class Window extends AbstractComponent { boolean didDispatch = false; boolean forceReload = false; if (validForDispatching) { - DispatchResult dispatchResult = doDispatchToComponent(ureq, null); // FIXME:fj:c enable time stats for ajax-mode + DispatchResult dispatchResult = doDispatchToComponent(ureq, null); didDispatch = dispatchResult.isDispatch(); incTimestamp = dispatchResult.isIncTimestamp(); forceReload = dispatchResult.isForceReload(); @@ -354,6 +354,7 @@ public class Window extends AbstractComponent { String reRenderUri = buildURIFor(this, timestampID, null); Command rmrcom = CommandFactory.createParentRedirectTo(reRenderUri); wbackofficeImpl.sendCommandTo(rmrcom); + System.out.println("Redirect"); } else if (didDispatch || !validForDispatching) { if (validForDispatching) { Window ww = ureq.getDispatchResult().getResultingWindow(); @@ -478,7 +479,6 @@ public class Window extends AbstractComponent { // create a mapper which maps this mediaresource, and serves it once only MediaResourceMapper extMRM = new MediaResourceMapper(); extMRM.setMediaResource(mmr); - //FIXME:fj:b deregister old mapper, or reuse current one String res = CoreSpringFactory.getImpl(MapperService.class).register(ureq.getUserSession(), extMRM) + "/"; // e.g. res = /olat/m/10001/ Command rmrcom = CommandFactory.createParentRedirectForExternalResource(res); @@ -622,7 +622,6 @@ public class Window extends AbstractComponent { long dstop = System.currentTimeMillis(); long diff = dstop - dstart; debugMsg.append("disp_comp:").append(diff).append(LOG_SEPARATOR); - //Tracing.logDebug("componentdispatchtime: " + (dstop - dstart), Window.class); } if (didDispatch) { // the component with the given id was found mr = ureq.getDispatchResult().getResultingMediaResource(); @@ -1052,7 +1051,7 @@ public class Window extends AbstractComponent { * @param bc the businesscontrolpath * @return the new (relative) url as a string */ - private String buildURIFor(Window win, String timestampId, String moduleUri) { + public String buildURIFor(Window win, String timestampId, String moduleUri) { URLBuilder ubu = new URLBuilder(uriPrefix, win.getInstanceId(), timestampId, wbackofficeImpl); StringOutput so = new StringOutput(); ubu.buildURI(so, null, null, moduleUri, 0); @@ -1145,7 +1144,7 @@ public class Window extends AbstractComponent { } ChiefController chief = Windows.getWindows(ureq).getChiefController(); - boolean reload = chief == null ? false : chief.wishReload(true); + boolean reload = chief == null ? false : chief.wishReload(ureq, true); return new DispatchResult(toDispatch, incTimestamp, reload); } @@ -1185,23 +1184,6 @@ public class Window extends AbstractComponent { } } // else: a component with -no- controller as listener, makes no sense in 99.99% of the cases; ignore in those rare cases } - - private List<Component> findComponentsWithChildName(final String childName, Component searchRoot) { - final List<Component> founds = new ArrayList<Component>(); - ComponentTraverser ct = new ComponentTraverser(new ComponentVisitor(){ - public boolean visit(Component comp, UserRequest ureq) { - if(comp.getParent()==null){ - return true; - } - if (comp.getParent().getComponent(childName) == comp) { - founds.add(comp); - } - return true; - }}, searchRoot, true); - ct.visitAll(null); - return founds; - } - /** * Sets the asyncMediaResponsible. diff --git a/src/main/java/org/olat/core/gui/control/ChiefController.java b/src/main/java/org/olat/core/gui/control/ChiefController.java index 158d6a01993d60b0b23e8b7efa750b5c82ab112c..aa3e07781de1c8e3ba07630992aa172d3a82c9ba 100644 --- a/src/main/java/org/olat/core/gui/control/ChiefController.java +++ b/src/main/java/org/olat/core/gui/control/ChiefController.java @@ -26,6 +26,7 @@ package org.olat.core.gui.control; +import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Window; import org.olat.core.gui.components.htmlheader.jscss.CustomCSS; import org.olat.core.gui.control.navigation.SiteInstance; @@ -48,7 +49,7 @@ public interface ChiefController extends Controller { public ScreenMode getScreenMode(); - public boolean wishReload(boolean erase); + public boolean wishReload(UserRequest ureq, boolean erase); public void lockResource(OLATResourceable resource); diff --git a/src/main/java/org/olat/core/gui/control/DefaultChiefController.java b/src/main/java/org/olat/core/gui/control/DefaultChiefController.java index eeb0a7c656966ecad62d70a27d8ca74d39eb186d..b2b0d1e2376e38a6a2b4285aa17528db48a7d24d 100644 --- a/src/main/java/org/olat/core/gui/control/DefaultChiefController.java +++ b/src/main/java/org/olat/core/gui/control/DefaultChiefController.java @@ -65,7 +65,7 @@ public abstract class DefaultChiefController extends DefaultController implement } @Override - public boolean wishReload(boolean erase) { + public boolean wishReload(UserRequest ureq, boolean erase) { return false; } diff --git a/src/main/java/org/olat/core/gui/control/WindowBackOffice.java b/src/main/java/org/olat/core/gui/control/WindowBackOffice.java index 82914fd2d6b69c756ff1bb7b8967d2c936707b85..af079acb8db5fc5a98aeac5221ff861e6def5301 100644 --- a/src/main/java/org/olat/core/gui/control/WindowBackOffice.java +++ b/src/main/java/org/olat/core/gui/control/WindowBackOffice.java @@ -110,13 +110,6 @@ public interface WindowBackOffice extends Disposable{ * @return */ public GuiStack createGuiStack(Component initialComponent); - - /** - * Use this method for asynchronous updates to the gui. <br> - * invokes the runnable at a time when it is safe, that is the dispatching and rendering of the window is not disturbed. - * @param runnable the runnable - */ - public void invokeLater(Runnable runnable); /** * @param wco the Command to be sent to the client (all requests are queued and sent in a batch at the end of the request) diff --git a/src/main/java/org/olat/core/gui/control/winmgr/AjaxController.java b/src/main/java/org/olat/core/gui/control/winmgr/AjaxController.java index 9c8e5d8dae75978fd5588dd2d9d7e25b24e28b07..b2eb001fa86f173f5559c6cd7a16d50c8b64cece 100644 --- a/src/main/java/org/olat/core/gui/control/winmgr/AjaxController.java +++ b/src/main/java/org/olat/core/gui/control/winmgr/AjaxController.java @@ -45,6 +45,8 @@ import org.olat.core.dispatcher.impl.StaticMediaDispatcher; import org.olat.core.dispatcher.mapper.Mapper; import org.olat.core.dispatcher.mapper.MapperService; import org.olat.core.gui.UserRequest; +import org.olat.core.gui.UserRequestImpl; +import org.olat.core.gui.Windows; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.Window; import org.olat.core.gui.components.panel.Panel; @@ -123,10 +125,23 @@ public class AjaxController extends DefaultController { // check for dirty components now. wboImpl.fireCycleEvent(Window.BEFORE_INLINE_RENDERING); Command updateDirtyCom = window.handleDirties(); + + ChiefController cc = Windows.getWindows(request).getChiefController(); + String uriPrefix = DispatcherModule.getLegacyUriPrefix(request); + UserRequest ureq = new UserRequestImpl(uriPrefix, request, null); + boolean reload = cc.wishReload(ureq, false); + System.out.println("Reload: " + reload); + wboImpl.fireCycleEvent(Window.AFTER_INLINE_RENDERING); if (updateDirtyCom != null) { synchronized (windowcommands) { //o_clusterOK by:fj windowcommands.add(new WindowCommand(wboImpl, updateDirtyCom)); + if(reload) { + String timestampID = ureq.getTimestampID(); + String reRenderUri = window.buildURIFor(window, timestampID, null); + Command rmrcom = CommandFactory.createParentRedirectTo(reRenderUri); + windowcommands.add(new WindowCommand(wboImpl, rmrcom)); + } } } MediaResource mr = extractMediaResource(false); diff --git a/src/main/java/org/olat/core/gui/control/winmgr/JSCommand.java b/src/main/java/org/olat/core/gui/control/winmgr/JSCommand.java index 7b2e072f40cb37efe9503e9558916fd44cd851b9..28e9146027e00143a65bc078bf62e8dc24c0b8b4 100644 --- a/src/main/java/org/olat/core/gui/control/winmgr/JSCommand.java +++ b/src/main/java/org/olat/core/gui/control/winmgr/JSCommand.java @@ -38,25 +38,6 @@ import org.olat.core.logging.AssertException; */ public class JSCommand extends Command { -// TODO: commented out since not implemented in functions.js: execute a -// method on a json object with some data -// /** -// * @param command -// */ -// public JSCommand(Component target, String fktName, JSONObject data) { -// super(1); // do not change this command id, it is in js also -// String jsObjectName = "o_jso"+target.getDispatchID(); -// JSONObject subjo = new JSONObject(); -// try { -// subjo.put("jso", jsObjectName); -// subjo.put("f", fktName); -// subjo.put("data", data); -// } catch (JSONException e) { -// throw new AssertException("json exception:", e); -// } -// setSubJSON(subjo); -// } - /** * Create a command that executes arbitrary JS code * @param javaScriptCode @@ -71,5 +52,4 @@ public class JSCommand extends Command { } setSubJSON(subjo); } - } diff --git a/src/main/java/org/olat/core/gui/control/winmgr/RedrawComponentsCommand.java b/src/main/java/org/olat/core/gui/control/winmgr/RedrawComponentsCommand.java deleted file mode 100644 index 64df4674bcc0e2ec781dda7e8d205c427e6336ab..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/core/gui/control/winmgr/RedrawComponentsCommand.java +++ /dev/null @@ -1,45 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <p> -* Licensed under the Apache License, Version 2.0 (the "License"); <br> -* you may not use this file except in compliance with the License.<br> -* You may obtain a copy of the License at -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <p> -* Unless required by applicable law or agreed to in writing,<br> -* software distributed under the License is distributed on an "AS IS" BASIS, <br> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> -* See the License for the specific language governing permissions and <br> -* limitations under the License. -* <p> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -* <p> -*/ - -package org.olat.core.gui.control.winmgr; - - -/** - * Description:<br> - * Initial Date: 24.03.2006 <br> - * - * @author Felix Jost - */ -public class RedrawComponentsCommand extends Command { - - /** - * @param command - */ - public RedrawComponentsCommand() { - super(2); - } - -} diff --git a/src/main/java/org/olat/core/gui/control/winmgr/WindowBackOfficeImpl.java b/src/main/java/org/olat/core/gui/control/winmgr/WindowBackOfficeImpl.java index 8726a4465c8eb7c238c70b13dbe998dd1c9addd6..5e849a90ad46432688c17f5c644984a6c8743c2c 100644 --- a/src/main/java/org/olat/core/gui/control/winmgr/WindowBackOfficeImpl.java +++ b/src/main/java/org/olat/core/gui/control/winmgr/WindowBackOfficeImpl.java @@ -336,23 +336,6 @@ public class WindowBackOfficeImpl implements WindowBackOffice { return new GuiStackNiceImpl(this, initialComponent); } - /* (non-Javadoc) - * @see org.olat.core.gui.control.WindowBackOffice#invokeLater(java.lang.Runnable) - */ - @Override - public void invokeLater(Runnable runnable) { - // brasato:::: verify that this is now as it should be. - // improve by handling those tasks after a ongoing dispatch/render is finished, - // or when handleDirties is called. - // the current solution below blocks the async caller - e.g. a user firing an eventbus message may then wait for all users to complete their - // rendering process - normally way below 0.1 sec, but if we have 100 users which happen to just being rendered when the notifications takes place. - // -> 10 seconds delay! this is not very probable but possible. - - synchronized(window) {//cluster_ok - runnable.run(); - } - } - public void fireCycleEvent(Event cycleEvent) { for (GenericEventListener gel : cycleListeners) { gel.event(cycleEvent); diff --git a/src/main/java/org/olat/core/util/IPUtils.java b/src/main/java/org/olat/core/util/IPUtils.java index bc916fb7a7bee1cbe8c445245ed4310bbc7e9502..b6f895cc6b4a56dfa14ed9c16d6362cc94259b67 100644 --- a/src/main/java/org/olat/core/util/IPUtils.java +++ b/src/main/java/org/olat/core/util/IPUtils.java @@ -19,7 +19,6 @@ */ package org.olat.core.util; -import org.apache.commons.net.util.SubnetUtils; /** @@ -44,11 +43,18 @@ public class IPUtils { return result; } - public static boolean isValidRange(String ipWithMask, String ipToCheck) { + public static boolean isValidRange(String ipWithMask, String address) { boolean allOk = false; - if(ipWithMask.indexOf("/") > 0) { - SubnetUtils utils = new SubnetUtils(ipWithMask); - allOk = utils.getInfo().isInRange(ipToCheck); + int maskIndex = ipWithMask.indexOf("/"); + if(maskIndex > 0) { + long bits = Long.parseLong(ipWithMask.substring(maskIndex + 1)); + long subnet = ipToLong(textToNumericFormatV4(ipWithMask.substring(0, maskIndex))); + long ip = ipToLong(textToNumericFormatV4(address)); + + long mask = -1 << (32 - bits); + if ((subnet & mask) == (ip & mask)) { + allOk = true; + } } return allOk; } diff --git a/src/main/java/org/olat/course/assessment/_spring/assessmentContext.xml b/src/main/java/org/olat/course/assessment/_spring/assessmentContext.xml index eeaa6225ea61c9e6ad8f1bd160d15b9ba4023497..08c3575d860bee2f489c26ebaa4363af01c852fb 100644 --- a/src/main/java/org/olat/course/assessment/_spring/assessmentContext.xml +++ b/src/main/java/org/olat/course/assessment/_spring/assessmentContext.xml @@ -23,7 +23,7 @@ <bean id="assessmentNotificationsTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="assessmentNotificationsJob" /> - <property name="cronExpression" value="25 */5 * * * ?" /> + <property name="cronExpression" value="25 * * * * ?" /> <property name="startDelay" value="55000" /> </bean> diff --git a/src/main/webapp/static/js/functions.js b/src/main/webapp/static/js/functions.js index 9acccb789d24a63a2531c62086e8c8a4e96bee3c..717a26b91060b2b72273cb3d959b15c2b0e5630c 100644 --- a/src/main/webapp/static/js/functions.js +++ b/src/main/webapp/static/js/functions.js @@ -716,7 +716,6 @@ function removeAjaxBusy() { jQuery('#o_body').removeClass('o_ajax_busy'); jQuery('#o_ajax_busy_backdrop').remove(); jQuery('#o_ajax_busy').modal('hide'); - console.log("Remove"); } catch (e) { if(window.console) console.log(e); } diff --git a/src/test/java/org/olat/core/util/IPUtilsTest.java b/src/test/java/org/olat/core/util/IPUtilsTest.java index 1fb4707a0e6e4d34d4ac3a7c6ea159b7d5335639..a01980f8c0d90749a362e3e6925fc4144847a35e 100644 --- a/src/test/java/org/olat/core/util/IPUtilsTest.java +++ b/src/test/java/org/olat/core/util/IPUtilsTest.java @@ -22,7 +22,7 @@ public class IPUtilsTest { boolean check2 = IPUtils.isValidRange(start, end, "192.168.5.45"); Assert.assertFalse(check2); } - /* + @Test public void checkRange_mask_31() { String ipWithMask = "192.168.100.1/24"; @@ -37,5 +37,4 @@ public class IPUtilsTest { boolean notAllowed3 = IPUtils.isValidRange(ipWithMask, "212.34.100.0"); Assert.assertFalse(notAllowed3); } - */ } diff --git a/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java b/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java index cafb42392f9c2262eb64c252af8e0ec76b04fc8e..9d26e3ae428daa82e824ca75dc43237ec1b4aa6e 100644 --- a/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java +++ b/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java @@ -594,6 +594,46 @@ public class AssessmentModeManagerTest extends OlatTestCase { boolean notAllowed4 = assessmentModeMgr.isIpAllowed(ipList, "212.203.203.64"); Assert.assertFalse(notAllowed4); } + + @Test + public void isIpAllowed_cidr() { + String ipList = "192.168.100.1/24"; + + boolean allowed1 = assessmentModeMgr.isIpAllowed(ipList, "192.168.100.64"); + Assert.assertTrue(allowed1); + + //negative test + boolean notAllowed1 = assessmentModeMgr.isIpAllowed(ipList, "192.168.99.129"); + Assert.assertFalse(notAllowed1); + boolean notAllowed2 = assessmentModeMgr.isIpAllowed(ipList, "192.168.101.204"); + Assert.assertFalse(notAllowed2); + boolean notAllowed3 = assessmentModeMgr.isIpAllowed(ipList, "192.167.100.1"); + Assert.assertFalse(notAllowed3); + boolean notAllowed4 = assessmentModeMgr.isIpAllowed(ipList, "212.203.203.64"); + Assert.assertFalse(notAllowed4); + } + + @Test + public void isIpAllowed_all() { + String ipList = "192.168.1.203\n192.168.30.1 - 192.168.32.128\n192.168.112.1/24"; + + boolean allowed1 = assessmentModeMgr.isIpAllowed(ipList, "192.168.1.203"); + Assert.assertTrue(allowed1); + boolean allowed2 = assessmentModeMgr.isIpAllowed(ipList, "192.168.31.203"); + Assert.assertTrue(allowed2); + boolean allowed3 = assessmentModeMgr.isIpAllowed(ipList, "192.168.112.203"); + Assert.assertTrue(allowed3); + + //negative test + boolean notAllowed1 = assessmentModeMgr.isIpAllowed(ipList, "192.168.99.129"); + Assert.assertFalse(notAllowed1); + boolean notAllowed2 = assessmentModeMgr.isIpAllowed(ipList, "192.168.101.204"); + Assert.assertFalse(notAllowed2); + boolean notAllowed3 = assessmentModeMgr.isIpAllowed(ipList, "192.167.100.1"); + Assert.assertFalse(notAllowed3); + boolean notAllowed4 = assessmentModeMgr.isIpAllowed(ipList, "212.203.203.64"); + Assert.assertFalse(notAllowed4); + } private AssessmentMode createMinimalAssessmentmode(RepositoryEntry entry) { AssessmentMode mode = assessmentModeMgr.createAssessmentMode(entry);