All Downloads are FREE. Search and download functionalities are using the official Maven repository.

aQute.maven.provider.PomGenerator Maven / Gradle / Ivy

There is a newer version: 7.1.0
Show newest version
package aQute.maven.provider;

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.util.Collection;
import java.util.Iterator;
import java.util.TreeSet;

import aQute.lib.tag.Tag;
import aQute.maven.api.Archive;
import aQute.maven.api.Revision;

/**
 * Generate a POM with the contents of the repository as dependencies
 */
public class PomGenerator {

	private Revision			name;
	private Revision			parent;
	private boolean				dependencyManagement;
	private Collection	dependencies;

	public PomGenerator(Collection dependencies) {
		this.dependencies = dependencies;
	}

	public PomGenerator name(Revision name) {
		this.name = name;
		return this;
	}

	public PomGenerator parent(Revision name) {
		this.parent = name;
		return this;
	}

	public PomGenerator dependencyManagement(boolean value) {
		this.dependencyManagement = value;
		return this;
	}

	public void out(OutputStream out) throws IOException {
		try (Writer w = new OutputStreamWriter(out, StandardCharsets.UTF_8)) {
			PrintWriter pw = new PrintWriter(w);
			pw.println("");
			Tag tag = build();
			tag.print(1, pw);
		}
	}

	public Tag build() {
		prune();
		Tag project = new Tag("project");
		project.addAttribute("xmlns", "http://maven.apache.org/POM/4.0.0");
		project.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
		project.addAttribute("xsi:schemaLocation",
			"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd");

		new Tag(project, "modelVersion", "4.0.0");

		if (parent != null) {
			Tag parent = new Tag(project, "parent");
			gav(parent, this.parent);
		}

		gav(project, name);

		Tag depType;
		if (dependencyManagement) {
			depType = new Tag(project, "dependencyManagement");
		} else
			depType = project;

		Tag dependencies = new Tag(depType, "dependencies");

		for (Archive dep : this.dependencies) {
			Tag dependency = new Tag(dependencies, "dependency");
			gav(dependency, dep.revision);
			if (dep.hasClassifier())
				new Tag(dependency, "classifier", dep.classifier);
			if (dep.hasExtension())
				new Tag(dependency, "type", dep.extension);

			if (!dependencyManagement)
				new Tag(dependency, "scope", "runtime");
		}

		return project;
	}

	private void prune() {
		TreeSet s = new TreeSet<>(dependencies);
		Archive prev = null;

		for (Iterator i = s.iterator(); i.hasNext();) {
			Archive a = i.next();
			boolean sameProgram = prev != null && prev.revision.program.equals(a.revision.program);
			if (sameProgram) {
				System.out.println("Skipping " + a);
				i.remove();
			} else
				prev = a;
		}
		dependencies = s;
	}

	private void gav(Tag parent, Revision name) {
		new Tag(parent, "groupId", name.group);
		new Tag(parent, "artifactId", name.artifact);
		new Tag(parent, "version", name.version);
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy