package org.dcache.gplazma.loader.cli; import com.google.common.collect.Ordering; import java.io.PrintStream; import org.dcache.gplazma.loader.PluginMetadata; import org.dcache.gplazma.loader.PluginRepository; import org.dcache.gplazma.loader.PluginRepository.PluginMetadataProcessor; import org.dcache.gplazma.loader.PluginRepositoryFactory; import org.dcache.gplazma.loader.XmlResourcePluginRepositoryFactory; /** * A command the provides information about plugins discovered by some * PluginRepositoryFactory. If no PluginRepositoryFactory is registered, with * {@link #setFactory(PluginRepositoryFactory), then { * @link XmlResourcePluginRepositoryFactory} is used. */ public class ListCommand implements Command { private PluginRepositoryFactory _factory = new XmlResourcePluginRepositoryFactory(); private PrintStream _out = System.out; @Override public int run( String[] args) { if( args.length > 1) { throw new IllegalArgumentException("List takes zero or one arguments"); } if( args.length == 1 && !args[0].equals("-l")) { throw new IllegalArgumentException("Only -l is a valid argument"); } PluginMetadataProcessor listProcessor; if( args.length == 1) { listProcessor = new DetailListPlugins(); } else { listProcessor = new SimpleListPlugins(); } PluginRepository repository = _factory.newRepository(); repository.processPluginsWith( listProcessor); return 0; } /** * Emit a simple list of discovered plugins: the shortest name first and * all aliases as a comma-separated list inside parentheses */ private class SimpleListPlugins implements PluginMetadataProcessor { @Override public void process( PluginMetadata plugin) { String shortestName = plugin.getShortestName(); boolean firstAlias = true; StringBuilder sb = new StringBuilder(); sb.append( shortestName); for( String name : Ordering.natural().sortedCopy(plugin.getPluginNames())) { if( name.equals( shortestName)) { continue; } if( firstAlias) { sb.append( " ("); } else { sb.append( ","); } sb.append( name); firstAlias = false; } if( !firstAlias) { sb.append( ")"); } _out.println( sb.toString()); } } /** * Emit a more detailed list of information about plugins. */ private class DetailListPlugins implements PluginMetadataProcessor { @Override public void process( PluginMetadata plugin) { _out.println( "Plugin:"); _out.println( " Class: " + plugin.getPluginClass().getName()); StringBuilder sb = new StringBuilder(); sb.append( " Name: "); boolean isFirstName = true; for( String name : Ordering.natural().sortedCopy(plugin.getPluginNames())) { if( !isFirstName) { sb.append( ","); } sb.append( name); isFirstName = false; } _out.println( sb.toString()); _out.println( " Shortest name: " + plugin.getShortestName()); if( plugin.getDefaultControl() != null) { _out.println( " Default-control: " + plugin.getDefaultControl()); } } } @Override public void setFactory( PluginRepositoryFactory factory) { _factory = factory; } @Override public void setOutput( PrintStream out) { _out = out; } }