]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoUtils.java
Deal with already existing MANIFEST
[gpl/argeo-slc.git] / runtime / org.argeo.slc.repo / src / main / java / org / argeo / slc / repo / RepoUtils.java
index 7b901af43b8d658f1f44b9bf489a7942bb3a8ecc..ec3d17e41e580dd8d3fe27013efa085312225452 100644 (file)
@@ -32,6 +32,7 @@ import java.util.jar.JarFile;
 import java.util.jar.JarInputStream;
 import java.util.jar.JarOutputStream;
 import java.util.jar.Manifest;
+import java.util.zip.ZipInputStream;
 
 import javax.jcr.Credentials;
 import javax.jcr.GuestCredentials;
@@ -50,6 +51,7 @@ import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.argeo.ArgeoMonitor;
 import org.argeo.jcr.ArgeoJcrUtils;
 import org.argeo.jcr.ArgeoNames;
 import org.argeo.jcr.ArgeoTypes;
@@ -198,16 +200,20 @@ public class RepoUtils implements ArgeoNames, SlcNames {
                        jarOut = new JarOutputStream(out, manifest);
                        JarEntry jarEntry = null;
                        while ((jarEntry = jarIn.getNextJarEntry()) != null) {
-                               jarOut.putNextEntry(jarEntry);
-                               IOUtils.copy(jarIn, jarOut);
-                               jarIn.closeEntry();
-                               jarOut.closeEntry();
+                               if (!jarEntry.getName().equals("META-INF/MANIFEST.MF")) {
+                                       JarEntry newJarEntry = new JarEntry(jarEntry.getName());
+                                       jarOut.putNextEntry(newJarEntry);
+                                       IOUtils.copy(jarIn, jarOut);
+                                       jarIn.closeEntry();
+                                       jarOut.closeEntry();
+                               }
                        }
                } catch (IOException e) {
                        throw new SlcException("Could not copy jar with MANIFEST "
                                        + manifest.getMainAttributes(), e);
                } finally {
-                       IOUtils.closeQuietly(jarIn);
+                       if (!(in instanceof ZipInputStream))
+                               IOUtils.closeQuietly(jarIn);
                        IOUtils.closeQuietly(jarOut);
                }
        }
@@ -388,7 +394,7 @@ public class RepoUtils implements ArgeoNames, SlcNames {
        }
 
        /**
-        * Reads credentials from node, using keyring if there is a password. Cann
+        * Reads credentials from node, using keyring if there is a password. Can
         * return null if no credentials needed (local repo) at all, but returns
         * {@link GuestCredentials} if user id is 'anonymous' .
         */
@@ -416,9 +422,73 @@ public class RepoUtils implements ArgeoNames, SlcNames {
                }
        }
 
+       /**
+        * Shortcut to retrieve a session given variable information: Handle the
+        * case where we only have an URI of the repository, that we want to connect
+        * as anonymous or the case of a identified connection to a local or remote
+        * repository.
+        * 
+        * Callers must close the session once it has been used
+        */
+       public static Session getRemoteSession(RepositoryFactory repositoryFactory,
+                       Keyring keyring, Node repoNode, String uri, String workspaceName) {
+               try {
+                       if (repoNode == null && uri == null)
+                               throw new SlcException(
+                                               "At least one of repoNode and uri must be defined");
+                       Repository currRepo = null;
+                       Credentials credentials = null;
+                       // Anonymous URI only workspace
+                       if (repoNode == null)
+                               // Anonymous
+                               currRepo = ArgeoJcrUtils.getRepositoryByUri(repositoryFactory,
+                                               uri);
+                       else {
+                               currRepo = RepoUtils.getRepository(repositoryFactory, keyring,
+                                               repoNode);
+                               credentials = RepoUtils.getRepositoryCredentials(keyring,
+                                               repoNode);
+                       }
+                       return currRepo.login(credentials, workspaceName);
+               } catch (RepositoryException e) {
+                       throw new SlcException("Cannot connect to workspace "
+                                       + workspaceName + " of repository " + repoNode
+                                       + " with URI " + uri, e);
+               }
+       }
+
+       /**
+        * Shortcut to retrieve a session on a remote Jrc Repository from
+        * information stored in a local argeo node or from an URI: Handle the case
+        * where we only have an URI of the repository, that we want to connect as
+        * anonymous or the case of a identified connection to a local or remote
+        * repository.
+        * 
+        * Callers must close the session once it has been used
+        */
+       public static Session getRemoteSession(RepositoryFactory repositoryFactory,
+                       Keyring keyring, Repository localRepository, String repoNodePath,
+                       String uri, String workspaceName) {
+               Session localSession = null;
+               Node repoNode = null;
+               try {
+                       localSession = localRepository.login();
+                       if (repoNodePath != null && localSession.nodeExists(repoNodePath))
+                               repoNode = localSession.getNode(repoNodePath);
+
+                       return RepoUtils.getRemoteSession(repositoryFactory, keyring,
+                                       repoNode, uri, workspaceName);
+               } catch (RepositoryException e) {
+                       throw new SlcException("Cannot log to workspace " + workspaceName
+                                       + " for repo defined in " + repoNodePath, e);
+               } finally {
+                       JcrUtils.logoutQuietly(localSession);
+               }
+       }
+
        /**
         * Write group indexes: 'binaries' lists all bundles and their versions,
-        * 'sources' list theire sources, and 'sdk' aggregates both.
+        * 'sources' list their sources, and 'sdk' aggregates both.
         */
        public static void writeGroupIndexes(Session session,
                        String artifactBasePath, String groupId, String version,
@@ -476,9 +546,16 @@ public class RepoUtils implements ArgeoNames, SlcNames {
         * a workspace completely.
         */
        public static void copy(Node fromNode, Node toNode) {
+               copy(fromNode, toNode, null);
+       }
+
+       public static void copy(Node fromNode, Node toNode, ArgeoMonitor monitor) {
                try {
+                       String fromPath = fromNode.getPath();
+                       if (monitor != null)
+                               monitor.subTask("copying node :" + fromPath);
                        if (log.isDebugEnabled())
-                               log.debug("copy node :" + fromNode.getPath());
+                               log.debug("copy node :" + fromPath);
 
                        // FIXME : small hack to enable specific workspace copy
                        if (fromNode.isNodeType("rep:ACL")
@@ -559,6 +636,9 @@ public class RepoUtils implements ArgeoNames, SlcNames {
                        if (toNode.isNodeType(SlcTypes.SLC_ARTIFACT))
                                toNode.getSession().save();
 
+                       if (monitor != null)
+                               monitor.worked(1);
+
                } catch (RepositoryException e) {
                        throw new SlcException("Cannot copy " + fromNode + " to " + toNode,
                                        e);