package org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.get;
import java.util.Map;
import java.util.concurrent.BlockingQueue;
import org.apache.log4j.Logger;
import org.buddycloud.channelserver.Configuration;
import org.buddycloud.channelserver.channel.ChannelManager;
import org.buddycloud.channelserver.channel.node.configuration.field.AccessModel;
import org.buddycloud.channelserver.db.exception.NodeStoreException;
import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub;
import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubElementProcessorAbstract;
import org.buddycloud.channelserver.utils.XMLConstants;
import org.dom4j.Element;
import org.xmpp.forms.DataForm;
import org.xmpp.forms.FormField;
import org.xmpp.packet.IQ;
import org.xmpp.packet.JID;
import org.xmpp.packet.Packet;
import org.xmpp.packet.PacketError;
public class NodeConfigureGet extends PubSubElementProcessorAbstract {
public static final String NS_CONFIGURE = "http://jabber.org/protocol/pubsub#node_config";
private static final Logger LOGGER = Logger.getLogger(NodeConfigureGet.class);
public NodeConfigureGet(BlockingQueue<Packet> outQueue, ChannelManager channelManager) {
setChannelManager(channelManager);
setOutQueue(outQueue);
acceptedElementName = XMLConstants.CONFIGURE_ELEM;
}
public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exception {
response = IQ.createResultIQ(reqIQ);
request = reqIQ;
actor = actorJID;
node = elm.attributeValue(XMLConstants.NODE_ATTR);
if (null == actor) {
actor = request.getFrom();
}
if (!nodePresent()) {
outQueue.put(response);
return;
}
if (!Configuration.getInstance().isLocalNode(node) && !channelManager.isCachedNodeConfig(node)) {
makeRemoteRequest();
return;
}
try {
if (!checkNodeExists()) {
outQueue.put(response);
return;
}
} catch (NodeStoreException e) {
LOGGER.error(e);
setErrorCondition(PacketError.Type.cancel, PacketError.Condition.internal_server_error);
outQueue.put(response);
return;
}
getNodeConfiguration();
}
private void getNodeConfiguration() throws Exception {
Map<String, String> nodeConf = channelManager.getNodeConf(node);
DataForm x = new DataForm(DataForm.Type.result);
FormField formType = x.addField();
formType.setType(FormField.Type.hidden);
formType.setVariable("FORM_TYPE");
formType.addValue(NS_CONFIGURE);
String value;
for (String key : nodeConf.keySet()) {
// If access model is 'local' and its not a local user return 'authorize'
value = nodeConf.get(key);
if ((key.equals(AccessModel.FIELD_NAME)) && (value.equals(AccessModel.local.toString())) && (!Configuration.getInstance().isLocalJID(actor))) {
value = AccessModel.authorize.toString();
}
x.addField(key, null, null).addValue(value);
}
Element pubsub = response.setChildElement(XMLConstants.PUBSUB_ELEM, JabberPubsub.NS_PUBSUB_OWNER);
Element configure = pubsub.addElement(XMLConstants.CONFIGURE_ELEM);
configure.addAttribute(XMLConstants.NODE_ATTR, node);
configure.add(x.getElement());
outQueue.put(response);
}
}