package com.reucon.openfire.plugin.archive.model;
import org.jivesoftware.database.JiveID;
import java.util.*;
/**
* A conversation between two or more participants.
*/
@JiveID(602)
public class Conversation
{
private Long id;
private final Date start;
private Date end;
private final String ownerJid;
private final String ownerResource;
private final String withJid;
private final String withResource;
private String subject;
private final String thread;
private final List<Participant> participants;
private final List<ArchivedMessage> messages;
public Conversation(Date start, String ownerJid, String ownerResource, String withJid, String withResource,
String subject, String thread)
{
this(start, start, ownerJid, ownerResource, withJid, withResource, subject, thread);
}
public Conversation(Date start, Date end, String ownerJid, String ownerResource, String withJid, String withResource,
String subject, String thread)
{
this.start = start;
this.end = end;
this.ownerJid = ownerJid;
this.ownerResource = ownerResource;
this.withJid = withJid;
this.withResource = withResource;
this.subject = subject;
this.thread = thread;
participants = new ArrayList<Participant>();
messages = new ArrayList<ArchivedMessage>();
}
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
public Date getStart()
{
return start;
}
public Date getEnd()
{
return end;
}
public void setEnd(Date end)
{
this.end = end;
}
public String getOwnerJid()
{
return ownerJid;
}
public String getOwnerResource()
{
return ownerResource;
}
public String getWithJid()
{
return withJid;
}
public String getWithResource()
{
return withResource;
}
public String getSubject()
{
return subject;
}
public void setSubject(String subject)
{
this.subject = subject;
}
public String getThread()
{
return thread;
}
public Collection<Participant> getParticipants()
{
return Collections.unmodifiableCollection(participants);
}
public void addParticipant(Participant participant)
{
synchronized (participants)
{
participants.add(participant);
}
}
public List<ArchivedMessage> getMessages()
{
return Collections.unmodifiableList(messages);
}
public void addMessage(ArchivedMessage message)
{
synchronized (messages)
{
messages.add(message);
}
}
public boolean isStale(int conversationTimeout)
{
Long now = System.currentTimeMillis();
return end.getTime() + conversationTimeout * 60L * 1000L < now;
}
/**
* Checks if this conversation has an active participant with the given JID.
*
* @param jid JID of the participant
* @return <code>true</code> if this conversation has an active participant with the given JID,
* <code>false</code> otherwise.
*/
public boolean hasParticipant(String jid)
{
synchronized (participants)
{
for (Participant p : participants)
{
if (p.getJid().equals(jid))
{
return true;
}
}
}
return false;
}
/**
* Checks if this conversation is new and has not yet been persisted.
*
* @return <code>true</code> if this conversation is new and has not yet been persisted,
* <code>false</code> otherwise.
*/
public boolean isNew()
{
return id == null;
}
}