/**
* 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.events.EventPublisher;
import org.eclipse.smarthome.core.thing.Bridge;
import org.eclipse.smarthome.core.thing.ChannelUID;
import org.eclipse.smarthome.core.thing.ManagedThingProvider;
import org.eclipse.smarthome.core.thing.Thing;
import org.eclipse.smarthome.core.thing.ThingRegistry;
import org.eclipse.smarthome.core.thing.ThingStatusInfo;
import org.eclipse.smarthome.core.thing.ThingUID;
import org.eclipse.smarthome.core.thing.events.ThingEventFactory;
import org.eclipse.smarthome.core.thing.i18n.ThingStatusInfoI18nLocalizationService;
import org.eclipse.smarthome.io.console.Console;
import org.eclipse.smarthome.io.console.extensions.AbstractConsoleCommandExtension;
/**
* {@link ThingConsoleCommandExtension} provides console commands for listing and removing things.
*
* @author Dennis Nobel - Initial contribution
* @author Thomas Höfer - Added localization of thing status
* @author Stefan Triller - Added trigger channel command
*/
public class ThingConsoleCommandExtension extends AbstractConsoleCommandExtension {
private static final String SUBCMD_LIST = "list";
private static final String SUBCMD_CLEAR = "clear";
private static final String SUBCMD_REMOVE = "remove";
private static final String SUBCMD_TRIGGER = "trigger";
private ManagedThingProvider managedThingProvider;
private ThingRegistry thingRegistry;
private ThingStatusInfoI18nLocalizationService thingStatusInfoI18nLocalizationService;
private EventPublisher eventPublisher;
public ThingConsoleCommandExtension() {
super("things", "Access your thing registry.");
}
@Override
public void execute(String[] args, Console console) {
Collection<Thing> things = thingRegistry.getAll();
if (args.length > 0) {
String subCommand = args[0];
switch (subCommand) {
case SUBCMD_LIST:
printThings(console, things);
return;
case SUBCMD_CLEAR:
removeAllThings(console, things);
return;
case SUBCMD_REMOVE:
if (args.length > 1) {
ThingUID thingUID = new ThingUID(args[1]);
removeThing(console, things, thingUID);
} else {
console.println("Specify thing id to remove: things remove <thingUID> (e.g. \"hue:light:1\")");
}
return;
case SUBCMD_TRIGGER:
if (args.length == 3) {
triggerChannel(console, args[1], args[2]);
} else if (args.length == 2) {
triggerChannel(console, args[1], null);
} else {
console.println("Command '" + subCommand + "' needs arguments <channelUID> [<event>]");
}
break;
default:
break;
}
} else {
printUsage(console);
}
}
private void triggerChannel(Console console, String channelUid, String event) {
eventPublisher.post(ThingEventFactory.createTriggerEvent(event, new ChannelUID(channelUid)));
}
private void removeThing(Console console, Collection<Thing> things, ThingUID thingUID) {
Thing removedThing = this.managedThingProvider.remove(thingUID);
if (removedThing != null) {
console.println("Thing '" + thingUID + "' successfully removed.");
} else {
console.println("Could not delete thing " + thingUID + ".");
}
}
private void removeAllThings(Console console, Collection<Thing> things) {
int numberOfThings = things.size();
for (Thing thing : things) {
managedThingProvider.remove(thing.getUID());
}
console.println(numberOfThings + " things successfully removed.");
}
@Override
public List<String> getUsages() {
return Arrays.asList(new String[] { buildCommandUsage(SUBCMD_LIST, "lists all things"),
buildCommandUsage(SUBCMD_CLEAR, "removes all managed things"),
buildCommandUsage(SUBCMD_REMOVE + " <thingUID>", "removes a thing"),
buildCommandUsage(SUBCMD_TRIGGER + " <channelUID> [<event>]",
"triggers the <channelUID> with <event> (if given)") });
}
private void printThings(Console console, Collection<Thing> things) {
if (things.isEmpty()) {
console.println("No things found.");
}
for (Thing thing : things) {
String id = thing.getUID().toString();
String thingType = thing instanceof Bridge ? "Bridge" : "Thing";
ThingStatusInfo status = thingStatusInfoI18nLocalizationService.getLocalizedThingStatusInfo(thing, null);
ThingUID bridgeUID = thing.getBridgeUID();
String label = thing.getLabel();
console.println(String.format("%s (Type=%s, Status=%s, Label=%s, Bridge=%s)", id, thingType, status, label,
bridgeUID));
}
}
protected void setManagedThingProvider(ManagedThingProvider managedThingProvider) {
this.managedThingProvider = managedThingProvider;
}
protected void setThingRegistry(ThingRegistry thingRegistry) {
this.thingRegistry = thingRegistry;
}
protected void unsetManagedThingProvider(ManagedThingProvider managedThingProvider) {
this.managedThingProvider = null;
}
protected void unsetThingRegistry(ThingRegistry thingRegistry) {
this.thingRegistry = null;
}
protected void setThingStatusInfoI18nLocalizationService(
ThingStatusInfoI18nLocalizationService thingStatusInfoI18nLocalizationService) {
this.thingStatusInfoI18nLocalizationService = thingStatusInfoI18nLocalizationService;
}
protected void unsetThingStatusInfoI18nLocalizationService(
ThingStatusInfoI18nLocalizationService thingStatusInfoI18nLocalizationService) {
this.thingStatusInfoI18nLocalizationService = null;
}
protected void setEventPublisher(EventPublisher eventPublisher) {
this.eventPublisher = eventPublisher;
}
protected void unsetEventPublisher(EventPublisher eventPublisher) {
this.eventPublisher = null;
}
}