]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/NormalizeDistribution.java
Normalize distirbution command
[gpl/argeo-slc.git] / eclipse / plugins / org.argeo.slc.client.ui.dist / src / main / java / org / argeo / slc / client / ui / dist / commands / NormalizeDistribution.java
index 85a336e8d96197adaae42a1bf96a4c6c0d6415eb..e10e75f506207b79a832b129ce9d8e62f07dee8e 100644 (file)
  */
 package org.argeo.slc.client.ui.dist.commands;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-
 import javax.jcr.Node;
-import javax.jcr.NodeIterator;
+import javax.jcr.Property;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
-import javax.jcr.query.QueryManager;
-import javax.jcr.query.QueryResult;
-import javax.jcr.query.qom.Ordering;
-import javax.jcr.query.qom.QueryObjectModel;
-import javax.jcr.query.qom.QueryObjectModelFactory;
-import javax.jcr.query.qom.Selector;
+import javax.jcr.nodetype.NodeType;
+import javax.jcr.util.TraversingItemVisitor;
 
-import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.argeo.eclipse.ui.ErrorFeedback;
 import org.argeo.jcr.JcrUtils;
+import org.argeo.slc.client.ui.dist.DistPlugin;
 import org.argeo.slc.jcr.SlcNames;
-import org.argeo.slc.jcr.SlcTypes;
 import org.argeo.slc.repo.ArtifactIndexer;
 import org.argeo.slc.repo.JarFileIndexer;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
-import org.osgi.framework.Constants;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
 
