package org.araqne.logdb.metadata; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import org.apache.felix.ipojo.annotations.Component; import org.apache.felix.ipojo.annotations.Invalidate; import org.apache.felix.ipojo.annotations.Requires; import org.apache.felix.ipojo.annotations.Validate; import org.araqne.logdb.FieldOrdering; import org.araqne.logdb.FunctionRegistry; import org.araqne.logdb.MetadataCallback; import org.araqne.logdb.MetadataProvider; import org.araqne.logdb.MetadataService; import org.araqne.logdb.QueryCommandHelp; import org.araqne.logdb.QueryCommandOption; import org.araqne.logdb.QueryCommandParser; import org.araqne.logdb.QueryContext; import org.araqne.logdb.QueryParserService; import org.araqne.logdb.Row; @Component(name = "logdb-command-metadata") public class CommandMetadataProvider implements MetadataProvider, FieldOrdering { @Requires private MetadataService metadataService; @Requires private QueryParserService queryParserService; @Requires private FunctionRegistry functionRegistry; @Validate public void start() { metadataService.addProvider(this); } @Invalidate public void stop() { if (metadataService != null) metadataService.removeProvider(this); } @Override public String getType() { return "commands"; } @Override public List<String> getFieldOrder() { return Arrays.asList("name", "descriptions", "options", "usages"); } @Override public void verify(QueryContext context, String queryString) { } @Override public void query(QueryContext context, String queryString, MetadataCallback callback) { for (QueryCommandParser command : queryParserService.getCommandParsers()) { Map<String, Object> m = new HashMap<String, Object>(); QueryCommandHelp help = command.getCommandHelp(); m.put("name", help.getCommandName()); Map<String, String> desc = new HashMap<String, String>(); for (Locale locale : help.getDescriptions().keySet()) desc.put(locale.toString(), help.getDescriptions().get(locale)); m.put("descriptions", desc); Map<String, Map<String, String>> options = new HashMap<String, Map<String, String>>(); for (String optionName : help.getOptions().keySet()) { Map<String, String> option = new HashMap<String, String>(); QueryCommandOption opt = help.getOptions().get(optionName); for (Locale locale : opt.getDescriptions().keySet()) { option.put(locale.toString(), opt.getDescriptions().get(locale)); } options.put(optionName, option); } m.put("options", options); Map<String, String> usages = new HashMap<String, String>(); for (Locale locale : help.getUsages().keySet()) usages.put(locale.toString(), help.getUsages().get(locale)); m.put("usages", usages); callback.onPush(new Row(m)); } } }