package com.voxeo.moho.presence.xmpp.impl;
import java.util.List;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.log4j.Logger;
import org.w3c.dom.DOMException;
import org.w3c.dom.Element;
import com.voxeo.moho.presence.impl.StoreHolder;
import com.voxeo.moho.presence.impl.xmpp.XMPPPresenceStore;
import com.voxeo.moho.presence.xmpp.Roster;
import com.voxeo.moho.presence.xmpp.RosterService;
import com.voxeo.moho.presence.xmpp.XMPPPresenceService;
import com.voxeo.moho.xmpp.RosterEvent.Ask;
import com.voxeo.moho.xmpp.RosterEvent.RosterItem;
import com.voxeo.moho.xmpp.RosterItemImpl;
import com.voxeo.moho.xmpp.RosterPush;
import com.voxeo.servlet.xmpp.JID;
import com.voxeo.servlet.xmpp.XmppSession;
public class RosterServiceImpl implements RosterService {
private static final Logger LOG = Logger.getLogger(XMPPPresenceServiceImpl.class);
private XMPPPresenceService _presenceService;
public RosterServiceImpl(XMPPPresenceService xmppPresenceService) {
_presenceService = xmppPresenceService;
}
@Override
public Roster getRoster(JID from) {
return getRoster(from.toString());
}
@Override
public Roster getRoster(String from) {
Roster roster = getStore().getRoster(from.toString());
if (roster == null) {
roster = new RosterImpl(from);
getStore().addRoster(roster);
}
return roster;
}
@Override
public void addRosterItem(String user, RosterItem item) {
Roster roster = getStore().getRoster(user);
if (roster == null) {
roster = new RosterImpl(user);
}
roster.addItem(item);
getStore().addRoster(roster);
// send a roster push containing the new roster
// item to all of the user's interested resources
pushRosterItem(_presenceService.getXmppFactory().createJID(user), item);
}
public RosterPush createRosterPush(JID from, RosterItem item) {
return null;
}
//TODO refactor to RosterPUSH
private void pushRosterItem(JID from, RosterItem item) {
try {
Element element = createRosterItemElement(item);
List<XmppSession> sessions = _presenceService.getSessionUtil().getSessions(from);
for (XmppSession session : sessions) {
if (_presenceService.isResourceInterested(from)) {
session.createIQ(from.toString(), "set", element).send();
}
}
}
catch (Exception e) {
LOG.error("Error do roster push", e);
}
}
private XMPPPresenceStore getStore() {
return (XMPPPresenceStore) StoreHolder.getPresenceStore();
}
@Override
public void removeRosterItem(String user, RosterItem item) {
Roster roster = getStore().getRoster(user);
roster.removeItem(item);
getStore().addRoster(roster);
pushRosterItem(_presenceService.getXmppFactory().createJID(user), item);
}
@Override
public Element createRosterItemElement(RosterItem... items) throws DOMException, ParserConfigurationException {
Element results = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument()
.createElementNS("jabber:iq:roster", "query");
if (items != null) {
for (RosterItem item : items) {
Element itemElem = results.getOwnerDocument().createElement("item");
itemElem.setAttribute("jid", item.getJID().toString());
if (item.getSubscription() != null) {
itemElem.setAttribute("subscription", item.getSubscription().toString().toLowerCase());
}
if (item.getName() != null) {
itemElem.setAttribute("name", item.getName());
}
for (String group : item.getGroups()) {
Element groupElem = itemElem.getOwnerDocument().createElement("group");
groupElem.setTextContent(group);
itemElem.appendChild(groupElem);
}
if (item.getAsk() != Ask.NONE) {
itemElem.setAttribute("ask", item.getAsk().toString().toLowerCase());
}
results.appendChild(itemElem);
}
}
return results;
}
@Override
public RosterItem getRosterItem(String owner, String to) {
Roster roster = getRoster(owner);
RosterItem item = roster.getItem(to);
if (item == null) {
item = new RosterItemImpl(to);
roster.addItem(item);
getStore().addRoster(roster);
}
return item;
}
@Override
public RosterItem getRosterItem(JID owner, JID to) {
return getRosterItem(owner.toString(), to.toString());
}
public RosterItem createRosterItem(String to) {
return new RosterItemImpl(to);
}
public RosterItem createRosterItem(JID to) {
return createRosterItem(to.toString());
}
@Override
public void addRosterItem(JID user, RosterItem item) {
addRosterItem(user.toString(), item);
}
}