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 2016/11/18 07:13:49 UTC

svn commit: r1770322 - in /openmeetings/application: branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ branches/3.1.x/openmeetings-we...

Author: solomax
Date: Fri Nov 18 07:13:48 2016
New Revision: 1770322

URL: http://svn.apache.org/viewvc?rev=1770322&view=rev
Log:
[OPENMEETINGS-1462] admin can now delete chat messages via UI

Modified:
    openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
    openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java

Modified: openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java?rev=1770322&r1=1770321&r2=1770322&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java Fri Nov 18 07:13:48 2016
@@ -90,4 +90,16 @@ public class ChatDao {
 	public void delete(ChatMessage entity, long userId) {
 		// TODO Auto-generated method stub
 	}
+
+	public void deleteGlobal() {
+		em.createNamedQuery("deleteChatGlobal").executeUpdate();
+	}
+
+	public void deleteRoom(Long roomId) {
+		em.createNamedQuery("deleteChatRoom").setParameter("roomId", roomId).executeUpdate();
+	}
+
+	public void deleteUser(Long userId) {
+		em.createNamedQuery("deleteChatUser").setParameter("userId", userId).executeUpdate();
+	}
 }

Modified: openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java?rev=1770322&r1=1770321&r2=1770322&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java Fri Nov 18 07:13:48 2016
@@ -44,12 +44,15 @@ import org.simpleframework.xml.Root;
 	@NamedQuery(name = "getChatMessageById", query = "SELECT c FROM ChatMessage c WHERE c.id = :id")
 	, @NamedQuery(name = "getChatMessages", query = "SELECT c FROM ChatMessage c ORDER BY c.id")
 	, @NamedQuery(name = "getGlobalChatMessages", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom IS NULL ORDER BY c.sent DESC")
-	, @NamedQuery(name = "getChatMessagesByRoom", query = "SELECT c FROM ChatMessage c WHERE c.toUser.id IS NULL AND c.toRoom.id = :roomId"
+	, @NamedQuery(name = "getChatMessagesByRoom", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom.id = :roomId"
 			+ " AND (true = :all OR (false = :all AND c.needModeration = false)) ORDER BY c.sent DESC")
 	, @NamedQuery(name = "getChatMessagesByUser", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NOT NULL AND c.toRoom IS NULL AND "
 			+ "(c.fromUser.id = :userId OR c.toUser.id = :userId) ORDER BY c.sent DESC")
 	, @NamedQuery(name = "getChatMessagesByUserTime", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NOT NULL AND c.toRoom IS NULL AND "
 			+ "(c.fromUser.id = :userId OR c.toUser.id = :userId) AND c.sent > :date ORDER BY c.sent DESC")
+	, @NamedQuery(name = "deleteChatGlobal", query = "DELETE FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom IS NULL")
+	, @NamedQuery(name = "deleteChatRoom", query = "DELETE FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom.id = :roomId")
+	, @NamedQuery(name = "deleteChatUser", query = "DELETE FROM ChatMessage c WHERE c.toRoom IS NULL AND c.toUser.id = :userId")
 })
 @Table(name = "chat")
 @Root(name = "ChatMessage")

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java?rev=1770322&r1=1770321&r2=1770322&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java Fri Nov 18 07:13:48 2016
@@ -259,6 +259,7 @@ public class WebSession extends Abstract
 		return false;
 	}
 
