import java.util.Set;
import javax.jcr.Node;
+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.repo.RepoConstants;
import org.argeo.slc.rpmfactory.RpmProxyService;
import org.argeo.slc.rpmfactory.RpmRepository;
private Set<RpmRepository> defaultRepositories = new HashSet<RpmRepository>();
+ @Override
+ protected void beforeInitSessionSave(Session session)
+ throws RepositoryException {
+ 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);
+ }
+
/**
* Retrieve and add this file to the repository
*/
protected Node retrieve(Session session, String path) {
StringBuilder relativePathBuilder = new StringBuilder();
String repoId = extractRepoId(path, relativePathBuilder);
- String relativePath = relativePathBuilder.toString();
+ // remove starting '/'
+ String relativePath = relativePathBuilder.toString().substring(1);
RpmRepository sourceRepo = null;
for (Iterator<RpmRepository> reposIt = defaultRepositories.iterator(); reposIt
throw new SlcException("No RPM repository found for " + path);
try {
- // if (session.hasPendingChanges())
- // throw new SlcException("Session has pending changed");
String baseUrl = sourceRepo.getUrl();
String remoteUrl = baseUrl + relativePath;
Node node = proxyUrl(session, remoteUrl, path);
if (node != null) {
- 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);
- // origin.setProperty(SLC_PROXY, sourceRepo.getId());
- JcrUtils.urlToAddressProperties(origin, remoteUrl);
-
+ registerSource(sourceRepo, node, remoteUrl);
if (log.isDebugEnabled())
log.debug("Imported " + remoteUrl + " to " + node);
return node;
throw new SlcException("No proxy found for " + path);
}
+ 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());
+ }
+
+ origin.setProperty(SLC_PROXY, proxiedRepository);
+ JcrUtils.urlToAddressProperties(origin, remoteUrl);
+ }
+
/** Returns the first token of the path */
protected String extractRepoId(String path, StringBuilder relativePath) {
StringBuilder workspace = new StringBuilder();
@Override
protected Boolean shouldUpdate(Session clientSession, String nodePath) {
- if (nodePath.contains("/repodata/"))
- return true;
+ // if (nodePath.contains("/repodata/"))
+ // return true;
return super.shouldUpdate(clientSession, nodePath);
}