]> git.argeo.org Git - gpl/argeo-slc.git/blob - org.argeo.slc.repo/src/org/argeo/slc/repo/maven/MavenProxyServiceImpl.java
Adapt to changes in Argeo Commons
[gpl/argeo-slc.git] / org.argeo.slc.repo / src / org / argeo / slc / repo / maven / MavenProxyServiceImpl.java
1 package org.argeo.slc.repo.maven;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import javax.jcr.Node;
7 import javax.jcr.NodeIterator;
8 import javax.jcr.RepositoryException;
9 import javax.jcr.Session;
10 import javax.jcr.nodetype.NodeType;
11 import javax.jcr.security.AccessControlException;
12 import javax.jcr.security.Privilege;
13
14 import org.argeo.api.cms.CmsLog;
15 import org.argeo.cms.ArgeoNames;
16 import org.argeo.jcr.JcrUtils;
17 import org.argeo.jcr.proxy.AbstractUrlProxy;
18 import org.argeo.slc.SlcConstants;
19 import org.argeo.slc.SlcException;
20 import org.argeo.slc.SlcNames;
21 import org.argeo.slc.SlcTypes;
22 import org.argeo.slc.repo.MavenProxyService;
23 import org.argeo.slc.repo.RepoConstants;
24 import org.eclipse.aether.repository.RemoteRepository;
25
26 /** Synchronises the node repository with remote Maven repositories */
27 public class MavenProxyServiceImpl extends AbstractUrlProxy implements MavenProxyService, ArgeoNames, SlcNames {
28 private final static CmsLog log = CmsLog.getLog(MavenProxyServiceImpl.class);
29
30 private List<RemoteRepository> defaultRepositories = new ArrayList<RemoteRepository>();
31
32 /** Initialises the artifacts area. */
33 @Override
34 protected void beforeInitSessionSave(Session session) throws RepositoryException {
35 JcrUtils.addPrivilege(session, "/", SlcConstants.USER_ANONYMOUS, Privilege.JCR_READ);
36 try {
37 JcrUtils.addPrivilege(session, "/", SlcConstants.ROLE_SLC, Privilege.JCR_ALL);
38 } catch (AccessControlException e) {
39 if (log.isTraceEnabled())
40 log.trace("Cannot give jcr:all privileges to " + SlcConstants.ROLE_SLC);
41 }
42
43 JcrUtils.mkdirsSafe(session, RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH);
44 Node proxiedRepositories = JcrUtils.mkdirsSafe(session, RepoConstants.PROXIED_REPOSITORIES);
45 for (RemoteRepository repository : defaultRepositories) {
46 if (!proxiedRepositories.hasNode(repository.getId())) {
47 Node proxiedRepository = proxiedRepositories.addNode(repository.getId());
48 proxiedRepository.addMixin(NodeType.MIX_REFERENCEABLE);
49 JcrUtils.urlToAddressProperties(proxiedRepository, repository.getUrl());
50 // proxiedRepository.setProperty(SLC_URL, repository.getUrl());
51 proxiedRepository.setProperty(SLC_TYPE, repository.getContentType());
52 }
53 }
54 }
55
56 /**
57 * Retrieve and add this file to the repository
58 */
59 @Override
60 protected Node retrieve(Session session, String path) {
61 try {
62 if (session.hasPendingChanges())
63 throw new SlcException("Session has pending changed");
64 Node node = null;
65 for (Node proxiedRepository : getBaseUrls(session)) {
66 String baseUrl = JcrUtils.urlFromAddressProperties(proxiedRepository);
67 node = proxyUrl(session, baseUrl, path);
68 if (node != null) {
69 node.addMixin(SlcTypes.SLC_KNOWN_ORIGIN);
70 Node origin = node.addNode(SLC_ORIGIN, SlcTypes.SLC_PROXIED);
71 origin.setProperty(SLC_PROXY, proxiedRepository);
72 JcrUtils.urlToAddressProperties(origin, baseUrl + path);
73 if (log.isDebugEnabled())
74 log.debug("Imported " + baseUrl + path + " to " + node);
75 return node;
76 }
77 }
78 if (log.isDebugEnabled())
79 log.warn("No proxy found for " + path);
80 return null;
81 } catch (Exception e) {
82 throw new SlcException("Cannot proxy " + path, e);
83 }
84 }
85
86 protected synchronized List<Node> getBaseUrls(Session session) throws RepositoryException {
87 List<Node> baseUrls = new ArrayList<Node>();
88 for (NodeIterator nit = session.getNode(RepoConstants.PROXIED_REPOSITORIES).getNodes(); nit.hasNext();) {
89 Node proxiedRepository = nit.nextNode();
90 baseUrls.add(proxiedRepository);
91 }
92 return baseUrls;
93 }
94
95 public void setDefaultRepositories(List<RemoteRepository> defaultRepositories) {
96 this.defaultRepositories = defaultRepositories;
97 }
98 }