+	@Override
 	public Locale getLocale(User u) {
 		Long langId = u.getLanguageId();
 		Locale locale = langId == 3 ? Locale.GERMANY : LabelDao.languages.get(langId);

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html?rev=1770322&r1=1770321&r2=1770322&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html Fri Nov 18 07:13:48 2016
@@ -9,7 +9,7 @@
   with the License.  You may obtain a copy of the License at
   
       http://www.apache.org/licenses/LICENSE-2.0
-    	  
+  
   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -29,7 +29,10 @@
 			<div id="chatTab-all" class="messageArea"></div>
 		</div>
 		<form wicket:id="sendForm">
-			<div wicket:id="toolbarContainer"></div>
+			<div style="display: inline-block;" wicket:id="toolbarContainer"></div>
+			<div style="display: inline-block; float: right; margin-right: 10px;">
+				<div class="formCancelButton" wicket:id="ajax-cancel-button" wicket:message="title:442"></div>
+			</div>
 			<table style="width: 100%">
 				<tr>
 					<td><div id="chatMessage" wicket:id="chatMessage"></div></td>

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java?rev=1770322&r1=1770321&r2=1770322&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java Fri Nov 18 07:13:48 2016
@@ -30,10 +30,13 @@ import static org.apache.openmeetings.we
 import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
 import static org.apache.openmeetings.web.util.ProfileImageResourceReference.getUrl;
 import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasAdminLevel;
+import static org.apache.openmeetings.web.app.WebSession.getRights;
 
+import java.time.Duration;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 
@@ -43,11 +46,12 @@ import org.apache.openmeetings.db.dao.ro
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.basic.ChatMessage;
 import org.apache.openmeetings.db.entity.room.Room;
+import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.Client;
-import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.BasePanel;
+import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -78,15 +82,15 @@ import com.googlecode.wicket.jquery.ui.p
 
 @AuthorizeInstantiation({"Dashboard", "Room"})
 public class ChatPanel extends BasePanel {
-	private static final Logger log = Red5LoggerFactory.getLogger(ChatPanel.class, webAppRootKey);
 	private static final long serialVersionUID = 1L;
+	private static final Logger log = Red5LoggerFactory.getLogger(ChatPanel.class, webAppRootKey);
 	private static final String ID_TAB_PREFIX = "chatTab-";
 	private static final String ID_USER_PREFIX = ID_TAB_PREFIX + "u";
 	public static final String ID_ROOM_PREFIX = ID_TAB_PREFIX + "r";
 	private static final String ID_ALL = ID_TAB_PREFIX + "all";
 	private static final String PARAM_MSG_ID = "msgid";
 	private static final String PARAM_ROOM_ID = "roomid";
-	private boolean  showDashboardChat = getBean(ConfigurationDao.class).getConfValue(CONFIG_DASHBOARD_SHOW_CHAT, Integer.class, "1") == 1;
+	private boolean showDashboardChat = getBean(ConfigurationDao.class).getConfValue(CONFIG_DASHBOARD_SHOW_CHAT, Integer.class, "1") == 1;
 	private final AbstractDefaultAjaxBehavior acceptMessage = new AbstractDefaultAjaxBehavior() {
 		private static final long serialVersionUID = 1L;
 
@@ -109,7 +113,7 @@ public class ChatPanel extends BasePanel
 			}
 		}
 	};
-	
+
 	private static JSONObject setScope(JSONObject o, ChatMessage m, long curUserId) {
 		String scope, scopeName;
 		if (m.getToUser() != null) {
@@ -126,11 +130,11 @@ public class ChatPanel extends BasePanel
 		}
 		return o.put("scope", scope).put("scopeName", scopeName);
 	}
-	
+
 	public JSONObject getMessage(List<ChatMessage> list) throws JSONException {
 		return getMessage(getUserId(), list);
 	}
-	
+
 	private JSONObject getMessage(long curUserId, List<ChatMessage> list) throws JSONException {
 		JSONArray arr = new JSONArray();
 		for (ChatMessage m : list) {
@@ -171,9 +175,7 @@ public class ChatPanel extends BasePanel
 						Room r = getBean(RoomDao.class).get(roomId);
 						list.addAll(dao.getRoom(roomId, 0, 30, !r.isChatModerated() || isModerator(getUserId(), roomId)));
 					}
-					Calendar c = WebSession.getCalendar();
-					c.add(Calendar.HOUR_OF_DAY, -1);
-					list.addAll(dao.getUserRecent(getUserId(), c.getTime(), 0, 30));
+					list.addAll(dao.getUserRecent(getUserId(), Date.from(Instant.now().minus(Duration.ofHours(1L))), 0, 30));
 					if (list.size() > 0) {
 						StringBuilder sb = new StringBuilder();
 						sb.append("addChatMessage(").append(getMessage(list).toString()).append(");");
@@ -205,7 +207,7 @@ public class ChatPanel extends BasePanel
 		sb.append("});");
 		target.appendJavaScript(sb);
 	}
-	
+
 	@Override
 	public void renderHead(IHeaderResponse response) {
 		super.renderHead(response);
@@ -220,12 +222,12 @@ public class ChatPanel extends BasePanel
 			response.render(OnDomReadyHeaderItem.forScript(sb.toString()));
 		}
 	}
