]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/ArtifactIndexer.java
Add BSD License.
[gpl/argeo-slc.git] / runtime / org.argeo.slc.repo / src / main / java / org / argeo / slc / repo / ArtifactIndexer.java
index c2e20c3abc479a1c13908c52006237b913e62594..27c6806a3e98d062c43462e5ffcf67c95f8e6dbb 100644 (file)
@@ -1,6 +1,23 @@
+/*
+ * 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.NodeIterator;
+import javax.jcr.RepositoryException;
 import javax.jcr.nodetype.NodeType;
 
 import org.apache.commons.logging.Log;
@@ -10,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;
 
 /**
@@ -17,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);
@@ -37,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;
 
@@ -58,6 +84,41 @@ public class ArtifactIndexer implements NodeIndexer {
                                        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 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();
                        if (!artifactVersionBase
@@ -99,7 +160,7 @@ public class ArtifactIndexer implements NodeIndexer {
                                                artifact.getGroupId());
                        }
                        JcrUtils.updateLastModifiedAndParents(groupBase,
-                                       RepoConstants.ARTIFACTS_BASE_PATH);
+                                       RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH);
 
                        if (log.isTraceEnabled())
                                log.trace("Indexed artifact " + artifact + " on " + fileNode);
@@ -110,10 +171,101 @@ 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();
+               p.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+               p.append("<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n");
+               p.append("<modelVersion>4.0.0</modelVersion>");
+
+               // Categorized name version
+               p.append("<groupId>").append(JcrUtils.get(n, SLC_GROUP_ID))
+                               .append("</groupId>\n");
+               p.append("<artifactId>").append(JcrUtils.get(n, SLC_ARTIFACT_ID))
+                               .append("</artifactId>\n");
+               p.append("<version>").append(JcrUtils.get(n, SLC_ARTIFACT_VERSION))
+                               .append("</version>\n");
+               // TODO make it more generic
+               p.append("<packaging>jar</packaging>\n");
+               if (n.hasProperty(SLC_ + Constants.BUNDLE_NAME))
+                       p.append("<name>")
+                                       .append(JcrUtils.get(n, SLC_ + Constants.BUNDLE_NAME))
+                                       .append("</name>\n");
+               if (n.hasProperty(SLC_ + Constants.BUNDLE_DESCRIPTION))
+                       p.append("<description>")
+                                       .append(JcrUtils
+                                                       .get(n, SLC_ + Constants.BUNDLE_DESCRIPTION))
+                                       .append("</description>\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("</project>\n");
+               return p.toString();
+       }
+
+       private String getDependenciesSnippet(NodeIterator nit)
+                       throws RepositoryException {
+               StringBuilder b = new StringBuilder();
+               b.append("<dependencies>\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("</dependencies>\n");
+               return b.toString();
+       }
+
+       private String getDependencyManagementSnippet(NodeIterator nit)
+                       throws RepositoryException {
+               StringBuilder b = new StringBuilder();
+               b.append("<dependencyManagement>\n");
+               b.append("<dependencies>\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("</dependencies>\n");
+               b.append("</dependencyManagement>\n");
+               return b.toString();
+       }
+
+       private String getDependencySnippet(String category, String name,
+                       String version) {
+               StringBuilder b = new StringBuilder();
+               b.append("<dependency>\n");
+               b.append("\t<groupId>").append(category).append("</groupId>\n");
+               b.append("\t<artifactId>").append(name).append("</artifactId>\n");
+               if (version != null)
+                       b.append("\t<version>").append(version).append("</version>\n");
+               b.append("</dependency>\n");
+               return b.toString();
+       }
+}
\ No newline at end of file