package org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.set;
import java.util.HashMap;
import java.util.concurrent.BlockingQueue;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.buddycloud.channelserver.Configuration;
import org.buddycloud.channelserver.channel.ChannelManager;
import org.buddycloud.channelserver.channel.Conf;
import org.buddycloud.channelserver.channel.node.configuration.NodeConfigurationException;
import org.buddycloud.channelserver.channel.node.configuration.field.Creator;
import org.buddycloud.channelserver.db.exception.NodeStoreException;
import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.PubSubElementProcessorAbstract;
import org.buddycloud.channelserver.utils.XMLConstants;
import org.dom4j.Element;
import org.xmpp.packet.IQ;
import org.xmpp.packet.JID;
import org.xmpp.packet.Packet;
import org.xmpp.packet.PacketError;
public class NodeCreate extends PubSubElementProcessorAbstract {
private static final String NODE_REG_EX = "^/user/[^@]+@[^/]+/[^/]+$";
private static final String INVALID_NODE_CONFIGURATION = "Invalid node configuration";
private static final Logger LOGGER = LogManager.getLogger(NodeCreate.class);
public NodeCreate(BlockingQueue<Packet> outQueue, ChannelManager channelManager) {
setChannelManager(channelManager);
setOutQueue(outQueue);
acceptedElementName = XMLConstants.CREATE_ELEM;
}
public void process(Element elm, JID actorJID, IQ reqIQ, Element rsm) throws Exception {
element = elm;
response = IQ.createResultIQ(reqIQ);
request = reqIQ;
actor = actorJID;
node = element.attributeValue(XMLConstants.NODE_ATTR);
if (null == actorJID) {
actor = request.getFrom();
}
if (!nodePresent() || !isNodeValid()) {
outQueue.put(response);
return;
}
if (!Configuration.getInstance().isLocalNode(node)) {
makeRemoteRequest();
return;
}
if ((checkNodeExists()) || (!actorIsRegistered())) {
outQueue.put(response);
return;
}
createNode();
}
private void createNode() throws InterruptedException {
try {
channelManager.createNode(actor, node, getNodeConfiguration());
} catch (NodeStoreException e) {
LOGGER.error(e);
setErrorCondition(PacketError.Type.wait, PacketError.Condition.internal_server_error);
outQueue.put(response);
return;
} catch (NodeConfigurationException e) {
LOGGER.error(e);
setErrorCondition(PacketError.Type.modify, PacketError.Condition.bad_request);
outQueue.put(response);
return;
}
response.setType(IQ.Type.result);
outQueue.put(response);
}
private HashMap<String, String> getNodeConfiguration() throws NodeStoreException {
getNodeConfigurationHelper().parse(request);
getNodeConfigurationHelper().setNode(node);
if (!getNodeConfigurationHelper().isValid()) {
throw new NodeConfigurationException(INVALID_NODE_CONFIGURATION);
}
HashMap<String, String> defaultConfiguration = Conf.getDefaultChannelConf(new JID(node.split("/")[2]), actor);
HashMap<String, String> configuration = getNodeConfigurationHelper().getValues();
configuration.put(Creator.FIELD_NAME, actor.toBareJID());
defaultConfiguration.putAll(configuration);
return defaultConfiguration;
}
@Override
protected boolean checkNodeExists() throws NodeStoreException {
if (!channelManager.nodeExists(node)) {
return false;
}
setErrorCondition(PacketError.Type.cancel, PacketError.Condition.conflict);
return true;
}
private boolean isNodeValid() {
if (!node.matches(NODE_REG_EX)) {
setErrorCondition(PacketError.Type.modify, PacketError.Condition.bad_request);
return false;
}
return true;
}
}