package org.buddycloud.channelserver.channel; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.node.configuration.field.Ephemeral; import org.buddycloud.channelserver.db.ClosableIteratorImpl; import org.buddycloud.channelserver.db.CloseableIterator; import org.buddycloud.channelserver.db.NodeStore; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; import org.buddycloud.channelserver.pubsub.model.GlobalItemID; import org.buddycloud.channelserver.pubsub.model.NodeAffiliation; import org.buddycloud.channelserver.pubsub.model.NodeItem; import org.buddycloud.channelserver.pubsub.model.NodeMembership; import org.buddycloud.channelserver.pubsub.model.NodeMembershipWithConfiguration; import org.buddycloud.channelserver.pubsub.model.NodeSubscription; import org.buddycloud.channelserver.pubsub.model.NodeThread; import org.xmpp.packet.JID; import org.xmpp.resultsetmanagement.ResultSet; /** * A basic implementation of a channel manager which delegates pretty much everything to a * {@link NodeStore}. */ public class ChannelManagerImpl implements ChannelManager { private final NodeStore nodeStore; private static final Logger logger = Logger.getLogger(ChannelManagerImpl.class); private static final String REMOTE_NODE = "Illegal remote node"; /** * Create an instance backed by a {@link NodeStore}. * * @param nodeStore the backing {@link NodeStore}. */ public ChannelManagerImpl(final NodeStore nodeStore) { this.nodeStore = nodeStore; } @Override public void createNode(JID owner, String nodeId, Map<String, String> nodeConf) throws NodeStoreException { nodeStore.createNode(owner, nodeId, nodeConf); } @Override public void setNodeConfValue(String nodeId, String key, String value) throws NodeStoreException { nodeStore.setNodeConfValue(nodeId, key, value); } @Override public void setNodeConf(String nodeId, Map<String, String> conf) throws NodeStoreException { nodeStore.setNodeConf(nodeId, conf); } @Override public String getNodeConfValue(String nodeId, String key) throws NodeStoreException { return nodeStore.getNodeConfValue(nodeId, key); } @Override public void deleteNodeConfiguration(String nodeId) throws NodeStoreException { nodeStore.deleteNodeConfiguration(nodeId); } @Override public Map<String, String> getNodeConf(String nodeId) throws NodeStoreException { return nodeStore.getNodeConf(nodeId); } @Override public boolean isCachedNodeConfig(String nodeId) throws NodeStoreException { return nodeStore.isCachedNodeConfig(nodeId); } @Override public boolean nodeExists(String nodeId) throws NodeStoreException { return nodeStore.nodeExists(nodeId); } @Override public void setUserAffiliation(String nodeId, JID user, Affiliations affiliation) throws NodeStoreException { nodeStore.setUserAffiliation(nodeId, user, affiliation); } @Override public void addUserSubscription(NodeSubscription subscription) throws NodeStoreException { nodeStore.addUserSubscription(subscription); } @Override public ResultSet<NodeAffiliation> getAffiliationChanges(JID user, Date startDate, Date endDate) throws NodeStoreException { return nodeStore.getAffiliationChanges(user, startDate, endDate); } @Override public ArrayList<JID> getNodeOwners(String node) throws NodeStoreException { return nodeStore.getNodeOwners(node); } @Override public ResultSet<NodeSubscription> getSubscriptionChanges(JID user, Date startDate, Date endDate) throws NodeStoreException { return nodeStore.getSubscriptionChanges(user, startDate, endDate); } @Override public CloseableIterator<NodeItem> getNodeItems(String nodeId, String afterItemId, int count, boolean parentOnly) throws NodeStoreException { return nodeStore.getNodeItems(nodeId, afterItemId, count, parentOnly); } @Override public CloseableIterator<NodeItem> getNodeItems(String nodeId) throws NodeStoreException { return nodeStore.getNodeItems(nodeId); } @Override public ClosableIteratorImpl<NodeItem> getNodeItemReplies(String nodeId, String itemId, String afterItemId, boolean after, int limit) throws NodeStoreException { return nodeStore.getNodeItemReplies(nodeId, itemId, afterItemId, after, limit); } @Override public int getCountNodeItemReplies(String nodeId, String itemId) throws NodeStoreException { return nodeStore.getCountNodeItemReplies(nodeId, itemId); } @Override public ClosableIteratorImpl<NodeItem> getNodeItemThread(String nodeId, String itemId, String afterItemId, int limit) throws NodeStoreException { return nodeStore.getNodeItemThread(nodeId, itemId, afterItemId, limit); } @Override public int getCountNodeThread(String nodeId, String itemId) throws NodeStoreException { return nodeStore.getCountNodeThread(nodeId, itemId); } @Override public CloseableIterator<NodeItem> getNewNodeItemsForUser(JID user, Date startDate, Date endDate) throws NodeStoreException { return nodeStore.getNewNodeItemsForUser(user, startDate, endDate); } @Override public int countNodeItems(String nodeId, boolean parentOnly) throws NodeStoreException { return nodeStore.countNodeItems(nodeId, parentOnly); } public boolean isCachedNode(String nodeId) throws NodeStoreException { return nodeStore.isCachedNode(nodeId); } @Override public boolean nodeHasSubscriptions(String nodeId) throws NodeStoreException { return (nodeStore.getNodeMemberships(nodeId).size() > 0); } public boolean isCachedJID(JID jid) throws NodeStoreException { return nodeStore.isCachedJID(jid); } @Override public NodeItem getNodeItem(String nodeId, String nodeItemId) throws NodeStoreException { return nodeStore.getNodeItem(nodeId, nodeItemId); } @Override public NodeItem getNodeItem(GlobalItemID item) throws NodeStoreException { return nodeStore.getNodeItem(item); } @Override public void addNodeItem(NodeItem item) throws NodeStoreException { nodeStore.addNodeItem(item); } @Override public void updateNodeItem(NodeItem item) throws NodeStoreException { nodeStore.updateNodeItem(item); } @Override public void deleteNodeItemById(String nodeId, String nodeItemId) throws NodeStoreException { nodeStore.deleteNodeItemById(nodeId, nodeItemId); } @Override public Transaction beginTransaction() throws NodeStoreException { return nodeStore.beginTransaction(); } @Override public void createPersonalChannel(JID owner) throws NodeStoreException { if (false == Configuration.getInstance().isLocalJID(owner)) { throw new IllegalArgumentException(REMOTE_NODE); } if (!nodeExists(Conf.getPostChannelNodename(owner))) { this.createNode(owner, Conf.getPostChannelNodename(owner), Conf.getDefaultPostChannelConf(owner)); } if (!nodeExists(Conf.getStatusChannelNodename(owner))) { this.createNode(owner, Conf.getStatusChannelNodename(owner), Conf.getDefaultStatusChannelConf(owner)); } if (!nodeExists(Conf.getSubscriptionsChannelNodename(owner))) { this.createNode(owner, Conf.getSubscriptionsChannelNodename(owner), Conf.getDefaultSubscriptionsChannelConf(owner)); } if (!nodeExists(Conf.getGeoPreviousChannelNodename(owner))) { this.createNode(owner, Conf.getGeoPreviousChannelNodename(owner), Conf.getDefaultGeoPreviousChannelConf(owner)); } if (!nodeExists(Conf.getGeoCurrentChannelNodename(owner))) { this.createNode(owner, Conf.getGeoCurrentChannelNodename(owner), Conf.getDefaultGeoCurrentChannelConf(owner)); } if (!nodeExists(Conf.getGeoNextChannelNodename(owner))) { this.createNode(owner, Conf.getGeoNextChannelNodename(owner), Conf.getDefaultGeoNextChannelConf(owner)); } } @Override public void close() throws NodeStoreException { nodeStore.close(); } @Override public void addRemoteNode(String node) throws NodeStoreException { nodeStore.addRemoteNode(node); } @Override public ResultSet<NodeSubscription> getNodeSubscriptionListeners(String nodeId) throws NodeStoreException { return nodeStore.getNodeSubscriptionListeners(nodeId); } @Override public ResultSet<NodeSubscription> getNodeSubscriptionListeners() throws NodeStoreException { return nodeStore.getNodeSubscriptionListeners(); } @Override public void deleteNode(String nodeId) throws NodeStoreException { nodeStore.deleteNode(nodeId); } @Override public void deleteRemoteData() throws NodeStoreException { List<String> nodes = this.getRemoteNodesList(); for (String node : nodes) { try { if (true == node.equals(("/firehose"))) { continue; } nodeStore.purgeNodeItems(node); } catch (IllegalArgumentException e) { logger.error("Invalid remote node in datastore " + node, e); } } } @Override public void purgeNodeItems(String nodeId) throws NodeStoreException { nodeStore.purgeNodeItems(nodeId); } @Override public ArrayList<String> getNodeList() throws NodeStoreException { return nodeStore.getNodeList(); } @Override public CloseableIterator<NodeItem> getRecentItems(JID user, Date since, int maxPerNode, int limit, GlobalItemID afterItemId, String node, boolean parentOnly) throws NodeStoreException { return nodeStore.getRecentItems(user, since, maxPerNode, limit, afterItemId, node, parentOnly); } @Override public int getCountRecentItems(JID user, Date since, int maxPerNode, String node, boolean parentOnly) throws NodeStoreException { return nodeStore.getCountRecentItems(user, since, maxPerNode, node, parentOnly); } @Override public CloseableIterator<NodeItem> getFirehose(int limit, String afterItemId, boolean isAdmin, String actorDomain) throws NodeStoreException { return nodeStore.getFirehose(limit, afterItemId, isAdmin, actorDomain); } @Override public int getFirehoseItemCount(boolean isAdmin, String actorDomain) throws NodeStoreException { return nodeStore.getFirehoseItemCount(isAdmin, actorDomain); } @Override public Affiliations getDefaultNodeAffiliation(String nodeId) throws NodeStoreException { String affiliationString = getNodeConfValue(nodeId, Conf.DEFAULT_AFFILIATION); if (affiliationString != null) { try { return Affiliations.valueOf(affiliationString); } catch (IllegalArgumentException e) { logger.error("Invalid default affiliation stored for node " + nodeId + ": " + affiliationString, e); } } return Affiliations.member; } @SuppressWarnings("rawtypes") @Override public CloseableIterator<NodeItem> performSearch(JID searcher, List content, JID author, int page, int rpp) throws NodeStoreException { return nodeStore.performSearch(searcher, content, author, page, rpp); } @Override public ResultSet<NodeItem> getUserPublishedItems(JID userJid) throws NodeStoreException { return nodeStore.getUserPublishedItems(userJid); } @Override public void deleteUserItems(JID userJid) throws NodeStoreException { nodeStore.deleteUserItems(userJid); } @Override public void deleteUserAffiliations(JID userJid) throws NodeStoreException { nodeStore.deleteUserAffiliations(userJid); } @Override public void deleteUserSubscriptions(JID userJid) throws NodeStoreException { nodeStore.deleteUserSubscriptions(userJid); } @Override public ResultSet<NodeThread> getNodeThreads(String node, String afterId, int limit) throws NodeStoreException { return nodeStore.getNodeThreads(node, afterId, limit); } @Override public int countNodeThreads(String node) throws NodeStoreException { return nodeStore.countNodeThreads(node); } @Override public boolean userHasRatedPost(String node, JID user, GlobalItemID id) throws NodeStoreException { return nodeStore.userHasRatedPost(node, user, id); } @Override public void updateThreadParent(String node, String itemId) throws NodeStoreException { nodeStore.updateThreadParent(node, itemId); } @Override public NodeMembership getNodeMembership(String nodeId, JID user) throws NodeStoreException { return nodeStore.getNodeMembership(nodeId, user); } @Override public ResultSet<NodeMembership> getUserMemberships(JID jid) throws NodeStoreException { return nodeStore.getUserMemberships(jid); } @Override public ResultSet<NodeMembershipWithConfiguration> getUserMembershipsWithConfiguration(JID jid, List<String> configurationFilter, Map<String, String> subscriptionsFilter) throws NodeStoreException { return nodeStore.getUserMembershipsWithConfiguration(jid, configurationFilter, subscriptionsFilter); } @Override public ResultSet<NodeMembership> getUserMemberships(JID jid, boolean ephemeral) throws NodeStoreException { return nodeStore.getUserMemberships(jid, ephemeral); } @Override public ResultSet<NodeMembership> getNodeMemberships(String nodeId) throws NodeStoreException { return nodeStore.getNodeMemberships(nodeId); } @Override public CloseableIterator<NodeItem> getUserFeedItems(JID user, Date since, int limit, GlobalItemID afterItemId, boolean parentOnly) throws NodeStoreException { return nodeStore.getUserFeedItems(user, since, limit, afterItemId, parentOnly); } @Override public int getCountUserFeedItems(JID user, Date since, boolean parentOnly) throws NodeStoreException { return nodeStore.getCountUserFeedItems(user, since, parentOnly); } @Override public void jidOnline(JID jid) throws NodeStoreException { nodeStore.jidOnline(jid); } @Override public void jidOffline(JID jid) throws NodeStoreException { nodeStore.jidOffline(jid); } @Override public ArrayList<JID> onlineJids(JID jid) throws NodeStoreException { return nodeStore.onlineJids(jid); } @Override public List<String> getLocalNodesList() throws NodeStoreException { return nodeStore.getLocalNodesList(); } @Override public List<String> getRemoteNodesList() throws NodeStoreException { return nodeStore.getRemoteNodesList(); } @Override public boolean isEphemeralNode(String node) throws NodeStoreException { String ephemeral = getNodeConfValue(node, Ephemeral.FIELD_NAME); if ((null == ephemeral) || !ephemeral.equals("true")) { return false; } return true; } @Override public int getCountLocalSubscriptionsToNode(String node) throws NodeStoreException { return nodeStore.getCountLocalSubscriptionsToNode(node); } }