コード例 #1
0
ファイル: Program.cs プロジェクト: pjdixit/app-windows-sample
        private static CommandExecutionContext InitExecutionContext(ParsedCommandLine cmdLine)
        {
            CommandExecutionContext result = null;

            String  baseUri           = cmdLine.Options.ContainsKey(Constants.BASE_URI) && cmdLine.Options[Constants.BASE_URI].Count == 1 ? cmdLine.Options[Constants.BASE_URI][0] : Environment.GetEnvironmentVariable(Constants.ONSHAPE_BASE_URI);
            String  clientId          = Environment.GetEnvironmentVariable(Constants.ONSHAPE_CLIENT_ID);
            String  clientSecret      = Environment.GetEnvironmentVariable(Constants.ONSHAPE_CLIENT_SECRET);
            String  oauthToken        = cmdLine.Options.ContainsKey(Constants.OAUTH_TOKEN) && cmdLine.Options[Constants.OAUTH_TOKEN].Count == 1 ? cmdLine.Options[Constants.OAUTH_TOKEN][0] : Environment.GetEnvironmentVariable(Constants.ONSHAPE_OAUTH_TOKEN);
            String  oauthRefreshToken = cmdLine.Options.ContainsKey(Constants.OAUTH_REFRESH_TOKEN) && cmdLine.Options[Constants.OAUTH_REFRESH_TOKEN].Count == 1 ? cmdLine.Options[Constants.OAUTH_REFRESH_TOKEN][0] : Environment.GetEnvironmentVariable(Constants.ONSHAPE_OAUTH_REFRESH_TOKEN);
            Boolean interactiveMode   = cmdLine.Options.ContainsKey(Constants.INTERACTIVE_MODE);

            if (BaseExecutionContext != null)
            {
                Boolean sameAsBaseContext = String.Equals(BaseExecutionContext.BaseURL, baseUri, StringComparison.InvariantCultureIgnoreCase);
                sameAsBaseContext = sameAsBaseContext && (oauthToken == null || String.Equals(BaseExecutionContext.OAuthToken, oauthToken, StringComparison.InvariantCultureIgnoreCase));
                sameAsBaseContext = sameAsBaseContext && (oauthRefreshToken == null || String.Equals(BaseExecutionContext.OAuthRefreshToken, oauthRefreshToken, StringComparison.InvariantCultureIgnoreCase));
                // Return base context if no changes
                result = sameAsBaseContext ? BaseExecutionContext : ConstructExecutionContext(baseUri, clientId, clientSecret, oauthToken, oauthRefreshToken, interactiveMode);
            }
            else
            {
                result = ConstructExecutionContext(baseUri, clientId, clientSecret, oauthToken, oauthRefreshToken, interactiveMode);
                BaseExecutionContext = result;
            }

            return(result);
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: pjdixit/app-windows-sample
        private static ParsedCommandLine ParseCommandLine(string[] args)
        {
            // The command line is expected to have the following structure:
            // COMMAND [OPTION_FLAG_1 [OPTION_VALUE_1 ...]] [...] [VALUE_1] [...]
            ParsedCommandLine result = new ParsedCommandLine {
                Args = args
            };

            if (args.Length < 1)
            {
                throw new CommandLineParseException(@"Invalid arguments");
            }
            return(ParseValues(ParseOptions(ParseCommand(result))));
        }
コード例 #3
0
ファイル: Program.cs プロジェクト: pjdixit/app-windows-sample
        private static ParsedCommandLine ParseValues(ParsedCommandLine cmdLine)
        {
            int index = cmdLine.NextArg;

            while (index < cmdLine.Args.Length)
            {
                String token = cmdLine.Args[index++];
                if (cmdLine.Values == null)
                {
                    cmdLine.Values = new List <string> ();
                }
                cmdLine.Values.Add(token);
            }
            return(cmdLine);
        }
コード例 #4
0
 private static ParsedCommandLine ParseCommand(ParsedCommandLine cmdLine)
 {
     StringBuilder commandName = new StringBuilder();
     int index = cmdLine.NextArg;
     while (index < cmdLine.Args.Length && Constants.commandTokens.ContainsKey(cmdLine.Args[index].ToUpperInvariant()))
     {
         if (commandName.Length > 0)
         {
             commandName.Append("_");
         }
         commandName.Append(Constants.commandTokens[cmdLine.Args[index++].ToUpperInvariant()]);
         if (Commands.commands.ContainsKey(commandName.ToString()))
         {
             cmdLine.Command = Commands.commands[commandName.ToString()];
             cmdLine.NextArg = index;
         }
     }
     if (cmdLine.Command == null)
     {
         throw new CommandLineParseException(String.Format(@"Unrecognized command: {0}", cmdLine.Args[cmdLine.NextArg]));
     }
     return cmdLine;
 }
コード例 #5
0
ファイル: Program.cs プロジェクト: pjdixit/app-windows-sample
        private static ParsedCommandLine ParseCommand(ParsedCommandLine cmdLine)
        {
            StringBuilder commandName = new StringBuilder();
            int           index       = cmdLine.NextArg;

            while (index < cmdLine.Args.Length && Constants.commandTokens.ContainsKey(cmdLine.Args[index].ToUpperInvariant()))
            {
                if (commandName.Length > 0)
                {
                    commandName.Append("_");
                }
                commandName.Append(Constants.commandTokens[cmdLine.Args[index++].ToUpperInvariant()]);
                if (Commands.commands.ContainsKey(commandName.ToString()))
                {
                    cmdLine.Command = Commands.commands[commandName.ToString()];
                    cmdLine.NextArg = index;
                }
            }
            if (cmdLine.Command == null)
            {
                throw new CommandLineParseException(String.Format(@"Unrecognized command: {0}", cmdLine.Args[cmdLine.NextArg]));
            }
            return(cmdLine);
        }
コード例 #6
0
 private static ParsedCommandLine ParseOptions(ParsedCommandLine cmdLine)
 {
     Dictionary<String, List<String>> optionValues = new Dictionary<String, List<String>>();
     List<CommandOption> options = cmdLine.Command.Options;
     CommandOption currentOption = null;
     List<String> currentValues = null;
     int index = cmdLine.NextArg;
     while (index < cmdLine.Args.Length)
     {
         String token = cmdLine.Args[index];
         if (currentOption == null)
         {
             if (Constants.optionTokens.ContainsKey(token))
             {
                 currentOption = options.Where(o => String.Equals(Constants.optionTokens[token], o.Token, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();
                 if (currentOption == null)
                 {
                     currentOption = Constants.globalOptions.Where(o => String.Equals(Constants.optionTokens[token], o.Token, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();
                 }
                 if (currentOption != null)
                 {
                     if (optionValues.ContainsKey(Constants.optionTokens[token]))
                     {
                         currentValues = optionValues[currentOption.Token];
                     }
                     else
                     {
                         currentValues = new List<String>();
                         optionValues.Add(currentOption.Token, currentValues);
                         OptionValueCache[currentOption.Token] = currentValues;
                     }
                     ++index;
                     continue;
                 }
                 else
                 {
                     throw new CommandLineParseException(String.Format(@"Unexpected option: {0}", token));
                 }
             }
             else
             {
                 break;
             }
         }
         if (Constants.optionTokens.ContainsKey(token))
         {
             // New option
             currentValues = null;
             currentOption = null;
             continue;
         }
         else {
             // Option value
             if (currentOption.MaxArgs == 0)
             {
                 break;
             }
             currentValues.Add(token);
             ++index;
             if (currentOption.MaxArgs == currentValues.Count)
             {
                 currentValues = null;
                 currentOption = null;
                 continue;
             }
         }
     }
     foreach(CommandOption o in options) {
         if (o.Required && !optionValues.ContainsKey(o.Token) && o.MutuallyExclusive == null)
         {
             if (OptionValueCache.ContainsKey(o.Token))
             {
                 optionValues.Add(o.Token, OptionValueCache[o.Token]);
             }
             else
             {
                 throw new CommandLineParseException(String.Format(@"{0} is required", o.Token));
             }
         }
         if (optionValues.ContainsKey(o.Token))
         {
             int argCount = optionValues[o.Token] == null ? 0 : optionValues[o.Token].Count;
             if (argCount > o.MaxArgs || argCount < o.MinArgs)
             {
                 throw new CommandLineParseException(String.Format(@"Invalid option {0}", o.Token));
             }
             if (o.MutuallyExclusive != null)
             {
                 foreach (var name in o.MutuallyExclusive)
                 {
                     if (optionValues.ContainsKey(name))
                     {
                         List<String> mutuallyExclusiveOptions = new List<String> { o.Token };
                         mutuallyExclusiveOptions.AddRange(o.MutuallyExclusive);
                         throw new CommandLineParseException(String.Format(@"One of {0} is expected", String.Join(", ", mutuallyExclusiveOptions)));
                     }
                 }
             }
         }
     }
     cmdLine.Options = optionValues;
     cmdLine.NextArg = index;
     return cmdLine;
 }
コード例 #7
0
        private static CommandExecutionContext InitExecutionContext(ParsedCommandLine cmdLine)
        {
            CommandExecutionContext result = null;

            String baseUri = cmdLine.Options.ContainsKey(Constants.BASE_URI) && cmdLine.Options[Constants.BASE_URI].Count == 1 ? cmdLine.Options[Constants.BASE_URI][0] : Environment.GetEnvironmentVariable(Constants.ONSHAPE_BASE_URI);
            String clientId = Environment.GetEnvironmentVariable(Constants.ONSHAPE_CLIENT_ID);
            String clientSecret = Environment.GetEnvironmentVariable(Constants.ONSHAPE_CLIENT_SECRET);
            String oauthToken = cmdLine.Options.ContainsKey(Constants.OAUTH_TOKEN) && cmdLine.Options[Constants.OAUTH_TOKEN].Count == 1 ? cmdLine.Options[Constants.OAUTH_TOKEN][0] : Environment.GetEnvironmentVariable(Constants.ONSHAPE_OAUTH_TOKEN);
            String oauthRefreshToken = cmdLine.Options.ContainsKey(Constants.OAUTH_REFRESH_TOKEN) && cmdLine.Options[Constants.OAUTH_REFRESH_TOKEN].Count == 1 ? cmdLine.Options[Constants.OAUTH_REFRESH_TOKEN][0] : Environment.GetEnvironmentVariable(Constants.ONSHAPE_OAUTH_REFRESH_TOKEN);
            Boolean interactiveMode = cmdLine.Options.ContainsKey(Constants.INTERACTIVE_MODE);

            if (BaseExecutionContext != null)
            {
                Boolean sameAsBaseContext = String.Equals(BaseExecutionContext.BaseURL, baseUri, StringComparison.InvariantCultureIgnoreCase);
                sameAsBaseContext = sameAsBaseContext && (oauthToken == null || String.Equals(BaseExecutionContext.OAuthToken, oauthToken, StringComparison.InvariantCultureIgnoreCase));
                sameAsBaseContext = sameAsBaseContext && (oauthRefreshToken == null || String.Equals(BaseExecutionContext.OAuthRefreshToken, oauthRefreshToken, StringComparison.InvariantCultureIgnoreCase));
                // Return base context if no changes
                result = sameAsBaseContext ? BaseExecutionContext : ConstructExecutionContext(baseUri, clientId, clientSecret, oauthToken, oauthRefreshToken, interactiveMode);
            }
            else
            {
                result = ConstructExecutionContext(baseUri, clientId, clientSecret, oauthToken, oauthRefreshToken, interactiveMode);
                BaseExecutionContext = result;
            }

            return result;
        }
コード例 #8
0
 private static ParsedCommandLine ParseCommandLine(string[] args)
 {
     // The command line is expected to have the following structure:
     // COMMAND [OPTION_FLAG_1 [OPTION_VALUE_1 ...]] [...] [VALUE_1] [...]
     ParsedCommandLine result = new ParsedCommandLine { Args = args };
     if (args.Length < 1)
     {
         throw new CommandLineParseException(@"Invalid arguments");
     }
     return ParseValues(ParseOptions(ParseCommand(result)));
 }
コード例 #9
0
 private static ParsedCommandLine ParseValues(ParsedCommandLine cmdLine)
 {
     int index = cmdLine.NextArg;
     while (index < cmdLine.Args.Length)
     {
         String token = cmdLine.Args[index++];
         if (cmdLine.Values == null)
         {
             cmdLine.Values = new List<string> ();
         }
         cmdLine.Values.Add(token);
     }
     return cmdLine;
 }
コード例 #10
0
ファイル: Program.cs プロジェクト: pjdixit/app-windows-sample
        private static ParsedCommandLine ParseOptions(ParsedCommandLine cmdLine)
        {
            Dictionary <String, List <String> > optionValues = new Dictionary <String, List <String> >();
            List <CommandOption> options       = cmdLine.Command.Options;
            CommandOption        currentOption = null;
            List <String>        currentValues = null;
            int index = cmdLine.NextArg;

            while (index < cmdLine.Args.Length)
            {
                String token = cmdLine.Args[index];
                if (currentOption == null)
                {
                    if (Constants.optionTokens.ContainsKey(token))
                    {
                        currentOption = options.Where(o => String.Equals(Constants.optionTokens[token], o.Token, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();
                        if (currentOption == null)
                        {
                            currentOption = Constants.globalOptions.Where(o => String.Equals(Constants.optionTokens[token], o.Token, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();
                        }
                        if (currentOption != null)
                        {
                            if (optionValues.ContainsKey(Constants.optionTokens[token]))
                            {
                                currentValues = optionValues[currentOption.Token];
                            }
                            else
                            {
                                currentValues = new List <String>();
                                optionValues.Add(currentOption.Token, currentValues);
                                OptionValueCache[currentOption.Token] = currentValues;
                            }
                            ++index;
                            continue;
                        }
                        else
                        {
                            throw new CommandLineParseException(String.Format(@"Unexpected option: {0}", token));
                        }
                    }
                    else
                    {
                        break;
                    }
                }
                if (Constants.optionTokens.ContainsKey(token))
                {
                    // New option
                    currentValues = null;
                    currentOption = null;
                    continue;
                }
                else
                {
                    // Option value
                    if (currentOption.MaxArgs == 0)
                    {
                        break;
                    }
                    currentValues.Add(token);
                    ++index;
                    if (currentOption.MaxArgs == currentValues.Count)
                    {
                        currentValues = null;
                        currentOption = null;
                        continue;
                    }
                }
            }
            foreach (CommandOption o in options)
            {
                if (o.Required && !optionValues.ContainsKey(o.Token) && o.MutuallyExclusive == null)
                {
                    if (OptionValueCache.ContainsKey(o.Token))
                    {
                        optionValues.Add(o.Token, OptionValueCache[o.Token]);
                    }
                    else
                    {
                        throw new CommandLineParseException(String.Format(@"{0} is required", o.Token));
                    }
                }
                if (optionValues.ContainsKey(o.Token))
                {
                    int argCount = optionValues[o.Token] == null ? 0 : optionValues[o.Token].Count;
                    if (argCount > o.MaxArgs || argCount < o.MinArgs)
                    {
                        throw new CommandLineParseException(String.Format(@"Invalid option {0}", o.Token));
                    }
                    if (o.MutuallyExclusive != null)
                    {
                        foreach (var name in o.MutuallyExclusive)
                        {
                            if (optionValues.ContainsKey(name))
                            {
                                List <String> mutuallyExclusiveOptions = new List <String> {
                                    o.Token
                                };
                                mutuallyExclusiveOptions.AddRange(o.MutuallyExclusive);
                                throw new CommandLineParseException(String.Format(@"One of {0} is expected", String.Join(", ", mutuallyExclusiveOptions)));
                            }
                        }
                    }
                }
            }
            cmdLine.Options = optionValues;
            cmdLine.NextArg = index;
            return(cmdLine);
        }
コード例 #11
0
ファイル: Program.cs プロジェクト: pjdixit/app-windows-sample
        private static async Task RunAsync(string[] args)
        {
            // Init console window size
            Console.WindowWidth = 98;

            // Parse command line
            ParsedCommandLine cmdLine = null;

            try
            {
                cmdLine = ParseCommandLine(args);
            }
            catch (CommandLineParseException e)
            {
                printUsage(e.Message, null, null);
                exitCode = 1;
            }

            if (cmdLine != null)
            {
                if (cmdLine.Command != null && String.Equals(Constants.HELP, cmdLine.Command.Name))
                {
                    printUsage(null, cmdLine.Options, cmdLine.Values);
                    return;
                }
                try
                {
                    // Initialize command execution context
                    BaseExecutionContext = InitExecutionContext(cmdLine);

                    // Execute command
                    if (cmdLine.Command != null)
                    {
                        await cmdLine.Command.Worker(BaseExecutionContext, cmdLine.Options, cmdLine.Values);
                    }

                    if (BaseExecutionContext.InteractiveMode)
                    {
                        CommandExecutionContext executionContext = BaseExecutionContext;
                        string pattern = @"\s*(""([^""])*""|'([^'])*'|([^""\s])*)";
                        do
                        {
                            Console.Write(Constants.INTERACTIVE_PROMPT);
                            MatchCollection matches   = Regex.Matches(Console.ReadLine(), pattern, RegexOptions.IgnorePatternWhitespace);
                            List <string>   tokenList = new List <string>();
                            foreach (Match m in matches)
                            {
                                String t = m.Value.Trim();
                                if (t.StartsWith("\"") || t.StartsWith("'") && t.Length > 1)
                                {
                                    t = t.Substring(1, t.Length - 2);
                                }
                                if (!String.IsNullOrEmpty(t))
                                {
                                    tokenList.Add(t);
                                }
                            }
                            string[] tokens = tokenList.ToArray();
                            if (tokens.Length > 0 && tokens[0].Length > 0)
                            {
                                try
                                {
                                    // Parse command
                                    cmdLine = ParseCommandLine(tokens);

                                    // Initialize execution context
                                    executionContext = InitExecutionContext(cmdLine);

                                    // Execute command
                                    await cmdLine.Command.Worker(BaseExecutionContext, cmdLine.Options, cmdLine.Values);
                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine(String.Format("Error:\n\t{0}", e.Message));
                                }
                            }
                        } while (executionContext != null && executionContext.InteractiveMode);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(String.Format(@"Error: {0}", e.Message));
                    exitCode = 1;
                }
            }
        }