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;
+            }
+        }
+    }
 }


Reply via email to