X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.slc.repo%2Fsrc%2Forg%2Fargeo%2Fslc%2Frepo%2Fmaven%2FMavenProxyServiceImpl.java;fp=org.argeo.slc.repo%2Fsrc%2Forg%2Fargeo%2Fslc%2Frepo%2Fmaven%2FMavenProxyServiceImpl.java;h=caee12b7f95fccd5f1a43385d425a98bc780739f;hb=825d60c5348dbe3f5be25b0bccf7bdebfe694219;hp=0000000000000000000000000000000000000000;hpb=5e991fff5cba01858dcc5747a27e637325bc5c8e;p=gpl%2Fargeo-jcr.git diff --git a/org.argeo.slc.repo/src/org/argeo/slc/repo/maven/MavenProxyServiceImpl.java b/org.argeo.slc.repo/src/org/argeo/slc/repo/maven/MavenProxyServiceImpl.java new file mode 100644 index 0000000..caee12b --- /dev/null +++ b/org.argeo.slc.repo/src/org/argeo/slc/repo/maven/MavenProxyServiceImpl.java @@ -0,0 +1,98 @@ +package org.argeo.slc.repo.maven; + +import java.util.ArrayList; +import java.util.List; + +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.nodetype.NodeType; +import javax.jcr.security.AccessControlException; +import javax.jcr.security.Privilege; + +import org.argeo.api.cms.CmsLog; +import org.argeo.cms.ArgeoNames; +import org.argeo.jcr.JcrUtils; +import org.argeo.jcr.proxy.AbstractUrlProxy; +import org.argeo.slc.SlcConstants; +import org.argeo.slc.SlcException; +import org.argeo.slc.SlcNames; +import org.argeo.slc.SlcTypes; +import org.argeo.slc.repo.MavenProxyService; +import org.argeo.slc.repo.RepoConstants; +import org.eclipse.aether.repository.RemoteRepository; + +/** Synchronises the node repository with remote Maven repositories */ +public class MavenProxyServiceImpl extends AbstractUrlProxy implements MavenProxyService, ArgeoNames, SlcNames { + private final static CmsLog log = CmsLog.getLog(MavenProxyServiceImpl.class); + + private List defaultRepositories = new ArrayList(); + + /** Initialises the artifacts area. */ + @Override + protected void beforeInitSessionSave(Session session) throws RepositoryException { + JcrUtils.addPrivilege(session, "/", SlcConstants.USER_ANONYMOUS, Privilege.JCR_READ); + try { + JcrUtils.addPrivilege(session, "/", SlcConstants.ROLE_SLC, Privilege.JCR_ALL); + } catch (AccessControlException e) { + if (log.isTraceEnabled()) + log.trace("Cannot give jcr:all privileges to " + SlcConstants.ROLE_SLC); + } + + JcrUtils.mkdirsSafe(session, RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH); + Node proxiedRepositories = JcrUtils.mkdirsSafe(session, RepoConstants.PROXIED_REPOSITORIES); + for (RemoteRepository repository : defaultRepositories) { + if (!proxiedRepositories.hasNode(repository.getId())) { + Node proxiedRepository = proxiedRepositories.addNode(repository.getId()); + proxiedRepository.addMixin(NodeType.MIX_REFERENCEABLE); + JcrUtils.urlToAddressProperties(proxiedRepository, repository.getUrl()); + // proxiedRepository.setProperty(SLC_URL, repository.getUrl()); + proxiedRepository.setProperty(SLC_TYPE, repository.getContentType()); + } + } + } + + /** + * Retrieve and add this file to the repository + */ + @Override + protected Node retrieve(Session session, String path) { + try { + if (session.hasPendingChanges()) + throw new SlcException("Session has pending changed"); + Node node = null; + for (Node proxiedRepository : getBaseUrls(session)) { + String baseUrl = JcrUtils.urlFromAddressProperties(proxiedRepository); + node = proxyUrl(session, baseUrl, path); + if (node != null) { + node.addMixin(SlcTypes.SLC_KNOWN_ORIGIN); + Node origin = node.addNode(SLC_ORIGIN, SlcTypes.SLC_PROXIED); + origin.setProperty(SLC_PROXY, proxiedRepository); + JcrUtils.urlToAddressProperties(origin, baseUrl + path); + if (log.isDebugEnabled()) + log.debug("Imported " + baseUrl + path + " to " + node); + return node; + } + } + if (log.isDebugEnabled()) + log.warn("No proxy found for " + path); + return null; + } catch (Exception e) { + throw new SlcException("Cannot proxy " + path, e); + } + } + + protected synchronized List getBaseUrls(Session session) throws RepositoryException { + List baseUrls = new ArrayList(); + for (NodeIterator nit = session.getNode(RepoConstants.PROXIED_REPOSITORIES).getNodes(); nit.hasNext();) { + Node proxiedRepository = nit.nextNode(); + baseUrls.add(proxiedRepository); + } + return baseUrls; + } + + public void setDefaultRepositories(List defaultRepositories) { + this.defaultRepositories = defaultRepositories; + } +}