예제 #1
0
  private static List<Map.Entry<String, String>> getOption(
      CliOption option, ArgumentList argumentList) {
    List<Map.Entry<String, String>> result = new ArrayList<>();
    boolean flag = option.isFlag();

    for (String switchName : option.getSwitchNames()) {
      List<Map.Entry<String, String>> values;

      if (flag) {
        values = argumentList.removeFlag(switchName);
      } else {
        values = argumentList.removeSwitchValues(switchName);
      }

      result.addAll(values);
    }

    if (result.isEmpty()) {
      String defaultValue = option.getDefaultValue();

      if (defaultValue != null) {
        Map.Entry<String, String> defaultEntry =
            new AbstractMap.SimpleImmutableEntry<>(last(option.getSwitchNames()), defaultValue);

        result.add(defaultEntry);
      }
    }

    return result;
  }
예제 #2
0
  public void verify(PrintStream out) {
    List<String> errors = new ArrayList<>();

    if (!missing.isEmpty()) {
      StringBuilder missingMessage = new StringBuilder(80);
      List<String> missingSwitches = new ArrayList<>(missing.size());

      for (CliOption option : missing) {
        missingSwitches.add(last(option.getSwitchNames()));
      }

      missingMessage.append("Missing required option");

      if (missing.size() > 1) {
        missingMessage.append('s');
      }

      missingMessage.append(": ").append(join(", ", missingSwitches));
      errors.add(missingMessage.toString());
    }

    if (!unexpected.isEmpty()) {
      String unexpectedMessage = "Unexpected parameters: " + join(" ", unexpected);

      errors.add(unexpectedMessage);
    }

    if (!duplicates.isEmpty()) {
      StringBuilder duplicatesMessage = new StringBuilder(80);
      List<String> duplicateSwitches = new ArrayList<>(duplicates.size());

      for (Map.Entry<String, String> duplicate : duplicates) {
        duplicateSwitches.add(duplicate.getKey() + "=" + duplicate.getValue());
      }

      duplicatesMessage.append("Duplicate options: ").append(join(", ", duplicateSwitches));
      errors.add(duplicatesMessage.toString());
    }

    if (!errors.isEmpty()) {
      out.println(command.getDocumentation());
      out.println();
      out.flush();

      throw new ErrorMessage(join("\n", errors));
    }
  }
예제 #3
0
 private void assertHelpTextIncludes(final CliOption option) {
   final String name = option.getName();
   if (!helpText.contains(name)) {
     errors.append("Help text does not contain command line option '");
     errors.append(name);
     errors.append("'\n");
   }
 }
예제 #4
0
 @Test
 public void helpTextIncludesAllCommandLineApplicationOptions() {
   for (CliOption appOption : CliOption.getApplicationOptions()) {
     assertHelpTextIncludes(appOption);
   }
   if (errors.length() > 0) {
     fail(errors.toString());
   }
 }
  public AbstractJavaCodegen() {
    super();
    modelTemplateFiles.put("model.mustache", ".java");
    apiTemplateFiles.put("api.mustache", ".java");
    apiTestTemplateFiles.put("api_test.mustache", ".java");
    modelDocTemplateFiles.put("model_doc.mustache", ".md");
    apiDocTemplateFiles.put("api_doc.mustache", ".md");

    setReservedWordsLowerCase(
        Arrays.asList(
            // used as internal variables, can collide with parameter names
            "localVarPath",
            "localVarQueryParams",
            "localVarHeaderParams",
            "localVarFormParams",
            "localVarPostBody",
            "localVarAccepts",
            "localVarAccept",
            "localVarContentTypes",
            "localVarContentType",
            "localVarAuthNames",
            "localReturnType",
            "ApiClient",
            "ApiException",
            "ApiResponse",
            "Configuration",
            "StringUtil",

            // language reserved words
            "abstract",
            "continue",
            "for",
            "new",
            "switch",
            "assert",
            "default",
            "if",
            "package",
            "synchronized",
            "boolean",
            "do",
            "goto",
            "private",
            "this",
            "break",
            "double",
            "implements",
            "protected",
            "throw",
            "byte",
            "else",
            "import",
            "public",
            "throws",
            "case",
            "enum",
            "instanceof",
            "return",
            "transient",
            "catch",
            "extends",
            "int",
            "short",
            "try",
            "char",
            "final",
            "interface",
            "static",
            "void",
            "class",
            "finally",
            "long",
            "strictfp",
            "volatile",
            "const",
            "float",
            "native",
            "super",
            "while"));

    languageSpecificPrimitives =
        new HashSet<String>(
            Arrays.asList(
                "String", "boolean", "Boolean", "Double", "Integer", "Long", "Float", "Object",
                "byte[]"));
    instantiationTypes.put("array", "ArrayList");
    instantiationTypes.put("map", "HashMap");
    typeMapping.put("date", "Date");
    typeMapping.put("file", "File");
    typeMapping.put("UUID", "String");

    cliOptions.add(
        new CliOption(CodegenConstants.MODEL_PACKAGE, CodegenConstants.MODEL_PACKAGE_DESC));
    cliOptions.add(new CliOption(CodegenConstants.API_PACKAGE, CodegenConstants.API_PACKAGE_DESC));
    cliOptions.add(
        new CliOption(CodegenConstants.INVOKER_PACKAGE, CodegenConstants.INVOKER_PACKAGE_DESC));
    cliOptions.add(new CliOption(CodegenConstants.GROUP_ID, CodegenConstants.GROUP_ID_DESC));
    cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_ID, CodegenConstants.ARTIFACT_ID_DESC));
    cliOptions.add(
        new CliOption(CodegenConstants.ARTIFACT_VERSION, CodegenConstants.ARTIFACT_VERSION_DESC));
    cliOptions.add(
        new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC));
    cliOptions.add(
        new CliOption(
            CodegenConstants.LOCAL_VARIABLE_PREFIX, CodegenConstants.LOCAL_VARIABLE_PREFIX_DESC));
    cliOptions.add(
        CliOption.newBoolean(
            CodegenConstants.SERIALIZABLE_MODEL, CodegenConstants.SERIALIZABLE_MODEL_DESC));
    cliOptions.add(
        CliOption.newBoolean(
            CodegenConstants.SERIALIZE_BIG_DECIMAL_AS_STRING,
            CodegenConstants.SERIALIZE_BIG_DECIMAL_AS_STRING_DESC));
    cliOptions.add(
        CliOption.newBoolean(
            FULL_JAVA_UTIL,
            "whether to use fully qualified name for classes under java.util. This option only works for Java API client"));
    cliOptions.add(
        new CliOption("hideGenerationTimestamp", "hides the timestamp when files were generated"));

    CliOption dateLibrary = new CliOption(DATE_LIBRARY, "Option. Date library to use");
    Map<String, String> dateOptions = new HashMap<String, String>();
    dateOptions.put("java8", "Java 8 native");
    dateOptions.put("java8-localdatetime", "Java 8 using LocalDateTime (for legacy app only)");
    dateOptions.put("joda", "Joda");
    dateOptions.put("legacy", "Legacy java.util.Date");
    dateLibrary.setEnum(dateOptions);

    cliOptions.add(dateLibrary);
  }
예제 #6
0
  public static void parseCLI(String[] args, Map<String, CliOption> options, List<String> arguments)
      throws IllegalArgumentException {
    List<String> argList = Arrays.asList(args);

    Iterator<String> iter = argList.iterator();
    while (iter.hasNext()) {
      final String arg = iter.next().trim();
      if (arg.startsWith("-")) {
        // option
        final String optName = arg.substring(1);
        final CliOption option = options.get(optName);
        if (option == null) {
          throw new IllegalArgumentException(arg + " is not a valid option");
        }
        switch (option.optType) {
          case SWITCH:
            {
              option.switchValue = true;
              break;
            }
          case STRING:
            {
              if (iter.hasNext()) {
                final String value = iter.next();
                option.stringValue = value.trim();
              } else {
                throw new IllegalArgumentException(arg + " requires a string argument");
              }
              break;
            }
          case NUMBER:
            {
              if (iter.hasNext()) {
                final String value = iter.next();
                try {
                  option.numValue = Long.valueOf(value.trim());
                } catch (NumberFormatException ex) {
                  throw new IllegalArgumentException(
                      arg + " requires a integer argument and " + value + " is not an integer");
                }
              } else {
                throw new IllegalArgumentException(arg + " requires a string argument");
              }
              break;
            }
          case URL:
            {
              if (iter.hasNext()) {
                final String value = iter.next();
                try {
                  final PBRPCServiceURL tmp =
                      new PBRPCServiceURL(value, option.urlDefaultProtocol, option.urlDefaultPort);
                  option.urlValue = tmp;
                } catch (Exception ex) {
                  throw new IllegalArgumentException(ex);
                }
              } else {
                throw new IllegalArgumentException(arg + " requires a string argument");
              }
              break;
            }

          case FILE:
            {
              if (iter.hasNext()) {
                final String value = iter.next();
                try {
                  final File tmp = new File(value);
                  option.fileValue = tmp;
                } catch (Exception ex) {
                  throw new IllegalArgumentException(arg + " requires <protocol>://<host>:<port>");
                }
              } else {
                throw new IllegalArgumentException(arg + " requires a string argument");
              }
              break;
            }
        }
      } else {
        arguments.add(arg);
      }
    }
  }
