From 0f05a24d55e92b847d2c72ff116ecd281a60adf8 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Fri, 14 Oct 2011 18:19:27 +0000 Subject: [PATCH] Improve Repo git-svn-id: https://svn.argeo.org/slc/trunk@4842 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- demo/log4j.properties | 3 + .../META-INF/MANIFEST.MF | 1 + .../META-INF/spring/maven.xml | 48 +++++++-------- .../org/argeo/slc/repo/ArtifactIndexer.java | 16 +++-- .../org/argeo/slc/repo/RepoConstants.java | 4 +- .../maven/proxy/MavenProxyServiceImpl.java | 60 ++++++++++++------- .../resources/org/argeo/slc/repo/repo.cnd | 36 +++++++---- .../main/java/org/argeo/slc/jcr/SlcNames.java | 4 ++ .../main/java/org/argeo/slc/jcr/SlcTypes.java | 6 +- .../org/argeo/slc/jcr/execution/JcrAgent.java | 2 +- 10 files changed, 109 insertions(+), 71 deletions(-) diff --git a/demo/log4j.properties b/demo/log4j.properties index b7d8fe653..26304cc11 100644 --- a/demo/log4j.properties +++ b/demo/log4j.properties @@ -4,10 +4,13 @@ log4j.rootLogger=WARN, development ## Levels log4j.logger.org.argeo=DEBUG log4j.logger.org.argeo.jackrabbit.remote.ExtendedDispatcherServlet=ERROR +#log4j.logger.org.argeo.jcr.mvc.ResourceProxyServlet=TRACE log4j.logger.org.springframework.web.servlet.PageNotFound=ERROR log4j.logger.org.argeo.server.webextender.TomcatDeployer=WARN log4j.logger.org.argeo.slc.client.ui.dist=TRACE +#log4j.logger.org.argeo.jcr.proxy=TRACE + #log4j.logger.org.apache.jackrabbit.webdav=DEBUG #log4j.logger.org.apache.jackrabbit.jcr2spi=DEBUG diff --git a/modules/server/org.argeo.slc.server.repo/META-INF/MANIFEST.MF b/modules/server/org.argeo.slc.server.repo/META-INF/MANIFEST.MF index e64aeef45..e20ff6597 100644 --- a/modules/server/org.argeo.slc.server.repo/META-INF/MANIFEST.MF +++ b/modules/server/org.argeo.slc.server.repo/META-INF/MANIFEST.MF @@ -13,5 +13,6 @@ Import-Package: javax.jcr;version="2.0.0", org.argeo.slc.repo, org.argeo.slc.repo.maven, org.argeo.slc.repo.maven.proxy, + org.h2;resolution:=optional, org.sonatype.aether;version="1.9.0", org.springframework.security;version="2.0.6.RELEASE" diff --git a/modules/server/org.argeo.slc.server.repo/META-INF/spring/maven.xml b/modules/server/org.argeo.slc.server.repo/META-INF/spring/maven.xml index a3708ba39..4b01d6194 100644 --- a/modules/server/org.argeo.slc.server.repo/META-INF/spring/maven.xml +++ b/modules/server/org.argeo.slc.server.repo/META-INF/spring/maven.xml @@ -7,38 +7,30 @@ http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd "> - - - - - - - + + + + + + + + + - - @@ -53,10 +45,10 @@ value="http://repository.springsource.com/maven/bundles/external" /> - + - + \ No newline at end of file diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/ArtifactIndexer.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/ArtifactIndexer.java index 841f22d38..c2e20c3ab 100644 --- a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/ArtifactIndexer.java +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/ArtifactIndexer.java @@ -70,8 +70,14 @@ public class ArtifactIndexer implements NodeIndexer { artifact.getArtifactId()); artifactVersionBase.setProperty(SlcNames.SLC_GROUP_ID, artifact.getGroupId()); - JcrUtils.updateLastModified(artifactVersionBase); } + JcrUtils.updateLastModified(artifactVersionBase); + + // pom + if (artifact.getExtension().equals("pom")) { + // TODO read to make it a distribution + } + Node artifactBase = artifactVersionBase.getParent(); if (!artifactBase.isNodeType(SlcTypes.SLC_ARTIFACT_BASE)) { artifactBase.addMixin(SlcTypes.SLC_ARTIFACT_BASE); @@ -79,10 +85,9 @@ public class ArtifactIndexer implements NodeIndexer { artifact.getArtifactId()); artifactBase.setProperty(SlcNames.SLC_GROUP_ID, artifact.getGroupId()); - JcrUtils.updateLastModified(artifactBase); } - - // TODO do we really need group base? + JcrUtils.updateLastModified(artifactBase); + Node groupBase = artifactBase.getParent(); if (!groupBase.isNodeType(SlcTypes.SLC_GROUP_BASE)) { // if (groupBase.isNodeType(SlcTypes.SLC_ARTIFACT_BASE)) { @@ -92,8 +97,9 @@ public class ArtifactIndexer implements NodeIndexer { groupBase.addMixin(SlcTypes.SLC_GROUP_BASE); groupBase.setProperty(SlcNames.SLC_GROUP_BASE_ID, artifact.getGroupId()); - JcrUtils.updateLastModified(groupBase); } + JcrUtils.updateLastModifiedAndParents(groupBase, + RepoConstants.ARTIFACTS_BASE_PATH); if (log.isTraceEnabled()) log.trace("Indexed artifact " + artifact + " on " + fileNode); diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoConstants.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoConstants.java index 0cbfcf475..6a0282828 100644 --- a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoConstants.java +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoConstants.java @@ -2,6 +2,6 @@ package org.argeo.slc.repo; /** SLC repository constants */ public interface RepoConstants { - public final static String ARTIFACTS_BASE_PATH = "/slc/repo/artifacts"; - public final static String PROXIED_REPOSITORIES = "/slc/repo/proxiedRepositories"; + public final static String ARTIFACTS_BASE_PATH = "/repo"; + public final static String PROXIED_REPOSITORIES = "/slc/repo/sources"; } diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyServiceImpl.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyServiceImpl.java index 19df339a2..c2b4e53d1 100644 --- a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyServiceImpl.java +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyServiceImpl.java @@ -6,6 +6,8 @@ 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 org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -14,6 +16,7 @@ import org.argeo.jcr.JcrUtils; import org.argeo.jcr.proxy.AbstractUrlProxy; 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.sonatype.aether.repository.RemoteRepository; @@ -25,16 +28,21 @@ public class MavenProxyServiceImpl extends AbstractUrlProxy implements private List defaultRepositories = new ArrayList(); + /** Inititalizes the artifacts area. */ @Override - protected void beforeInitSessionSave() throws RepositoryException { - JcrUtils.mkdirs(getJcrAdminSession(), RepoConstants.ARTIFACTS_BASE_PATH); - Node proxiedRepositories = JcrUtils.mkdirs(getJcrAdminSession(), + protected void beforeInitSessionSave(Session session) + throws RepositoryException { + JcrUtils.mkdirsSafe(session, RepoConstants.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.setProperty(SLC_URL, repository.getUrl()); + proxiedRepository.addMixin(NodeType.MIX_REFERENCEABLE); + JcrUtils.urlToAddressProperties(proxiedRepository, + repository.getUrl()); + // proxiedRepository.setProperty(SLC_URL, repository.getUrl()); proxiedRepository.setProperty(SLC_TYPE, repository.getContentType()); } @@ -44,34 +52,42 @@ public class MavenProxyServiceImpl extends AbstractUrlProxy implements /** * Retrieve and add this file to the repository */ - protected String retrieve(String path) { + @Override + protected Node retrieve(Session session, String path) { try { + if (session.hasPendingChanges()) + throw new SlcException("Session has pending changed"); Node node = null; - baseUrls: for (String baseUrl : getBaseUrls()) { - node = proxyUrl(baseUrl, path); - if (node != null) - break baseUrls; - } - - if (node != null) - return node.getIdentifier(); - else { - log.warn("Could not proxy " + path); - return 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; + } } - } catch (RepositoryException e) { + 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() + protected synchronized List getBaseUrls(Session session) throws RepositoryException { - List baseUrls = new ArrayList(); - for (NodeIterator nit = getJcrAdminSession().getNode( + List baseUrls = new ArrayList(); + for (NodeIterator nit = session.getNode( RepoConstants.PROXIED_REPOSITORIES).getNodes(); nit.hasNext();) { Node proxiedRepository = nit.nextNode(); - String repoUrl = proxiedRepository.getProperty(SLC_URL).getString(); - baseUrls.add(repoUrl); + baseUrls.add(proxiedRepository); } return baseUrls; } diff --git a/runtime/org.argeo.slc.repo/src/main/resources/org/argeo/slc/repo/repo.cnd b/runtime/org.argeo.slc.repo/src/main/resources/org/argeo/slc/repo/repo.cnd index 1ab84569d..578beb570 100644 --- a/runtime/org.argeo.slc.repo/src/main/resources/org/argeo/slc/repo/repo.cnd +++ b/runtime/org.argeo.slc.repo/src/main/resources/org/argeo/slc/repo/repo.cnd @@ -1,7 +1,7 @@ // AETHER -[slc:artifact] > nt:base, mix:shareable +[slc:artifact] > mix:referenceable, mix:created, mix:lastModified mixin - slc:artifactId (STRING) m - slc:groupId (STRING) m @@ -9,24 +9,37 @@ mixin - slc:artifactExtension (STRING) m - slc:artifactClassifier (STRING) ='' m a -[slc:artifactVersionBase] > nt:base +[slc:artifactVersion] > mix:referenceable, mix:created, mix:lastModified, mix:title mixin - slc:artifactId (STRING) m - slc:groupId (STRING) m - slc:artifactVersion (STRING) m -[slc:artifactBase] > nt:base +[slc:artifactBase] > mix:referenceable, mix:created, mix:lastModified mixin - slc:artifactId (STRING) m - slc:groupId (STRING) m -[slc:groupBase] > nt:base +[slc:groupBase] > mix:referenceable, mix:created, mix:lastModified mixin // it is possible to have groupBase being artifact base (e.g. org.argeo.commons.basic) // so using groupId would conflict - slc:groupBaseId (STRING) m -[slc:jarFile] > nt:base +[slc:distribution] > slc:artifactVersion +mixin ++ slc:artifactVersions (argeo:references) m + +// ORIGINS +[slc:knownOrigin] > nt:base +mixin ++ slc:origin (nt:address) + +[slc:proxied] > nt:address +- slc:proxy (REFERENCE) + +// JAVA +[slc:jarFile] > mix:referenceable mixin - 'slc:manifest' (BINARY) m - 'slc:Manifest-Version' (STRING) @@ -46,10 +59,10 @@ mixin // OSGi // see http://www.osgi.org/Specifications/Reference -[slc:javaPackage] > nt:base +[slc:javaPackage] > mix:referenceable - slc:name (STRING) primary m -[slc:osgiBaseVersion] > nt:base +[slc:osgiBaseVersion] > mix:referenceable - slc:asString (STRING) primary m - slc:major (LONG) m - slc:minor (LONG) m @@ -70,22 +83,22 @@ mixin - slc:version (STRING) ='0.0.0' m a - slc:optional (BOOLEAN) ='false' m a -[slc:requiredBundle] > nt:base +[slc:requiredBundle] > mix:referenceable - 'slc:symbolic-name' (STRING) primary m - 'slc:bundle-version' (STRING) ='0.0.0' m a - slc:optional (BOOLEAN) ='false' m a -[slc:fragmentHost] > nt:base +[slc:fragmentHost] > mix:referenceable - 'slc:symbolic-name' (STRING) m - 'slc:bundle-version' (STRING) ='0.0.0' m a -[slc:bundleNativeCode] > nt:base +[slc:bundleNativeCode] > mix:referenceable - slc:path (STRING) primary m - slc:osname (STRING) - slc:processor (STRING) // see http://www.osgi.org/Specifications/ReferenceHeaders -[slc:bundle] > nt:base +[slc:bundle] > mix:referenceable mixin - 'slc:symbolic-name' (STRING) primary m - 'slc:bundle-version' (STRING) m @@ -116,4 +129,3 @@ mixin [slc:bundleArtifact] > slc:artifact,slc:jarFile,slc:bundle mixin - diff --git a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/SlcNames.java b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/SlcNames.java index 3d39cbb7d..51a62b4b7 100644 --- a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/SlcNames.java +++ b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/SlcNames.java @@ -56,6 +56,10 @@ public interface SlcNames { public final static String SLC_OPTIONAL = "slc:optional"; public final static String SLC_AS_STRING = "slc:asString"; + // origin + public final static String SLC_ORIGIN = "slc:origin"; + public final static String SLC_PROXY = "slc:proxy"; + // slc:artifact public final static String SLC_ARTIFACT_ID = "slc:artifactId"; public final static String SLC_GROUP_ID = "slc:groupId"; diff --git a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/SlcTypes.java b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/SlcTypes.java index e0e2d1e25..fde1b0dd2 100644 --- a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/SlcTypes.java +++ b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/SlcTypes.java @@ -33,7 +33,7 @@ public interface SlcTypes { * REPO */ public final static String SLC_ARTIFACT = "slc:artifact"; - public final static String SLC_ARTIFACT_VERSION_BASE = "slc:artifactVersionBase"; + public final static String SLC_ARTIFACT_VERSION_BASE = "slc:artifactVersion"; public final static String SLC_ARTIFACT_BASE = "slc:artifactBase"; public final static String SLC_GROUP_BASE = "slc:groupBase"; public final static String SLC_JAR_FILE = "slc:jarFile"; @@ -45,5 +45,9 @@ public interface SlcTypes { public final static String SLC_DYNAMIC_IMPORTED_PACKAGE = "slc:dynamicImportedPackage"; public final static String SLC_REQUIRED_BUNDLE = "slc:requiredBundle"; public final static String SLC_FRAGMENT_HOST = "slc:fragmentHost"; + + // origin + public final static String SLC_KNOWN_ORIGIN = "slc:knownOrigin"; + public final static String SLC_PROXIED = "slc:proxied"; } diff --git a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrAgent.java b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrAgent.java index 89b618d1b..a096e5d5e 100644 --- a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrAgent.java +++ b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrAgent.java @@ -31,7 +31,7 @@ public class JcrAgent extends DefaultAgent implements SlcAgentFactory, SlcNames */ protected String initAgentUuid() { try { - Node vmAgentFactoryNode = JcrUtils.mkdirs(session, + Node vmAgentFactoryNode = JcrUtils.mkdirsSafe(session, SlcJcrConstants.VM_AGENT_FACTORY_PATH, SlcTypes.SLC_AGENT_FACTORY); if (!vmAgentFactoryNode.hasNode(agentNodeName)) { -- 2.39.2