-	
+
 	private static void sendRoom(ChatMessage m, String msg) {
 		IWebSocketConnectionRegistry reg = WebSocketSettings.Holder.get(Application.get()).getConnectionRegistry();
 		for (Client c : getRoomClients(m.getToRoom().getId())) {
 			try {
-				if (!m.isNeedModeration() || (m.isNeedModeration() && c.hasRight(Room.Right.moderator))) {
+				if (!m.isNeedModeration() || (m.isNeedModeration() && c.hasRight(Right.moderator))) {
 					IWebSocketConnection con = reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId()));
 					if (con != null) {
 						con.sendMessage(msg);
@@ -236,7 +238,7 @@ public class ChatPanel extends BasePanel
 			}
 		}
 	}
-	
+
 	private class ChatForm extends Form<Void> {
 		private static final long serialVersionUID = 1L;
 		private final ChatToolbar toolbar = new ChatToolbar("toolbarContainer");
@@ -322,5 +324,49 @@ public class ChatPanel extends BasePanel
 					};
 				});
 		}
+		
+		@Override
+		protected void onInitialize() {
+			super.onInitialize();
+			ConfirmableAjaxBorder delBtn = new ConfirmableAjaxBorder("ajax-cancel-button", getString("80"), getString("832"), this) {
+				private static final long serialVersionUID = 1L;
+
+				@Override
+				protected void onError(AjaxRequestTarget target, Form<?> form) {
+				}
+
+				@Override
+				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+					ChatDao dao = getBean(ChatDao.class);
+					String scope = activeTab.getModelObject();
+					boolean clean = false;
+					try {
+						if (scope == null || ID_ALL.equals(scope)) {
+							scope = ID_ALL;
+							dao.deleteGlobal();
+							clean = true;
+						} else if (scope.startsWith(ID_ROOM_PREFIX)) {
+							Room r = getBean(RoomDao.class).get(Long.parseLong(scope.substring(ID_ROOM_PREFIX.length())));
+							if (r != null) {
+								dao.deleteRoom(r.getId());
+								clean = true;
+							}
+						} else if (scope.startsWith(ID_USER_PREFIX)) {
+							User u = getBean(UserDao.class).get(Long.parseLong(scope.substring(ID_USER_PREFIX.length())));
+							if (u != null) {
+								dao.deleteUser(u.getId());
+								clean = true;
+							}
+						}
+					} catch (Exception e) {
+						//no-op
+					}
+					if (clean) {
+						target.appendJavaScript("$('#" + scope + "').html('')");
+					}
+				}
+			};
+			add(delBtn.setVisible(hasAdminLevel(getRights())));
+		}
 	}
 }

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java?rev=1770322&r1=1770321&r2=1770322&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java Fri Nov 18 07:13:48 2016
@@ -90,4 +90,16 @@ public class ChatDao {
 	public void delete(ChatMessage entity, long userId) {
 		// TODO Auto-generated method stub
 	}
+
+	public void deleteGlobal() {
+		em.createNamedQuery("deleteChatGlobal").executeUpdate();
+	}
+
+	public void deleteRoom(Long roomId) {
+		em.createNamedQuery("deleteChatRoom").setParameter("roomId", roomId).executeUpdate();
+	}
+
+	public void deleteUser(Long userId) {
+		em.createNamedQuery("deleteChatUser").setParameter("userId", userId).executeUpdate();
+	}
 }

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java?rev=1770322&r1=1770321&r2=1770322&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java Fri Nov 18 07:13:48 2016
@@ -44,12 +44,15 @@ import org.simpleframework.xml.Root;
 	@NamedQuery(name = "getChatMessageById", query = "SELECT c FROM ChatMessage c WHERE c.id = :id")
 	, @NamedQuery(name = "getChatMessages", query = "SELECT c FROM ChatMessage c ORDER BY c.id")
 	, @NamedQuery(name = "getGlobalChatMessages", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom IS NULL ORDER BY c.sent DESC")
-	, @NamedQuery(name = "getChatMessagesByRoom", query = "SELECT c FROM ChatMessage c WHERE c.toUser.id IS NULL AND c.toRoom.id = :roomId"
+	, @NamedQuery(name = "getChatMessagesByRoom", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom.id = :roomId"
 			+ " AND (true = :all OR (false = :all AND c.needModeration = false)) ORDER BY c.sent DESC")
 	, @NamedQuery(name = "getChatMessagesByUser", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NOT NULL AND c.toRoom IS NULL AND "
 			+ "(c.fromUser.id = :userId OR c.toUser.id = :userId) ORDER BY c.sent DESC")
 	, @NamedQuery(name = "getChatMessagesByUserTime", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NOT NULL AND c.toRoom IS NULL AND "
 			+ "(c.fromUser.id = :userId OR c.toUser.id = :userId) AND c.sent > :date ORDER BY c.sent DESC")
+	, @NamedQuery(name = "deleteChatGlobal", query = "DELETE FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom IS NULL")
+	, @NamedQuery(name = "deleteChatRoom", query = "DELETE FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom.id = :roomId")
+	, @NamedQuery(name = "deleteChatUser", query = "DELETE FROM ChatMessage c WHERE c.toRoom IS NULL AND c.toUser.id = :userId")
 })
 @Table(name = "chat")
 @Root(name = "ChatMessage")

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java?rev=1770322&r1=1770321&r2=1770322&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java Fri Nov 18 07:13:48 2016
@@ -265,6 +265,7 @@ public class WebSession extends Abstract
 		return false;
 	}
 
