This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new d87f237  [OPENMEETINGS-2223] various mainPanel behaviors should work 
more stable
d87f237 is described below

commit d87f23795ff67756fa379ce78ce53359d4bc018f
Author: Maxim Solodovnik <solomax...@gmail.com>
AuthorDate: Mon Apr 13 22:35:00 2020 +0700

    [OPENMEETINGS-2223] various mainPanel behaviors should work more stable
---
 .../openmeetings/web/common/OmWebSocketPanel.java  | 187 +++++++++++----------
 .../org/apache/openmeetings/web/common/main.js     |   3 +
 .../apache/openmeetings/web/pages/MainPage.java    |  97 ++++++-----
 .../apache/openmeetings/AbstractWicketTester.java  |   2 +-
 4 files changed, 160 insertions(+), 129 deletions(-)

diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java
index 54053ed..f5fdfa5 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java
@@ -22,7 +22,6 @@ import static 
org.apache.openmeetings.core.remote.KurentoHandler.KURENTO_TYPE;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
 import java.io.IOException;
-import java.time.Duration;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.openmeetings.core.remote.KurentoHandler;
@@ -30,10 +29,11 @@ import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.basic.IWsClient;
 import org.apache.wicket.Component;
-import org.apache.wicket.ajax.AbstractAjaxTimerBehavior;
+import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
+import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
 import org.apache.wicket.markup.html.panel.IMarkupSourcingStrategy;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.protocol.ws.api.WebSocketBehavior;
