Commit 597e98e9 authored by Armando Jagucki's avatar Armando Jagucki Committed by ajagucki

[CS-4030] Added support to track room Subject changes for Clearspace group...

[CS-4030] Added support to track room Subject changes for Clearspace group chat transcripts. Reviewer: David Smith

git-svn-id: http://svn.igniterealtime.org/svn/repos/openfire/trunk@10210 b35dd754-fafc-0310-a699-88a17e54d16e
parent 73e3749f
package org.jivesoftware.openfire.clearspace;
import org.xmpp.packet.JID;
import org.jivesoftware.util.cache.ExternalizableUtil;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectOutput;
import java.io.ObjectInput;
/**
* A MUC event that is intended to be recorded in a transcript for a group chat room in Clearspace.
*
* @author Armando Jagucki
*/
public class ClearspaceMUCTranscriptEvent implements Externalizable {
public class ClearspaceMUCTranscriptEvent {
public Type type;
public long timestamp;
public String body;
public String content;
public JID roomJID;
public JID user;
......@@ -47,50 +41,26 @@ public class ClearspaceMUCTranscriptEvent implements Externalizable {
return event;
}
public static ClearspaceMUCTranscriptEvent roomMessageReceived(JID roomJID, JID user, String body,
public static ClearspaceMUCTranscriptEvent messageReceived(JID roomJID, JID user, String body,
long timestamp) {
ClearspaceMUCTranscriptEvent event = new ClearspaceMUCTranscriptEvent();
event.type = Type.roomMessageReceived;
event.type = Type.messageReceived;
event.roomJID = roomJID;
event.user = user;
event.body = body;
event.content = body;
event.timestamp = timestamp;
return event;
}
public void writeExternal(ObjectOutput out) throws IOException {
ExternalizableUtil.getInstance().writeInt(out, type.ordinal());
ExternalizableUtil.getInstance().writeLong(out, timestamp);
ExternalizableUtil.getInstance().writeBoolean(out, body != null);
if (body != null) {
ExternalizableUtil.getInstance().writeSafeUTF(out, body);
}
ExternalizableUtil.getInstance().writeBoolean(out, roomJID != null);
if (roomJID != null) {
ExternalizableUtil.getInstance().writeSerializable(out, roomJID);
}
ExternalizableUtil.getInstance().writeBoolean(out, user != null);
if (user != null) {
ExternalizableUtil.getInstance().writeSerializable(out, user);
}
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
type = Type.values()[ExternalizableUtil.getInstance().readInt(in)];
timestamp = ExternalizableUtil.getInstance().readLong(in);
if (ExternalizableUtil.getInstance().readBoolean(in)) {
body = ExternalizableUtil.getInstance().readSafeUTF(in);
}
if (ExternalizableUtil.getInstance().readBoolean(in)) {
roomJID = (JID) ExternalizableUtil.getInstance().readSerializable(in);
}
if (ExternalizableUtil.getInstance().readBoolean(in)) {
user = (JID) ExternalizableUtil.getInstance().readSerializable(in);
}
public static ClearspaceMUCTranscriptEvent roomSubjectChanged(JID roomJID, JID user, String newSubject,
long timestamp) {
ClearspaceMUCTranscriptEvent event = new ClearspaceMUCTranscriptEvent();
event.type = Type.roomSubjectChanged;
event.roomJID = roomJID;
event.user = user;
event.content = newSubject;
event.timestamp = timestamp;
return event;
}
public static enum Type {
......@@ -109,6 +79,10 @@ public class ClearspaceMUCTranscriptEvent implements Externalizable {
/**
* Event triggered when a room occupant sent a message to a room.
*/
roomMessageReceived
messageReceived,
/**
* Event triggered when a room's subject has changed.
*/
roomSubjectChanged
}
}
......@@ -113,9 +113,9 @@ public class ClearspaceMUCTranscriptManager implements MUCEventListener {
Element mucEventElement = null;
switch (event.type) {
case roomMessageReceived:
case messageReceived:
mucEventElement = transcriptElement.addElement("message");
mucEventElement.addElement("body").setText(event.body);
mucEventElement.addElement("body").setText(event.content);
break;
case occupantJoined:
mucEventElement = transcriptElement.addElement("presence");
......@@ -124,12 +124,20 @@ public class ClearspaceMUCTranscriptManager implements MUCEventListener {
mucEventElement = transcriptElement.addElement("presence");
mucEventElement.addAttribute("type", "unavailable");
break;
case roomSubjectChanged:
mucEventElement = transcriptElement.addElement("subject-change");
mucEventElement.addElement("subject").setText(event.content);
break;
}
// Now add those event fields that are common to all elements in the transcript-update packet.
if (mucEventElement != null) {
mucEventElement.addAttribute("from", event.user.toBareJID());
mucEventElement.addElement("roomjid").setText(event.roomJID.toBareJID());
if (event.user != null) {
mucEventElement.addAttribute("from", event.user.toBareJID());
}
if (event.roomJID != null) {
mucEventElement.addElement("roomjid").setText(event.roomJID.toBareJID());
}
mucEventElement.addElement("timestamp").setText(Long.toString(event.timestamp));
}
}
......@@ -178,8 +186,13 @@ public class ClearspaceMUCTranscriptManager implements MUCEventListener {
}
public void messageReceived(JID roomJID, JID user, String nickname, Message message) {
addGroupChatEvent(ClearspaceMUCTranscriptEvent.roomMessageReceived(roomJID, user, message.getBody(),
new Date().getTime()));
addGroupChatEvent(ClearspaceMUCTranscriptEvent.messageReceived(roomJID, user, message.getBody(),
new Date().getTime()));
}
public void roomSubjectChanged(JID roomJID, JID user, String newSubject) {
addGroupChatEvent(ClearspaceMUCTranscriptEvent.roomSubjectChanged(roomJID, user, newSubject,
new Date().getTime()));
}
/**
......
......@@ -80,4 +80,10 @@ public class MUCEventDispatcher {
}
}
public static void roomSubjectChanged(JID roomJID, JID user, String newSubject) {
for (MUCEventListener listener : listeners) {
listener.roomSubjectChanged(roomJID, user, newSubject);
}
}
}
......@@ -73,4 +73,13 @@ public interface MUCEventListener {
* @param message the message sent by the room occupant.
*/
void messageReceived(JID roomJID, JID user, String nickname, Message message);
/**
* Event triggered when the subject of a room is changed.
*
* @param roomJID the JID of the room that had its subject changed.
* @param user the JID of the user that changed the subject.
* @param newSubject new room subject.
*/
void roomSubjectChanged(JID roomJID, JID user, String newSubject);
}
......@@ -1608,6 +1608,9 @@ public class LocalMUCRoom implements MUCRoom {
// Notify all the occupants that the subject has changed
packet.setFrom(role.getRoleAddress());
send(packet);
// Fire event signifying that the room's subject has changed.
MUCEventDispatcher.roomSubjectChanged(getJID(), role.getUserAddress(), subject);
}
else {
throw new ForbiddenException();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment