class JavaGeneratorMojo extends AbstractMojo {

  @Parameter(defaultValue = "${project}")
  private MavenProject project;

  /**
   * The input file or directory to be used for generating sources
   *
   */
  @Parameter(property = "fabric8.java-generator.source")
  File source;

  /**
   * The URLs to be used to download CRDs from remote locations
   */
  @Parameter(property = "fabric8.java-generator.urls", required = false)
  String[] urls;

  /**
   * The Download target folder for CRDs downloaded from remote URLs
   *
   */
  @Parameter(property = "fabric8.java-generator.download-target", defaultValue = "${basedir}/target/manifests")
  File downloadTarget;

  /**
   * The target folder to generate the Java sources
   *
   */
  @Parameter(property = "fabric8.java-generator.target", defaultValue = "${basedir}/target/generated-sources/java")
  File target;

  /**
   * Generate uppercase Enums
   *
   */
  @Parameter(property = "fabric8.java-generator.enum-uppercase", required = false)
  Boolean enumUppercase = null;

  /**
   * Generate Extra annotation for lombok and sundrio integration
   *
   */
  @Parameter(property = "fabric8.java-generator.extra-annotations", required = false)
  Boolean extraAnnotations = null;

  /**
   * *advanced* Emit the @javax.annotation.processing.Generated annotation on the generated sources
   *
   */
  @Parameter(property = "fabric8.java-generator.generated-annotations", required = false)
  Boolean generatedAnnotations = null;

  /**
   * Always preserve unknown fields in the generated classes by emitting an additionalProperties field
   *
   */
  @Parameter(property = "fabric8.java-generator.always-preserve-unknown", required = false)
  Boolean alwaysPreserveUnknown = null;

  /**
   * Package names to be substituted
   *
   */
  @Parameter(property = "fabric8.java-generator.package-overrides", required = false)
  Map<String, String> packageOverrides = null;

  /**
   * Files suffixes to be processed
   *
   */
  @Parameter(property = "fabric8.java-generator.files-suffixes", required = false)
  List<String> filesSuffixes = null;

  /**
   * DateTime format used for Serialization of fields of type `date-time`
   *
   */
  @Parameter(property = "fabric8.java-generator.datetime-serialization-format", required = false)
  String datetimeSerializationFormat = null;

  /**
   * DateTime format used for Deserialization of fields of type `date-time`
   *
   */
  @Parameter(property = "fabric8.java-generator.datetime-deserialization-format", required = false)
  String datetimeDeserializationFormat = null;

  /**
   * Mapping from fully qualified generated type to fully qualified existing Java type
   *
   */
  @Parameter(property = "fabric8.java-generator.existing-java-types", required = false)
  Map<String, String> existingJavaTypes = null;

  @Override
  public void execute() throws MojoExecutionException {<FILL_FUNCTION_BODY>}
}

    final Config config = Config.builder()
        .uppercaseEnums(enumUppercase)
        .objectExtraAnnotations(extraAnnotations)
        .generatedAnnotations(generatedAnnotations)
        .alwaysPreserveUnknown(alwaysPreserveUnknown)
        .packageOverrides(packageOverrides)
        .filesSuffixes(filesSuffixes)
        .serDatetimeFormat(datetimeSerializationFormat)
        .deserDatetimeFormat(datetimeDeserializationFormat)
        .existingJavaTypes(existingJavaTypes)
        .build();

    List<JavaGenerator> runners = new ArrayList<>();

    if (urls != null && urls.length > 0) {
      final List<URL> urlList = new ArrayList<>();
      for (String url : urls) {
        try {
          urlList.add(new URL(url));
        } catch (MalformedURLException e) {
          throw new MojoExecutionException("URL '" + url + "' is not valid", e);
        }
      }
      if (!downloadTarget.isDirectory()) {
        downloadTarget.mkdirs();
      }
      runners.add(new URLJavaGenerator(config, urlList, downloadTarget));
    }

    if (source != null) {
      runners.add(new FileJavaGenerator(config, source));
    }

    if (runners.isEmpty()) {
      throw new MojoExecutionException("No source or urls specified");
    }

    runners.forEach(r -> r.run(target));
    project.addCompileSourceRoot(target.getAbsolutePath());
  
<no_super_class>