File downloadOrCreateReferenceBuildinfo()

in src/main/java/org/apache/maven/plugins/artifact/buildinfo/ReferenceBuildinfoUtil.java [102:200]


    File downloadOrCreateReferenceBuildinfo(
            RemoteRepository repo, MavenProject project, File buildinfoFile, boolean mono)
            throws MojoExecutionException {
        File referenceBuildinfo = downloadReferenceBuildinfo(repo, project);

        if (referenceBuildinfo != null) {
            log.warn("dropping downloaded reference buildinfo because it may be generated"
                    + " from different maven-artifact-plugin release...");
            // TODO keep a save?
            referenceBuildinfo = null;
        }

        // download reference artifacts and guess Java version and OS
        String javaVersion = null;
        String osName = null;
        String currentJavaVersion = null;
        String currentOsName = null;
        Map<Artifact, File> referenceArtifacts = new HashMap<>();
        for (Artifact artifact : artifacts.keySet()) {
            try {
                // download
                File file = downloadReference(repo, artifact);
                referenceArtifacts.put(artifact, file);

                // guess Java version and OS
                if ((javaVersion == null) && JAR_EXTENSIONS.contains(artifact.getExtension())) {
                    ReproducibleEnv env = extractEnv(file, artifact);
                    if ((env != null) && (env.javaVersion != null)) {
                        javaVersion = env.javaVersion;
                        osName = env.osName;

                        ReproducibleEnv currentEnv = extractEnv(artifact.getFile(), artifact);
                        currentJavaVersion = currentEnv.javaVersion;
                        currentOsName = currentEnv.osName;
                    }
                }
            } catch (ArtifactResolutionException e) {
                log.warn("Reference artifact not found " + artifact);
            }
        }

        try {
            // generate buildinfo from reference artifacts
            referenceBuildinfo = getReference(null, buildinfoFile);
            try (PrintWriter p = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
                    Files.newOutputStream(referenceBuildinfo.toPath()), StandardCharsets.UTF_8)))) {
                BuildInfoWriter bi = new BuildInfoWriter(log, p, mono, rtInformation);

                if (javaVersion != null || osName != null) {
                    p.println("# effective build environment information");
                    if (javaVersion != null) {
                        p.println("java.version=" + javaVersion);
                        log.info("Reference build java.version: " + javaVersion);
                        if (!javaVersion.equals(currentJavaVersion)) {
                            log.error("Current build java.version: " + currentJavaVersion);
                        }
                    }
                    if (osName != null) {
                        p.println("os.name=" + osName);
                        log.info("Reference build os.name: " + osName);

                        // check against current line separator
                        if (!osName.equals(currentOsName)) {
                            log.error("Current build os.name: " + currentOsName);
                        }
                        String expectedLs = osName.startsWith("Windows") ? "\r\n" : "\n";
                        if (!expectedLs.equals(System.lineSeparator())) {
                            log.warn("Current System.lineSeparator() does not match reference build OS");

                            String ls = System.getProperty("line.separator");
                            if (!ls.equals(System.lineSeparator())) {
                                log.warn("System.lineSeparator() != System.getProperty( \"line.separator\" ): "
                                        + "too late standard system property update...");
                            }
                        }
                    }
                }

                for (Map.Entry<Artifact, String> entry : artifacts.entrySet()) {
                    Artifact artifact = entry.getKey();
                    String prefix = entry.getValue();
                    File referenceFile = referenceArtifacts.get(artifact);
                    if (referenceFile != null) {
                        bi.printFile(prefix, artifact.getGroupId(), referenceFile);
                    }
                }

                if (p.checkError()) {
                    throw new MojoExecutionException("Write error to " + referenceBuildinfo);
                }

                log.info("Minimal buildinfo generated from downloaded artifacts: " + referenceBuildinfo);
            }
        } catch (IOException e) {
            throw new MojoExecutionException("Error creating file " + referenceBuildinfo, e);
        }

        return referenceBuildinfo;
    }