blob: 00e1a4c05695bb4ca9d4c4c7aadd029e28e9c52b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.vysper.xmpp.modules.extension.xep0050_adhoc_commands;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.vysper.xmpp.addressing.Entity;
import org.apache.vysper.xmpp.modules.DefaultDiscoAwareModule;
import org.apache.vysper.xmpp.modules.ServerRuntimeContextService;
import org.apache.vysper.xmpp.modules.servicediscovery.management.Feature;
import org.apache.vysper.xmpp.modules.servicediscovery.management.Identity;
import org.apache.vysper.xmpp.modules.servicediscovery.management.InfoElement;
import org.apache.vysper.xmpp.modules.servicediscovery.management.InfoRequest;
import org.apache.vysper.xmpp.modules.servicediscovery.management.Item;
import org.apache.vysper.xmpp.modules.servicediscovery.management.ItemRequestListener;
import org.apache.vysper.xmpp.modules.servicediscovery.management.ServerInfoRequestListener;
import org.apache.vysper.xmpp.modules.servicediscovery.management.ServiceDiscoveryRequestException;
import org.apache.vysper.xmpp.protocol.HandlerDictionary;
import org.apache.vysper.xmpp.protocol.NamespaceHandlerDictionary;
import org.apache.vysper.xmpp.protocol.NamespaceURIs;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A module for <a href="http://xmpp.org/extensions/xep-0050.html">XEP-0050 Ad-hoc Commands</a>.
*
* @author The Apache MINA Project (dev@mina.apache.org)
*/
public class AdhocCommandsModule extends DefaultDiscoAwareModule
implements ItemRequestListener, ServerInfoRequestListener,
ServerRuntimeContextService, AdhocCommandsService {
public static final String ADHOC_COMMANDS = "adhoc_commands";
private final Logger logger = LoggerFactory.getLogger(org.apache.vysper.xmpp.modules.extension.xep0050_adhoc_commands.AdhocCommandsModule.class);
protected ServerRuntimeContext serverRuntimeContext;
protected AdhocCommandIQHandler iqHandler;
protected final List<AdhocCommandSupport> adhocCommandSupporters = new ArrayList<AdhocCommandSupport>();
@Override
public void initialize(ServerRuntimeContext serverRuntimeContext) {
super.initialize(serverRuntimeContext);
this.serverRuntimeContext = serverRuntimeContext;
serverRuntimeContext.registerServerRuntimeContextService(this);
}
@Override
public String getName() {
return "XEP-0050 Ad-hoc Commands";
}
@Override
public String getVersion() {
return "1.2";
}
/**
* Make this object available for disco#items requests.
*/
@Override
protected void addItemRequestListeners(List<ItemRequestListener> itemRequestListeners) {
itemRequestListeners.add(this);
}
@Override
protected void addServerInfoRequestListeners(List<ServerInfoRequestListener> serverInfoRequestListeners) {
serverInfoRequestListeners.add(this);
}
/**
* Implements the getItemsFor method from the {@link ItemRequestListener} interface.
* Makes this modules available via disco#items and returns the associated nodes.
*
* @see ItemRequestListener#getItemsFor(InfoRequest)
*/
public List<Item> getItemsFor(InfoRequest request) throws ServiceDiscoveryRequestException {
if (!NamespaceURIs.XEP0050_ADHOC_COMMANDS.equals(request.getNode())) {
return null;
}
List<CommandInfo> allCommandInfos = new ArrayList<CommandInfo>();
for (AdhocCommandSupport adhocCommandSupporter : adhocCommandSupporters) {
final Collection<CommandInfo> commandInfos = adhocCommandSupporter.getCommandInfosForInfoRequest(request, true);
if (commandInfos != null) allCommandInfos.addAll(commandInfos);
}
if (allCommandInfos.size() == 0) return null; // do not announce when no command available
// formulate info response from collected command infos
List<Item> items = new ArrayList<Item>();
for (CommandInfo commandInfo : allCommandInfos) {
Entity jid = commandInfo.getJid();
if (jid == null) jid = serverRuntimeContext.getServerEntity();
String node = commandInfo.getNode();
if (node == null) {
logger.warn("no node for command info, ignoring. command name = " + commandInfo.getName());
continue;
}
String name = commandInfo.getName() == null ? commandInfo.getNode() : commandInfo.getName();
items.add(new Item(jid, name, node));
}
return items;
}
public List<InfoElement> getServerInfosFor(InfoRequest request) throws ServiceDiscoveryRequestException {
if (adhocCommandSupporters.size() == 0) return null; // do not announce when no command available
if (StringUtils.isEmpty(request.getNode())) {
return Arrays.asList((InfoElement)new Feature(NamespaceURIs.XEP0050_ADHOC_COMMANDS));
}
// info for specific node has been asked
List<CommandInfo> allCommandInfos = new ArrayList<CommandInfo>();
for (AdhocCommandSupport adhocCommandSupporter : adhocCommandSupporters) {
final Collection<CommandInfo> commandInfos = adhocCommandSupporter.getCommandInfosForInfoRequest(request, false);
if (commandInfos != null) allCommandInfos.addAll(commandInfos);
}
if (allCommandInfos.size() == 0) return null; // do not announce when no command available
final CommandInfo commandInfo = allCommandInfos.get(0);
final ArrayList<InfoElement> infoElements = new ArrayList<InfoElement>();
infoElements.add(new Identity("automation", "command-node", commandInfo.getName()));
infoElements.add(new Feature(NamespaceURIs.XEP0050_ADHOC_COMMANDS));
infoElements.add(new Feature(NamespaceURIs.JABBER_X_DATA));
return infoElements;
}
public String getServiceName() {
return ADHOC_COMMANDS;
}
public void registerCommandSupport(AdhocCommandSupport adhocCommandSupport) {
adhocCommandSupporters.add(adhocCommandSupport);
}
@Override
protected void addHandlerDictionaries(List<HandlerDictionary> dictionary) {
iqHandler = new AdhocCommandIQHandler(Collections.unmodifiableCollection(adhocCommandSupporters));
dictionary.add(new NamespaceHandlerDictionary(NamespaceURIs.XEP0050_ADHOC_COMMANDS, iqHandler));
}
}