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=27c6806a3e98d062c43462e5ffcf67c95f8e6dbb;hb=af67496c90f9e0347b3b6c39805f9ce673695baf;hp=a0f0be25ba2ca4ed4efb65932c410cff02c778e3;hpb=aeaa45c7cfbb4f2376a4ec02e6dd71d711a52c5b;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 a0f0be25b..27c6806a3 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,5 +1,5 @@ /* - * Copyright (C) 2007-2012 Mathieu Baudier + * 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. @@ -16,6 +16,8 @@ package org.argeo.slc.repo; import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.RepositoryException; import javax.jcr.nodetype.NodeType; import org.apache.commons.logging.Log; @@ -25,6 +27,7 @@ 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; /** @@ -32,8 +35,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); @@ -52,6 +56,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; @@ -73,13 +84,40 @@ public class ArtifactIndexer implements NodeIndexer { artifact.getClassifier()); JcrUtils.updateLastModified(fileNode); - // make sure there is a checksum + // 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 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(); @@ -139,4 +177,95 @@ public class ArtifactIndexer implements NodeIndexer { 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(); + p.append("\n"); + p.append("\n"); + p.append("4.0.0"); + + // Categorized name version + 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"); + // TODO make it more generic + p.append("jar\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"); + + // Dependencies in case of a distribution + if (n.isNodeType(SlcTypes.SLC_MODULAR_DISTRIBUTION)) { + p.append(getDependenciesSnippet(n.getNode(SlcNames.SLC_MODULES) + .getNodes())); + p.append(getDependencyManagementSnippet(n.getNode( + SlcNames.SLC_MODULES).getNodes())); + } + p.append("\n"); + return p.toString(); + } + + private String getDependenciesSnippet(NodeIterator nit) + throws RepositoryException { + StringBuilder b = new StringBuilder(); + b.append("\n"); + while (nit.hasNext()) { + Node currModule = nit.nextNode(); + if (currModule.isNodeType(SlcTypes.SLC_MODULE_COORDINATES)) { + b.append(getDependencySnippet( + currModule.getProperty(SlcNames.SLC_CATEGORY) + .getString(), + currModule.getProperty(SlcNames.SLC_NAME).getString(), + null)); + } + } + b.append("\n"); + return b.toString(); + } + + private String getDependencyManagementSnippet(NodeIterator nit) + throws RepositoryException { + StringBuilder b = new StringBuilder(); + b.append("\n"); + b.append("\n"); + while (nit.hasNext()) { + Node currModule = nit.nextNode(); + if (currModule.isNodeType(SlcTypes.SLC_MODULE_COORDINATES)) { + b.append(getDependencySnippet( + currModule.getProperty(SlcNames.SLC_CATEGORY) + .getString(), + currModule.getProperty(SlcNames.SLC_NAME).getString(), + currModule.getProperty(SlcNames.SLC_VERSION) + .getString())); + } + } + b.append("\n"); + b.append("\n"); + return b.toString(); + } + + private String getDependencySnippet(String category, String name, + String version) { + StringBuilder b = new StringBuilder(); + b.append("\n"); + b.append("\t").append(category).append("\n"); + b.append("\t").append(name).append("\n"); + if (version != null) + b.append("\t").append(version).append("\n"); + b.append("\n"); + return b.toString(); + } +} \ No newline at end of file