+	@Override
 	public Locale getLocale(User u) {
 		Long langId = u.getLanguageId();
 		Locale locale = langId == 3 ? Locale.GERMANY : LabelDao.languages.get(langId);

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html?rev=1770322&r1=1770321&r2=1770322&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html Fri Nov 18 07:13:48 2016
@@ -9,7 +9,7 @@
   with the License.  You may obtain a copy of the License at
   
       http://www.apache.org/licenses/LICENSE-2.0
-    	  
+  
   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -29,7 +29,10 @@
 			<div id="chatTab-all" class="messageArea"></div>
 		</div>
 		<form wicket:id="sendForm">
-			<div wicket:id="toolbarContainer"></div>
+			<div style="display: inline-block;" wicket:id="toolbarContainer"></div>
+			<div style="display: inline-block; float: right; margin-right: 10px;">
+				<div class="formCancelButton" wicket:id="ajax-cancel-button" wicket:message="title:442"></div>
+			</div>
 			<table style="width: 100%">
 				<tr>
 					<td><div id="chatMessage" wicket:id="chatMessage"></div></td>

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java?rev=1770322&r1=1770321&r2=1770322&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java Fri Nov 18 07:13:48 2016
@@ -30,10 +30,13 @@ import static org.apache.openmeetings.we
 import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
 import static org.apache.openmeetings.web.util.ProfileImageResourceReference.getUrl;
 import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasAdminLevel;
+import static org.apache.openmeetings.web.app.WebSession.getRights;
 
+import java.time.Duration;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 
@@ -48,8 +51,8 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.Client;
-import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.BasePanel;
+import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -81,15 +84,15 @@ import com.googlecode.wicket.jquery.ui.p
 
 @AuthorizeInstantiation({"Dashboard", "Room"})
 public class ChatPanel extends BasePanel {
-	private static final Logger log = Red5LoggerFactory.getLogger(ChatPanel.class, webAppRootKey);
 	private static final long serialVersionUID = 1L;
+	private static final Logger log = Red5LoggerFactory.getLogger(ChatPanel.class, webAppRootKey);
 	private static final String ID_TAB_PREFIX = "chatTab-";
 	private static final String ID_USER_PREFIX = ID_TAB_PREFIX + "u";
 	public static final String ID_ROOM_PREFIX = ID_TAB_PREFIX + "r";
 	private static final String ID_ALL = ID_TAB_PREFIX + "all";
 	private static final String PARAM_MSG_ID = "msgid";
 	private static final String PARAM_ROOM_ID = "roomid";
-	private boolean  showDashboardChat = getBean(ConfigurationDao.class).getConfValue(CONFIG_DASHBOARD_SHOW_CHAT, Integer.class, "1") == 1;
+	private boolean showDashboardChat = getBean(ConfigurationDao.class).getConfValue(CONFIG_DASHBOARD_SHOW_CHAT, Integer.class, "1") == 1;
 	private final AbstractDefaultAjaxBehavior acceptMessage = new AbstractDefaultAjaxBehavior() {
 		private static final long serialVersionUID = 1L;
 
@@ -174,9 +177,7 @@ public class ChatPanel extends BasePanel
 						Room r = getBean(RoomDao.class).get(roomId);
 						list.addAll(dao.getRoom(roomId, 0, 30, !r.isChatModerated() || isModerator(getUserId(), roomId)));
 					}
-					Calendar c = WebSession.getCalendar();
-					c.add(Calendar.HOUR_OF_DAY, -1);
-					list.addAll(dao.getUserRecent(getUserId(), c.getTime(), 0, 30));
+					list.addAll(dao.getUserRecent(getUserId(), Date.from(Instant.now().minus(Duration.ofHours(1L))), 0, 30));
 					if (list.size() > 0) {
 						StringBuilder sb = new StringBuilder();
 						sb.append("addChatMessage(").append(getMessage(list).toString()).append(");");
@@ -351,5 +352,49 @@ public class ChatPanel extends BasePanel
 					};
 				});
 		}
