You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2014/09/11 19:09:38 UTC

svn commit: r1624338 - in /openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web: pages/MainPage.java room/RoomPanel.html room/RoomPanel.java room/message/UserEnter.java room/message/UserListMessage.java

Author: solomax
Date: Thu Sep 11 17:09:38 2014
New Revision: 1624338

URL: http://svn.apache.org/r1624338
Log:
[OPENMEETINGS-1085] message-based user list update is implemented

Added:
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/message/UserListMessage.java
      - copied, changed from r1624336, openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/message/UserEnter.java
Removed:
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/message/UserEnter.java
Modified:
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java?rev=1624338&r1=1624337&r2=1624338&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java Thu Sep 11 17:09:38 2014
@@ -45,6 +45,7 @@ import org.apache.openmeetings.web.commo
 import org.apache.openmeetings.web.common.menu.MenuItem;
 import org.apache.openmeetings.web.common.menu.MenuPanel;
 import org.apache.openmeetings.web.room.RoomPanel;
+import org.apache.openmeetings.web.room.message.UserListMessage;
 import org.apache.openmeetings.web.user.AboutDialog;
 import org.apache.openmeetings.web.user.ChatPanel;
 import org.apache.openmeetings.web.util.OmUrlFragment;
@@ -146,8 +147,8 @@ public class MainPage extends BaseInited
 				log.debug(String.format("WebSocketBehavior::onClose [session: %s, key: %s]", message.getSessionId(), message.getKey()));
 				long roomId = Application.getRoom(_c);
 				if (roomId > 0) {
-					Client c = Application.removeUserFromRoom(roomId, _c);
-					RoomPanel.sendRoom(roomId, RoomPanel.removeUser(c));
+					Application.removeUserFromRoom(roomId, _c);
+					RoomPanel.broadcast(roomId, new UserListMessage(_c.getUserId(), roomId, UserListMessage.Type.exit));
 				}
 			}
 		});

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html?rev=1624338&r1=1624337&r2=1624338&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html Thu Sep 11 17:09:38 2014
@@ -19,6 +19,13 @@
   
 -->
 <html xmlns:wicket="http://wicket.apache.org">
+<wicket:head>
+	<script type="text/javascript">
+		Wicket.Event.subscribe("/websocket/closed", function(jqEvent, msg) {
+			//FIXME add Error dialog should be displayed 
+		});
+	</script>
+</wicket:head>
 <wicket:panel>
 	<div wicket:id="roomMenu"></div>
 	<div class="room menu right">
@@ -33,7 +40,11 @@
 				<li><a href="#utab"><wicket:ommessage key="613"/></a></li>
 				<li><a wicket:id="flink" href="#ftab"><wicket:ommessage key="614"/></a></li>
 			</ul>
-			<div id="utab"><div class="user list"></div></div>
+			<div id="utab">
+				<div wicket:id="userList" class="user list">
+					<div wicket:id="user" class="user ui-corner-all ui-widget-content"><span wicket:id="name"></span></div>
+				</div>
+			</div>
 			<div wicket:id="ftab" id="ftab"><div class="file list" wicket:id="tree"></div></div>
 		</div>
 	</div>

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java?rev=1624338&r1=1624337&r2=1624338&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java Thu Sep 11 17:09:38 2014
@@ -27,7 +27,7 @@ import static org.apache.openmeetings.we
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.openmeetings.web.util.OmUrlFragment.ROOMS_PUBLIC;
 
-import java.sql.ClientInfoStatus;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
@@ -63,6 +63,8 @@ import org.apache.openmeetings.web.commo
 import org.apache.openmeetings.web.common.tree.PublicRecordingTreeProvider;
 import org.apache.openmeetings.web.pages.MainPage;
 import org.apache.openmeetings.web.room.message.PollCreated;
+import org.apache.openmeetings.web.room.message.RoomMessage;
+import org.apache.openmeetings.web.room.message.UserListMessage;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -79,12 +81,16 @@ import org.apache.wicket.markup.head.OnD
 import org.apache.wicket.markup.head.PriorityHeaderItem;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.protocol.ws.WebSocketSettings;
+import org.apache.wicket.protocol.ws.api.IWebSocketConnection;
 import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload;
 import org.apache.wicket.protocol.ws.api.registry.IWebSocketConnectionRegistry;
 import org.apache.wicket.protocol.ws.api.registry.PageIdKey;
+import org.apache.wicket.protocol.ws.concurrent.Executor;
 import org.apache.wicket.request.flow.RedirectToUrlException;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
