blob: 69e3fafcf9324f44a209b2b7838a85c9c7631357 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package common;
import java.io.*;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONObject;
import org.codehaus.jettison.json.JSONTokener;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
/**
* Created with IntelliJ IDEA.
* User: cdutz
* Date: 11.05.12
* Time: 14:53
*/
public abstract class BaseGenerator {
protected static final Map<String, MavenMetadata> checksums = new HashMap<String, MavenMetadata>();
protected static final String MAVEN_SCHEMA_URI = "http://maven.apache.org/POM/4.0.0";
protected static final String MAVEN_CENTRAL_SHA_1_QUERY_URL = "http://search.maven.org/solrsearch/select?rows=20&wt=json&q=1:";
// Artifactory: "http://server:port/artifactory/api/search/checksum?repos=libs-release-local&md5=04040c7c184620af0a0a8a3682a75eb7
// Nexus: "http://repository.sonatype.org/service/local/data_index?a=04040c7c184620af0a0a8a3682a75eb7"
abstract public void process(File sdkSourceDirectory, boolean isApache, File sdkTargetDirectory, String sdkVersion, boolean useApache)
throws Exception;
protected String calculateChecksum(File jarFile) throws Exception {
// Implement the calculation of checksums for a given jar.
final MessageDigest digest = MessageDigest.getInstance("SHA-1");
final InputStream is = new FileInputStream(jarFile);
final byte[] buffer = new byte[8192];
int read;
try {
while( (read = is.read(buffer)) > 0) {
digest.update(buffer, 0, read);
}
final byte[] md5sum = digest.digest();
final BigInteger bigInt = new BigInteger(1, md5sum);
return bigInt.toString(16);
}
catch(IOException e) {
throw new RuntimeException("Unable to process file for MD5", e);
}
finally {
try {
is.close();
}
catch(IOException e) {
//noinspection ThrowFromFinallyBlock
throw new RuntimeException("Unable to close input stream for MD5 calculation", e);
}
}
}
protected MavenMetadata lookupMetadataForChecksum(String checksum) throws Exception {
final String queryUrl = MAVEN_CENTRAL_SHA_1_QUERY_URL + checksum;
final Client client = Client.create();
final WebResource webResource = client.resource(queryUrl);
final ClientResponse response = webResource.accept("application/json").get(ClientResponse.class);
if (response.getStatus() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + response.getStatus());
}
final String output = response.getEntity(String.class);
final BufferedReader reader = new BufferedReader(new StringReader(output));
final StringBuilder builder = new StringBuilder();
for (String line; (line = reader.readLine()) != null; ) {
builder.append(line).append("\n");
}
final JSONTokener tokener = new JSONTokener(builder.toString());
final JSONObject rootObject = new JSONObject(tokener);
final JSONObject responseObject = (JSONObject) rootObject.get("response");
final int numFound = (Integer) responseObject.get("numFound");
if(numFound == 0) {
return null;
}
else if(numFound == 1) {
final JSONArray docs = (JSONArray) responseObject.get("docs");
final JSONObject firstHit = (JSONObject) docs.get(0);
final MavenMetadata artifactMetadata = new MavenMetadata();
artifactMetadata.groupId = (String) firstHit.get("g");
artifactMetadata.artifactId = (String) firstHit.get("a");
artifactMetadata.version = (String) firstHit.get("v");
artifactMetadata.packaging = (String) firstHit.get("p");
return artifactMetadata;
} else {
long newestTimestamp = 0;
JSONObject newestVersion = null;
JSONArray options = (JSONArray) responseObject.get("docs");
// if the "groupId" is "batik" then use the newer version.
for(int i = 0; i < numFound; i++) {
final JSONObject option = (JSONObject) options.get(0);
if("batik".equals(option.get("g")) && "batik-dom".equals(option.get("a")) && "jar".equals(option.get("p"))) {
final long timestamp = (Long) option.get("timestamp");
if(timestamp > newestTimestamp) {
newestTimestamp = timestamp;
newestVersion = option;
}
}
}
if(newestVersion != null) {
final MavenMetadata artifactMetadata = new MavenMetadata();
artifactMetadata.groupId = (String) newestVersion.get("g");
artifactMetadata.artifactId = (String) newestVersion.get("a");
artifactMetadata.version = (String) newestVersion.get("v");
artifactMetadata.packaging = (String) newestVersion.get("p");
return artifactMetadata;
} else {
System.out.println("For jar-file with checksum: " + checksum +
" more than one result was returned by query: " + queryUrl);
}
}
return null;
}
protected void copyFile(File source, File target) throws Exception {
InputStream in = new FileInputStream(source);
OutputStream out = new FileOutputStream(target);
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0){
out.write(buf, 0, len);
}
in.close();
out.close();
}
protected void appendArtifact(MavenMetadata artifactMetadata, Element dependencies) {
final Document doc = dependencies.getOwnerDocument();
final Element dependency = doc.createElementNS(MAVEN_SCHEMA_URI, "dependency");
dependencies.appendChild(dependency);
final Element groupId = doc.createElementNS(MAVEN_SCHEMA_URI, "groupId");
groupId.setTextContent(artifactMetadata.groupId);
dependency.appendChild(groupId);
final Element artifactId = doc.createElementNS(MAVEN_SCHEMA_URI, "artifactId");
artifactId.setTextContent(artifactMetadata.artifactId);
dependency.appendChild(artifactId);
final Element version = doc.createElementNS(MAVEN_SCHEMA_URI, "version");
version.setTextContent(artifactMetadata.version);
dependency.appendChild(version);
if(!artifactMetadata.getPackaging().equals("jar")) {
final Element packaging = doc.createElementNS(MAVEN_SCHEMA_URI, "type");
packaging.setTextContent(artifactMetadata.packaging);
dependency.appendChild(packaging);
}
}
protected void writeDocument(Document doc, File outputFile) throws Exception {
final Source source = new DOMSource(doc);
final File outputDirectory = outputFile.getParentFile();
if(!outputDirectory.exists()) {
if(!outputDirectory.mkdirs()) {
throw new RuntimeException("Could not create directory: " + outputDirectory.getAbsolutePath());
}
}
final Result result = new StreamResult(outputFile);
final Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.transform(source, result);
}
protected Document createPomDocument(final MavenMetadata metadata) throws Exception {
final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
final DocumentBuilder builder = factory.newDocumentBuilder();
DOMImplementation domImpl = builder.getDOMImplementation();
final Document pom = domImpl.createDocument(MAVEN_SCHEMA_URI, "project", null);
final Element root = pom.getDocumentElement();
final Element modelVersion = pom.createElementNS(MAVEN_SCHEMA_URI, "modelVersion");
modelVersion.setTextContent("4.0.0");
root.appendChild(modelVersion);
final Element groupId = pom.createElementNS(MAVEN_SCHEMA_URI, "groupId");
groupId.setTextContent(metadata.groupId);
root.appendChild(groupId);
final Element artifactId = pom.createElementNS(MAVEN_SCHEMA_URI, "artifactId");
artifactId.setTextContent(metadata.artifactId);
root.appendChild(artifactId);
final Element version = pom.createElementNS(MAVEN_SCHEMA_URI, "version");
version.setTextContent(metadata.version);
root.appendChild(version);
final Element packaging = pom.createElementNS(MAVEN_SCHEMA_URI, "packaging");
packaging.setTextContent(metadata.packaging);
root.appendChild(packaging);
// Output dependency data.
if((metadata.dependencies != null) && !metadata.dependencies.isEmpty()) {
final Element dependencies = pom.createElementNS(MAVEN_SCHEMA_URI, "dependencies");
root.appendChild(dependencies);
final Map<String, MavenMetadata> dependencyIndex = new HashMap<String, MavenMetadata>();
for(final MavenMetadata dependencyMetadata : metadata.dependencies) {
final Element dependency = pom.createElementNS(MAVEN_SCHEMA_URI, "dependency");
dependencies.appendChild(dependency);
final Element dependencyGroupId = pom.createElementNS(MAVEN_SCHEMA_URI, "groupId");
dependencyGroupId.setTextContent(dependencyMetadata.groupId);
dependency.appendChild(dependencyGroupId);
final Element dependencyArtifactId = pom.createElementNS(MAVEN_SCHEMA_URI, "artifactId");
dependencyArtifactId.setTextContent(dependencyMetadata.artifactId);
dependency.appendChild(dependencyArtifactId);
final Element dependencyVersion = pom.createElementNS(MAVEN_SCHEMA_URI, "version");
dependencyVersion.setTextContent(dependencyMetadata.version);
dependency.appendChild(dependencyVersion);
final Element dependencyPackaging = pom.createElementNS(MAVEN_SCHEMA_URI, "type");
dependencyPackaging.setTextContent(dependencyMetadata.packaging);
dependency.appendChild(dependencyPackaging);
if(dependencyMetadata.classifier != null) {
final Element dependencyClassifier = pom.createElementNS(MAVEN_SCHEMA_URI, "classifier");
dependencyClassifier.setTextContent(dependencyMetadata.classifier);
dependency.appendChild(dependencyClassifier);
}
dependencyIndex.put(dependencyMetadata.artifactId, dependencyMetadata);
}
// Output the rb.swc dependencies.
if(metadata.librariesWithResourceBundles != null) {
for(final String artifactWithResourceBundle : metadata.librariesWithResourceBundles) {
final MavenMetadata dependencyMetadata = dependencyIndex.get(artifactWithResourceBundle);
if(dependencyMetadata != null) {
final Element dependency = pom.createElementNS(MAVEN_SCHEMA_URI, "dependency");
dependencies.appendChild(dependency);
final Element dependencyGroupId = pom.createElementNS(MAVEN_SCHEMA_URI, "groupId");
dependencyGroupId.setTextContent(dependencyMetadata.groupId);
dependency.appendChild(dependencyGroupId);
final Element dependencyArtifactId = pom.createElementNS(MAVEN_SCHEMA_URI, "artifactId");
dependencyArtifactId.setTextContent(dependencyMetadata.artifactId);
dependency.appendChild(dependencyArtifactId);
final Element dependencyVersion = pom.createElementNS(MAVEN_SCHEMA_URI, "version");
dependencyVersion.setTextContent(dependencyMetadata.version);
dependency.appendChild(dependencyVersion);
final Element dependencyPackaging = pom.createElementNS(MAVEN_SCHEMA_URI, "type");
dependencyPackaging.setTextContent("rb.swc");
dependency.appendChild(dependencyPackaging);
}
}
}
}
return pom;
}
protected Document createPomDocumentDependencyManagement(final MavenMetadata metadata) throws Exception {
final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
final DocumentBuilder builder = factory.newDocumentBuilder();
DOMImplementation domImpl = builder.getDOMImplementation();
final Document pom = domImpl.createDocument(MAVEN_SCHEMA_URI, "project", null);
final Element root = pom.getDocumentElement();
final Element modelVersion = pom.createElementNS(MAVEN_SCHEMA_URI, "modelVersion");
modelVersion.setTextContent("4.0.0");
root.appendChild(modelVersion);
final Element groupId = pom.createElementNS(MAVEN_SCHEMA_URI, "groupId");
groupId.setTextContent(metadata.groupId);
root.appendChild(groupId);
final Element artifactId = pom.createElementNS(MAVEN_SCHEMA_URI, "artifactId");
artifactId.setTextContent(metadata.artifactId);
root.appendChild(artifactId);
final Element version = pom.createElementNS(MAVEN_SCHEMA_URI, "version");
version.setTextContent(metadata.version);
root.appendChild(version);
final Element packaging = pom.createElementNS(MAVEN_SCHEMA_URI, "packaging");
packaging.setTextContent(metadata.packaging);
root.appendChild(packaging);
// Output dependency data.
if((metadata.dependencies != null) && !metadata.dependencies.isEmpty()) {
final Element dependencyManagement = pom.createElementNS(MAVEN_SCHEMA_URI, "dependencyManagement");
root.appendChild(dependencyManagement);
final Element dependencies = pom.createElementNS(MAVEN_SCHEMA_URI, "dependencies");
dependencyManagement.appendChild(dependencies);
final Map<String, MavenMetadata> dependencyIndex = new HashMap<String, MavenMetadata>();
for(final MavenMetadata dependencyMetadata : metadata.dependencies) {
final Element dependency = pom.createElementNS(MAVEN_SCHEMA_URI, "dependency");
dependencies.appendChild(dependency);
final Element dependencyGroupId = pom.createElementNS(MAVEN_SCHEMA_URI, "groupId");
dependencyGroupId.setTextContent(dependencyMetadata.groupId);
dependency.appendChild(dependencyGroupId);
final Element dependencyArtifactId = pom.createElementNS(MAVEN_SCHEMA_URI, "artifactId");
dependencyArtifactId.setTextContent(dependencyMetadata.artifactId);
dependency.appendChild(dependencyArtifactId);
final Element dependencyVersion = pom.createElementNS(MAVEN_SCHEMA_URI, "version");
dependencyVersion.setTextContent(dependencyMetadata.version);
dependency.appendChild(dependencyVersion);
final Element dependencyPackaging = pom.createElementNS(MAVEN_SCHEMA_URI, "type");
dependencyPackaging.setTextContent(dependencyMetadata.packaging);
dependency.appendChild(dependencyPackaging);
if(dependencyMetadata.classifier != null) {
final Element dependencyClassifier = pom.createElementNS(MAVEN_SCHEMA_URI, "classifier");
dependencyClassifier.setTextContent(dependencyMetadata.classifier);
dependency.appendChild(dependencyClassifier);
}
dependencyIndex.put(dependencyMetadata.artifactId, dependencyMetadata);
}
// Output the rb.swc dependencies.
for(final String artifactWithResourceBundle : metadata.librariesWithResourceBundles) {
final MavenMetadata dependencyMetadata = dependencyIndex.get(artifactWithResourceBundle);
if(dependencyMetadata != null) {
final Element dependency = pom.createElementNS(MAVEN_SCHEMA_URI, "dependency");
dependencies.appendChild(dependency);
final Element dependencyGroupId = pom.createElementNS(MAVEN_SCHEMA_URI, "groupId");
dependencyGroupId.setTextContent(dependencyMetadata.groupId);
dependency.appendChild(dependencyGroupId);
final Element dependencyArtifactId = pom.createElementNS(MAVEN_SCHEMA_URI, "artifactId");
dependencyArtifactId.setTextContent(dependencyMetadata.artifactId);
dependency.appendChild(dependencyArtifactId);
final Element dependencyVersion = pom.createElementNS(MAVEN_SCHEMA_URI, "version");
dependencyVersion.setTextContent(dependencyMetadata.version);
dependency.appendChild(dependencyVersion);
final Element dependencyPackaging = pom.createElementNS(MAVEN_SCHEMA_URI, "type");
dependencyPackaging.setTextContent("rb.swc");
dependency.appendChild(dependencyPackaging);
}
}
}
return pom;
}
protected static File findDirectory(File directory, String directoryToFind) {
File[] entries = directory.listFiles();
File founded = null;
// Go over entries
for (File entry : entries) {
if (entry.isDirectory() && directoryToFind.equalsIgnoreCase(entry.getName())) {
founded = entry;
break;
}
if (entry.isDirectory()) {
founded = findDirectory(entry, directoryToFind);
if (founded != null)
break;
}
}
return founded;
}
}