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