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 <[email protected]>
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);