Author: rmannibucau
Date: Thu Jul 18 16:31:15 2013
New Revision: 1504514
URL: http://svn.apache.org/r1504514
Log:
handling timestamp snapshots
Modified:
tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/ProvisioningUtil.java
Modified:
tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/ProvisioningUtil.java
URL:
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/ProvisioningUtil.java?rev=1504514&r1=1504513&r2=1504514&view=diff
==============================================================================
---
tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/ProvisioningUtil.java
(original)
+++
tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/ProvisioningUtil.java
Thu Jul 18 16:31:15 2013
@@ -16,10 +16,19 @@
*/
package org.apache.openejb.loader;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.ProxySelector;
@@ -34,9 +43,16 @@ import java.util.Properties;
import java.util.logging.Logger;
public class ProvisioningUtil {
+ private static final SAXParserFactory FACTORY =
SAXParserFactory.newInstance();
+ static {
+ FACTORY.setNamespaceAware(false);
+ FACTORY.setValidating(false);
+ }
+
public static final String OPENEJB_DEPLOYER_CACHE_FOLDER =
"openejb.deployer.cache.folder";
public static final String HTTP_PREFIX = "http";
public static final String MVN_PREFIX = "mvn:";
+ public static final String SNAPSHOT_SUFFIX = "-SNAPSHOT";
private static final int CONNECT_TIMEOUT = 10000;
@@ -156,7 +172,7 @@ public class ProvisioningUtil {
public static String quickMvnUrl(final String raw) throws
MalformedURLException {
final String base;
- if (raw.contains("-SNAPSHOT") && raw.contains("apache")) {
+ if (raw.contains(SNAPSHOT_SUFFIX) && raw.contains("apache")) {
base = APACHE_SNAPSHOT;
} else {
base = REPO1;
@@ -166,7 +182,7 @@ public class ProvisioningUtil {
final String toParse;
if (!raw.contains("!")) {
// try first local file with default maven settings
- final File file = new File(m2Home() + mvnArtifactPath(raw));
+ final File file = new File(m2Home() + mvnArtifactPath(raw, null));
if (file.exists()) {
return file.getAbsolutePath();
}
@@ -187,7 +203,7 @@ public class ProvisioningUtil {
}
}
- builder.append(mvnArtifactPath(toParse));
+ builder.append(mvnArtifactPath(toParse, base));
return builder.toString();
}
@@ -196,7 +212,7 @@ public class ProvisioningUtil {
return SystemInstance.get().getProperty("openejb.m2.home",
System.getProperty("user.home") + "/.m2/repository/");
}
- private static String mvnArtifactPath(final String toParse) throws
MalformedURLException {
+ private static String mvnArtifactPath(final String toParse, final String
snapshotBase) throws MalformedURLException {
final StringBuilder builder = new StringBuilder();
final String[] segments = toParse.split("/");
if (segments.length < 3) {
@@ -219,8 +235,28 @@ public class ProvisioningUtil {
if (version.trim().isEmpty()) {
throw new MalformedURLException("Invalid artifactId. " + toParse);
}
+
builder.append(version).append("/");
+ String artifactVersion;
+ if (snapshotBase != null && snapshotBase.startsWith(HTTP_PREFIX) &&
version.endsWith(SNAPSHOT_SUFFIX)) {
+ final String meta = new
StringBuilder(snapshotBase).append(builder.toString()).append("maven-metadata.xml").toString();
+ final URL url = new URL(meta);
+ final ByteArrayOutputStream out = new ByteArrayOutputStream();
+ InputStream is = null;
+ try {
+ is = inputStreamTryingProxies(url.toURI());
+ IO.copy(is, out);
+ artifactVersion = extractLastSnapshotVersion(version, new
ByteArrayInputStream(out.toByteArray()));
+ } catch (final Exception e) {
+ artifactVersion = version;
+ } finally {
+ IO.close(is);
+ }
+ } else {
+ artifactVersion = version;
+ }
+
String type = "jar";
if (segments.length >= 4 && segments[3].trim().length() > 0) {
type = segments[3];
@@ -231,7 +267,8 @@ public class ProvisioningUtil {
fullClassifier = "-" + segments[4];
}
- builder.append(artifact).append("-").append(version);
+ builder.append(artifact).append("-").append(artifactVersion);
+
if (fullClassifier != null) {
builder.append(fullClassifier);
}
@@ -239,6 +276,20 @@ public class ProvisioningUtil {
return builder.append(".").append(type).toString();
}
+ private static String extractLastSnapshotVersion(final String
defaultVersion, final InputStream metadata) {
+ final QuickMvnMetadataParser handler = new QuickMvnMetadataParser();
+ try {
+ final SAXParser parser = FACTORY.newSAXParser();
+ parser.parse(metadata, handler);
+ if (handler.timestamp != null && handler.buildNumber != null) {
+ return defaultVersion.substring(0, defaultVersion.length() -
SNAPSHOT_SUFFIX.length()) + "-" + handler.timestamp.toString() + "-" +
handler.buildNumber.toString();
+ }
+ } catch (final Exception e) {
+ // no-op: not parseable so ignoring
+ }
+ return defaultVersion;
+ }
+
public static void addAdditionalLibraries() throws IOException {
final File conf = SystemInstance.get().getConf(ADDITIONAL_LIB_CONFIG);
if (conf == null || !conf.exists()) {
@@ -326,4 +377,40 @@ public class ProvisioningUtil {
}
return libs;
}
+
+ private static class QuickMvnMetadataParser extends DefaultHandler {
+ private boolean readTs = false;
+ private boolean readBn = false;
+ private StringBuilder timestamp = null;
+ private StringBuilder buildNumber = null;
+
+ @Override
+ public void startElement(final String uri, final String localName,
+ final String qName, final Attributes
attributes) throws SAXException {
+ if ("timestamp".equalsIgnoreCase(qName)) {
+ readTs = true;
+ timestamp = new StringBuilder();
+ } else if ("buildNumber".equalsIgnoreCase(qName)) {
+ readBn = true;
+ buildNumber = new StringBuilder();
+ }
+ }
+
+ @Override
+ public void characters(final char ch[], final int start, final int
length) throws SAXException {
+ if (readBn && buildNumber != null) {
+ buildNumber.append(new String(ch, start, length));
+ } else if (readTs && timestamp != null) {
+ timestamp.append(new String(ch, start, length));
+ }
+ }
+
+ public void endElement(final String uri, final String localName, final
String qName) throws SAXException {
+ if ("timestamp".equalsIgnoreCase(qName)) {
+ readTs = false;
+ } else if ("buildNumber".equalsIgnoreCase(qName)) {
+ readBn = false;
+ }
+ }
+ }
}