+		
+		@Override
+		protected void onInitialize() {
+			super.onInitialize();
+			ConfirmableAjaxBorder delBtn = new ConfirmableAjaxBorder("ajax-cancel-button", getString("80"), getString("832"), this) {
+				private static final long serialVersionUID = 1L;
+
+				@Override
+				protected void onError(AjaxRequestTarget target, Form<?> form) {
+				}
+
+				@Override
+				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+					ChatDao dao = getBean(ChatDao.class);
+					String scope = activeTab.getModelObject();
+					boolean clean = false;
+					try {
+						if (scope == null || ID_ALL.equals(scope)) {
+							scope = ID_ALL;
+							dao.deleteGlobal();
+							clean = true;
+						} else if (scope.startsWith(ID_ROOM_PREFIX)) {
+							Room r = getBean(RoomDao.class).get(Long.parseLong(scope.substring(ID_ROOM_PREFIX.length())));
+							if (r != null) {
+								dao.deleteRoom(r.getId());
+								clean = true;
+							}
+						} else if (scope.startsWith(ID_USER_PREFIX)) {
+							User u = getBean(UserDao.class).get(Long.parseLong(scope.substring(ID_USER_PREFIX.length())));
+							if (u != null) {
+								dao.deleteUser(u.getId());
+								clean = true;
+							}
+						}
+					} catch (Exception e) {
+						//no-op
+					}
+					if (clean) {
+						target.appendJavaScript("$('#" + scope + "').html('')");
+					}
+				}
+			};
+			add(delBtn.setVisible(hasAdminLevel(getRights())));
+		}
 	}
 }

Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java?rev=1770322&r1=1770321&r2=1770322&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java (original)
+++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java Fri Nov 18 07:13:48 2016
@@ -90,4 +90,16 @@ public class ChatDao {
 	public void delete(ChatMessage entity, long userId) {
 		// TODO Auto-generated method stub
 	}
+
+	public void deleteGlobal() {
+		em.createNamedQuery("deleteChatGlobal").executeUpdate();
+	}
+
+	public void deleteRoom(Long roomId) {
+		em.createNamedQuery("deleteChatRoom").setParameter("roomId", roomId).executeUpdate();
+	}
+
+	public void deleteUser(Long userId) {
+		em.createNamedQuery("deleteChatUser").setParameter("userId", userId).executeUpdate();
+	}
 }

Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java?rev=1770322&r1=1770321&r2=1770322&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java (original)
+++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java Fri Nov 18 07:13:48 2016
@@ -44,12 +44,15 @@ import org.simpleframework.xml.Root;
 	@NamedQuery(name = "getChatMessageById", query = "SELECT c FROM ChatMessage c WHERE c.id = :id")
 	, @NamedQuery(name = "getChatMessages", query = "SELECT c FROM ChatMessage c ORDER BY c.id")
 	, @NamedQuery(name = "getGlobalChatMessages", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom IS NULL ORDER BY c.sent DESC")
-	, @NamedQuery(name = "getChatMessagesByRoom", query = "SELECT c FROM ChatMessage c WHERE c.toUser.id IS NULL AND c.toRoom.id = :roomId"
+	, @NamedQuery(name = "getChatMessagesByRoom", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom.id = :roomId"
 			+ " AND (true = :all OR (false = :all AND c.needModeration = false)) ORDER BY c.sent DESC")
 	, @NamedQuery(name = "getChatMessagesByUser", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NOT NULL AND c.toRoom IS NULL AND "
 			+ "(c.fromUser.id = :userId OR c.toUser.id = :userId) ORDER BY c.sent DESC")
 	, @NamedQuery(name = "getChatMessagesByUserTime", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NOT NULL AND c.toRoom IS NULL AND "
 			+ "(c.fromUser.id = :userId OR c.toUser.id = :userId) AND c.sent > :date ORDER BY c.sent DESC")
+	, @NamedQuery(name = "deleteChatGlobal", query = "DELETE FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom IS NULL")
+	, @NamedQuery(name = "deleteChatRoom", query = "DELETE FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom.id = :roomId")
+	, @NamedQuery(name = "deleteChatUser", query = "DELETE FROM ChatMessage c WHERE c.toRoom IS NULL AND c.toUser.id = :userId")
 })
 @Table(name = "chat")
 @Root(name = "ChatMessage")

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java?rev=1770322&r1=1770321&r2=1770322&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java Fri Nov 18 07:13:48 2016
@@ -265,6 +265,7 @@ public class WebSession extends Abstract
 		return false;
 	}
 