@@ -109,7 +115,6 @@ public class RoomPanel extends BasePanel
 
 		@Override
 		protected void respond(AjaxRequestTarget target) {
-			target.appendJavaScript("roomMessage(" + userList(roomId, c) + ");");
 			target.appendJavaScript("setHeight();");
 			//TODO SID etc
 			Room r = getBean(RoomDao.class).get(roomId);
@@ -119,7 +124,7 @@ public class RoomPanel extends BasePanel
 					, 4L == r.getRoomtype().getRoomtypes_id()
 					, getStringLabels(448, 449, 450, 451, 758, 447, 52, 53, 1429, 1430, 775, 452, 767, 764, 765, 918, 54, 761, 762).toString()
 					));
-			
+			broadcast(roomId, new UserListMessage(c.getUserId(), roomId, UserListMessage.Type.enter));
 		}
 	};
 	private final InvitationDialog invite;
@@ -133,6 +138,8 @@ public class RoomPanel extends BasePanel
 	private final RoomMenuItem pollVote;
 	private final RoomMenuItem pollResult;
 	private final RoomMenuItem sipDialer;
+	private final WebMarkupContainer userList = new WebMarkupContainer("userList");
+	private final ListView<RoomClient> users;
 	
 	public RoomPanel(String id, long _roomId) {
 		this(id, getBean(RoomDao.class).get(_roomId));
@@ -220,6 +227,19 @@ public class RoomPanel extends BasePanel
 				}
 			}
 		}).setVisible(showFiles));
+		add(userList.add(users = new ListView<RoomClient>("user", getUsers()) {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void populateItem(ListItem<RoomClient> item) {
+				RoomClient rc = item.getModelObject();
+				item.setMarkupId(String.format("user%s", rc.c.getUid()));
+				item.add(new Label("name", rc.u.getFirstname() + " " + rc.u.getLastname()));
+				if (c != null && rc.c.getUid().equals(c.getUid())) {
+					item.add(AttributeAppender.append("class", "current"));
+				}
+			}
+		}.setReuseItems(true)).setOutputMarkupId(true));
 		add(new JQueryBehavior(".room.sidebar.left .tabs", "tabs", new Options("active", showFiles && r.isFilesOpened() ? "ftab" : "utab")) {
 			private static final long serialVersionUID = 1L;
 
@@ -249,7 +269,11 @@ public class RoomPanel extends BasePanel
 		if (event.getPayload() instanceof WebSocketPushPayload) {
 			WebSocketPushPayload wsEvent = (WebSocketPushPayload) event.getPayload();
 			if (wsEvent.getMessage() instanceof PollCreated) {
-				//handleMessage(wsEvent.getHandler(), (PollCreated) wsEvent.getMessage());
+				//TODO check this menuPanel.modelChanged();
+				wsEvent.getHandler().add(menuPanel);
+			} else if (wsEvent.getMessage() instanceof UserListMessage) {
+				users.setList(getUsers());
+				wsEvent.getHandler().add(userList);
 			}
 		}
 		super.onEvent(event);
@@ -258,9 +282,9 @@ public class RoomPanel extends BasePanel
 	private JSONArray getStringLabels(long... ids) {
 		JSONArray arr = new JSONArray();
 		try {
-		for (long id : ids) {
-			arr.put(new JSONObject().put("id", id).put("value", WebSession.getString(id)));
-		}
+			for (long id : ids) {
+				arr.put(new JSONObject().put("id", id).put("value", WebSession.getString(id)));
+			}
 		} catch (JSONException e) {
 			log.error("", e);
 		}
@@ -289,59 +313,27 @@ public class RoomPanel extends BasePanel
 				}
 			}
 		}
-		sendRoom(roomId, addUser(c));
-	}
-	
-	public static JSONObject getUser(Client c, boolean current) throws JSONException {
-		User u = getBean(UserDao.class).get(c.getUserId());
-		return new JSONObject()
-			.put("uid", c.getUid())
-			.put("id", u.getId())
-			.put("firstname", u.getFirstname())
-			.put("lastname", u.getLastname())
-			.put("email", u.getAdresses() == null ? null : u.getAdresses().getEmail())
-			.put("current", current);
-	}
-	
-	public static String userList(long roomId, Client cur) {
-		try {
-			JSONArray ul = new JSONArray();
-			for (Client c : getRoomUsers(roomId)) {
-				ul.put(getUser(c, c.equals(cur)));
-			}
-			return new JSONObject()
-				.put("type", "room")
-				.put("msg", "users")
-				.put("timestamp", System.currentTimeMillis())
-				.put("users", ul).toString();
-		} catch (Exception e) {
-			log.error("Error while creating message", e);
-		}
-		return "{}";
-	}
-	
-	public static String addUser(Client c) {
-		try {
-			return new JSONObject()
-				.put("type", "room")
-				.put("msg", "addUser")
-				.put("user", getUser(c, false)).toString();
-		} catch (Exception e) {
-			log.error("Error while creating message", e);
-		}
-		return "{}";
 	}
 	
