*/
package org.argeo.slc.rpmfactory.core;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
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 org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.argeo.jcr.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.jcr.SlcNames;
import org.argeo.slc.jcr.SlcTypes;
import org.argeo.slc.rpmfactory.RpmProxyService;
import org.argeo.slc.rpmfactory.RpmRepository;
-/** Synchronizes the node repository with remote Maven repositories */
+/** Synchronises the node repository with remote Maven repositories */
public class RpmProxyServiceImpl extends AbstractUrlProxy implements
RpmProxyService, ArgeoNames, SlcNames {
- private final static Log log = LogFactory
- .getLog(RpmProxyServiceImpl.class);
+ private final static Log log = LogFactory.getLog(RpmProxyServiceImpl.class);
- private List<RpmRepository> defaultRepositories = new ArrayList<RpmRepository>();
+ private Set<RpmRepository> defaultRepositories = new HashSet<RpmRepository>();
- private String artifactsBasePath = RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH;
-
- /** Inititalizes the artifacts area. */
@Override
protected void beforeInitSessionSave(Session session)
throws RepositoryException {
- JcrUtils.mkdirsSafe(session, RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH);
- Node proxiedRepositories = JcrUtils.mkdirsSafe(session,
- RepoConstants.PROXIED_REPOSITORIES);
- for (RpmRepository 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());
- }
+ JcrUtils.addPrivilege(session, "/", "anonymous", "jcr:read");
+ try {
+ JcrUtils.addPrivilege(session, "/", SlcConstants.ROLE_SLC,
+ "jcr:all");
+ } catch (AccessControlException e) {
+ if (log.isTraceEnabled())
+ log.trace("Cannot give jcr:all privileges to ROLE_SLC");
}
+
+ JcrUtils.mkdirsSafe(session, RepoConstants.PROXIED_REPOSITORIES);
}
/**
*/
@Override
protected Node retrieve(Session session, String path) {
+ StringBuilder relativePathBuilder = new StringBuilder();
+ String repoId = extractRepoId(path, relativePathBuilder);
+ // remove starting '/'
+ String relativePath = relativePathBuilder.toString().substring(1);
+
+ RpmRepository sourceRepo = null;
+ for (Iterator<RpmRepository> reposIt = defaultRepositories.iterator(); reposIt
+ .hasNext();) {
+ RpmRepository rpmRepo = reposIt.next();
+ if (rpmRepo.getId().equals(repoId)) {
+ sourceRepo = rpmRepo;
+ break;
+ }
+ }
+
+ if (sourceRepo == null)
+ throw new SlcException("No RPM repository found for " + 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;
- }
+ String baseUrl = sourceRepo.getUrl();
+ String remoteUrl = baseUrl + relativePath;
+ Node node = proxyUrl(session, remoteUrl, path);
+ if (node != null) {
+ registerSource(sourceRepo, node, remoteUrl);
+ if (log.isDebugEnabled())
+ log.debug("Imported " + remoteUrl + " 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);
}
+ JcrUtils.discardQuietly(session);
+ throw new SlcException("No proxy found for " + path);
}
- protected synchronized List<Node> getBaseUrls(Session session)
- throws RepositoryException {
- List<Node> baseUrls = new ArrayList<Node>();
- for (NodeIterator nit = session.getNode(
- RepoConstants.PROXIED_REPOSITORIES).getNodes(); nit.hasNext();) {
- Node proxiedRepository = nit.nextNode();
- baseUrls.add(proxiedRepository);
+ protected void registerSource(RpmRepository sourceRepo, Node node,
+ String remoteUrl) throws RepositoryException {
+ node.addMixin(SlcTypes.SLC_KNOWN_ORIGIN);
+ Node origin;
+ if (!node.hasNode(SLC_ORIGIN))
+ origin = node.addNode(SLC_ORIGIN, SlcTypes.SLC_PROXIED);
+ else
+ origin = node.getNode(SLC_ORIGIN);
+
+ // proxied repository
+ Node proxiedRepository;
+ String proxiedRepositoryPath = RepoConstants.PROXIED_REPOSITORIES + '/'
+ + sourceRepo.getId();
+ Session session = node.getSession();
+ if (session.itemExists(proxiedRepositoryPath)) {
+ proxiedRepository = session.getNode(proxiedRepositoryPath);
+ } else {
+ proxiedRepository = session.getNode(
+ RepoConstants.PROXIED_REPOSITORIES).addNode(
+ sourceRepo.getId());
+ proxiedRepository.addMixin(NodeType.MIX_REFERENCEABLE);
+ JcrUtils.urlToAddressProperties(proxiedRepository,
+ sourceRepo.getUrl());
+ proxiedRepository.setProperty(SLC_URL, sourceRepo.getUrl());
}
- return baseUrls;
- }
- /** The JCR path where this file could be found */
- public String getNodePath(String path) {
- if (artifactsBasePath.equals(RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH))
- return path;
- else
- return artifactsBasePath + path;
+ origin.setProperty(SLC_PROXY, proxiedRepository);
+ JcrUtils.urlToAddressProperties(origin, remoteUrl);
}
- public void setDefaultRepositories(List<RpmRepository> defaultRepositories) {
- this.defaultRepositories = defaultRepositories;
+ /** Returns the first token of the path */
+ protected String extractRepoId(String path, StringBuilder relativePath) {
+ StringBuilder workspace = new StringBuilder();
+ StringBuilder buf = workspace;
+ for (int i = 1; i < path.length(); i++) {
+ char c = path.charAt(i);
+ if (c == '/') {
+ buf = relativePath;
+ }
+ buf.append(c);
+ }
+ return workspace.toString();
}
- public void setArtifactsBasePath(String artifactsBasePath) {
- this.artifactsBasePath = artifactsBasePath;
+ @Override
+ protected Boolean shouldUpdate(Session clientSession, String nodePath) {
+ // if (nodePath.contains("/repodata/"))
+ // return true;
+ return super.shouldUpdate(clientSession, nodePath);
}
+ public void setDefaultRepositories(Set<RpmRepository> defaultRepositories) {
+ this.defaultRepositories = defaultRepositories;
+ }
}