+	@Override
 	public Locale getLocale(User u) {
 		Long langId = u.getLanguageId();
 		Locale locale = langId == 3 ? Locale.GERMANY : LabelDao.languages.get(langId);

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html?rev=1770322&r1=1770321&r2=1770322&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html Fri Nov 18 07:13:48 2016
@@ -9,7 +9,7 @@
   with the License.  You may obtain a copy of the License at
   
       http://www.apache.org/licenses/LICENSE-2.0
-    	  
+  
   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -29,7 +29,10 @@
 			<div id="chatTab-all" class="messageArea"></div>
 		</div>
 		<form wicket:id="sendForm">
-			<div wicket:id="toolbarContainer"></div>
+			<div style="display: inline-block;" wicket:id="toolbarContainer"></div>
+			<div style="display: inline-block; float: right; margin-right: 10px;">
+				<div class="formCancelButton" wicket:id="ajax-cancel-button" wicket:message="title:442"></div>
+			</div>
 			<table style="width: 100%">
 				<tr>
 					<td><div id="chatMessage" wicket:id="chatMessage"></div></td>

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java?rev=1770322&r1=1770321&r2=1770322&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java Fri Nov 18 07:13:48 2016
@@ -30,10 +30,13 @@ import static org.apache.openmeetings.we
 import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
 import static org.apache.openmeetings.web.util.ProfileImageResourceReference.getUrl;
 import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasAdminLevel;
+import static org.apache.openmeetings.web.app.WebSession.getRights;
 
+import java.time.Duration;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 
@@ -48,8 +51,8 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.Client;
-import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.BasePanel;
+import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -81,15 +84,15 @@ import com.googlecode.wicket.jquery.ui.p
 
 @AuthorizeInstantiation({"Dashboard", "Room"})
 public class ChatPanel extends BasePanel {
-	private static final Logger log = Red5LoggerFactory.getLogger(ChatPanel.class, webAppRootKey);
 	private static final long serialVersionUID = 1L;
+	private static final Logger log = Red5LoggerFactory.getLogger(ChatPanel.class, webAppRootKey);
 	private static final String ID_TAB_PREFIX = "chatTab-";
 	private static final String ID_USER_PREFIX = ID_TAB_PREFIX + "u";
 	public static final String ID_ROOM_PREFIX = ID_TAB_PREFIX + "r";
 	private static final String ID_ALL = ID_TAB_PREFIX + "all";
 	private static final String PARAM_MSG_ID = "msgid";
 	private static final String PARAM_ROOM_ID = "roomid";
-	private boolean  showDashboardChat = getBean(ConfigurationDao.class).getConfValue(CONFIG_DASHBOARD_SHOW_CHAT, Integer.class, "1") == 1;
+	private boolean showDashboardChat = getBean(ConfigurationDao.class).getConfValue(CONFIG_DASHBOARD_SHOW_CHAT, Integer.class, "1") == 1;
 	private final AbstractDefaultAjaxBehavior acceptMessage = new AbstractDefaultAjaxBehavior() {
 		private static final long serialVersionUID = 1L;
 
@@ -174,9 +177,7 @@ public class ChatPanel extends BasePanel
 						Room r = getBean(RoomDao.class).get(roomId);
 						list.addAll(dao.getRoom(roomId, 0, 30, !r.isChatModerated() || isModerator(getUserId(), roomId)));
 					}
-					Calendar c = WebSession.getCalendar();
-					c.add(Calendar.HOUR_OF_DAY, -1);
-					list.addAll(dao.getUserRecent(getUserId(), c.getTime(), 0, 30));
+					list.addAll(dao.getUserRecent(getUserId(), Date.from(Instant.now().minus(Duration.ofHours(1L))), 0, 30));
 					if (list.size() > 0) {
 						StringBuilder sb = new StringBuilder();
 						sb.append("addChatMessage(").append(getMessage(list).toString()).append(");");
@@ -351,5 +352,49 @@ public class ChatPanel extends BasePanel
 					};
 				});
 		}
