/**
* Copyright (c) 2014-2017 by the respective copyright holders.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.smarthome.core.thing.internal.console;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.eclipse.smarthome.core.thing.ChannelUID;
import org.eclipse.smarthome.core.thing.link.ItemChannelLink;
import org.eclipse.smarthome.core.thing.link.ItemChannelLinkRegistry;
import org.eclipse.smarthome.io.console.Console;
import org.eclipse.smarthome.io.console.extensions.AbstractConsoleCommandExtension;
/**
* {@link LinkConsoleCommandExtension} provides console commands for listing,
* addding and removing links.
*
* @author Dennis Nobel - Initial contribution
* @author Alex Tugarev - Added support for links between items and things
* @author Kai Kreuzer - Removed Thing link commands
*/
public class LinkConsoleCommandExtension extends AbstractConsoleCommandExtension {
private static final String SUBCMD_LIST = "list";
private static final String SUBCMD_CL_ADD = "addChannelLink";
private static final String SUBCMD_CL_REMOVE = "removeChannelLink";
private static final String SUBCMD_CLEAR = "clear";
private ItemChannelLinkRegistry itemChannelLinkRegistry;
public LinkConsoleCommandExtension() {
super("links", "Manage your links.");
}
@Override
public void execute(String[] args, Console console) {
if (args.length > 0) {
String subCommand = args[0];
switch (subCommand) {
case SUBCMD_LIST:
list(console, itemChannelLinkRegistry.getAll());
return;
case SUBCMD_CL_ADD:
if (args.length > 2) {
String itemName = args[1];
ChannelUID channelUID = new ChannelUID(args[2]);
addChannelLink(console, itemName, channelUID);
} else {
console.println("Specify item name and channel UID to link: link <itemName> <channelUID>");
}
return;
case SUBCMD_CL_REMOVE:
if (args.length > 2) {
String itemName = args[1];
ChannelUID channelUID = new ChannelUID(args[2]);
removeChannelLink(console, itemName, channelUID);
} else {
console.println("Specify item name and channel UID to unlink: link <itemName> <channelUID>");
}
return;
case SUBCMD_CLEAR:
clear(console);
return;
default:
console.println("Unknown command '" + subCommand + "'");
printUsage(console);
break;
}
} else {
printUsage(console);
}
}
@Override
public List<String> getUsages() {
return Arrays.asList(new String[] { buildCommandUsage(SUBCMD_LIST, "lists all links"),
buildCommandUsage(SUBCMD_CL_ADD + " <itemName> <channelUID>", "links an item with a channel"),
buildCommandUsage(SUBCMD_CL_REMOVE + " <itemName> <thingUID>", "unlinks an item with a channel"),
buildCommandUsage(SUBCMD_CLEAR, "removes all managed links") });
}
private void clear(Console console) {
Collection<ItemChannelLink> itemChannelLinks = itemChannelLinkRegistry.getAll();
for (ItemChannelLink itemChannelLink : itemChannelLinks) {
itemChannelLinkRegistry.remove(itemChannelLink.getID());
}
console.println(itemChannelLinks.size() + " links successfully removed.");
}
private void addChannelLink(Console console, String itemName, ChannelUID channelUID) {
ItemChannelLink itemChannelLink = new ItemChannelLink(itemName, channelUID);
itemChannelLinkRegistry.add(itemChannelLink);
console.println("Link " + itemChannelLink.toString() + " successfully added.");
}
private void list(Console console, Collection<ItemChannelLink> itemChannelLinks) {
for (ItemChannelLink itemChannelLink : itemChannelLinks) {
console.println(itemChannelLink.toString());
}
}
private void removeChannelLink(Console console, String itemName, ChannelUID channelUID) {
ItemChannelLink itemChannelLink = new ItemChannelLink(itemName, channelUID);
ItemChannelLink removedItemChannelLink = itemChannelLinkRegistry.remove(itemChannelLink.getID());
if (removedItemChannelLink != null) {
console.println("Link " + itemChannelLink.toString() + "successfully removed.");
} else {
console.println("Could not remove link " + itemChannelLink.toString() + ".");
}
}
protected void setItemChannelLinkRegistry(ItemChannelLinkRegistry itemChannelLinkRegistry) {
this.itemChannelLinkRegistry = itemChannelLinkRegistry;
}
protected void unsetItemChannelLinkRegistry(ItemChannelLinkRegistry itemChannelLinkRegistry) {
this.itemChannelLinkRegistry = null;
}
}