]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/OsgiFactoryImpl.java
Deal with already existing MANIFEST
[gpl/argeo-slc.git] / runtime / org.argeo.slc.repo / src / main / java / org / argeo / slc / repo / osgi / OsgiFactoryImpl.java
index ab4f9775cf37c5ffa6a5eb48b09d5cbb86459019..bd4f4311ce94595120145ce67dfafb8ed58d1984 100644 (file)
@@ -1,10 +1,12 @@
 package org.argeo.slc.repo.osgi;
 
+import java.io.BufferedInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.net.URLConnection;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -15,6 +17,7 @@ import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.jcr.JcrUtils;
@@ -24,9 +27,12 @@ import org.argeo.slc.jcr.SlcNames;
 import org.argeo.slc.jcr.SlcTypes;
 import org.argeo.slc.repo.NodeIndexer;
 import org.argeo.slc.repo.OsgiFactory;
+import org.argeo.slc.repo.maven.MavenConventionsUtils;
+import org.sonatype.aether.artifact.Artifact;
+import org.sonatype.aether.util.artifact.DefaultArtifact;
 
 /** Default implementation of {@link OsgiFactory}. */
-public class OsgiFactoryImpl implements OsgiFactory {
+public class OsgiFactoryImpl implements OsgiFactory, SlcNames {
        private final static Log log = LogFactory.getLog(OsgiFactoryImpl.class);
 
        private String workspace;
@@ -38,13 +44,25 @@ public class OsgiFactoryImpl implements OsgiFactory {
        /** key is URI prefix, value list of base URLs */
        private Map<String, List<String>> mirrors = new HashMap<String, List<String>>();
 
+       private List<String> mavenRepositories = new ArrayList<String>();
+       private String mavenProxyBase = "/mavenProxy";
+
        public void init() {
                if (workspace == null)
                        throw new SlcException("A workspace must be specified");
 
+               // default Maven repo
+               if (mavenRepositories.size() == 0) {
+                       // mavenRepositories
+                       // .add("http://search.maven.org/remotecontent?filepath=");
+                       mavenRepositories.add("http://repo1.maven.org/maven2");
+               }
+
                Session javaSession = null;
                Session distSession = null;
                try {
+                       // TODO rather user a JavaRepoManager that will also implicitely
+                       // manage the indexing of newly created nodes.
                        javaSession = JcrUtils.loginOrCreateWorkspace(javaRepository,
                                        workspace);
                        distSession = JcrUtils.loginOrCreateWorkspace(distRepository,
@@ -82,6 +100,45 @@ public class OsgiFactoryImpl implements OsgiFactory {
                }
        }
 
+       public Node getMaven(Session distSession, String coords)
+                       throws RepositoryException {
+               Artifact artifact = new DefaultArtifact(coords);
+               String path = MavenConventionsUtils.artifactPath(mavenProxyBase,
+                               artifact);
+
+               // exists
+               if (distSession.itemExists(path))
+                       return distSession.getNode(path);
+
+               for (String mavenRepo : mavenRepositories) {
+                       String url = mavenRepo
+                                       + MavenConventionsUtils.artifactPath("/", artifact);
+                       try {
+                               Node node = loadUrlToPath(url, distSession, path);
+                               if (node != null) {
+                                       // checksums
+                                       try {
+                                               loadUrlToPath(url + ".md5", distSession, path + ".md5");
+                                       } catch (FileNotFoundException e) {
+                                               // silent
+                                       }
+                                       try {
+                                               loadUrlToPath(url + ".sha1", distSession, path
+                                                               + ".sha1");
+                                       } catch (FileNotFoundException e) {
+                                               // silent
+                                       }
+                                       return node;
+                               }
+                       } catch (FileNotFoundException e) {
+                               if (log.isDebugEnabled())
+                                       log.debug("Maven " + coords
+                                                       + " could not be downloaded from " + url);
+                       }
+               }
+               throw new SlcException("Could not download Maven " + coords);
+       }
+
        public Node getDist(Session distSession, String uri)
                        throws RepositoryException {
                String distPath = '/' + JcrUtils.urlAsPath(uri);
@@ -117,7 +174,7 @@ public class OsgiFactoryImpl implements OsgiFactory {
                                return loadUrlToPath(url, distSession, distPath);
                        } catch (FileNotFoundException e) {
                                if (log.isDebugEnabled())
-                                       log.debug("Cannot download" + url
+                                       log.debug("Cannot download " + url
                                                        + ", trying another mirror");
                        }
                }
@@ -125,22 +182,28 @@ public class OsgiFactoryImpl implements OsgiFactory {
                throw new SlcException("Could not download " + uri);
        }
 
+       /** Actually downloads a file to an internal location */
        protected Node loadUrlToPath(String url, Session distSession, String path)
                        throws RepositoryException, FileNotFoundException {
                if (log.isDebugEnabled())
                        log.debug("Downloading " + url + "...");
 
                InputStream in = null;
+               URLConnection conn = null;
                Node folderNode = JcrUtils.mkfolders(distSession,
                                JcrUtils.parentPath(path));
                try {
                        URL u = new URL(url);
-                       in = u.openStream();
+                       conn = u.openConnection();
+                       conn.connect();
+                       in = new BufferedInputStream(conn.getInputStream());
+                       // byte[] arr = IOUtils.toByteArray(in);
+                       // Node fileNode = JcrUtils.copyBytesAsFile(folderNode,
+                       // JcrUtils.nodeNameFromPath(path), arr);
                        Node fileNode = JcrUtils.copyStreamAsFile(folderNode,
                                        JcrUtils.nodeNameFromPath(path), in);
                        fileNode.addMixin(SlcTypes.SLC_KNOWN_ORIGIN);
-                       Node origin = fileNode.addNode(SlcNames.SLC_ORIGIN,
-                                       SlcTypes.SLC_PROXIED);
+                       Node origin = fileNode.addNode(SLC_ORIGIN, SlcTypes.SLC_PROXIED);
                        JcrUtils.urlToAddressProperties(origin, url);
                        distSession.save();
                        return fileNode;
@@ -150,6 +213,8 @@ public class OsgiFactoryImpl implements OsgiFactory {
                        throw e;
                } catch (IOException e) {
                        throw new SlcException("Cannot load " + url + " to " + path, e);
+               } finally {
+                       IOUtils.closeQuietly(in);
                }
 
        }
@@ -174,4 +239,12 @@ public class OsgiFactoryImpl implements OsgiFactory {
                this.mirrors = mirrors;
        }
 
+       public void setMavenRepositories(List<String> mavenRepositories) {
+               this.mavenRepositories = mavenRepositories;
+       }
+
+       public void setMavenProxyBase(String mavenProxyBase) {
+               this.mavenProxyBase = mavenProxyBase;
+       }
+
 }