+		
+		@Override
+		protected void onInitialize() {
+			super.onInitialize();
+			ConfirmableAjaxBorder delBtn = new ConfirmableAjaxBorder("ajax-cancel-button", getString("80"), getString("832"), this) {
+				private static final long serialVersionUID = 1L;
+
+				@Override
+				protected void onError(AjaxRequestTarget target, Form<?> form) {
+				}
+
+				@Override
+				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+					ChatDao dao = getBean(ChatDao.class);
+					String scope = activeTab.getModelObject();
+					boolean clean = false;
+					try {
+						if (scope == null || ID_ALL.equals(scope)) {
+							scope = ID_ALL;
+							dao.deleteGlobal();
+							clean = true;
+						} else if (scope.startsWith(ID_ROOM_PREFIX)) {
+							Room r = getBean(RoomDao.class).get(Long.parseLong(scope.substring(ID_ROOM_PREFIX.length())));
+							if (r != null) {
+								dao.deleteRoom(r.getId());
+								clean = true;
+							}
+						} else if (scope.startsWith(ID_USER_PREFIX)) {
+							User u = getBean(UserDao.class).get(Long.parseLong(scope.substring(ID_USER_PREFIX.length())));
+							if (u != null) {
+								dao.deleteUser(u.getId());
+								clean = true;
+							}
+						}
+					} catch (Exception e) {
+						//no-op
+					}
+					if (clean) {
+						target.appendJavaScript("$('#" + scope + "').html('')");
+					}
+				}
+			};
+			add(delBtn.setVisible(hasAdminLevel(getRights())));
+		}
 	}
 }