]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/MavenProxyServiceImpl.java
87ee867b71313cd29a837545129b1aa8db865600
[gpl/argeo-slc.git] / runtime / org.argeo.slc.repo / src / main / java / org / argeo / slc / repo / maven / MavenProxyServiceImpl.java
1 /*
2 * Copyright (C) 2007-2012 Argeo GmbH
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.argeo.slc.repo.maven;
17
18 import java.util.ArrayList;
19 import java.util.List;
20
21 import javax.jcr.Node;
22 import javax.jcr.NodeIterator;
23 import javax.jcr.RepositoryException;
24 import javax.jcr.Session;
25 import javax.jcr.nodetype.NodeType;
26
27 import org.apache.commons.logging.Log;
28 import org.apache.commons.logging.LogFactory;
29 import org.argeo.jcr.ArgeoNames;
30 import org.argeo.jcr.JcrUtils;
31 import org.argeo.jcr.proxy.AbstractUrlProxy;
32 import org.argeo.slc.SlcException;
33 import org.argeo.slc.jcr.SlcNames;
34 import org.argeo.slc.jcr.SlcTypes;
35 import org.argeo.slc.repo.MavenProxyService;
36 import org.argeo.slc.repo.RepoConstants;
37 import org.sonatype.aether.repository.RemoteRepository;
38
39 /** Synchronises the node repository with remote Maven repositories */
40 public class MavenProxyServiceImpl extends AbstractUrlProxy implements
41 MavenProxyService, ArgeoNames, SlcNames {
42 private final static Log log = LogFactory
43 .getLog(MavenProxyServiceImpl.class);
44
45 private List<RemoteRepository> defaultRepositories = new ArrayList<RemoteRepository>();
46
47 /** Initialises the artifacts area. */
48 @Override
49 protected void beforeInitSessionSave(Session session)
50 throws RepositoryException {
51 JcrUtils.mkdirsSafe(session, RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH);
52 Node proxiedRepositories = JcrUtils.mkdirsSafe(session,
53 RepoConstants.PROXIED_REPOSITORIES);
54 for (RemoteRepository repository : defaultRepositories) {
55 if (!proxiedRepositories.hasNode(repository.getId())) {
56 Node proxiedRepository = proxiedRepositories.addNode(repository
57 .getId());
58 proxiedRepository.addMixin(NodeType.MIX_REFERENCEABLE);
59 JcrUtils.urlToAddressProperties(proxiedRepository,
60 repository.getUrl());
61 // proxiedRepository.setProperty(SLC_URL, repository.getUrl());
62 proxiedRepository.setProperty(SLC_TYPE,
63 repository.getContentType());
64 }
65 }
66 }
67
68 /**
69 * Retrieve and add this file to the repository
70 */
71 @Override
72 protected Node retrieve(Session session, String path) {
73 try {
74 if (session.hasPendingChanges())
75 throw new SlcException("Session has pending changed");
76 Node node = null;
77 for (Node proxiedRepository : getBaseUrls(session)) {
78 String baseUrl = JcrUtils
79 .urlFromAddressProperties(proxiedRepository);
80 node = proxyUrl(session, baseUrl, path);
81 if (node != null) {
82 node.addMixin(SlcTypes.SLC_KNOWN_ORIGIN);
83 Node origin = node
84 .addNode(SLC_ORIGIN, SlcTypes.SLC_PROXIED);
85 origin.setProperty(SLC_PROXY, proxiedRepository);
86 JcrUtils.urlToAddressProperties(origin, baseUrl + path);
87 if (log.isDebugEnabled())
88 log.debug("Imported " + baseUrl + path + " to " + node);
89 return node;
90 }
91 }
92 if (log.isDebugEnabled())
93 log.warn("No proxy found for " + path);
94 return null;
95 } catch (Exception e) {
96 throw new SlcException("Cannot proxy " + path, e);
97 }
98 }
99
100 protected synchronized List<Node> getBaseUrls(Session session)
101 throws RepositoryException {
102 List<Node> baseUrls = new ArrayList<Node>();
103 for (NodeIterator nit = session.getNode(
104 RepoConstants.PROXIED_REPOSITORIES).getNodes(); nit.hasNext();) {
105 Node proxiedRepository = nit.nextNode();
106 baseUrls.add(proxiedRepository);
107 }
108 return baseUrls;
109 }
110
111 public void setDefaultRepositories(
112 List<RemoteRepository> defaultRepositories) {
113 this.defaultRepositories = defaultRepositories;
114 }
115 }