+/** Make sure than Maven and OSGi metadata are consistent */
 public class NormalizeDistribution extends AbstractHandler implements SlcNames {
+       public final static String ID = DistPlugin.ID + ".normalizeDistribution";
+       public final static String PARAM_WORKSPACE = "workspace";
+       public final static String DEFAULT_LABEL = "Normalize";
+       public final static String DEFAULT_ICON_PATH = "icons/addItem.gif";
+
        private final static Log log = LogFactory
                        .getLog(NormalizeDistribution.class);
 
        private Repository repository;
-       private String workspace;
-       private String groupId;
+       private String artifactBasePath = "/";
 
        private ArtifactIndexer artifactIndexer = new ArtifactIndexer();
        private JarFileIndexer jarFileIndexer = new JarFileIndexer();
 
-       // indexes
-       private Map<String, String> packagesToSymbolicNames = new HashMap<String, String>();
-       private Map<String, Node> symbolicNamesToNodes = new HashMap<String, Node>();
-
        public Object execute(ExecutionEvent event) throws ExecutionException {
-               Session session = null;
-               try {
-                       session = repository.login(workspace);
-                       NodeIterator bundlesIt = listBundleArtifacts(session);
-
-                       while (bundlesIt.hasNext()) {
-                               Node bundleNode = bundlesIt.nextNode();
-                               preProcessBundleArtifact(bundleNode);
-                               bundleNode.getSession().save();
-                               if (log.isDebugEnabled())
-                                       log.debug("Pre-processed " + bundleNode.getName());
-                       }
-
-                       int bundleCount = symbolicNamesToNodes.size();
-                       if (log.isDebugEnabled())
-                               log.debug("Indexed " + bundleCount + " bundles");
-
-                       int count = 1;
-                       for (Node bundleNode : symbolicNamesToNodes.values()) {
-                               processBundleArtifact(bundleNode);
-                               bundleNode.getSession().save();
-                               if (log.isDebugEnabled())
-                                       log.debug(count + "/" + bundleCount + " Processed "
-                                                       + bundleNode.getName());
-                               count++;
-                       }
-               } catch (Exception e) {
-                       ErrorFeedback.show("Cannot normalize distribution " + workspace, e);
-               } finally {
-                       JcrUtils.logoutQuietly(session);
-               }
-
+               String workspace = event.getParameter(PARAM_WORKSPACE);
+               NormalizeJob job = new NormalizeJob(workspace);
+               job.setUser(true);
+               job.schedule();
                return null;
        }
 
-       protected void preProcessBundleArtifact(Node bundleNode)
-                       throws RepositoryException {
-               artifactIndexer.index(bundleNode);
-               jarFileIndexer.index(bundleNode);
+       public void setRepository(Repository repository) {
+               this.repository = repository;
+       }
 
-               String symbolicName = JcrUtils.get(bundleNode, SLC_SYMBOLIC_NAME);
+       private class NormalizeJob extends Job {
+               private String workspace;
 
-               if (symbolicName.endsWith(".source")) {
-                       // TODO make a shared node with classifier 'sources'
-                       return;
+               public NormalizeJob(String workspace) {
+                       super("Normalize Distribution");
+                       this.workspace = workspace;
                }
 
-               NodeIterator exportPackages = bundleNode.getNodes(SLC_
-                               + Constants.EXPORT_PACKAGE);
-               while (exportPackages.hasNext()) {
-                       Node exportPackage = exportPackages.nextNode();
-                       String pkg = JcrUtils.get(exportPackage, SLC_NAME);
-                       packagesToSymbolicNames.put(pkg, symbolicName);
+               @Override
+               protected IStatus run(IProgressMonitor monitor) {
+                       Session session = null;
+                       try {
+                               session = repository.login(workspace);
+                               // QueryManager qm = session.getWorkspace().getQueryManager();
+                               // Query query = qm
+                               // .createQuery(
+                               // "select * from [nt:file] where NAME([nt:file]) like '%.jar'",
+                               // Query.JCR_SQL2);
+                               // // Query query = qm.createQuery("//*jar", Query.XPATH);
+                               // long count = query.execute().getRows().getSize();
+                               // if (log.isDebugEnabled())
+                               // log.debug("Count: " + count);
+                               // long count = query.execute().getRows().nextRow()
+                               // .getValue("count").getLong();
+                               monitor.beginTask("Normalize " + workspace, -1);
+                               NormalizingTraverser tiv = new NormalizingTraverser(monitor);
+                               session.getNode(artifactBasePath).accept(tiv);
+                       } catch (Exception e) {
+                               return new Status(IStatus.ERROR, DistPlugin.ID,
+                                               "Cannot normalize distribution " + workspace, e);
+                       } finally {
+                               JcrUtils.logoutQuietly(session);
+                       }
+                       return Status.OK_STATUS;
                }
 
-               symbolicNamesToNodes.put(symbolicName, bundleNode);
-       }
-
-       protected void processBundleArtifact(Node bundleNode)
-                       throws RepositoryException {
-               Node artifactFolder = bundleNode.getParent();
-               String baseName = FilenameUtils.getBaseName(bundleNode.getName());
-
-               // pom
-               String pom = generatePomForBundle(bundleNode);
-               String pomName = baseName + ".pom";
-               Node pomNode = JcrUtils.copyBytesAsFile(artifactFolder, pomName,
-                               pom.getBytes());
-
-               // checksum
-               String bundleSha = JcrUtils.checksumFile(bundleNode, "SHA-1");
-               JcrUtils.copyBytesAsFile(artifactFolder,
-                               bundleNode.getName() + ".sha1", bundleSha.getBytes());
-               String pomSha = JcrUtils.checksumFile(bundleNode, "SHA-1");
-               JcrUtils.copyBytesAsFile(artifactFolder, pomNode.getName() + ".sha1",
-                               pomSha.getBytes());
        }
 
-       private String generatePomForBundle(Node n) throws RepositoryException {
-               String ownSymbolicName = JcrUtils.get(n, SLC_SYMBOLIC_NAME);
-
-               StringBuffer p = new StringBuffer();
-
-               // XML header
-               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>");
+       private class NormalizingTraverser extends TraversingItemVisitor {
+               IProgressMonitor monitor;
 
-               // Artifact
-               // p.append("<parent><groupId>org.argeo</groupId><artifactId>parent</artifactId><version>1.2.0</version></parent>\n");
-               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");
-               p.append("<packaging>pom</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
-               Set<String> dependenciesSymbolicNames = new TreeSet<String>();
-               Set<String> optionalSymbolicNames = new TreeSet<String>();
-               NodeIterator importPackages = n.getNodes(SLC_
-                               + Constants.IMPORT_PACKAGE);
-               while (importPackages.hasNext()) {
-                       Node importPackage = importPackages.nextNode();
-                       String pkg = JcrUtils.get(importPackage, SLC_NAME);
-                       if (packagesToSymbolicNames.containsKey(pkg)) {
-                               String dependencySymbolicName = packagesToSymbolicNames
-                                               .get(pkg);
-                               if (JcrUtils.check(importPackage, SLC_OPTIONAL))
-                                       optionalSymbolicNames.add(dependencySymbolicName);
-                               else
-                                       dependenciesSymbolicNames.add(dependencySymbolicName);
-                       } else {
-                               if (!JcrUtils.check(importPackage, SLC_OPTIONAL))
-                                       log.warn("No bundle found for pkg " + pkg);
-                       }
+               public NormalizingTraverser(IProgressMonitor monitor) {
+                       super();
+                       this.monitor = monitor;
                }
 
-               if (n.hasNode(SLC_ + Constants.FRAGMENT_HOST)) {
-                       String fragmentHost = JcrUtils.get(
-                                       n.getNode(SLC_ + Constants.FRAGMENT_HOST),
-                                       SLC_SYMBOLIC_NAME);
-                       dependenciesSymbolicNames.add(fragmentHost);
+               @Override
+               protected void entering(Property property, int level)
+                               throws RepositoryException {
                }
 
-               List<Node> dependencyNodes = new ArrayList<Node>();
-               for (String depSymbName : dependenciesSymbolicNames) {
-                       if (depSymbName.equals(ownSymbolicName))
-                               continue;// skip self
-
-                       if (symbolicNamesToNodes.containsKey(depSymbName))
-                               dependencyNodes.add(symbolicNamesToNodes.get(depSymbName));
-                       else
-                               log.warn("Could not find node for " + depSymbName);
-               }
-               List<Node> optionalDependencyNodes = new ArrayList<Node>();
-               for (String depSymbName : optionalSymbolicNames) {
-                       if (symbolicNamesToNodes.containsKey(depSymbName))
-                               optionalDependencyNodes.add(symbolicNamesToNodes
-                                               .get(depSymbName));
-                       else
-                               log.warn("Could not find node for " + depSymbName);
+               @Override
+               protected void entering(Node node, int level)
+                               throws RepositoryException {
+                       if (node.isNodeType(NodeType.NT_FILE)) {
+                               if (jarFileIndexer.support(node.getPath()))
+                                       if (artifactIndexer.support(node.getPath())) {
+                                               monitor.subTask(node.getName());
+                                               artifactIndexer.index(node);
+                                               jarFileIndexer.index(node);
+                                               node.getSession().save();
+                                               monitor.worked(1);
+                                               if (log.isDebugEnabled())
+                                                       log.debug("Processed " + node);
+                                       }
+                       }
                }
 
-               p.append("<dependencies>\n");
-               for (Node dependencyNode : dependencyNodes) {
-                       p.append("<dependency>\n");
-                       p.append("\t<groupId>")
-                                       .append(JcrUtils.get(dependencyNode, SLC_GROUP_ID))
-                                       .append("</groupId>\n");
-                       p.append("\t<artifactId>")
-                                       .append(JcrUtils.get(dependencyNode, SLC_ARTIFACT_ID))
-                                       .append("</artifactId>\n");
-                       p.append("</dependency>\n");
+               @Override
+               protected void leaving(Property property, int level)
+                               throws RepositoryException {
                }
 
-               if (optionalDependencyNodes.size() > 0)
-                       p.append("<!-- OPTIONAL -->\n");
-               for (Node dependencyNode : optionalDependencyNodes) {
-                       p.append("<dependency>\n");
-                       p.append("\t<groupId>")
-                                       .append(JcrUtils.get(dependencyNode, SLC_GROUP_ID))
-                                       .append("</groupId>\n");
-                       p.append("\t<artifactId>")
-                                       .append(JcrUtils.get(dependencyNode, SLC_ARTIFACT_ID))
-                                       .append("</artifactId>\n");
-                       p.append("\t<optional>true</optional>\n");
-                       p.append("</dependency>\n");
+               @Override
+               protected void leaving(Node node, int level) throws RepositoryException {
                }
-               p.append("</dependencies>\n");
 
-               // Dependency management
-               p.append("<dependencyManagement>\n");
-               p.append("<dependencies>\n");
-               // TODO import SDK
-               p.append("</dependencies>\n");
-               p.append("</dependencyManagement>\n");
-
-               p.append("</project>\n");
-               return p.toString();
        }
-
-       static NodeIterator listBundleArtifacts(Session session)
-                       throws RepositoryException {
-               QueryManager queryManager = session.getWorkspace().getQueryManager();
-               QueryObjectModelFactory factory = queryManager.getQOMFactory();
-
-               final String bundleArtifactsSelector = "bundleArtifacts";
-               Selector source = factory.selector(SlcTypes.SLC_BUNDLE_ARTIFACT,
-                               bundleArtifactsSelector);
-
-               Ordering order = factory.ascending(factory.propertyValue(
-                               bundleArtifactsSelector, SlcNames.SLC_SYMBOLIC_NAME));
-               Ordering[] orderings = { order };
-
-               QueryObjectModel query = factory.createQuery(source, null, orderings,
-                               null);
-
-               QueryResult result = query.execute();
-               return result.getNodes();
-       }
-
-       public void setRepository(Repository repository) {
-               this.repository = repository;
-       }
-
-       public void setWorkspace(String workspace) {
-               this.workspace = workspace;
-       }
-
 }