/**
* 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 java.util.concurrent.CopyOnWriteArrayList;
import org.eclipse.smarthome.core.thing.ThingTypeUID;
import org.eclipse.smarthome.core.thing.ThingUID;
import org.eclipse.smarthome.core.thing.binding.firmware.Firmware;
import org.eclipse.smarthome.core.thing.binding.firmware.FirmwareUID;
import org.eclipse.smarthome.core.thing.binding.firmware.FirmwareUpdateHandler;
import org.eclipse.smarthome.core.thing.firmware.FirmwareRegistry;
import org.eclipse.smarthome.core.thing.firmware.FirmwareStatusInfo;
import org.eclipse.smarthome.core.thing.firmware.FirmwareUpdateService;
import org.eclipse.smarthome.io.console.Console;
import org.eclipse.smarthome.io.console.extensions.AbstractConsoleCommandExtension;
/**
* {@link FirmwareUpdateConsoleCommandExtension} provides console commands for managing the firmwares of things.
*
* @author Thomas Höfer - Initial contribution
* @author Christoph Knauf - added cancel command
*/
public final class FirmwareUpdateConsoleCommandExtension extends AbstractConsoleCommandExtension {
private static final String SUBCMD_LIST = "list";
private static final String SUBCMD_STATUS = "status";
private static final String SUBCMD_UPDATE = "update";
private static final String SUBCMD_CANCEL = "cancel";
private FirmwareUpdateService firmwareUpdateService;
private FirmwareRegistry firmwareRegistry;
private final List<FirmwareUpdateHandler> firmwareUpdateHandlers = new CopyOnWriteArrayList<>();
public FirmwareUpdateConsoleCommandExtension() {
super("firmware", "Manage your things' firmwares.");
}
@Override
public void execute(String[] args, Console console) {
int numberOfArguments = args.length;
if (numberOfArguments < 1) {
console.println("No firmware subcommand given.");
printUsage(console);
return;
}
String subCommand = args[0];
switch (subCommand) {
case SUBCMD_LIST:
listFirmwares(console, args);
break;
case SUBCMD_STATUS:
listFirmwareStatus(console, args);
break;
case SUBCMD_UPDATE:
updateFirmware(console, args);
break;
case SUBCMD_CANCEL:
cancelUpdate(console,args);
break;
default:
console.println(String.format("Unknown firmware sub command '%s'.", subCommand));
printUsage(console);
break;
}
}
private void listFirmwares(Console console, String[] args) {
if (args.length != 2) {
console.println("Specify the thing type id to get its available firmwares: firmware list <thingTypeUID>");
return;
}
ThingTypeUID thingTypeUID = new ThingTypeUID(args[1]);
Collection<Firmware> firmwares = firmwareRegistry.getFirmwares(thingTypeUID);
if (firmwares.isEmpty()) {
console.println("No firmwares found.");
}
for (Firmware firmware : firmwares) {
console.println(firmware.toString());
}
}
private void listFirmwareStatus(Console console, String[] args) {
if (args.length != 2) {
console.println("Specify the thing id to get its firmware status: firmware status <thingUID>");
return;
}
ThingUID thingUID = new ThingUID(args[1]);
FirmwareStatusInfo firmwareStatusInfo = firmwareUpdateService.getFirmwareStatusInfo(thingUID);
if (firmwareStatusInfo != null) {
StringBuffer sb = new StringBuffer();
sb.append(String.format("Firmware status for thing with UID %s is %s.", thingUID,
firmwareStatusInfo.getFirmwareStatus()));
if (firmwareStatusInfo.getUpdatableFirmwareUID() != null) {
sb.append(String.format(" The latest updatable firmware version is %s.",
firmwareStatusInfo.getUpdatableFirmwareUID().getFirmwareVersion()));
}
console.println(sb.toString());
} else {
console.println(
String.format("The firmware status for thing with UID %s could not be determined.", thingUID));
}
}
private void cancelUpdate(Console console, String[] args) {
if (args.length != 2) {
console.println("Specify the thing id to cancel the update: firmware cancel <thingUID>");
return;
}
ThingUID thingUID = new ThingUID(args[1]);
FirmwareUpdateHandler firmwareUpdateHandler = getFirmwareUpdateHandler(thingUID);
if (firmwareUpdateHandler == null) {
console.println(String.format("No firmware update handler available for thing with UID %s.", thingUID));
return;
}
firmwareUpdateService.cancelFirmwareUpdate(thingUID);
console.println("Firmware update canceled.");
}
private void updateFirmware(Console console, String[] args) {
if (args.length != 3) {
console.println(
"Specify the thing id and the firmware version to update the firmware: firmware update <thingUID> <firmware version>");
return;
}
ThingUID thingUID = new ThingUID(args[1]);
FirmwareUpdateHandler firmwareUpdateHandler = getFirmwareUpdateHandler(thingUID);
if (firmwareUpdateHandler == null) {
console.println(String.format("No firmware update handler available for thing with UID %s.", thingUID));
return;
}
FirmwareUID firmwareUID = new FirmwareUID(firmwareUpdateHandler.getThing().getThingTypeUID(), args[2]);
firmwareUpdateService.updateFirmware(thingUID, firmwareUID, null);
console.println("Firmware update started.");
}
private FirmwareUpdateHandler getFirmwareUpdateHandler(ThingUID thingUID) {
for (FirmwareUpdateHandler firmwareUpdateHandler : firmwareUpdateHandlers) {
if (thingUID.equals(firmwareUpdateHandler.getThing().getUID())) {
return firmwareUpdateHandler;
}
}
return null;
}
@Override
public List<String> getUsages() {
return Arrays
.asList(new String[] {
buildCommandUsage(SUBCMD_LIST + " <thingTypeUID>",
"lists the available firmwares for a thing type"),
buildCommandUsage(SUBCMD_STATUS + " <thingUID>", "lists the firmware status for a thing"),
buildCommandUsage(SUBCMD_CANCEL + " <thingUID>", "cancels the update for a thing"),
buildCommandUsage(SUBCMD_UPDATE + " <thingUID> <firmware version>",
"updates the firmware for a thing") });
}
protected void setFirmwareUpdateService(FirmwareUpdateService firmwareUpdateService) {
this.firmwareUpdateService = firmwareUpdateService;
}
protected void unsetFirmwareUpdateService(FirmwareUpdateService firmwareUpdateService) {
this.firmwareUpdateService = null;
}
protected void setFirmwareRegistry(FirmwareRegistry firmwareRegistry) {
this.firmwareRegistry = firmwareRegistry;
}
protected void unsetFirmwareRegistry(FirmwareRegistry firmwareRegistry) {
this.firmwareRegistry = null;
}
protected void addFirmwareUpdateHandler(FirmwareUpdateHandler firmwareUpdateHandler) {
firmwareUpdateHandlers.add(firmwareUpdateHandler);
}
protected void removeFirmwareUpdateHandler(FirmwareUpdateHandler firmwareUpdateHandler) {
firmwareUpdateHandlers.remove(firmwareUpdateHandler);
}
}