@@ -55,90 +55,9 @@ public abstract class OmWebSocketPanel extends Panel {
        private static final Logger log = 
LoggerFactory.getLogger(OmWebSocketPanel.class);
        public static final String CONNECTED_MSG = "socketConnected";
        private final AtomicBoolean connected = new AtomicBoolean();
-       private final AbstractAjaxTimerBehavior pingTimer = new 
AbstractAjaxTimerBehavior(Duration.ofSeconds(30)) {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               protected void onTimer(AjaxRequestTarget target) {
-                       log.debug("Sending WebSocket PING");
-                       WebSocketHelper.sendClient(getWsClient(), new 
byte[]{getUserId() == null ? 0 : getUserId().byteValue()});
-               }
-       };
-       private final WebSocketBehavior wsBehavior = new WebSocketBehavior() {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               public void renderHead(Component component, IHeaderResponse 
response) {
-                       super.renderHead(component, response);
-                       response.render(JavaScriptHeaderItem.forScript(
-                                       
String.format("Wicket.Event.subscribe(Wicket.Event.Topic.WebSocket.Opened, 
function() {Wicket.WebSocket.send('%s');});",CONNECTED_MSG)
-                                       , "ws-connected-script"));
-               }
-
-               @Override
-               protected void onConnect(ConnectedMessage message) {
-                       super.onConnect(message);
-                       OmWebSocketPanel.this.onConnect(message);
-               }
-
-               @Override
-               protected void onMessage(WebSocketRequestHandler handler, 
TextMessage msg) {
-                       if (CONNECTED_MSG.equals(msg.getText())) {
-                               if (connected.compareAndSet(false, true)) {
-                                       
OmWebSocketPanel.this.onConnect(handler);
-                                       log.debug("WebSocketBehavior:: 
pingTimer is attached");
-                                       pingTimer.restart(handler);
-                               }
-                       } else {
-                               final JSONObject m;
-                               try {
-                                       m = new JSONObject(msg.getText());
-                                       switch(m.optString("type", "")) {
-                                               case KURENTO_TYPE:
-                                                       
kHandler.onMessage(getWsClient(), m);
-                                                       break;
-                                               case "mic":
-                                               {
-                                                       IWsClient _c = 
getWsClient();
-                                                       if (!(_c instanceof 
Client)) {
-                                                               break;
-                                                       }
-                                                       Client c = (Client)_c;
-                                                       if (c.getRoomId() == 
null) {
-                                                               break;
-                                                       }
-                                                       
WebSocketHelper.sendRoomOthers(c.getRoomId(), c.getUid(), m.put("uid", 
c.getUid()));
-                                               }
-                                                       break;
-                                               default:
-                                                       
OmWebSocketPanel.this.onMessage(handler, m);
-                                       }
-                               } catch (Exception e) {
-                                       log.error("Error while processing 
incoming message", e);
-                               }
-                       }
-               }
-
-               @Override
-               protected void onAbort(AbortedMessage msg) {
-                       super.onAbort(msg);
-                       closeHandler(msg);
-               }
-
-               @Override
-               protected void onClose(ClosedMessage msg) {
-                       super.onClose(msg);
-                       closeHandler(msg);
-               }
-
-               @Override
-               protected void onError(WebSocketRequestHandler handler, 
ErrorMessage msg) {
-                       super.onError(handler, msg);
-                       closeHandler(msg);
-               }
-       };
        @SpringBean
        private KurentoHandler kHandler;
+       private boolean pingable = false;
 
        public OmWebSocketPanel(String id) {
                super(id);
@@ -147,8 +66,104 @@ public abstract class OmWebSocketPanel extends Panel {
        @Override
        protected void onInitialize() {
                super.onInitialize();
-               add(pingTimer, wsBehavior);
-               pingTimer.stop(null);
+               add(newWsBehavior(), new AbstractDefaultAjaxBehavior() {
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       public void renderHead(Component component, 
IHeaderResponse response) {
+                               if (!pingable) {
+                                       log.debug("pingTimer is attached");
+                                       pingable = true;
+                                       super.renderHead(component, response);
+                                       
response.render(OnDomReadyHeaderItem.forScript(getJs()));
+                               }
+                       }
+
+                       private CharSequence getJs() {
+                               return "OmUtil.ping(function(){" + 
getCallbackScript() + "});";
+                       }
+
+                       @Override
+                       protected void respond(AjaxRequestTarget target) {
+                               log.debug("Sending WebSocket PING");
+                               target.appendJavaScript(getJs());
+                               WebSocketHelper.sendClient(getWsClient(), new 
byte[]{getUserId() == null ? 0 : getUserId().byteValue()});
+                       }
+               });
+       }
+
+       private WebSocketBehavior newWsBehavior() {
+               return new WebSocketBehavior() {
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       public void renderHead(Component component, 
IHeaderResponse response) {
+                               super.renderHead(component, response);
+                               response.render(JavaScriptHeaderItem.forScript(
+                                               
String.format("Wicket.Event.subscribe(Wicket.Event.Topic.WebSocket.Opened, 
function() {Wicket.WebSocket.send('%s');});",CONNECTED_MSG)
+                                               , "ws-connected-script"));
+                       }
+
+                       @Override
+                       protected void onConnect(ConnectedMessage message) {
+                               super.onConnect(message);
+                               OmWebSocketPanel.this.onConnect(message);
+                       }
+
+                       @Override
+                       protected void onMessage(WebSocketRequestHandler 
handler, TextMessage msg) {
+                               if (CONNECTED_MSG.equals(msg.getText())) {
+                                       if (connected.compareAndSet(false, 
true)) {
+                                               
OmWebSocketPanel.this.onConnect(handler);
+                                       }
+                               } else {
+                                       final JSONObject m;
+                                       try {
+                                               m = new 
JSONObject(msg.getText());
+                                               switch(m.optString("type", "")) 
{
+                                                       case KURENTO_TYPE:
+                                                               
kHandler.onMessage(getWsClient(), m);
+                                                               break;
+                                                       case "mic":
+                                                       {
+                                                               IWsClient _c = 
getWsClient();
+                                                               if (!(_c 
instanceof Client)) {
+                                                                       break;
+                                                               }
+                                                               Client c = 
(Client)_c;
+                                                               if 
(c.getRoomId() == null) {
+                                                                       break;
+                                                               }
+                                                               
WebSocketHelper.sendRoomOthers(c.getRoomId(), c.getUid(), m.put("uid", 
c.getUid()));
+                                                       }
+                                                               break;
+                                                       default:
+                                                               
OmWebSocketPanel.this.onMessage(handler, m);
+                                               }
+                                       } catch (Exception e) {
+                                               log.error("Error while 
processing incoming message", e);
+                                       }
+                               }
+                       }
+
+                       @Override
+                       protected void onAbort(AbortedMessage msg) {
+                               super.onAbort(msg);
+                               closeHandler(msg);
+                       }
+
+                       @Override
+                       protected void onClose(ClosedMessage msg) {
+                               super.onClose(msg);
+                               closeHandler(msg);
+                       }
+
+                       @Override
+                       protected void onError(WebSocketRequestHandler handler, 
ErrorMessage msg) {
+                               super.onError(handler, msg);
+                               closeHandler(msg);
+                       }
+               };
        }
 
        protected abstract IWsClient getWsClient();
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/main.js 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/main.js
index b162f29..854bdf5 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/main.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/main.js
@@ -122,6 +122,9 @@ var OmUtil = (function() {
        self.setCssVar = function(key, val) {
                ($('body')[0]).style.setProperty(key, val);
        };
+       self.ping = function(callback) {
+               setTimeout(callback, 30000);
+       } ;
        return self;
 })();
 Wicket.BrowserInfo.collectExtraInfo = function(info) {
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
index dc88e0d..6423d52 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
@@ -25,7 +25,6 @@ import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import 
org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
-import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
@@ -41,41 +40,9 @@ public class MainPage extends BaseInitedPage {
        private static final Logger log = 
LoggerFactory.getLogger(MainPage.class);
        private static final String MAIN_PANEL_ID = "main";
        private final WebMarkupContainer mainContainer = new 
WebMarkupContainer("main-container");
-       private final AbstractDefaultAjaxBehavior areaBehavior = new 
AbstractDefaultAjaxBehavior() {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               protected void respond(AjaxRequestTarget target) {
-                       loaded = true;
-                       log.debug("MainPage::areaBehavior");
-                       if (uf == null) {
-                               uf = WebSession.get().getArea();
-                       }
-                       main.updateContents(uf == null ? OmUrlFragment.get() : 
uf, target);
-                       WebSession.get().setArea(null);
-               }
-       };
-       private final MainPanel main = new MainPanel(MAIN_PANEL_ID);
-       private final AbstractDefaultAjaxBehavior delayedLoad = new 
AbstractDefaultAjaxBehavior() {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               protected void respond(AjaxRequestTarget target) {
-                       log.debug("MainPage::delayedLoad");
-                       mainContainer.replace(main);
-                       target.add(
-                               mainContainer.add(areaBehavior, new Behavior() {
-                                       private static final long 
serialVersionUID = 1L;
-
-                                       @Override
-                                       public void renderHead(Component 
component, IHeaderResponse response) {
-                                               internalRenderHead(response);
-                                               
response.render(OnDomReadyHeaderItem.forScript(areaBehavior.getCallbackScript()));
-                                       }
-                               }));
-               }
-       };
+       private MainPanel main;
        private OmUrlFragment uf = null;
+       private boolean inited = false;
        private boolean loaded = false;
 
        public void updateContents(OmUrlFragment f, IPartialPageRequestHandler 
handler) {
@@ -86,8 +53,59 @@ public class MainPage extends BaseInitedPage {
        protected void onInitialize() {
                super.onInitialize();
                getHeader().setVisible(false);
-               add(mainContainer.add(new 
EmptyPanel(MAIN_PANEL_ID)).setOutputMarkupId(true));
-               add(delayedLoad);
+               final EmptyPanel temp = new EmptyPanel(MAIN_PANEL_ID);
+               add(newDelayedLoad());
+               add(mainContainer.add(temp).setOutputMarkupId(true));
+       }
+
+       private AbstractDefaultAjaxBehavior newDelayedLoad() {
+               return new AbstractDefaultAjaxBehavior() {
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       protected void respond(AjaxRequestTarget target) {
+                               log.debug("MainPage::delayedLoad");
+                               main = new MainPanel(MAIN_PANEL_ID);
+                               
target.add(mainContainer.replace(main).add(newAreaBehavior()));
+                       }
+
+                       @Override
+                       public void renderHead(Component component, 
IHeaderResponse response) {
+                               if (!inited) {
+                                       log.debug("renderHead:: 
newDelayedLoad");
+                                       inited = true;
+                                       super.renderHead(component, response);
+                                       
response.render(OnDomReadyHeaderItem.forScript(getCallbackScript()));
+                               }
+                       }
+               };
+       }
+
+       private AbstractDefaultAjaxBehavior newAreaBehavior() {
+               return new AbstractDefaultAjaxBehavior() {
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       protected void respond(AjaxRequestTarget target) {
+                               loaded = true;
+                               log.debug("MainPage::areaBehavior");
+                               if (uf == null) {
+                                       uf = WebSession.get().getArea();
+                               }
+                               main.updateContents(uf == null ? 
OmUrlFragment.get() : uf, target);
+                               WebSession.get().setArea(null);
+                       }
+
+                       @Override
+                       public void renderHead(Component component, 
IHeaderResponse response) {
+                               if (!loaded) {
+                                       log.debug("renderHead:: 
newAreaBehavior");
+                                       super.renderHead(component, response);
+                                       internalRenderHead(response);
+                                       
response.render(OnDomReadyHeaderItem.forScript(getCallbackScript()));
+                               }
+                       }
+               };
        }
 
        @Override
@@ -106,9 +124,4 @@ public class MainPage extends BaseInitedPage {
                        main.updateContents(newf, target, false);
                }
        }
-
-       @Override
-       public void renderHead(IHeaderResponse response) {
-               
response.render(OnDomReadyHeaderItem.forScript(delayedLoad.getCallbackScript()));
-       }
 }
diff --git 
a/openmeetings-web/src/test/java/org/apache/openmeetings/AbstractWicketTester.java
 
b/openmeetings-web/src/test/java/org/apache/openmeetings/AbstractWicketTester.java
index 296797a..28a018c 100644
--- 
a/openmeetings-web/src/test/java/org/apache/openmeetings/AbstractWicketTester.java
+++ 
b/openmeetings-web/src/test/java/org/apache/openmeetings/AbstractWicketTester.java
@@ -114,7 +114,7 @@ public class AbstractWicketTester extends 
AbstractJUnitDefaults {
                assertTrue(((WebSession)tester.getSession()).signIn(user, 
userpass, User.Type.USER, null));
                MainPage page = tester.startPage(MainPage.class);
                tester.assertRenderedPage(MainPage.class);
-               
tester.executeBehavior((AbstractAjaxBehavior)page.getBehaviorById(1));
+               
tester.executeBehavior((AbstractAjaxBehavior)page.get("main-container:main").getBehaviorById(0));
                
tester.executeBehavior((AbstractAjaxBehavior)page.get("main-container").getBehaviorById(0));
                WebSocketTester webSocketTester = new WebSocketTester(tester, 
page);
                webSocketTester.sendMessage(CONNECTED_MSG);

Reply via email to