/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.communication.connection.internal; import java.util.ArrayList; import java.util.Collection; import java.util.List; import de.rcenvironment.core.command.common.CommandException; import de.rcenvironment.core.command.spi.CommandContext; import de.rcenvironment.core.command.spi.CommandDescription; import de.rcenvironment.core.command.spi.CommandPlugin; import de.rcenvironment.core.communication.connection.api.ConnectionSetup; import de.rcenvironment.core.communication.connection.api.ConnectionSetupService; import de.rcenvironment.core.communication.model.NetworkContactPoint; import de.rcenvironment.core.communication.utils.NetworkContactPointUtils; import de.rcenvironment.core.utils.common.StringUtils; /** * Execution handler for "cn [...]" commands. * * @author Robert Mischke */ public class ConnectionSetupCommandPlugin implements CommandPlugin { private static final String CMD_CN = "cn"; private ConnectionSetupService connectionSetupService; @Override public Collection<CommandDescription> getCommandDescriptions() { final Collection<CommandDescription> contributions = new ArrayList<CommandDescription>(); contributions.add(new CommandDescription(CMD_CN, "", false, "short form of \"cn list\"")); contributions.add(new CommandDescription("cn add", "<target> [\"<description>\"]", false, "add a new network connection", "(Example: cn add activemq-tcp:rceserver.example.com:20001 \"Our RCE Server\")")); contributions.add(new CommandDescription("cn list", "", false, "lists all network connections, including ids and connection states")); contributions.add(new CommandDescription("cn start", "<id>", false, "starts/connects a READY or DISCONNECTED connection (use \"cn list\" to get the id)")); contributions.add(new CommandDescription("cn stop", "<id>", false, "stops/disconnects an ESTABLISHED connection (use \"cn list\" to get the id)")); return contributions; } @Override public void execute(CommandContext context) throws CommandException { context.consumeExpectedToken(CMD_CN); String subCmd = context.consumeNextToken(); if (subCmd == null) { // "cn" -> "cn list" by default performList(context); } else { List<String> parameters = context.consumeRemainingTokens(); if ("add".equals(subCmd)) { // "rce net add <...>" performAdd(context, parameters); } else if ("list".equals(subCmd)) { performList(context); } else if ("start".equals(subCmd)) { performStart(context, parameters); } else if ("stop".equals(subCmd)) { performStop(context, parameters); } else { throw CommandException.unknownCommand(context); } } } /** * OSGi-DS bind method. * * @param newInstance the new service instance to bind */ public void bindConnectionSetupService(ConnectionSetupService newInstance) { this.connectionSetupService = newInstance; } private void performList(CommandContext context) { Collection<ConnectionSetup> setups = connectionSetupService.getAllConnectionSetups(); for (ConnectionSetup setup : setups) { String optionalSuffix = ""; if (true) { // show channel ids String currentChannelId = setup.getCurrentChannelId(); if (currentChannelId != null) { optionalSuffix = " [" + currentChannelId + "]"; } } context.println(StringUtils.format(" (%d) '%s' [%s] - %s%s", setup.getId(), setup.getDisplayName(), setup.getNetworkContactPointString(), setup.getState(), optionalSuffix)); } } private void performAdd(CommandContext context, List<String> parameters) throws CommandException { if (parameters.size() < 1 || parameters.size() > 2) { throw CommandException.wrongNumberOfParameters(context); } String contactPointStr = parameters.get(0); NetworkContactPoint ncp; try { ncp = NetworkContactPointUtils.parseStringRepresentation(contactPointStr); } catch (IllegalArgumentException e1) { context.println("Invalid target description: " + contactPointStr); return; } String displayName; if (parameters.size() == 2) { displayName = parameters.get(1); } else { displayName = "<" + contactPointStr + ">"; } ConnectionSetup setup = connectionSetupService.createConnectionSetup(ncp, displayName, true); context.println("Connection added, id=" + setup.getId()); performList(context); } private void performStart(CommandContext context, List<String> parameters) { if (parameters.size() < 1) { context.println("Error: missing connection id"); // TODO print standard help? return; } long id; try { id = Long.parseLong(parameters.get(0)); } catch (NumberFormatException e) { context.println("Error: invalid connection id"); return; } ConnectionSetup setup = connectionSetupService.getConnectionSetupById(id); if (setup == null) { context.println("Error: unknown connection id"); return; } // validated -> perform action setup.signalStartIntent(); // TODO add synchronous option as well; decide which should be default // try { // } catch (CommunicationException e) { // log.error("Error on connection attempt", e); // context.println("Error on connection attempt: " + e.toString()); // return; // } } private void performStop(CommandContext context, List<String> parameters) { if (parameters.size() < 1) { context.println("Error: missing connection id"); // TODO print standard help? return; } long id; try { id = Long.parseLong(parameters.get(0)); } catch (NumberFormatException e) { context.println("Error: invalid connection id"); return; } ConnectionSetup setup = connectionSetupService.getConnectionSetupById(id); if (setup == null) { context.println("Error: unknown connection id"); return; } // validated -> perform action setup.signalStopIntent(); // TODO add synchronous option as well; decide which should be default } }