/*
* Copyright © 2014-2016 Cask Data, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package co.cask.cdap.cli;
import co.cask.cdap.api.data.format.Formats;
import co.cask.cdap.api.workflow.WorkflowToken;
import co.cask.cdap.cli.command.system.RenderAsCommand;
import co.cask.cdap.cli.completer.StringsCompleter;
import co.cask.cdap.cli.completer.element.AppIdCompleter;
import co.cask.cdap.cli.completer.element.ArtifactNameCompleter;
import co.cask.cdap.cli.completer.element.DatasetModuleNameCompleter;
import co.cask.cdap.cli.completer.element.DatasetNameCompleter;
import co.cask.cdap.cli.completer.element.DatasetTypeNameCompleter;
import co.cask.cdap.cli.completer.element.EndpointCompleter;
import co.cask.cdap.cli.completer.element.NamespaceNameCompleter;
import co.cask.cdap.cli.completer.element.ProgramIdCompleter;
import co.cask.cdap.cli.completer.element.StreamIdCompleter;
import co.cask.cdap.client.ApplicationClient;
import co.cask.cdap.proto.ProgramRunStatus;
import co.cask.cdap.proto.metadata.MetadataScope;
import co.cask.cdap.proto.metadata.MetadataSearchTargetType;
import co.cask.cdap.proto.security.Principal;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableMap;
import com.google.inject.Injector;
import jline.console.completer.Completer;
import jline.console.completer.EnumCompleter;
import jline.console.completer.FileNameCompleter;
import java.util.Map;
import javax.inject.Inject;
/**
* Default set of completers.
*/
public class DefaultCompleters implements Supplier<Map<String, Completer>> {
private final ImmutableMap<String, Completer> completers;
@Inject
public DefaultCompleters(Injector injector) {
this.completers = ImmutableMap.<String, Completer>builder()
.put(ArgumentName.APP.getName(), injector.getInstance(AppIdCompleter.class))
.put(ArgumentName.ARTIFACT_NAME.getName(), injector.getInstance(ArtifactNameCompleter.class))
.put(ArgumentName.DATASET_MODULE.getName(), injector.getInstance(DatasetModuleNameCompleter.class))
.put(ArgumentName.DATASET.getName(), injector.getInstance(DatasetNameCompleter.class))
.put(ArgumentName.DATASET_TYPE.getName(), injector.getInstance(DatasetTypeNameCompleter.class))
.put(ArgumentName.STREAM.getName(), injector.getInstance(StreamIdCompleter.class))
.put(ArgumentName.LOCAL_FILE_PATH.getName(), new FileNameCompleter())
.put(ArgumentName.APP_JAR_FILE.getName(), new FileNameCompleter())
.put(ArgumentName.DATASET_MODULE_JAR_FILE.getName(), new FileNameCompleter())
.put(ArgumentName.ARTIFACT_CONFIG_FILE.getName(), new FileNameCompleter())
.put(ArgumentName.APP_CONFIG_FILE.getName(), new FileNameCompleter())
.put(ArgumentName.HTTP_METHOD.getName(), new EndpointCompleter())
.put(ArgumentName.ENDPOINT.getName(), new EndpointCompleter())
.put(ArgumentName.RUN_STATUS.getName(), new EnumCompleter(ProgramRunStatus.class))
.put(ArgumentName.NAMESPACE_NAME.getName(), injector.getInstance(NamespaceNameCompleter.class))
.put(ArgumentName.COMMAND_CATEGORY.getName(), new EnumCompleter(CommandCategory.class))
.put(ArgumentName.TABLE_RENDERER.getName(), new EnumCompleter(RenderAsCommand.Type.class))
.put(ArgumentName.WORKFLOW_TOKEN_SCOPE.getName(), new EnumCompleter(WorkflowToken.Scope.class))
.put(ArgumentName.TARGET_TYPE.getName(), new EnumCompleter(MetadataSearchTargetType.class))
.put(ArgumentName.METADATA_SCOPE.getName(), new EnumCompleter(MetadataScope.class))
.put(ArgumentName.FORMAT.getName(), new StringsCompleter(Formats.ALL))
.put(ArgumentName.PRINCIPAL_TYPE.getName(), new EnumCompleter(Principal.PrincipalType.class))
.putAll(generateProgramIdCompleters(injector)).build();
}
private static Map<? extends String, ? extends Completer> generateProgramIdCompleters(Injector injector) {
ImmutableMap.Builder<String, Completer> result = ImmutableMap.builder();
for (ElementType elementType : ElementType.values()) {
if (elementType.getProgramType() != null && elementType.isListable()) {
result.put(elementType.getArgumentName().getName(),
new ProgramIdCompleter(injector.getInstance(ApplicationClient.class),
injector.getInstance(CLIConfig.class),
elementType.getProgramType()));
}
}
return result.build();
}
@Override
public Map<String, Completer> get() {
return completers;
}
}