package io.fathom.cloud.commands;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fathomdb.discovery.DiscoveredSubTypes;
import com.fathomdb.discovery.Discovery;
import com.google.common.collect.Lists;
import com.google.inject.Injector;
@Singleton
public class Cmdlets {
private static final Logger log = LoggerFactory.getLogger(Cmdlets.class);
@Inject
Discovery discovery;
@Inject
Injector injector;
List<Cmdlet> cmdlets;
synchronized List<Cmdlet> getCommands() {
if (cmdlets == null) {
List<Cmdlet> cmdlets = Lists.newArrayList();
DiscoveredSubTypes<Cmdlet> cmdletTypes = discovery.getSubTypesOf(Cmdlet.class);
for (Cmdlet cmdlet : cmdletTypes.getInstances()) {
cmdlets.add(cmdlet);
log.info("Added cmdlet: {}", cmdlet.getClass().getSimpleName());
}
this.cmdlets = cmdlets;
}
return cmdlets;
}
public Cmdlet getCommand(String command) {
List<Cmdlet> matching = Lists.newArrayList();
for (Cmdlet cmdlet : getCommands()) {
if (cmdlet.accepts(command)) {
matching.add(cmdlet);
}
}
if (matching.size() == 0) {
return null;
}
if (matching.size() != 1) {
throw new IllegalArgumentException("Ambiguous command");
}
Cmdlet cmdlet = injector.getInstance(matching.get(0).getClass());
return cmdlet;
}
}