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);