Author: solomax
Date: Mon Jan 21 17:17:53 2013
New Revision: 1436494
URL: http://svn.apache.org/viewvc?rev=1436494&view=rev
Log:
Wicket: basic websocket-based chat messages are added
Added:
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/chat/
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/chat/ChatDao.java
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/chat/
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/chat/ChatMessage.java
Modified:
incubator/openmeetings/trunk/singlewebapp/WebContent/WEB-INF/openmeetings-applicationContext.xml
incubator/openmeetings/trunk/singlewebapp/src/META-INF/db2_persistence.xml
incubator/openmeetings/trunk/singlewebapp/src/META-INF/derby_persistence.xml
incubator/openmeetings/trunk/singlewebapp/src/META-INF/mysql_persistence.xml
incubator/openmeetings/trunk/singlewebapp/src/META-INF/oracle_persistence.xml
incubator/openmeetings/trunk/singlewebapp/src/META-INF/postgres_persistence.xml
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/ChatPanel.html
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/ChatPanel.java
Modified:
incubator/openmeetings/trunk/singlewebapp/WebContent/WEB-INF/openmeetings-applicationContext.xml
URL:
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/WebContent/WEB-INF/openmeetings-applicationContext.xml?rev=1436494&r1=1436493&r2=1436494&view=diff
==============================================================================
---
incubator/openmeetings/trunk/singlewebapp/WebContent/WEB-INF/openmeetings-applicationContext.xml
(original)
+++
incubator/openmeetings/trunk/singlewebapp/WebContent/WEB-INF/openmeetings-applicationContext.xml
Mon Jan 21 17:17:53 2013
@@ -238,6 +238,7 @@
<bean id="userContactsDao"
class="org.apache.openmeetings.data.user.dao.UserContactsDao" />
<bean id="usersDao"
class="org.apache.openmeetings.data.user.dao.UsersDao" />
<bean id="serverDao"
class="org.apache.openmeetings.data.basic.dao.ServerDao" />
+ <bean id="chatDao" class="org.apache.openmeetings.data.chat.ChatDao" />
<!-- No Interface -->
<bean id="manageCryptStyle"
class="org.apache.openmeetings.utils.crypt.ManageCryptStyle" />
Modified:
incubator/openmeetings/trunk/singlewebapp/src/META-INF/db2_persistence.xml
URL:
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/META-INF/db2_persistence.xml?rev=1436494&r1=1436493&r2=1436494&view=diff
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/src/META-INF/db2_persistence.xml
(original)
+++ incubator/openmeetings/trunk/singlewebapp/src/META-INF/db2_persistence.xml
Mon Jan 21 17:17:53 2013
@@ -38,6 +38,7 @@
<class>org.apache.openmeetings.persistence.beans.calendar.AppointmentCategory</class>
<class>org.apache.openmeetings.persistence.beans.calendar.AppointmentReminderTyps</class>
<class>org.apache.openmeetings.persistence.beans.calendar.MeetingMember</class>
+
<class>org.apache.openmeetings.persistence.beans.chat.ChatMessage</class>
<class>org.apache.openmeetings.persistence.beans.domain.Organisation</class>
<class>org.apache.openmeetings.persistence.beans.domain.Organisation_Users</class>
<class>org.apache.openmeetings.persistence.beans.flvrecord.FlvRecording</class>
Modified:
incubator/openmeetings/trunk/singlewebapp/src/META-INF/derby_persistence.xml
URL:
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/META-INF/derby_persistence.xml?rev=1436494&r1=1436493&r2=1436494&view=diff
==============================================================================
---
incubator/openmeetings/trunk/singlewebapp/src/META-INF/derby_persistence.xml
(original)
+++
incubator/openmeetings/trunk/singlewebapp/src/META-INF/derby_persistence.xml
Mon Jan 21 17:17:53 2013
@@ -38,6 +38,7 @@
<class>org.apache.openmeetings.persistence.beans.calendar.AppointmentCategory</class>
<class>org.apache.openmeetings.persistence.beans.calendar.AppointmentReminderTyps</class>
<class>org.apache.openmeetings.persistence.beans.calendar.MeetingMember</class>
+
<class>org.apache.openmeetings.persistence.beans.chat.ChatMessage</class>
<class>org.apache.openmeetings.persistence.beans.domain.Organisation</class>
<class>org.apache.openmeetings.persistence.beans.domain.Organisation_Users</class>
<class>org.apache.openmeetings.persistence.beans.flvrecord.FlvRecording</class>
Modified:
incubator/openmeetings/trunk/singlewebapp/src/META-INF/mysql_persistence.xml
URL:
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/META-INF/mysql_persistence.xml?rev=1436494&r1=1436493&r2=1436494&view=diff
==============================================================================
---
incubator/openmeetings/trunk/singlewebapp/src/META-INF/mysql_persistence.xml
(original)
+++
incubator/openmeetings/trunk/singlewebapp/src/META-INF/mysql_persistence.xml
Mon Jan 21 17:17:53 2013
@@ -38,6 +38,7 @@
<class>org.apache.openmeetings.persistence.beans.calendar.AppointmentCategory</class>
<class>org.apache.openmeetings.persistence.beans.calendar.AppointmentReminderTyps</class>
<class>org.apache.openmeetings.persistence.beans.calendar.MeetingMember</class>
+
<class>org.apache.openmeetings.persistence.beans.chat.ChatMessage</class>
<class>org.apache.openmeetings.persistence.beans.domain.Organisation</class>
<class>org.apache.openmeetings.persistence.beans.domain.Organisation_Users</class>
<class>org.apache.openmeetings.persistence.beans.flvrecord.FlvRecording</class>
Modified:
incubator/openmeetings/trunk/singlewebapp/src/META-INF/oracle_persistence.xml
URL:
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/META-INF/oracle_persistence.xml?rev=1436494&r1=1436493&r2=1436494&view=diff
==============================================================================
---
incubator/openmeetings/trunk/singlewebapp/src/META-INF/oracle_persistence.xml
(original)
+++
incubator/openmeetings/trunk/singlewebapp/src/META-INF/oracle_persistence.xml
Mon Jan 21 17:17:53 2013
@@ -38,6 +38,7 @@
<class>org.apache.openmeetings.persistence.beans.calendar.AppointmentCategory</class>
<class>org.apache.openmeetings.persistence.beans.calendar.AppointmentReminderTyps</class>
<class>org.apache.openmeetings.persistence.beans.calendar.MeetingMember</class>
+
<class>org.apache.openmeetings.persistence.beans.chat.ChatMessage</class>
<class>org.apache.openmeetings.persistence.beans.domain.Organisation</class>
<class>org.apache.openmeetings.persistence.beans.domain.Organisation_Users</class>
<class>org.apache.openmeetings.persistence.beans.flvrecord.FlvRecording</class>
Modified:
incubator/openmeetings/trunk/singlewebapp/src/META-INF/postgres_persistence.xml
URL:
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/META-INF/postgres_persistence.xml?rev=1436494&r1=1436493&r2=1436494&view=diff
==============================================================================
---
incubator/openmeetings/trunk/singlewebapp/src/META-INF/postgres_persistence.xml
(original)
+++
incubator/openmeetings/trunk/singlewebapp/src/META-INF/postgres_persistence.xml
Mon Jan 21 17:17:53 2013
@@ -38,6 +38,7 @@
<class>org.apache.openmeetings.persistence.beans.calendar.AppointmentCategory</class>
<class>org.apache.openmeetings.persistence.beans.calendar.AppointmentReminderTyps</class>
<class>org.apache.openmeetings.persistence.beans.calendar.MeetingMember</class>
+
<class>org.apache.openmeetings.persistence.beans.chat.ChatMessage</class>
<class>org.apache.openmeetings.persistence.beans.domain.Organisation</class>
<class>org.apache.openmeetings.persistence.beans.domain.Organisation_Users</class>
<class>org.apache.openmeetings.persistence.beans.flvrecord.FlvRecording</class>
Added:
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/chat/ChatDao.java
URL:
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/chat/ChatDao.java?rev=1436494&view=auto
==============================================================================
---
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/chat/ChatDao.java
(added)
+++
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/chat/ChatDao.java
Mon Jan 21 17:17:53 2013
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") + you may not use this file except in compliance
+ * 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
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.data.chat;
+
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import org.apache.openmeetings.persistence.beans.chat.ChatMessage;
+import org.springframework.transaction.annotation.Transactional;
+
+@Transactional
+public class ChatDao {
+ @PersistenceContext
+ private EntityManager em;
+
+ public ChatMessage get(long id) {
+ return em.createNamedQuery("getChatMessageById",
ChatMessage.class)
+ .setParameter("id", id)
+ .getSingleResult();
+ }
+
+ //TODO additional methods should be added to get messages by external
email
+ public List<ChatMessage> get(long userId, int start, int count) {
+ return em.createNamedQuery("getChatMessagesByUser",
ChatMessage.class)
+ .setParameter("userId", userId)
+ .setFirstResult(start)
+ .setMaxResults(count)
+ .getResultList();
+ }
+
+ public List<ChatMessage> get(int start, int count) {
+ return em.createNamedQuery("getGlobalChatMessages",
ChatMessage.class)
+ .setFirstResult(start)
+ .setMaxResults(count)
+ .getResultList();
+ }
+
+ public ChatMessage update(ChatMessage entity) {
+ entity.setSent(new Date());
+ if (entity.getId() == 0) {
+ em.persist(entity);
+ }
+ return entity;
+ }
+
+ public void delete(ChatMessage entity, long userId) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
Added:
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/chat/ChatMessage.java
URL:
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/chat/ChatMessage.java?rev=1436494&view=auto
==============================================================================
---
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/chat/ChatMessage.java
(added)
+++
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/chat/ChatMessage.java
Mon Jan 21 17:17:53 2013
@@ -0,0 +1,177 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") + you may not use this file except in compliance
+ * 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
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.persistence.beans.chat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+
+import org.apache.openmeetings.persistence.beans.IDataProviderEntity;
+import org.apache.openmeetings.persistence.beans.rooms.Rooms;
+import org.apache.openmeetings.persistence.beans.user.Users;
+import org.simpleframework.xml.Element;
+import org.simpleframework.xml.Root;
+
+@Entity
+@NamedQueries({
+ @NamedQuery(name = "getChatMessageById", query = "SELECT c FROM
ChatMessage c WHERE c.id = :id")
+ , @NamedQuery(name = "getChatMessagesByUser", query = "SELECT DISTINCT
c FROM ChatMessage c WHERE c.fromUser.user_id = :userId OR c.toUser.user_id =
:userId ORDER BY c.sent DESC")
+ , @NamedQuery(name = "getGlobalChatMessages", query = "SELECT DISTINCT
c FROM ChatMessage c WHERE c.toUser IS NULL ORDER BY c.sent DESC")
+})@Table(name = "chat")
+@Root(name = "ChatMessage")
+public class ChatMessage implements Serializable, IDataProviderEntity {
+ private static final long serialVersionUID = 4248081997318897605L;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "id")
+ @Element(name = "id", data = true)
+ private long id;
+
+ @ManyToOne
+ @JoinColumn(name = "from_user_id")
+ @Element(name = "fromUserId", data = true, required = false)
+ private Users fromUser;
+
+ // necessary to hold messages from external guests enters by invitation
hash
+ @Column(name = "from_email")
+ @Element(name = "fromEmail", data = true, required = false)
+ private String fromEmail;
+
+ @Column(name = "from_name")
+ @Element(name = "fromName", data = true, required = false)
+ private String fromName;
+
+ @ManyToOne
+ @JoinColumn(name = "to_room_id")
+ @Element(name = "toRoomId", data = true, required = false)
+ private Rooms toRoom;
+
+ @ManyToOne
+ @JoinColumn(name = "to_user_id")
+ @Element(name = "toUserId", data = true, required = false)
+ private Users toUser;
+
+ // necessary to hold messages to external guests enters by invitation
hash
+ @Column(name = "to_email")
+ @Element(name = "toEmail", data = true, required = false)
+ private String toEmail;
+
+ @Column(name = "to_name")
+ @Element(name = "toName", data = true, required = false)
+ private String toName;
+
+ @Column(name = "message")
+ @Element(name = "message", data = true, required = false)
+ private String message;
+
+ @Column(name = "sent")
+ @Element(name = "sent", data = true, required = false)
+ private Date sent;
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public Users getFromUser() {
+ return fromUser;
+ }
+
+ public void setFromUser(Users fromUser) {
+ this.fromUser = fromUser;
+ }
+
+ public String getFromEmail() {
+ return fromEmail;
+ }
+
+ public void setFromEmail(String fromEmail) {
+ this.fromEmail = fromEmail;
+ }
+
+ public String getFromName() {
+ return fromName;
+ }
+
+ public void setFromName(String fromName) {
+ this.fromName = fromName;
+ }
+
+ public Rooms getToRoom() {
+ return toRoom;
+ }
+
+ public void setToRoom(Rooms toRoom) {
+ this.toRoom = toRoom;
+ }
+
+ public Users getToUser() {
+ return toUser;
+ }
+
+ public void setToUser(Users toUser) {
+ this.toUser = toUser;
+ }
+
+ public String getToEmail() {
+ return toEmail;
+ }
+
+ public void setToEmail(String toEmail) {
+ this.toEmail = toEmail;
+ }
+
+ public String getToName() {
+ return toName;
+ }
+
+ public void setToName(String toName) {
+ this.toName = toName;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public Date getSent() {
+ return sent;
+ }
+
+ public void setSent(Date sent) {
+ this.sent = sent;
+ }
+}
Modified:
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/ChatPanel.html
URL:
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/ChatPanel.html?rev=1436494&r1=1436493&r2=1436494&view=diff
==============================================================================
---
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/ChatPanel.html
(original)
+++
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/ChatPanel.html
Mon Jan 21 17:17:53 2013
@@ -28,8 +28,13 @@
.addClass('ui-icon-carat-1-' +
(chat.height() < 20 ? 's' : 'n'));
chat.animate({ height: chat.height() < 20 ?
"300px" : "16px" }, 1000);
}
- Wicket.Event.subscribe("/websocket/message",
function(jqEvent, message) {
- $('#messageArea').append('<div>' + message +
'</div>');
+ function addChatMessage(m) {
+ if (m && m.type == "chat") {
+ $('#messageArea').append('<div>' +
m.msg.message + '</div>');
+ }
+ }
+ Wicket.Event.subscribe("/websocket/message",
function(jqEvent, msg) {
+ addChatMessage(jQuery.parseJSON(msg));
});
</script>
</wicket:head>
Modified:
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/ChatPanel.java
URL:
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/ChatPanel.java?rev=1436494&r1=1436493&r2=1436494&view=diff
==============================================================================
---
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/ChatPanel.java
(original)
+++
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/ChatPanel.java
Mon Jan 21 17:17:53 2013
@@ -18,10 +18,23 @@
*/
package org.apache.openmeetings.web.components.user;
+import java.util.Date;
+
import org.apache.openmeetings.OpenmeetingsVariables;
+import org.apache.openmeetings.data.chat.ChatDao;
+import org.apache.openmeetings.data.user.dao.UsersDao;
+import org.apache.openmeetings.persistence.beans.chat.ChatMessage;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.app.WebSession;
import org.apache.openmeetings.web.components.UserPanel;
+import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior;
+import org.apache.wicket.ajax.json.JSONException;
+import org.apache.wicket.ajax.json.JSONObject;
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
@@ -38,11 +51,40 @@ public class ChatPanel extends UserPanel
private static final long serialVersionUID = -9144707674886211557L;
private String message;
+ private JSONObject getMessage(ChatMessage m) throws JSONException {
+ return new JSONObject()
+ .put("type", "chat")
+ .put("msg", new JSONObject()
+ .put("id", m.getId())
+ .put("message", m.getMessage())
+ );
+ }
+
public ChatPanel(String id) {
super(id);
setOutputMarkupId(true);
setMarkupId(id);
-
+
+ add(new Behavior() {
+ private static final long serialVersionUID =
-2205036360048419129L;
+
+ @Override
+ public void renderHead(Component component,
IHeaderResponse response) {
+ ChatDao dao =
Application.getBean(ChatDao.class);
+ try {
+ StringBuilder sb = new StringBuilder();
+ for (ChatMessage m : dao.get(0,
Integer.MAX_VALUE)) {
+
sb.append("addChatMessage(").append(getMessage(m).toString()).append(");");
+ }
+ if (sb.length() > 0) {
+
response.render(OnDomReadyHeaderItem.forScript(sb.toString()));
+ }
+ } catch (JSONException e) {
+
+ }
+ super.renderHead(component, response);
+ }
+ });
add(new
WebMarkupContainer("messages").setMarkupId("messageArea"));
final Form<Void> f = new Form<Void>("sendForm");
f.add(new TextArea<String>("message", new
PropertyModel<String>(ChatPanel.this, "message")).setOutputMarkupId(true));
@@ -50,11 +92,16 @@ public class ChatPanel extends UserPanel
private static final long serialVersionUID =
-3746739738826501331L;
protected void onSubmit(AjaxRequestTarget target) {
- //Application.getBean(ChatService)
sendMessageToOverallChat
+ ChatDao dao =
Application.getBean(ChatDao.class);
+ ChatMessage m = new ChatMessage();
+ m.setMessage(message);
+ m.setSent(new Date());
+
m.setFromUser(Application.getBean(UsersDao.class).get(WebSession.getUserId()));
+ dao.update(m);
IWebSocketConnectionRegistry reg =
IWebSocketSettings.Holder.get(getApplication()).getConnectionRegistry();
for (IWebSocketConnection c :
reg.getConnections(getApplication())) {
try {
- c.sendMessage(message);
+
c.sendMessage(getMessage(m).toString());
} catch(Exception e) {
log.error("Error while sending
message", e);
}