/*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.forge.arquillian.commandcompleter;
import org.jboss.forge.arquillian.container.Container;
import org.jboss.forge.arquillian.container.ContainerDirectoryParser;
import org.jboss.forge.arquillian.container.ContainerType;
import org.jboss.forge.shell.Shell;
import org.jboss.forge.shell.ShellMessages;
import org.jboss.forge.shell.completer.CommandCompleterState;
import org.jboss.forge.shell.completer.SimpleTokenCompleter;
import javax.inject.Inject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @Author Paul Bakker - paul.bakker.nl@gmail.com
*/
public class ContainerCommandCompleter extends SimpleTokenCompleter
{
public static final String OPTION_CONTAINER_TYPE = "containerType";
public static final String OPTION_CONTAINER_NAME = "containerName";
private static final String NOT_FOUND = "container-type-not-found";
@Inject
private ContainerDirectoryParser parser;
@Inject
private Shell shell;
private CommandCompleterState state;
@Override
public void complete(CommandCompleterState state)
{
this.state = state;
super.complete(state);
}
@Override
public Iterable<?> getCompletionTokens()
{
List<Container> availableContainers = null;
try
{
availableContainers = new ArrayList<Container>(parser.getContainers());
Collections.sort(availableContainers);
String containerTypeAsString = resolveContainerType();
if (NOT_FOUND.equals(containerTypeAsString))
{
return availableContainers;
}
return filterByType(availableContainers, ContainerType.valueOf(containerTypeAsString));
}
catch (IOException e)
{
ShellMessages.error(shell, e.getMessage());
return null;
}
}
private Iterable<?> filterByType(List<Container> containers, ContainerType containerType)
{
List<Container> filtered = new ArrayList<Container>();
for (Container container : containers)
{
if (containerType.equals(container.getContainerType()))
{
filtered.add(container);
}
}
return filtered;
}
/**
* Resolves the value of containerType command option if already specified
*/
private String resolveContainerType()
{
final String completeCommand = state.getBuffer();
final String[] commands = completeCommand.split("[\\s]++"); // split by one or more whitespaces
int containerTypePosition = 0;
for (String token : commands)
{
containerTypePosition++;
if (("--" + OPTION_CONTAINER_TYPE).equals(token))
{
break;
}
}
if (containerTypePosition == commands.length)
{
return NOT_FOUND;
}
return commands[containerTypePosition];
}
}