churchyard / rpms / maven

Forked from rpms/maven 5 years ago
Clone
Stanislav Ochotnicky 1ae9fb1
package org.apache.maven.artifact.repository;
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
import java.io.FileNotFoundException;
Stanislav Ochotnicky 1ae9fb1
import java.io.IOException;
Stanislav Ochotnicky 1ae9fb1
import java.util.Hashtable;
Stanislav Ochotnicky 1ae9fb1
import java.util.StringTokenizer;
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
import javax.xml.parsers.DocumentBuilder;
Stanislav Ochotnicky 1ae9fb1
import javax.xml.parsers.DocumentBuilderFactory;
Stanislav Ochotnicky 1ae9fb1
import javax.xml.parsers.ParserConfigurationException;
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
import org.xml.sax.SAXException;
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
import org.w3c.dom.*;
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
public class MavenJPackageDepmap {
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
	private static class ArtifactDefinition {
Stanislav Ochotnicky 1ae9fb1
		String groupId = null;
Stanislav Ochotnicky 1ae9fb1
		String artifactId = null;
Stanislav Ochotnicky 1ae9fb1
		String version = null;
Stanislav Ochotnicky 1ae9fb1
	}
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
	private static  MavenJPackageDepmap instance;
Stanislav Ochotnicky 1ae9fb1
	private static Hashtable<String, String> jppArtifactMap;
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
	private MavenJPackageDepmap() {
Stanislav Ochotnicky 1ae9fb1
		jppArtifactMap = new Hashtable<String,String>();
Stanislav Ochotnicky 1ae9fb1
		buildJppArtifactMap();
Stanislav Ochotnicky 1ae9fb1
	}
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
	public static MavenJPackageDepmap getInstance() {
Stanislav Ochotnicky 1ae9fb1
		if (instance == null) {
Stanislav Ochotnicky 1ae9fb1
			instance = new MavenJPackageDepmap();
Stanislav Ochotnicky 1ae9fb1
		}
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
		return instance;
Stanislav Ochotnicky 1ae9fb1
	}
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
	public Hashtable<String, String> getMappedInfo(Hashtable<String, String> mavenDep) {
Stanislav Ochotnicky 1ae9fb1
		return getMappedInfo((String) mavenDep.get("group"),
Stanislav Ochotnicky 1ae9fb1
				(String) mavenDep.get("artifact"),
Stanislav Ochotnicky 1ae9fb1
				(String) mavenDep.get("version"));
Stanislav Ochotnicky 1ae9fb1
	}
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
	public Hashtable<String, String> getMappedInfo(String groupId, String artifactId, String version) {
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
		Hashtable<String, String> jppDep;
Stanislav Ochotnicky 1ae9fb1
		String idToCheck, jppCombination;
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky f5501c5
		if (System.getProperty("maven.ignore.versions") == null && System.getProperty("maven.local.mode") == null) {
Stanislav Ochotnicky 1ae9fb1
			idToCheck = groupId+","+artifactId+","+version;
Stanislav Ochotnicky 1ae9fb1
		} else {
Stanislav Ochotnicky 1ae9fb1
			idToCheck = groupId+","+artifactId;
Stanislav Ochotnicky 1ae9fb1
		}
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
		jppCombination = (String) jppArtifactMap.get(idToCheck);
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
		//System.err.println("*** " + groupId+","+artifactId+","+version + " => " + jppCombination);
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
		jppDep = new Hashtable<String, String>();
Stanislav Ochotnicky 1ae9fb1
		if (jppCombination != null && jppCombination != "") {
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
			StringTokenizer st = new StringTokenizer(jppCombination, ",");
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
			jppDep.put("group", st.nextToken());
Stanislav Ochotnicky 1ae9fb1
			jppDep.put("artifact",st.nextToken());
Stanislav Ochotnicky 1ae9fb1
			jppDep.put("version",st.nextToken());
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
		} else {
Stanislav Ochotnicky 1ae9fb1
			jppDep.put("group", groupId);
Stanislav Ochotnicky 1ae9fb1
			jppDep.put("artifact", artifactId);
Stanislav Ochotnicky 1ae9fb1
			jppDep.put("version", version);
Stanislav Ochotnicky 1ae9fb1
		}
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
		return jppDep;
Stanislav Ochotnicky 1ae9fb1
	}
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
	/**
Stanislav Ochotnicky 1ae9fb1
	 *	Returns whether or not the given dependency should be dropped.
Stanislav Ochotnicky 1ae9fb1
	 */
Stanislav Ochotnicky 1ae9fb1
	public boolean shouldEliminate(String groupId, String artifactId, String version) {
Stanislav Ochotnicky 1ae9fb1
		String idToCheck;
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky f5501c5
		if (System.getProperty("maven.ignore.versions") == null && System.getProperty("maven.local.mode") == null) {
Stanislav Ochotnicky 1ae9fb1
			idToCheck = groupId+","+artifactId+","+version;
Stanislav Ochotnicky 1ae9fb1
		} else {
Stanislav Ochotnicky 1ae9fb1
			idToCheck = groupId+","+artifactId;
Stanislav Ochotnicky 1ae9fb1
		}
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
		return jppArtifactMap.get(idToCheck) != null && jppArtifactMap.get(idToCheck).equals("");
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
	}
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
	private static void buildJppArtifactMap() {
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky f5501c5
		if (System.getProperty("maven.ignore.versions") != null || System.getProperty("maven.local.mode") != null) {
Stanislav Ochotnicky 1ae9fb1
			debug("Processing file: /usr/share/java-utils/xml/maven2-versionless-depmap.xml");
Stanislav Ochotnicky 1ae9fb1
			processDepmapFile("/etc/maven/maven2-versionless-depmap.xml");
Stanislav Ochotnicky 1ae9fb1
		}
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
		debug("Processing file: /usr/share/java-utils/xml/maven2-depmap.xml");
Stanislav Ochotnicky 1ae9fb1
		processDepmapFile("/etc/maven/maven2-depmap.xml");
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky f5501c5
		String customFileName = System.getProperty("maven.local.depmap.file", null);
Stanislav Ochotnicky 1ae9fb1
		if (customFileName != null) {
Stanislav Ochotnicky 1ae9fb1
			debug("Processing file: " + customFileName);
Stanislav Ochotnicky 1ae9fb1
			processDepmapFile(customFileName);
Stanislav Ochotnicky 1ae9fb1
		}
Stanislav Ochotnicky 1ae9fb1
	}
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
	private static void processDepmapFile(String fileName) {
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
		Document mapDocument;
Stanislav Ochotnicky 1ae9fb1
		debug("Loading depmap file: " + fileName);
Stanislav Ochotnicky 1ae9fb1
		try {
Stanislav Ochotnicky 1ae9fb1
			DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
Stanislav Ochotnicky 1ae9fb1
			fact.setNamespaceAware(true);
Stanislav Ochotnicky 1ae9fb1
			DocumentBuilder builder = fact.newDocumentBuilder();
Stanislav Ochotnicky 1ae9fb1
			mapDocument = builder.parse(fileName);
Stanislav Ochotnicky 1ae9fb1
		} catch (FileNotFoundException fnfe) {
Stanislav Ochotnicky 1ae9fb1
			System.err.println("ERROR: Unable to find map file: " + fileName);
Stanislav Ochotnicky 1ae9fb1
			fnfe.printStackTrace();
Stanislav Ochotnicky 1ae9fb1
			return;
Stanislav Ochotnicky 1ae9fb1
		} catch (IOException ioe) {
Stanislav Ochotnicky 1ae9fb1
			System.err.println("ERROR: I/O exception occured when opening map file");
Stanislav Ochotnicky 1ae9fb1
			ioe.printStackTrace();
Stanislav Ochotnicky 1ae9fb1
			return;
Stanislav Ochotnicky 1ae9fb1
		} catch (ParserConfigurationException pce) {
Stanislav Ochotnicky 1ae9fb1
			System.err.println("ERROR: Parsing of depmap file failed - configuration");
Stanislav Ochotnicky 1ae9fb1
			pce.printStackTrace();
Stanislav Ochotnicky 1ae9fb1
			return;
Stanislav Ochotnicky 1ae9fb1
		} catch (SAXException se) {
Stanislav Ochotnicky 1ae9fb1
			System.err.println("ERROR: Parsing of depmap file failed");
Stanislav Ochotnicky 1ae9fb1
			se.printStackTrace();
Stanislav Ochotnicky 1ae9fb1
			return;
Stanislav Ochotnicky 1ae9fb1
		}
Stanislav Ochotnicky 1ae9fb1
		
Stanislav Ochotnicky 1ae9fb1
		NodeList depNodes = (NodeList) mapDocument.getElementsByTagName("dependency");
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
		for (int i = 0; i < depNodes.getLength(); i++) {
Stanislav Ochotnicky 1ae9fb1
			Element depNode = (Element) depNodes.item(i);
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
			NodeList mavenNodeList = (NodeList) depNode.getElementsByTagName("maven");
Stanislav Ochotnicky 1ae9fb1
			if (mavenNodeList.getLength() != 1) {
Stanislav Ochotnicky 1ae9fb1
				debug("Number of maven sub-elements is not 1. Bailing from depmap generation");
Stanislav Ochotnicky 1ae9fb1
				debug("Maven node: " + depNode.getTextContent());
Stanislav Ochotnicky 1ae9fb1
				return;
Stanislav Ochotnicky 1ae9fb1
			}
Stanislav Ochotnicky 1ae9fb1
			ArtifactDefinition mavenAD = getArtifactDefinition((Element) mavenNodeList.item(0));
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
			ArtifactDefinition jppAD = null;
Stanislav Ochotnicky 1ae9fb1
			NodeList jppNodeList = (NodeList) depNode.getElementsByTagName("jpp");
Stanislav Ochotnicky 1ae9fb1
			
Stanislav Ochotnicky 1ae9fb1
			if (jppNodeList.getLength() == 1) {
Stanislav Ochotnicky 1ae9fb1
				jppAD = getArtifactDefinition((Element) jppNodeList.item(0));
Stanislav Ochotnicky f5501c5
				if (System.getProperty("maven.ignore.versions") == null && System.getProperty("maven.local.mode") == null) {
Stanislav Ochotnicky 1ae9fb1
					debug("*** Adding: " + mavenAD.groupId + "," + mavenAD.artifactId + "," + mavenAD.version + " => "
Stanislav Ochotnicky 1ae9fb1
							+  jppAD.groupId + "," + jppAD.artifactId + "," + jppAD.version + " to map...");
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
					jppArtifactMap.put(mavenAD.groupId + "," + mavenAD.artifactId + "," + mavenAD.version,
Stanislav Ochotnicky 1ae9fb1
							jppAD.groupId + "," + jppAD.artifactId + "," + jppAD.version);
Stanislav Ochotnicky 1ae9fb1
				} else {
Stanislav Ochotnicky 1ae9fb1
					debug("*** Adding: " + mavenAD.groupId+"," + mavenAD.artifactId + " => " 
Stanislav Ochotnicky 1ae9fb1
							+  jppAD.groupId + "," + jppAD.artifactId + "," + jppAD.version + " to map...");
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
					jppArtifactMap.put(mavenAD.groupId+","+mavenAD.artifactId, 
Stanislav Ochotnicky 1ae9fb1
							jppAD.groupId + "," + jppAD.artifactId + "," + jppAD.version);
Stanislav Ochotnicky 1ae9fb1
				}
Stanislav Ochotnicky 1ae9fb1
			} else {
Stanislav Ochotnicky 1ae9fb1
				debug("Number of jpp sub-elements is not 1. Dropping dependency");
Stanislav Ochotnicky 1ae9fb1
				debug("*** Adding: " + mavenAD.groupId+","+mavenAD.artifactId+"," + " => " +  "JPP/maven2,empty-dep,"+mavenAD.version + " to map...");
Stanislav Ochotnicky 1ae9fb1
				jppArtifactMap.put(mavenAD.groupId+","+mavenAD.artifactId, "JPP/maven2,empty-dep,"+mavenAD.version);
Stanislav Ochotnicky 1ae9fb1
			}
Stanislav Ochotnicky 1ae9fb1
		} 
Stanislav Ochotnicky 1ae9fb1
	}
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
	private static ArtifactDefinition getArtifactDefinition(Element element) {
Stanislav Ochotnicky 1ae9fb1
		ArtifactDefinition ad = new ArtifactDefinition();
Stanislav Ochotnicky 1ae9fb1
		
Stanislav Ochotnicky 1ae9fb1
		NodeList nodes = element.getElementsByTagName("groupId");
Stanislav Ochotnicky 1ae9fb1
		if (nodes.getLength() != 1) {
Stanislav Ochotnicky 1ae9fb1
			debug("groupId definition not found in depmap");
Stanislav Ochotnicky 1ae9fb1
			return null;
Stanislav Ochotnicky 1ae9fb1
		}
Stanislav Ochotnicky 1ae9fb1
		ad.groupId = nodes.item(0).getTextContent();
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
		nodes = element.getElementsByTagName("artifactId");
Stanislav Ochotnicky 1ae9fb1
		if (nodes.getLength() != 1) {
Stanislav Ochotnicky 1ae9fb1
			debug("artifactId definition not found in depmap");
Stanislav Ochotnicky 1ae9fb1
			return null;
Stanislav Ochotnicky 1ae9fb1
		}
Stanislav Ochotnicky 1ae9fb1
		ad.artifactId = nodes.item(0).getTextContent();
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
		nodes = element.getElementsByTagName("version");
Stanislav Ochotnicky 1ae9fb1
		if (nodes.getLength() != 1) {
Stanislav Ochotnicky 1ae9fb1
			ad.version = "DUMMY_VER";
Stanislav Ochotnicky 1ae9fb1
		} else {
Stanislav Ochotnicky 1ae9fb1
			ad.version = nodes.item(0).getTextContent();
Stanislav Ochotnicky 1ae9fb1
		}
Stanislav Ochotnicky 1ae9fb1
		return ad;
Stanislav Ochotnicky 1ae9fb1
	}
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
Stanislav Ochotnicky 1ae9fb1
	public static void debug(String msg) {
Stanislav Ochotnicky f5501c5
		if (System.getProperty("maven.local.debug") != null)
Stanislav Ochotnicky 1ae9fb1
			System.err.println(msg);
Stanislav Ochotnicky 1ae9fb1
	}
Stanislav Ochotnicky 1ae9fb1
}