예제 #7
0
  public CliParser(CliCommand command, List<String> arguments) {
    this.command = command;

    // getOption removes options as it parses them
    ArgumentList argumentList = new ArgumentList(arguments);

    for (CliOption option : command.getOptions()) {
      switches.addAll(option.getSwitchNames());

      List<Map.Entry<String, String>> parsedValues = getOption(option, argumentList);

      if (parsedValues.isEmpty()) {
        if (option.isRequired()) {
          missing.add(option);
        }
      } else if (parsedValues.size() > 1) {
        if (option.isUnique()) {
          duplicates.addAll(parsedValues);
        } else {
          for (String switchName : option.getSwitchNames()) {
            for (Map.Entry<String, String> parsedValue : parsedValues) {
              List<String> switchValues = multiValues.get(switchName);

              if (switchValues == null) {
                switchValues = new ArrayList<>();
                multiValues.put(switchName, switchValues);
              }

              switchValues.add(parsedValue.getValue());
            }
          }
        }
      } else {
        String value = parsedValues.get(0).getValue();

        for (String switchName : option.getSwitchNames()) {
          values.put(switchName, value);
        }
      }
    }

    Iterator<CliParameter> parameters = command.getParameters().iterator();
    Iterator<String> trailingArguments = argumentList.trailing();

    while (parameters.hasNext() && trailingArguments.hasNext()) {
      String name = parameters.next().getName();

      values.put(name, trailingArguments.next());
      trailingArguments.remove();
      switches.add(name);
    }

    while (parameters.hasNext()) {
      CliParameter parameter = parameters.next();

      switches.add(parameter.getName());

      if (parameter.isRequired()) {
        CliOption option = new CliOption.SwitchBuilder().withSwitch(parameter.getName()).build();

        missing.add(option);
      }
    }

    if (command.allowsTrailingParameter()) {
      while (trailingArguments.hasNext()) {
        trailing.add(trailingArguments.next());
        trailingArguments.remove();
      }
    }

    Iterator<String> unexpected = argumentList.remaining();

    while (unexpected.hasNext()) {
      this.unexpected.add(unexpected.next());
    }
  }
  public JavaClientCodegen() {
    super();
    outputFolder = "generated-code" + File.separator + "java";
    modelTemplateFiles.put("model.mustache", ".java");
    apiTemplateFiles.put("api.mustache", ".java");
    embeddedTemplateDir = templateDir = "Java";
    apiPackage = "io.swagger.client.api";
    modelPackage = "io.swagger.client.model";

    setReservedWordsLowerCase(
        Arrays.asList(
            // used as internal variables, can collide with parameter names
            "localVarPath",
            "localVarQueryParams",
            "localVarHeaderParams",
            "localVarFormParams",
            "localVarPostBody",
            "localVarAccepts",
            "localVarAccept",
            "localVarContentTypes",
            "localVarContentType",
            "localVarAuthNames",
            "localReturnType",
            "ApiClient",
            "ApiException",
            "ApiResponse",
            "Configuration",
            "StringUtil",

            // language reserved words
            "abstract",
            "continue",
            "for",
            "new",
            "switch",
            "assert",
            "default",
            "if",
            "package",
            "synchronized",
            "boolean",
            "do",
            "goto",
            "private",
            "this",
            "break",
            "double",
            "implements",
            "protected",
            "throw",
            "byte",
            "else",
            "import",
            "public",
            "throws",
            "case",
            "enum",
            "instanceof",
            "return",
            "transient",
            "catch",
            "extends",
            "int",
            "short",
            "try",
            "char",
            "final",
            "interface",
            "static",
            "void",
            "class",
            "finally",
            "long",
            "strictfp",
            "volatile",
            "const",
            "float",
            "native",
            "super",
            "while"));

    languageSpecificPrimitives =
        new HashSet<String>(
            Arrays.asList(
                "String", "boolean", "Boolean", "Double", "Integer", "Long", "Float", "Object",
                "byte[]"));
    instantiationTypes.put("array", "ArrayList");
    instantiationTypes.put("map", "HashMap");
    typeMapping.put("date", "Date");
    typeMapping.put("file", "File");
    typeMapping.put("UUID", "String");

    cliOptions.add(
        new CliOption(CodegenConstants.MODEL_PACKAGE, CodegenConstants.MODEL_PACKAGE_DESC));
    cliOptions.add(new CliOption(CodegenConstants.API_PACKAGE, CodegenConstants.API_PACKAGE_DESC));
    cliOptions.add(
        new CliOption(CodegenConstants.INVOKER_PACKAGE, CodegenConstants.INVOKER_PACKAGE_DESC));
    cliOptions.add(new CliOption(CodegenConstants.GROUP_ID, CodegenConstants.GROUP_ID_DESC));
    cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_ID, CodegenConstants.ARTIFACT_ID_DESC));
    cliOptions.add(
        new CliOption(CodegenConstants.ARTIFACT_VERSION, CodegenConstants.ARTIFACT_VERSION_DESC));
    cliOptions.add(
        new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC));
    cliOptions.add(
        new CliOption(
            CodegenConstants.LOCAL_VARIABLE_PREFIX, CodegenConstants.LOCAL_VARIABLE_PREFIX_DESC));
    cliOptions.add(
        CliOption.newBoolean(
            CodegenConstants.SERIALIZABLE_MODEL, CodegenConstants.SERIALIZABLE_MODEL_DESC));
    cliOptions.add(
        CliOption.newBoolean(
            CodegenConstants.SERIALIZE_BIG_DECIMAL_AS_STRING,
            CodegenConstants.SERIALIZE_BIG_DECIMAL_AS_STRING_DESC));
    cliOptions.add(
        CliOption.newBoolean(
            FULL_JAVA_UTIL, "whether to use fully qualified name for classes under java.util"));
    cliOptions.add(
        CliOption.newBoolean(
            USE_RX_JAVA, "Whether to use the RxJava adapter with the retrofit2 library."));
    cliOptions.add(
        new CliOption("hideGenerationTimestamp", "hides the timestamp when files were generated"));

    supportedLibraries.put(
        DEFAULT_LIBRARY, "HTTP client: Jersey client 1.18. JSON processing: Jackson 2.4.2");
    supportedLibraries.put("feign", "HTTP client: Netflix Feign 8.1.1");
    supportedLibraries.put("jersey2", "HTTP client: Jersey client 2.6");
    supportedLibraries.put("okhttp-gson", "HTTP client: OkHttp 2.4.0. JSON processing: Gson 2.3.1");
    supportedLibraries.put(
        RETROFIT_1, "HTTP client: OkHttp 2.4.0. JSON processing: Gson 2.3.1 (Retrofit 1.9.0)");
    supportedLibraries.put(
        RETROFIT_2,
        "HTTP client: OkHttp 2.5.0. JSON processing: Gson 2.4 (Retrofit 2.0.1). Enable the RxJava adapter using '-DuseRxJava=true'. (RxJava 1.1.2)");

    CliOption library =
        new CliOption(CodegenConstants.LIBRARY, "library template (sub-template) to use");
    library.setDefault(DEFAULT_LIBRARY);
    library.setEnum(supportedLibraries);
    library.setDefault(DEFAULT_LIBRARY);
    cliOptions.add(library);

    CliOption dateLibrary = new CliOption(DATE_LIBRARY, "Option. Date library to use");
    Map<String, String> dateOptions = new HashMap<String, String>();
    dateOptions.put("java8", "Java 8 native");
    dateOptions.put("joda", "Joda");
    dateLibrary.setEnum(dateOptions);

    cliOptions.add(dateLibrary);
  }