-	public static String removeUser(Client c) {
-		try {
-			return new JSONObject()
-				.put("type", "room")
-				.put("msg", "removeUser")
-				.put("uid", c.getUid()).toString();
-		} catch (Exception e) {
-			log.error("Error while creating message", e);
+	public static void broadcast(long roomId, final RoomMessage m) {
+		WebSocketSettings settings = WebSocketSettings.Holder.get(Application.get());
+		IWebSocketConnectionRegistry reg = settings.getConnectionRegistry();
+		Executor executor = settings.getWebSocketPushMessageExecutor();
+		for (Client c : getRoomUsers(roomId)) {
+			try {
+				final IWebSocketConnection wsConnection = reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId()));
+				executor.run(new Runnable()
+				{
+					@Override
+					public void run()
+					{
+						wsConnection.sendMessage(m);
+					}
+				});
+			} catch (Exception e) {
+				log.error("Error while sending message", e);
+			}
 		}
-		return "{}";
 	}
 	
 	public static void sendRoom(long roomId, String msg) {
@@ -362,7 +354,6 @@ public class RoomPanel extends BasePanel
 
 			@Override
 			public void onClick(MainPage page, AjaxRequestTarget target) {
-				target.appendJavaScript("$('.room.video').dialog('destroy');");
 				if (WebSession.getRights().contains(Right.Dashboard)) {
 					page.updateContents(ROOMS_PUBLIC, target);
 				} else {
@@ -420,8 +411,7 @@ public class RoomPanel extends BasePanel
 	public void cleanup(AjaxRequestTarget target) {
 		target.add(getMainPage().getHeader().setVisible(true), getMainPage().getMenu().setVisible(true)
 				, getMainPage().getTopLinks().setVisible(true));
-		target.appendJavaScript("$(window).off('resize.openmeetings');");
-		sendRoom(roomId, removeUser(c));
+		target.appendJavaScript("$(window).off('resize.openmeetings'); $('.room.video').dialog('destroy');");
 	}
 
 	private ResourceReference newResourceReference() {
@@ -435,6 +425,25 @@ public class RoomPanel extends BasePanel
 		response.render(OnDomReadyHeaderItem.forScript(aab.getCallbackScript()));
 	}
 
+	private List<RoomClient> getUsers() {
+		List<RoomClient> list = new ArrayList<RoomPanel.RoomClient>();
+		for (Client c : getRoomUsers(roomId)) {
+			list.add(new RoomClient(c));
+		}
+		return list;
+	}
+	
+	static class RoomClient implements Serializable {
+		private static final long serialVersionUID = 1L;
+		private final Client c;
+		private final User u;
+		
+		RoomClient(Client c) {
+			this.c = c;
+			this.u = getBean(UserDao.class).get(c.getUserId());
+		}
+	}
+	
 	static class FilesTreeProvider implements ITreeProvider<FileExplorerItem> {
 		private static final long serialVersionUID = 1L;
 		Long roomId = null;

Copied: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/message/UserListMessage.java (from r1624336, openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/message/UserEnter.java)
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/message/UserListMessage.java?p2=openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/message/UserListMessage.java&p1=openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/message/UserEnter.java&r1=1624336&r2=1624338&rev=1624338&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/message/UserEnter.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/message/UserListMessage.java Thu Sep 11 17:09:38 2014
@@ -18,14 +18,20 @@
  */
 package org.apache.openmeetings.web.room.message;
 
-public class UserEnter extends RoomMessage {
+public class UserListMessage extends RoomMessage {
 	private static final long serialVersionUID = 1L;
+	public enum Type {
+		enter
+		, exit
+	}
 	private final Long userId;
 	private final Long roomId;
+	private final Type type;
 
-	public UserEnter(Long userId, Long roomId) {
+	public UserListMessage(Long userId, Long roomId, Type type) {
 		this.userId = userId;
 		this.roomId = roomId;
+		this.type = type;
 	}
 
 	public long getPollId() {
@@ -35,4 +41,8 @@ public class UserEnter extends RoomMessa
 	public Long getRoomId() {
 		return roomId;
 	}
+
+	public Type getType() {
+		return type;
+	}
 }