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; package org.jivesoftware.openfire.clearspace;
import org.xmpp.packet.JID; 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. * A MUC event that is intended to be recorded in a transcript for a group chat room in Clearspace.
* *
* @author Armando Jagucki * @author Armando Jagucki
*/ */
public class ClearspaceMUCTranscriptEvent implements Externalizable { public class ClearspaceMUCTranscriptEvent {
public Type type; public Type type;
public long timestamp; public long timestamp;
public String body; public String content;
public JID roomJID; public JID roomJID;
public JID user; public JID user;
...@@ -47,50 +41,26 @@ public class ClearspaceMUCTranscriptEvent implements Externalizable { ...@@ -47,50 +41,26 @@ public class ClearspaceMUCTranscriptEvent implements Externalizable {
return event; return event;
} }
public static ClearspaceMUCTranscriptEvent roomMessageReceived(JID roomJID, JID user, String body, public static ClearspaceMUCTranscriptEvent messageReceived(JID roomJID, JID user, String body,
long timestamp) { long timestamp) {
ClearspaceMUCTranscriptEvent event = new ClearspaceMUCTranscriptEvent(); ClearspaceMUCTranscriptEvent event = new ClearspaceMUCTranscriptEvent();
event.type = Type.roomMessageReceived; event.type = Type.messageReceived;
event.roomJID = roomJID; event.roomJID = roomJID;
event.user = user; event.user = user;
event.body = body; event.content = body;
event.timestamp = timestamp; event.timestamp = timestamp;
return event; return event;
} }
public void writeExternal(ObjectOutput out) throws IOException { public static ClearspaceMUCTranscriptEvent roomSubjectChanged(JID roomJID, JID user, String newSubject,
ExternalizableUtil.getInstance().writeInt(out, type.ordinal()); long timestamp) {
ExternalizableUtil.getInstance().writeLong(out, timestamp); ClearspaceMUCTranscriptEvent event = new ClearspaceMUCTranscriptEvent();
event.type = Type.roomSubjectChanged;
ExternalizableUtil.getInstance().writeBoolean(out, body != null); event.roomJID = roomJID;
if (body != null) { event.user = user;
ExternalizableUtil.getInstance().writeSafeUTF(out, body); event.content = newSubject;
} event.timestamp = timestamp;
return event;
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 enum Type { public static enum Type {
...@@ -109,6 +79,10 @@ public class ClearspaceMUCTranscriptEvent implements Externalizable { ...@@ -109,6 +79,10 @@ public class ClearspaceMUCTranscriptEvent implements Externalizable {
/** /**
* Event triggered when a room occupant sent a message to a room. * 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 { ...@@ -113,9 +113,9 @@ public class ClearspaceMUCTranscriptManager implements MUCEventListener {
Element mucEventElement = null; Element mucEventElement = null;
switch (event.type) { switch (event.type) {
case roomMessageReceived: case messageReceived:
mucEventElement = transcriptElement.addElement("message"); mucEventElement = transcriptElement.addElement("message");
mucEventElement.addElement("body").setText(event.body); mucEventElement.addElement("body").setText(event.content);
break; break;
case occupantJoined: case occupantJoined:
mucEventElement = transcriptElement.addElement("presence"); mucEventElement = transcriptElement.addElement("presence");
...@@ -124,12 +124,20 @@ public class ClearspaceMUCTranscriptManager implements MUCEventListener { ...@@ -124,12 +124,20 @@ public class ClearspaceMUCTranscriptManager implements MUCEventListener {
mucEventElement = transcriptElement.addElement("presence"); mucEventElement = transcriptElement.addElement("presence");
mucEventElement.addAttribute("type", "unavailable"); mucEventElement.addAttribute("type", "unavailable");
break; 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. // Now add those event fields that are common to all elements in the transcript-update packet.
if (mucEventElement != null) { if (mucEventElement != null) {
mucEventElement.addAttribute("from", event.user.toBareJID()); if (event.user != null) {
mucEventElement.addElement("roomjid").setText(event.roomJID.toBareJID()); 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)); mucEventElement.addElement("timestamp").setText(Long.toString(event.timestamp));
} }
} }
...@@ -178,8 +186,13 @@ public class ClearspaceMUCTranscriptManager implements MUCEventListener { ...@@ -178,8 +186,13 @@ public class ClearspaceMUCTranscriptManager implements MUCEventListener {
} }
public void messageReceived(JID roomJID, JID user, String nickname, Message message) { public void messageReceived(JID roomJID, JID user, String nickname, Message message) {
addGroupChatEvent(ClearspaceMUCTranscriptEvent.roomMessageReceived(roomJID, user, message.getBody(), addGroupChatEvent(ClearspaceMUCTranscriptEvent.messageReceived(roomJID, user, message.getBody(),
new Date().getTime())); 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 { ...@@ -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 { ...@@ -73,4 +73,13 @@ public interface MUCEventListener {
* @param message the message sent by the room occupant. * @param message the message sent by the room occupant.
*/ */
void messageReceived(JID roomJID, JID user, String nickname, Message message); 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 { ...@@ -1608,6 +1608,9 @@ public class LocalMUCRoom implements MUCRoom {
// Notify all the occupants that the subject has changed // Notify all the occupants that the subject has changed
packet.setFrom(role.getRoleAddress()); packet.setFrom(role.getRoleAddress());
send(packet); send(packet);
// Fire event signifying that the room's subject has changed.
MUCEventDispatcher.roomSubjectChanged(getJID(), role.getUserAddress(), subject);
} }
else { else {
throw new ForbiddenException(); 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