/** Generate classes needed for the model and API invocation */
  public void generateCode() {
    apiMarshaller =
        new SwaggerResourceDocReader(
            this.config, this.getDataTypeMappingProvider(), this.getNameGenerator());
    // read resources and get their documentation
    List<Resource> resources = apiMarshaller.readResourceDocumentation();
    preprocess(resources);
    StringTemplateGroup aTemplateGroup =
        new StringTemplateGroup("templates", languageConfig.getTemplateLocation());
    if (resources.size() > 0) {
      generateVersionHelper(resources.get(0).getApiVersion(), aTemplateGroup);
    }
    generateModelClasses(resources, aTemplateGroup);
    generateModelClassesForInput(resources, aTemplateGroup);
    if (languageConfig.isModelEnumRequired()) {
      generateEnumForAllowedValues(resources, aTemplateGroup);
    }

    if (languageConfig.isOutputWrapperRequired()) {
      generateOutputWrappers(resources, aTemplateGroup);
    }
    generateAPIClasses(resources, aTemplateGroup);
    generateMiscClasses(resources, aTemplateGroup);
  }