예제 #9
0
  public JavaClientCodegen() {
    super();
    outputFolder = "generated-code" + File.separator + "java";
    modelTemplateFiles.put("model.mustache", ".java");
    apiTemplateFiles.put("api.mustache", ".java");
    embeddedTemplateDir = templateDir = "Java";
    apiPackage = "io.swagger.client.api";
    modelPackage = "io.swagger.client.model";

    reservedWords =
        new HashSet<String>(
            Arrays.asList(
                // used as internal variables, can collide with parameter names
                "path",
                "queryParams",
                "headerParams",
                "formParams",
                "postBody",
                "accepts",
                "accept",
                "contentTypes",
                "contentType",
                "authNames",

                // language reserved words
                "abstract",
                "continue",
                "for",
                "new",
                "switch",
                "assert",
                "default",
                "if",
                "package",
                "synchronized",
                "boolean",
                "do",
                "goto",
                "private",
                "this",
                "break",
                "double",
                "implements",
                "protected",
                "throw",
                "byte",
                "else",
                "import",
                "public",
                "throws",
                "case",
                "enum",
                "instanceof",
                "return",
                "transient",
                "catch",
                "extends",
                "int",
                "short",
                "try",
                "char",
                "final",
                "interface",
                "static",
                "void",
                "class",
                "finally",
                "long",
                "strictfp",
                "volatile",
                "const",
                "float",
                "native",
                "super",
                "while"));

    languageSpecificPrimitives =
        new HashSet<String>(
            Arrays.asList(
                "String", "boolean", "Boolean", "Double", "Integer", "Long", "Float", "Object",
                "byte[]"));
    instantiationTypes.put("array", "ArrayList");
    instantiationTypes.put("map", "HashMap");

    cliOptions.add(
        new CliOption(CodegenConstants.MODEL_PACKAGE, CodegenConstants.MODEL_PACKAGE_DESC));
    cliOptions.add(new CliOption(CodegenConstants.API_PACKAGE, CodegenConstants.API_PACKAGE_DESC));
    cliOptions.add(
        new CliOption(CodegenConstants.INVOKER_PACKAGE, CodegenConstants.INVOKER_PACKAGE_DESC));
    cliOptions.add(new CliOption(CodegenConstants.GROUP_ID, CodegenConstants.GROUP_ID_DESC));
    cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_ID, CodegenConstants.ARTIFACT_ID_DESC));
    cliOptions.add(
        new CliOption(CodegenConstants.ARTIFACT_VERSION, CodegenConstants.ARTIFACT_VERSION_DESC));
    cliOptions.add(
        new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC));
    cliOptions.add(
        new CliOption(
            CodegenConstants.LOCAL_VARIABLE_PREFIX, CodegenConstants.LOCAL_VARIABLE_PREFIX_DESC));
    cliOptions.add(
        CliOption.newBoolean(
            CodegenConstants.SERIALIZABLE_MODEL, CodegenConstants.SERIALIZABLE_MODEL_DESC));
    cliOptions.add(
        CliOption.newBoolean(
            CodegenConstants.SERIALIZE_BIG_DECIMAL_AS_STRING,
            CodegenConstants.SERIALIZE_BIG_DECIMAL_AS_STRING_DESC));
    cliOptions.add(
        CliOption.newBoolean(
            FULL_JAVA_UTIL, "whether to use fully qualified name for classes under java.util"));

    supportedLibraries.put(
        DEFAULT_LIBRARY, "HTTP client: Jersey client 1.18. JSON processing: Jackson 2.4.2");
    supportedLibraries.put("feign", "HTTP client: Netflix Feign 8.1.1");
    supportedLibraries.put("jersey2", "HTTP client: Jersey client 2.6");
    supportedLibraries.put("okhttp-gson", "HTTP client: OkHttp 2.4.0. JSON processing: Gson 2.3.1");
    supportedLibraries.put(
        "retrofit", "HTTP client: OkHttp 2.4.0. JSON processing: Gson 2.3.1 (Retrofit 1.9.0)");
    supportedLibraries.put(
        "retrofit2", "HTTP client: OkHttp 2.5.0. JSON processing: Gson 2.4 (Retrofit 2.0.0-beta2)");
    CliOption library =
        new CliOption(CodegenConstants.LIBRARY, "library template (sub-template) to use");
    library.setDefault(DEFAULT_LIBRARY);
    library.setEnum(supportedLibraries);
    library.setDefault(DEFAULT_LIBRARY);
    cliOptions.add(library);
  }