X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.repo%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Frepo%2FRepoUtils.java;h=ec3d17e41e580dd8d3fe27013efa085312225452;hb=3ee2fdf1cb2047b3c4eda153ce1e9ac2b24f6f9c;hp=7b901af43b8d658f1f44b9bf489a7942bb3a8ecc;hpb=420f8848873b1781e72d6bef0bab3b9d2d680fbe;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoUtils.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoUtils.java index 7b901af43..ec3d17e41 100644 --- a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoUtils.java +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoUtils.java @@ -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);