X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.repo%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Frepo%2FArtifactIndexer.java;h=6de832b91a6e323e265f2ff713f838439ad08b02;hb=1a0340b557d4cd38e763e4922a3ee4e5dcc8f6d3;hp=4b767796151d044a02e0b91c2771777f0aedf6d1;hpb=912cf5554a61dc35fb61183da39673656b668467;p=gpl%2Fargeo-slc.git 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 4b7677961..6de832b91 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 @@ -1,14 +1,32 @@ +/* + * Copyright (C) 2007-2012 Argeo GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.argeo.slc.repo; import javax.jcr.Node; +import javax.jcr.RepositoryException; import javax.jcr.nodetype.NodeType; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.argeo.jcr.JcrUtils; import org.argeo.slc.SlcException; import org.argeo.slc.aether.AetherUtils; import org.argeo.slc.jcr.SlcNames; import org.argeo.slc.jcr.SlcTypes; +import org.osgi.framework.Constants; import org.sonatype.aether.artifact.Artifact; /** @@ -16,8 +34,9 @@ import org.sonatype.aether.artifact.Artifact; * name doesn't start with the artifact id (in order to skip Maven metadata XML * files and other non artifact files). */ -public class ArtifactIndexer implements NodeIndexer { +public class ArtifactIndexer implements NodeIndexer, SlcNames { private Log log = LogFactory.getLog(ArtifactIndexer.class); + private Boolean force = false; public Boolean support(String path) { String relativePath = getRelativePath(path); @@ -36,6 +55,13 @@ public class ArtifactIndexer implements NodeIndexer { public void index(Node fileNode) { Artifact artifact = null; try { + if (!support(fileNode.getPath())) + return; + + // Already indexed + if (!force && fileNode.isNodeType(SlcTypes.SLC_ARTIFACT)) + return; + if (!fileNode.isNodeType(NodeType.NT_FILE)) return; @@ -55,6 +81,41 @@ public class ArtifactIndexer implements NodeIndexer { // can be null but ok for JCR API fileNode.setProperty(SlcNames.SLC_ARTIFACT_CLASSIFIER, artifact.getClassifier()); + JcrUtils.updateLastModified(fileNode); + + // make sure there are checksums + String shaNodeName = fileNode.getName() + ".sha1"; + if (!fileNode.getParent().hasNode(shaNodeName)) { + String sha = JcrUtils.checksumFile(fileNode, "SHA-1"); + JcrUtils.copyBytesAsFile(fileNode.getParent(), shaNodeName, + sha.getBytes()); + } + String md5NodeName = fileNode.getName() + ".md5"; + if (!fileNode.getParent().hasNode(md5NodeName)) { + String md5 = JcrUtils.checksumFile(fileNode, "MD5"); + JcrUtils.copyBytesAsFile(fileNode.getParent(), md5NodeName, + md5.getBytes()); + } + + // Create a default pom only with artifact coordinates if none + // already exist + String fileNodeName = fileNode.getName(); + String pomName= null; + if (fileNodeName.endsWith(".jar")) + pomName = fileNodeName.substring(0, fileNodeName.length()-".jar".length()) + ".pom"; + + if (pomName != null && !fileNode.getParent().hasNode(pomName)) { + String pom = generatePomForBundle(fileNode); + Node pomNode = JcrUtils.copyBytesAsFile(fileNode.getParent(), + pomName, pom.getBytes()); + // corresponding check sums + String sha = JcrUtils.checksumFile(pomNode, "SHA-1"); + JcrUtils.copyBytesAsFile(fileNode.getParent(), pomName + ".sha1", + sha.getBytes()); + String md5 = JcrUtils.checksumFile(fileNode, "MD5"); + JcrUtils.copyBytesAsFile(fileNode.getParent(), pomName +".md5", + md5.getBytes()); + } // set higher levels Node artifactVersionBase = fileNode.getParent(); @@ -69,6 +130,13 @@ public class ArtifactIndexer implements NodeIndexer { artifactVersionBase.setProperty(SlcNames.SLC_GROUP_ID, artifact.getGroupId()); } + 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); @@ -77,12 +145,20 @@ public class ArtifactIndexer implements NodeIndexer { artifactBase.setProperty(SlcNames.SLC_GROUP_ID, artifact.getGroupId()); } + JcrUtils.updateLastModified(artifactBase); + Node groupBase = artifactBase.getParent(); if (!groupBase.isNodeType(SlcTypes.SLC_GROUP_BASE)) { + // if (groupBase.isNodeType(SlcTypes.SLC_ARTIFACT_BASE)) { + // log.warn("Group base " + groupBase.getPath() + // + " is also artifact base"); + // } groupBase.addMixin(SlcTypes.SLC_GROUP_BASE); - groupBase.setProperty(SlcNames.SLC_GROUP_ID, + groupBase.setProperty(SlcNames.SLC_GROUP_BASE_ID, artifact.getGroupId()); } + JcrUtils.updateLastModifiedAndParents(groupBase, + RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH); if (log.isTraceEnabled()) log.trace("Indexed artifact " + artifact + " on " + fileNode); @@ -93,10 +169,43 @@ public class ArtifactIndexer implements NodeIndexer { } private String getRelativePath(String nodePath) { - String basePath = RepoConstants.ARTIFACTS_BASE_PATH; + String basePath = RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH; if (!nodePath.startsWith(basePath)) return null; String relativePath = nodePath.substring(basePath.length()); return relativePath; } -} + + public void setForce(Boolean force) { + this.force = force; + } + + private String generatePomForBundle(Node n) throws RepositoryException { + StringBuffer p = new StringBuffer(); + + // XML header + p.append("\n"); + p.append("\n"); + p.append("4.0.0"); + + // Artifact + p.append("").append(JcrUtils.get(n, SLC_GROUP_ID)) + .append("\n"); + p.append("").append(JcrUtils.get(n, SLC_ARTIFACT_ID)) + .append("\n"); + p.append("").append(JcrUtils.get(n, SLC_ARTIFACT_VERSION)) + .append("\n"); + p.append("pom\n"); + if (n.hasProperty(SLC_ + Constants.BUNDLE_NAME)) + p.append("") + .append(JcrUtils.get(n, SLC_ + Constants.BUNDLE_NAME)) + .append("\n"); + if (n.hasProperty(SLC_ + Constants.BUNDLE_DESCRIPTION)) + p.append("") + .append(JcrUtils + .get(n, SLC_ + Constants.BUNDLE_DESCRIPTION)) + .append("\n"); + p.append("\n"); + return p.toString(); + } +} \ No newline at end of file