/** * 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.config.discovery.internal.console; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Map; import org.eclipse.smarthome.config.discovery.DiscoveryResult; import org.eclipse.smarthome.config.discovery.DiscoveryResultFlag; import org.eclipse.smarthome.config.discovery.inbox.Inbox; import org.eclipse.smarthome.config.discovery.inbox.InboxFilterCriteria; import org.eclipse.smarthome.config.discovery.internal.PersistentInbox; import org.eclipse.smarthome.core.thing.ThingTypeUID; import org.eclipse.smarthome.core.thing.ThingUID; import org.eclipse.smarthome.io.console.Console; import org.eclipse.smarthome.io.console.extensions.AbstractConsoleCommandExtension; /** * This class provides console commands around the inbox functionality * * @author Kai Kreuzer - Initial contribution and API */ public class InboxConsoleCommandExtension extends AbstractConsoleCommandExtension { private static final String SUBCMD_APPROVE = "approve"; private static final String SUBCMD_IGNORE = "ignore"; private static final String SUBCMD_LIST_IGNORED = "listignored"; private static final String SUBCMD_CLEAR = "clear"; private Inbox inbox; public InboxConsoleCommandExtension() { super("inbox", "Manage your inbox."); } @Override public void execute(String[] args, Console console) { if (args.length > 0) { final String subCommand = args[0]; switch (subCommand) { case SUBCMD_APPROVE: if (args.length > 2) { String label = args[2]; try { ThingUID thingUID = new ThingUID(args[1]); List<DiscoveryResult> results = inbox.get(new InboxFilterCriteria(thingUID, null)); if (results.isEmpty()) { console.println("No matching inbox entry could be found."); return; } inbox.approve(thingUID, label); } catch (Exception e) { console.println(e.getMessage()); } } else { console.println("Specify thing id to approve: inbox approve <thingUID> <label>"); } break; case SUBCMD_IGNORE: if (args.length > 1) { try { ThingUID thingUID = new ThingUID(args[1]); PersistentInbox persistentInbox = (PersistentInbox) inbox; persistentInbox.setFlag(thingUID, DiscoveryResultFlag.IGNORED); } catch (IllegalArgumentException e) { console.println("'" + args[1] + "' is no valid thing UID."); } } else { console.println("Cannot approve thing as managed thing provider is missing."); } break; case SUBCMD_LIST_IGNORED: printInboxEntries(console, inbox.get(new InboxFilterCriteria(DiscoveryResultFlag.IGNORED))); break; case SUBCMD_CLEAR: clearInboxEntries(console, inbox.get(new InboxFilterCriteria(DiscoveryResultFlag.NEW))); break; default: break; } } else { printInboxEntries(console, inbox.get(new InboxFilterCriteria(DiscoveryResultFlag.NEW))); } } private void printInboxEntries(Console console, List<DiscoveryResult> discoveryResults) { if (discoveryResults.isEmpty()) { console.println("No inbox entries found."); } for (DiscoveryResult discoveryResult : discoveryResults) { ThingTypeUID thingTypeUID = discoveryResult.getThingTypeUID(); ThingUID thingUID = discoveryResult.getThingUID(); String label = discoveryResult.getLabel(); DiscoveryResultFlag flag = discoveryResult.getFlag(); ThingUID bridgeId = discoveryResult.getBridgeUID(); Map<String, Object> properties = discoveryResult.getProperties(); String timestamp = new Date(discoveryResult.getTimestamp()).toString(); String timeToLive = discoveryResult.getTimeToLive() == DiscoveryResult.TTL_UNLIMITED ? "UNLIMITED" : "" + discoveryResult.getTimeToLive(); console.println( String.format("%s [%s]: %s [thingId=%s, bridgeId=%s, properties=%s, timestamp=%s, timeToLive=%s]", flag.name(), thingTypeUID, label, thingUID, bridgeId, properties, timestamp, timeToLive)); } } private void clearInboxEntries(Console console, List<DiscoveryResult> discoveryResults) { if (discoveryResults.isEmpty()) { console.println("No inbox entries found."); } for (DiscoveryResult discoveryResult : discoveryResults) { ThingTypeUID thingTypeUID = discoveryResult.getThingTypeUID(); ThingUID thingUID = discoveryResult.getThingUID(); String label = discoveryResult.getLabel(); DiscoveryResultFlag flag = discoveryResult.getFlag(); ThingUID bridgeId = discoveryResult.getBridgeUID(); Map<String, Object> properties = discoveryResult.getProperties(); console.println(String.format("REMOVED [%s]: %s [label=%s, thingId=%s, bridgeId=%s, properties=%s]", flag.name(), thingTypeUID, label, thingUID, bridgeId, properties)); inbox.remove(thingUID); } } @Override public List<String> getUsages() { return Arrays.asList(new String[] { buildCommandUsage("lists all current inbox entries"), buildCommandUsage(SUBCMD_LIST_IGNORED, "lists all ignored inbox entries"), buildCommandUsage(SUBCMD_APPROVE + " <thingUID> <label>", "creates a thing for an inbox entry"), buildCommandUsage(SUBCMD_CLEAR, "clears all current inbox entries"), buildCommandUsage(SUBCMD_IGNORE + " <thingUID>", "ignores an inbox entry permanently") }); } protected void setInbox(Inbox inbox) { this.inbox = inbox; } protected void unsetInbox(Inbox inbox) { this.inbox = null; } }