/* * Copyright 2015-2016 OpenCB * * 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 org.opencb.opencga.app.cli.main; import com.beust.jcommander.JCommander; import com.beust.jcommander.ParameterException; import org.opencb.commons.utils.CommandLineUtils; import org.opencb.opencga.app.cli.GeneralCliOptions; import org.opencb.opencga.app.cli.admin.AdminCliOptionsParser; import org.opencb.opencga.app.cli.analysis.options.AlignmentCommandOptions; import org.opencb.opencga.app.cli.analysis.options.VariantCommandOptions; import org.opencb.opencga.app.cli.main.options.*; import org.opencb.opencga.core.common.GitRepositoryState; import java.util.*; /** * Created by imedina on AdminMain. */ public class OpencgaCliOptionsParser { private final JCommander jCommander; private final GeneralCliOptions.GeneralOptions generalOptions; private final GeneralCliOptions.CommonCommandOptions commonCommandOptions; private final GeneralCliOptions.DataModelOptions dataModelOptions; private final GeneralCliOptions.NumericOptions numericOptions; // Catalog commands private UserCommandOptions usersCommandOptions; private ProjectCommandOptions projectCommandOptions; private StudyCommandOptions studyCommandOptions; private FileCommandOptions fileCommandOptions; private JobCommandOptions jobCommandOptions; private IndividualCommandOptions individualCommandOptions; private SampleCommandOptions sampleCommandOptions; private VariableCommandOptions variableCommandOptions; private CohortCommandOptions cohortCommandOptions; private PanelCommandOptions panelCommandOptions; private ToolCommandOptions toolCommandOptions; // Analysis commands private AlignmentCommandOptions alignmentCommandOptions; private VariantCommandOptions variantCommandOptions; enum OutputFormat {IDS, ID_CSV, NAME_ID_MAP, ID_LIST, RAW, PRETTY_JSON, PLAIN_JSON} public OpencgaCliOptionsParser() { this(false); } public OpencgaCliOptionsParser(boolean interactive) { generalOptions = new GeneralCliOptions.GeneralOptions(); jCommander = new JCommander(generalOptions); jCommander.setExpandAtSign(false); commonCommandOptions = new GeneralCliOptions.CommonCommandOptions(); dataModelOptions = new GeneralCliOptions.DataModelOptions(); numericOptions = new GeneralCliOptions.NumericOptions(); usersCommandOptions = new UserCommandOptions(this.commonCommandOptions, this.dataModelOptions, this.numericOptions, this.jCommander); jCommander.addCommand("users", usersCommandOptions); JCommander userSubCommands = jCommander.getCommands().get("users"); userSubCommands.addCommand("create", usersCommandOptions.createCommandOptions); userSubCommands.addCommand("info", usersCommandOptions.infoCommandOptions); userSubCommands.addCommand("update", usersCommandOptions.updateCommandOptions); userSubCommands.addCommand("change-password", usersCommandOptions.changePasswordCommandOptions); userSubCommands.addCommand("delete", usersCommandOptions.deleteCommandOptions); userSubCommands.addCommand("projects", usersCommandOptions.projectsCommandOptions); userSubCommands.addCommand("login", usersCommandOptions.loginCommandOptions); userSubCommands.addCommand("logout", usersCommandOptions.logoutCommandOptions); userSubCommands.addCommand("reset-password", usersCommandOptions.resetPasswordCommandOptions); projectCommandOptions = new ProjectCommandOptions(this.commonCommandOptions, this.dataModelOptions, this.numericOptions, jCommander); jCommander.addCommand("projects", projectCommandOptions); JCommander projectSubCommands = jCommander.getCommands().get("projects"); projectSubCommands.addCommand("create", projectCommandOptions.createCommandOptions); projectSubCommands.addCommand("info", projectCommandOptions.infoCommandOptions); projectSubCommands.addCommand("studies", projectCommandOptions.studiesCommandOptions); projectSubCommands.addCommand("update", projectCommandOptions.updateCommandOptions); projectSubCommands.addCommand("delete", projectCommandOptions.deleteCommandOptions); studyCommandOptions = new StudyCommandOptions(this.commonCommandOptions, this.dataModelOptions, this.numericOptions, jCommander); jCommander.addCommand("studies", studyCommandOptions); JCommander studySubCommands = jCommander.getCommands().get("studies"); studySubCommands.addCommand("create", studyCommandOptions.createCommandOptions); studySubCommands.addCommand("info", studyCommandOptions.infoCommandOptions); studySubCommands.addCommand("search", studyCommandOptions.searchCommandOptions); studySubCommands.addCommand("summary", studyCommandOptions.summaryCommandOptions); studySubCommands.addCommand("delete", studyCommandOptions.deleteCommandOptions); studySubCommands.addCommand("update", studyCommandOptions.updateCommandOptions); studySubCommands.addCommand("scan-files", studyCommandOptions.scanFilesCommandOptions); studySubCommands.addCommand("resync-files", studyCommandOptions.resyncFilesCommandOptions); studySubCommands.addCommand("files", studyCommandOptions.filesCommandOptions); studySubCommands.addCommand("jobs", studyCommandOptions.jobsCommandOptions); studySubCommands.addCommand("samples", studyCommandOptions.samplesCommandOptions); studySubCommands.addCommand("variants", studyCommandOptions.variantsCommandOptions); studySubCommands.addCommand("help", studyCommandOptions.helpCommandOptions); studySubCommands.addCommand("groups", studyCommandOptions.groupsCommandOptions); studySubCommands.addCommand("groups-create", studyCommandOptions.groupsCreateCommandOptions); studySubCommands.addCommand("groups-delete", studyCommandOptions.groupsDeleteCommandOptions); studySubCommands.addCommand("groups-info", studyCommandOptions.groupsInfoCommandOptions); studySubCommands.addCommand("groups-update", studyCommandOptions.groupsUpdateCommandOptions); studySubCommands.addCommand("acl", studyCommandOptions.aclsCommandOptions); studySubCommands.addCommand("acl-create", studyCommandOptions.aclsCreateCommandOptions); studySubCommands.addCommand("acl-member-delete", studyCommandOptions.aclsMemberDeleteCommandOptions); studySubCommands.addCommand("acl-member-info", studyCommandOptions.aclsMemberInfoCommandOptions); studySubCommands.addCommand("acl-member-update", studyCommandOptions.aclsMemberUpdateCommandOptions); fileCommandOptions = new FileCommandOptions(this.commonCommandOptions,dataModelOptions, numericOptions, jCommander); jCommander.addCommand("files", fileCommandOptions); JCommander fileSubCommands = jCommander.getCommands().get("files"); // fileSubCommands.addCommand("copy", fileCommandOptions.copyCommandOptions); fileSubCommands.addCommand("create-folder", fileCommandOptions.createFolderCommandOptions); fileSubCommands.addCommand("info", fileCommandOptions.infoCommandOptions); fileSubCommands.addCommand("download", fileCommandOptions.downloadCommandOptions); fileSubCommands.addCommand("grep", fileCommandOptions.grepCommandOptions); fileSubCommands.addCommand("search", fileCommandOptions.searchCommandOptions); fileSubCommands.addCommand("list", fileCommandOptions.listCommandOptions); fileSubCommands.addCommand("tree", fileCommandOptions.treeCommandOptions); // fileSubCommands.addCommand("index", fileCommandOptions.indexCommandOptions); fileSubCommands.addCommand("content", fileCommandOptions.contentCommandOptions); // fileSubCommands.addCommand("fetch", fileCommandOptions.fetchCommandOptions); fileSubCommands.addCommand("update", fileCommandOptions.updateCommandOptions); fileSubCommands.addCommand("upload", fileCommandOptions.uploadCommandOptions); fileSubCommands.addCommand("link", fileCommandOptions.linkCommandOptions); fileSubCommands.addCommand("unlink", fileCommandOptions.unlinkCommandOptions); fileSubCommands.addCommand("relink", fileCommandOptions.relinkCommandOptions); fileSubCommands.addCommand("delete", fileCommandOptions.deleteCommandOptions); fileSubCommands.addCommand("refresh", fileCommandOptions.refreshCommandOptions); // fileSubCommands.addCommand("variants", fileCommandOptions.variantsCommandOptions); fileSubCommands.addCommand("acl", fileCommandOptions.aclsCommandOptions); fileSubCommands.addCommand("acl-create", fileCommandOptions.aclsCreateCommandOptions); fileSubCommands.addCommand("acl-member-delete", fileCommandOptions.aclsMemberDeleteCommandOptions); fileSubCommands.addCommand("acl-member-info", fileCommandOptions.aclsMemberInfoCommandOptions); fileSubCommands.addCommand("acl-member-update", fileCommandOptions.aclsMemberUpdateCommandOptions); jobCommandOptions = new JobCommandOptions(this.commonCommandOptions, dataModelOptions, numericOptions, jCommander); jCommander.addCommand("jobs", jobCommandOptions); JCommander jobSubCommands = jCommander.getCommands().get("jobs"); jobSubCommands.addCommand("create", jobCommandOptions.createCommandOptions); jobSubCommands.addCommand("info", jobCommandOptions.infoCommandOptions); jobSubCommands.addCommand("search", jobCommandOptions.searchCommandOptions); jobSubCommands.addCommand("visit", jobCommandOptions.visitCommandOptions); jobSubCommands.addCommand("delete", jobCommandOptions.deleteCommandOptions); jobSubCommands.addCommand("group-by", jobCommandOptions.groupByCommandOptions); jobSubCommands.addCommand("acl", jobCommandOptions.aclsCommandOptions); jobSubCommands.addCommand("acl-create", jobCommandOptions.aclsCreateCommandOptions); jobSubCommands.addCommand("acl-member-delete", jobCommandOptions.aclsMemberDeleteCommandOptions); jobSubCommands.addCommand("acl-member-info", jobCommandOptions.aclsMemberInfoCommandOptions); jobSubCommands.addCommand("acl-member-update", jobCommandOptions.aclsMemberUpdateCommandOptions); // jobSubCommands.addCommand("status", jobCommandOptions.statusCommandOptions); individualCommandOptions = new IndividualCommandOptions(this.commonCommandOptions, dataModelOptions, numericOptions, jCommander); jCommander.addCommand("individuals", individualCommandOptions); JCommander individualSubCommands = jCommander.getCommands().get("individuals"); individualSubCommands.addCommand("create", individualCommandOptions.createCommandOptions); individualSubCommands.addCommand("info", individualCommandOptions.infoCommandOptions); individualSubCommands.addCommand("search", individualCommandOptions.searchCommandOptions); individualSubCommands.addCommand("update", individualCommandOptions.updateCommandOptions); individualSubCommands.addCommand("delete", individualCommandOptions.deleteCommandOptions); individualSubCommands.addCommand("group-by", individualCommandOptions.groupByCommandOptions); individualSubCommands.addCommand("samples", individualCommandOptions.sampleCommandOptions); individualSubCommands.addCommand("acl", individualCommandOptions.aclsCommandOptions); individualSubCommands.addCommand("acl-create", individualCommandOptions.aclsCreateCommandOptions); individualSubCommands.addCommand("acl-member-delete", individualCommandOptions.aclsMemberDeleteCommandOptions); individualSubCommands.addCommand("acl-member-info", individualCommandOptions.aclsMemberInfoCommandOptions); individualSubCommands.addCommand("acl-member-update", individualCommandOptions.aclsMemberUpdateCommandOptions); individualSubCommands.addCommand("annotation-sets-create", individualCommandOptions.annotationCreateCommandOptions); individualSubCommands.addCommand("annotation-sets-all-info", individualCommandOptions.annotationAllInfoCommandOptions); individualSubCommands.addCommand("annotation-sets-info", individualCommandOptions.annotationInfoCommandOptions); individualSubCommands.addCommand("annotation-sets-search", individualCommandOptions.annotationSearchCommandOptions); individualSubCommands.addCommand("annotation-sets-update", individualCommandOptions.annotationUpdateCommandOptions); individualSubCommands.addCommand("annotation-sets-delete", individualCommandOptions.annotationDeleteCommandOptions); sampleCommandOptions = new SampleCommandOptions(this.commonCommandOptions, dataModelOptions, numericOptions, jCommander); jCommander.addCommand("samples", sampleCommandOptions); JCommander sampleSubCommands = jCommander.getCommands().get("samples"); sampleSubCommands.addCommand("create", sampleCommandOptions.createCommandOptions); sampleSubCommands.addCommand("load", sampleCommandOptions.loadCommandOptions); sampleSubCommands.addCommand("info", sampleCommandOptions.infoCommandOptions); sampleSubCommands.addCommand("search", sampleCommandOptions.searchCommandOptions); sampleSubCommands.addCommand("update", sampleCommandOptions.updateCommandOptions); sampleSubCommands.addCommand("delete", sampleCommandOptions.deleteCommandOptions); sampleSubCommands.addCommand("group-by", sampleCommandOptions.groupByCommandOptions); sampleSubCommands.addCommand("individuals", sampleCommandOptions.individualCommandOptions); sampleSubCommands.addCommand("acl", sampleCommandOptions.aclsCommandOptions); sampleSubCommands.addCommand("acl-create", sampleCommandOptions.aclsCreateCommandOptions); sampleSubCommands.addCommand("acl-member-delete", sampleCommandOptions.aclsMemberDeleteCommandOptions); sampleSubCommands.addCommand("acl-member-info", sampleCommandOptions.aclsMemberInfoCommandOptions); sampleSubCommands.addCommand("acl-member-update", sampleCommandOptions.aclsMemberUpdateCommandOptions); sampleSubCommands.addCommand("annotation-sets-create", sampleCommandOptions.annotationCreateCommandOptions); sampleSubCommands.addCommand("annotation-sets-all-info", sampleCommandOptions.annotationAllInfoCommandOptions); sampleSubCommands.addCommand("annotation-sets-info", sampleCommandOptions.annotationInfoCommandOptions); sampleSubCommands.addCommand("annotation-sets-search", sampleCommandOptions.annotationSearchCommandOptions); sampleSubCommands.addCommand("annotation-sets-update", sampleCommandOptions.annotationUpdateCommandOptions); sampleSubCommands.addCommand("annotation-sets-delete", sampleCommandOptions.annotationDeleteCommandOptions); variableCommandOptions = new VariableCommandOptions(this.commonCommandOptions, jCommander); jCommander.addCommand("variables", variableCommandOptions); JCommander variableSubCommands = jCommander.getCommands().get("variables"); variableSubCommands.addCommand("create", variableCommandOptions.createCommandOptions); variableSubCommands.addCommand("info", variableCommandOptions.infoCommandOptions); variableSubCommands.addCommand("search", variableCommandOptions.searchCommandOptions); variableSubCommands.addCommand("delete", variableCommandOptions.deleteCommandOptions); variableSubCommands.addCommand("update", variableCommandOptions.updateCommandOptions); variableSubCommands.addCommand("field-add", variableCommandOptions.fieldAddCommandOptions); variableSubCommands.addCommand("field-delete", variableCommandOptions.fieldDeleteCommandOptions); variableSubCommands.addCommand("field-rename", variableCommandOptions.fieldRenameCommandOptions); cohortCommandOptions = new CohortCommandOptions(this.commonCommandOptions, dataModelOptions, numericOptions, jCommander); jCommander.addCommand("cohorts", cohortCommandOptions); JCommander cohortSubCommands = jCommander.getCommands().get("cohorts"); cohortSubCommands.addCommand("create", cohortCommandOptions.createCommandOptions); cohortSubCommands.addCommand("info", cohortCommandOptions.infoCommandOptions); cohortSubCommands.addCommand("search", cohortCommandOptions.searchCommandOptions); cohortSubCommands.addCommand("samples", cohortCommandOptions.samplesCommandOptions); cohortSubCommands.addCommand("update", cohortCommandOptions.updateCommandOptions); cohortSubCommands.addCommand("delete", cohortCommandOptions.deleteCommandOptions); cohortSubCommands.addCommand("stats", cohortCommandOptions.statsCommandOptions); cohortSubCommands.addCommand("group-by", cohortCommandOptions.groupByCommandOptions); cohortSubCommands.addCommand("acl", cohortCommandOptions.aclsCommandOptions); cohortSubCommands.addCommand("acl-create", cohortCommandOptions.aclsCreateCommandOptions); cohortSubCommands.addCommand("acl-member-delete", cohortCommandOptions.aclsMemberDeleteCommandOptions); cohortSubCommands.addCommand("acl-member-info", cohortCommandOptions.aclsMemberInfoCommandOptions); cohortSubCommands.addCommand("acl-member-update", cohortCommandOptions.aclsMemberUpdateCommandOptions); cohortSubCommands.addCommand("annotation-sets-create", cohortCommandOptions.annotationCreateCommandOptions); cohortSubCommands.addCommand("annotation-sets-all-info", cohortCommandOptions.annotationAllInfoCommandOptions); cohortSubCommands.addCommand("annotation-sets-info", cohortCommandOptions.annotationInfoCommandOptions); cohortSubCommands.addCommand("annotation-sets-search", cohortCommandOptions.annotationSearchCommandOptions); cohortSubCommands.addCommand("annotation-sets-update", cohortCommandOptions.annotationUpdateCommandOptions); cohortSubCommands.addCommand("annotation-sets-delete", cohortCommandOptions.annotationDeleteCommandOptions); toolCommandOptions = new ToolCommandOptions(this.commonCommandOptions, jCommander); jCommander.addCommand("tools", toolCommandOptions); JCommander toolSubCommands = jCommander.getCommands().get("tools"); toolSubCommands.addCommand("help", toolCommandOptions.helpCommandOptions); toolSubCommands.addCommand("info", toolCommandOptions.infoCommandOptions); toolSubCommands.addCommand("search", toolCommandOptions.searchCommandOptions); toolSubCommands.addCommand("update", toolCommandOptions.updateCommandOptions); toolSubCommands.addCommand("delete", toolCommandOptions.deleteCommandOptions); panelCommandOptions = new PanelCommandOptions(this.commonCommandOptions, jCommander); jCommander.addCommand("panels", panelCommandOptions); JCommander panelSubCommands = jCommander.getCommands().get("panels"); panelSubCommands.addCommand("create", panelCommandOptions.createCommandOptions); panelSubCommands.addCommand("info", panelCommandOptions.infoCommandOptions); panelSubCommands.addCommand("acl", panelCommandOptions.aclsCommandOptions); panelSubCommands.addCommand("acl-create", panelCommandOptions.aclsCreateCommandOptions); panelSubCommands.addCommand("acl-member-delete", panelCommandOptions.aclsMemberDeleteCommandOptions); panelSubCommands.addCommand("acl-member-info", panelCommandOptions.aclsMemberInfoCommandOptions); panelSubCommands.addCommand("acl-member-update", panelCommandOptions.aclsMemberUpdateCommandOptions); alignmentCommandOptions = new AlignmentCommandOptions(this.commonCommandOptions, jCommander); jCommander.addCommand("alignments", alignmentCommandOptions); JCommander alignmentSubCommands = jCommander.getCommands().get("alignments"); alignmentSubCommands.addCommand("index", alignmentCommandOptions.indexAlignmentCommandOptions); alignmentSubCommands.addCommand("query", alignmentCommandOptions.queryAlignmentCommandOptions); alignmentSubCommands.addCommand("stats", alignmentCommandOptions.statsAlignmentCommandOptions); alignmentSubCommands.addCommand("coverage", alignmentCommandOptions.coverageAlignmentCommandOptions); variantCommandOptions = new VariantCommandOptions(this.commonCommandOptions, dataModelOptions, numericOptions, jCommander); jCommander.addCommand("variant", variantCommandOptions); JCommander variantSubCommands = jCommander.getCommands().get("variant"); variantSubCommands.addCommand("index", variantCommandOptions.indexVariantCommandOptions); variantSubCommands.addCommand("query", variantCommandOptions.queryVariantCommandOptions); } public void parse(String[] args) throws ParameterException { jCommander.parse(args); } public String getCommand() { return (jCommander.getParsedCommand() != null) ? jCommander.getParsedCommand() : ""; } public String getSubCommand() { String parsedCommand = jCommander.getParsedCommand(); if (jCommander.getCommands().containsKey(parsedCommand)) { String subCommand = jCommander.getCommands().get(parsedCommand).getParsedCommand(); return subCommand != null ? subCommand: ""; } else { return null; } } public boolean isHelp() { String parsedCommand = jCommander.getParsedCommand(); if (parsedCommand != null) { JCommander jCommander2 = jCommander.getCommands().get(parsedCommand); List<Object> objects = jCommander2.getObjects(); if (!objects.isEmpty() && objects.get(0) instanceof AdminCliOptionsParser.AdminCommonCommandOptions) { return ((AdminCliOptionsParser.AdminCommonCommandOptions) objects.get(0)).help; } } return commonCommandOptions.help; } public void printUsage() { String parsedCommand = getCommand(); if (parsedCommand.isEmpty()) { System.err.println(""); System.err.println("Program: OpenCGA (OpenCB)"); System.err.println("Version: " + GitRepositoryState.get().getBuildVersion()); System.err.println("Git commit: " + GitRepositoryState.get().getCommitId()); System.err.println("Description: Big Data platform for processing and analysing NGS data"); System.err.println(""); System.err.println("Usage: opencga.sh [-h|--help] [--version] <command> [options]"); System.err.println(""); printMainUsage(); System.err.println(""); } else { String parsedSubCommand = getSubCommand(); if (parsedSubCommand.isEmpty()) { System.err.println(""); System.err.println("Usage: opencga.sh " + parsedCommand + " <subcommand> [options]"); System.err.println(""); System.err.println("Subcommands:"); printCommands(jCommander.getCommands().get(parsedCommand)); System.err.println(""); } else { System.err.println(""); System.err.println("Usage: opencga.sh " + parsedCommand + " " + parsedSubCommand + " [options]"); System.err.println(""); System.err.println("Options:"); CommandLineUtils.printCommandUsage(jCommander.getCommands().get(parsedCommand).getCommands().get(parsedSubCommand)); System.err.println(""); } } } private void printMainUsage() { Set<String> analysisCommands = new HashSet<>(Arrays.asList("alignments", "variant")); System.err.println("Catalog commands:"); for (String command : jCommander.getCommands().keySet()) { if (!analysisCommands.contains(command)) { System.err.printf("%14s %s\n", command, jCommander.getCommandDescription(command)); } } System.err.println(""); System.err.println("Analysis commands:"); for (String command : jCommander.getCommands().keySet()) { if (analysisCommands.contains(command)) { System.err.printf("%14s %s\n", command, jCommander.getCommandDescription(command)); } } } private void printCommands(JCommander commander) { for (Map.Entry<String, JCommander> entry : commander.getCommands().entrySet()) { System.err.printf("%14s %s\n", entry.getKey(), commander.getCommandDescription(entry.getKey())); } } public GeneralCliOptions.GeneralOptions getGeneralOptions() { return generalOptions; } public GeneralCliOptions.CommonCommandOptions getCommonCommandOptions() { return commonCommandOptions; } public UserCommandOptions getUsersCommandOptions() { return usersCommandOptions; } public ProjectCommandOptions getProjectCommandOptions() { return projectCommandOptions; } public StudyCommandOptions getStudyCommandOptions() { return studyCommandOptions; } public FileCommandOptions getFileCommands() { return fileCommandOptions; } public JobCommandOptions getJobsCommands() { return jobCommandOptions; } public IndividualCommandOptions getIndividualsCommands() { return individualCommandOptions; } public SampleCommandOptions getSampleCommands() { return sampleCommandOptions; } public VariableCommandOptions getVariableCommands() { return variableCommandOptions; } public CohortCommandOptions getCohortCommands() { return cohortCommandOptions; } public PanelCommandOptions getPanelCommands() { return panelCommandOptions; } public ToolCommandOptions getToolCommands() { return toolCommandOptions; } public AlignmentCommandOptions getAlignmentCommands() { return alignmentCommandOptions; } public VariantCommandOptions getVariantCommands() { return variantCommandOptions; } }