Ray Milkey

ONOS-1612 - CLI completer for property names

Change-Id: Id3667f885d5d473385531308ffd486991136bfde
1 +/*
2 + * Copyright 2015 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +package org.onosproject.cli.cfg;
17 +
18 +import java.util.List;
19 +import java.util.SortedSet;
20 +
21 +import org.apache.felix.service.command.CommandSession;
22 +import org.apache.karaf.shell.console.CommandSessionHolder;
23 +import org.apache.karaf.shell.console.Completer;
24 +import org.apache.karaf.shell.console.completer.ArgumentCompleter;
25 +import org.apache.karaf.shell.console.completer.StringsCompleter;
26 +import org.onosproject.cfg.ComponentConfigService;
27 +import org.onosproject.cli.AbstractShellCommand;
28 +
29 +/**
30 + * Component property name completer.
31 + */
32 +public class ComponentPropertyNameCompleter implements Completer {
33 + @Override
34 + public int complete(String buffer, int cursor, List<String> candidates) {
35 + // Delegate string completer
36 + StringsCompleter delegate = new StringsCompleter();
37 +
38 + CommandSession session = CommandSessionHolder.getSession();
39 + ArgumentCompleter.ArgumentList list =
40 + (ArgumentCompleter.ArgumentList) session.get(
41 + ArgumentCompleter.ARGUMENTS_LIST);
42 +
43 + // Component name is the previous argument.
44 + String componentName = list.getArguments()[list.getCursorArgumentIndex() - 1];
45 + ComponentConfigService service =
46 + AbstractShellCommand.get(ComponentConfigService.class);
47 +
48 + SortedSet<String> strings = delegate.getStrings();
49 + service.getProperties(componentName)
50 + .forEach(property -> strings.add(property.name()));
51 +
52 + // Now let the completer do the work for figuring out what to offer.
53 + return delegate.complete(buffer, cursor, candidates);
54 + }
55 +
56 +}
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
37 <completers> 37 <completers>
38 <ref component-id="cfgCommandCompleter"/> 38 <ref component-id="cfgCommandCompleter"/>
39 <ref component-id="componentNameCompleter"/> 39 <ref component-id="componentNameCompleter"/>
40 + <ref component-id="componentPropertyNameCompleter"/>
40 <null/> 41 <null/>
41 </completers> 42 </completers>
42 </command> 43 </command>
...@@ -317,6 +318,7 @@ ...@@ -317,6 +318,7 @@
317 <bean id="appIdWithIntentNameCompleter" class="org.onosproject.cli.app.ApplicationIdWithIntentNameCompleter"/> 318 <bean id="appIdWithIntentNameCompleter" class="org.onosproject.cli.app.ApplicationIdWithIntentNameCompleter"/>
318 <bean id="cfgCommandCompleter" class="org.onosproject.cli.cfg.ComponentConfigCommandCompleter"/> 319 <bean id="cfgCommandCompleter" class="org.onosproject.cli.cfg.ComponentConfigCommandCompleter"/>
319 <bean id="componentNameCompleter" class="org.onosproject.cli.cfg.ComponentNameCompleter"/> 320 <bean id="componentNameCompleter" class="org.onosproject.cli.cfg.ComponentNameCompleter"/>
321 + <bean id="componentPropertyNameCompleter" class="org.onosproject.cli.cfg.ComponentPropertyNameCompleter"/>
320 <bean id="nodeIdCompleter" class="org.onosproject.cli.NodeIdCompleter"/> 322 <bean id="nodeIdCompleter" class="org.onosproject.cli.NodeIdCompleter"/>
321 <bean id="deviceIdCompleter" class="org.onosproject.cli.net.DeviceIdCompleter"/> 323 <bean id="deviceIdCompleter" class="org.onosproject.cli.net.DeviceIdCompleter"/>
322 <bean id="clusterIdCompleter" class="org.onosproject.cli.net.ClusterIdCompleter"/> 324 <bean id="clusterIdCompleter" class="org.onosproject.cli.net.ClusterIdCompleter"/>
......