Normalize distirbution command
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 1 Jul 2012 18:01:55 +0000 (18:01 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 1 Jul 2012 18:01:55 +0000 (18:01 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@5415 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

eclipse/plugins/org.argeo.slc.client.ui.dist/META-INF/MANIFEST.MF
eclipse/plugins/org.argeo.slc.client.ui.dist/META-INF/spring/commands.xml
eclipse/plugins/org.argeo.slc.client.ui.dist/plugin.xml
eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CopyWorkspace.java
eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/DeleteWorkspace.java
eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/ManageWorkspaceAuth.java
eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/NormalizeDistribution.java
eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java

index 01068e8d20dcde957c53eb251251e141f0470c3d..88160b8d9b04203562568919953f8cf0d1747ed7 100644 (file)
@@ -16,6 +16,7 @@ Import-Package: aQute.lib.osgi;resolution:=optional,
  javax.jcr.query,
  javax.jcr.query.qom;version="2.0.0",
  javax.jcr.security,
+ javax.jcr.util;version="2.0.0",
  org.apache.commons.io;version="1.4.0",
  org.apache.commons.logging;version="1.1.1",
  org.argeo,
index ea596a1d13432d620b6e50570851915a16c466ce..2be2c1185fbc8537608c567df42c6fc636314cfc 100644 (file)
@@ -21,7 +21,6 @@
                class="org.argeo.slc.client.ui.dist.commands.NormalizeDistribution"
                scope="prototype">
                <property name="repository" ref="javaRepository" />
-               <property name="workspace" value="org.argeo.tp-1.3.1" />
        </bean>
        <bean id="createWorkspace"
                class="org.argeo.slc.client.ui.dist.commands.CreateWorkspace"
index 8750f012f8bcec503e05137f3463e4560e0d04ef..97174910966d6ce72c61dffae18afa3bd1d3c195 100644 (file)
             id="org.argeo.slc.client.ui.dist.runInOSGi"
             defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
             name="Run in OSGi">
+            <commandParameter
+                       id="workspace"
+                       name="Workspace Name">
+                       </commandParameter>
        </command>
                <command
             id="org.argeo.slc.client.ui.dist.normalizeDistribution"
             defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
             name="Normalize Distribution">
+            <commandParameter
+                       id="workspace"
+                       name="Workspace Name">
+                       </commandParameter>
        </command>
        
                <!-- TO MANIPULATE WORKSPACES -->
                 tooltip="Refresh the whole browser">
             </command>
         </menuContribution>
+        <!--
                <menuContribution
                locationURI="toolbar:org.argeo.slc.client.ui.dist.distributionsView">
             <command
                 tooltip="Run in a spearate OSGi runtime">
             </command>
         </menuContribution>
-               <menuContribution
-               locationURI="toolbar:org.argeo.slc.client.ui.dist.distributionsView">
-            <command
-               commandId="org.argeo.slc.client.ui.dist.normalizeDistribution"
-                icon="icons/refresh.png"
-                label="Normalize Distribution"
-                tooltip="Normalize Distribution">
-            </command>
-        </menuContribution>
-       
+       -->
         <!-- Queries --> 
                <!-- <menuContribution
                 allPopups="false"
index e95e57aec3191b48ae69b531737b67817f062aaf..7d1e589f86463368a62219d8db697cb740d1fa74 100644 (file)
@@ -31,7 +31,7 @@ public class CopyWorkspace extends AbstractHandler {
        public final static String ID = DistPlugin.ID + ".copyWorkspace";
        public final static String PARAM_WORKSPACE_NAME = DistPlugin.ID
                        + ".workspaceName";
-       public final static String DEFAULT_LABEL = "Copy this workspace";
+       public final static String DEFAULT_LABEL = "Duplicate";
        public final static String DEFAULT_ICON_PATH = "icons/addItem.gif";
 
        /* DEPENDENCY INJECTION */
index 39ba79e48be4c9abebc7e5000ead613695c3cd7e..b1a3632b418271660ace2d6661a21d1bf53077bc 100644 (file)
@@ -17,7 +17,7 @@ public class DeleteWorkspace extends AbstractHandler {
        public final static String ID = DistPlugin.ID + ".deleteWorkspace";
        public final static String PARAM_WORKSPACE_NAME = DistPlugin.ID
                        + ".workspaceName";
-       public final static String DEFAULT_LABEL = "Delete current workspace";
+       public final static String DEFAULT_LABEL = "Delete";
        public final static String DEFAULT_ICON_PATH = "icons/removeItem.gif";
 
        /* DEPENDENCY INJECTION */
index 292a35ee5b5dab8e9d76d8f99235c4f25c137a0d..717e86bf48e33629e3de8b601cccdeafe7de6fda 100644 (file)
@@ -23,7 +23,7 @@ public class ManageWorkspaceAuth extends AbstractHandler {
        public final static String ID = DistPlugin.ID + ".manageWorkspaceAuth";
        public final static String PARAM_WORKSPACE_NAME = DistPlugin.ID
                        + ".workspaceName";
-       public final static String DEFAULT_LABEL = "Change rights for current workspace";
+       public final static String DEFAULT_LABEL = "Manage Rights";
        public final static String DEFAULT_ICON_PATH = "icons/changeRights.gif";
 
        /* DEPENDENCY INJECTION */
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;
-       }
-
 }
index f62707abe11c689ff3bd48397dbbbe797dbcf73c..6ac3d79ad783f5c90c4dea819217122746eb87a9 100644 (file)
@@ -32,6 +32,7 @@ import org.argeo.slc.client.ui.dist.commands.CopyWorkspace;
 import org.argeo.slc.client.ui.dist.commands.CreateWorkspace;
 import org.argeo.slc.client.ui.dist.commands.DeleteWorkspace;
 import org.argeo.slc.client.ui.dist.commands.ManageWorkspaceAuth;
+import org.argeo.slc.client.ui.dist.commands.NormalizeDistribution;
 import org.argeo.slc.client.ui.dist.editors.DistributionEditor;
 import org.argeo.slc.client.ui.dist.editors.DistributionEditorInput;
 import org.argeo.slc.client.ui.dist.utils.CommandHelpers;
@@ -145,10 +146,20 @@ public class DistributionsView extends ViewPart implements SlcNames {
                        // create workspace
                        CommandHelpers.refreshCommand(menuManager, window,
                                        CreateWorkspace.ID, CreateWorkspace.DEFAULT_LABEL,
-                                       CreateWorkspace.DEFAULT_ICON_PATH, true);
+                                       CreateWorkspace.DEFAULT_ICON_PATH,
+                                       tp instanceof RepositoryElem);
 
-                       // Copy workspace
+                       // Normalize workspace
                        Map<String, String> params = new HashMap<String, String>();
+                       params.put(NormalizeDistribution.PARAM_WORKSPACE, wsName);
+                       CommandHelpers.refreshParameterizedCommand(menuManager, window,
+                                       NormalizeDistribution.ID,
+                                       NormalizeDistribution.DEFAULT_LABEL,
+                                       NormalizeDistribution.DEFAULT_ICON_PATH, isDistribElem,
+                                       params);
+
+                       // Copy workspace
+                       params = new HashMap<String, String>();
                        params.put(CopyWorkspace.PARAM_WORKSPACE_NAME, wsName);
                        CommandHelpers.refreshParameterizedCommand(menuManager, window,
                                        CopyWorkspace.ID, CopyWorkspace.DEFAULT_LABEL,