From 3b44f736ec89e7bad73a333786e1a64dff34b579 Mon Sep 17 00:00:00 2001 From: Bruno Sinou Date: Thu, 30 Oct 2014 12:20:17 +0000 Subject: [PATCH] Implement order for versions and name versions. git-svn-id: https://svn.argeo.org/slc/trunk@7384 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../ui/dist/commands/CreateWorkspace.java | 5 +- .../dist/controllers/DistTreeComparator.java | 12 ++- .../ui/dist/editors/DistWkspSearchPage.java | 10 +-- .../ModularDistVersionOverviewPage.java | 10 +-- .../editors/WkspCategoryBaseListPage.java | 8 +- .../dist/utils/ArtifactNamesComparator.java | 73 ----------------- ...tor.java => DistNodeViewerComparator.java} | 22 ++++- .../ui/dist/utils/NameVersionComparator.java | 82 +++++++++++++++++++ .../ui/dist/utils/VersionComparator.java | 68 +++++++++++++++ 9 files changed, 195 insertions(+), 95 deletions(-) delete mode 100644 plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/ArtifactNamesComparator.java rename plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/{NodeViewerComparator.java => DistNodeViewerComparator.java} (84%) create mode 100644 plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/NameVersionComparator.java create mode 100644 plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/VersionComparator.java diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CreateWorkspace.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CreateWorkspace.java index 95dee2b6e..73de37384 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CreateWorkspace.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CreateWorkspace.java @@ -96,8 +96,9 @@ public class CreateWorkspace extends AbstractHandler { count++; } - if (log.isDebugEnabled()) - log.debug("Count " + count); + if (log.isTraceEnabled()) + log.trace("Translated workspace name length: " + count + + " (name: " + enteredName + " )"); if (count > 60) { ErrorFeedback.show("Workspace name '" + enteredName diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/controllers/DistTreeComparator.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/controllers/DistTreeComparator.java index c5b17e089..96a088125 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/controllers/DistTreeComparator.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/controllers/DistTreeComparator.java @@ -5,12 +5,17 @@ import org.argeo.slc.client.ui.dist.model.ModularDistVersionElem; import org.argeo.slc.client.ui.dist.model.RepoElem; import org.argeo.slc.client.ui.dist.model.WkspGroupElem; import org.argeo.slc.client.ui.dist.model.WorkspaceElem; +import org.argeo.slc.client.ui.dist.utils.NameVersionComparator; +import org.argeo.slc.client.ui.dist.utils.VersionComparator; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; /** Specific comparator to enhance Distribution tree browsers */ public class DistTreeComparator extends ViewerComparator { + private VersionComparator vc = new VersionComparator(); + private NameVersionComparator nvc = new NameVersionComparator(); + public int category(Object element) { if (element instanceof RepoElem) if (((RepoElem) element).inHome()) @@ -44,9 +49,12 @@ public class DistTreeComparator extends ViewerComparator { s2 = e2.toString(); } - if (e1 instanceof WorkspaceElem || e1 instanceof ModularDistVersionElem) + if (e1 instanceof WorkspaceElem) + // Reverse order for nameversions + return nvc.compare(viewer, s2, s1); + else if (e1 instanceof ModularDistVersionElem) // Reverse order for versions - return s2.compareTo(s1); + return vc.compare(viewer, s2, s1); else return s1.compareTo(s2); } diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistWkspSearchPage.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistWkspSearchPage.java index 8ce3fe12d..8d024087e 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistWkspSearchPage.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistWkspSearchPage.java @@ -48,7 +48,7 @@ import org.argeo.slc.client.ui.dist.DistPlugin; import org.argeo.slc.client.ui.dist.PrivilegedJob; import org.argeo.slc.client.ui.dist.commands.DeleteArtifacts; import org.argeo.slc.client.ui.dist.commands.OpenModuleEditor; -import org.argeo.slc.client.ui.dist.utils.NodeViewerComparator; +import org.argeo.slc.client.ui.dist.utils.DistNodeViewerComparator; import org.argeo.slc.jcr.SlcNames; import org.argeo.slc.jcr.SlcTypes; import org.eclipse.core.runtime.IProgressMonitor; @@ -102,7 +102,7 @@ public class DistWkspSearchPage extends FormPage implements SlcNames { private DistWorkspaceEditor formEditor; private FormToolkit tk; - private NodeViewerComparator comparator; + private DistNodeViewerComparator comparator; private TableViewer viewer; // private Composite header; @@ -410,7 +410,7 @@ public class DistWkspSearchPage extends FormPage implements SlcNames { }); col.getColumn().addSelectionListener(getSelectionAdapter(2)); propertiesList.add(SLC_BUNDLE_VERSION); - propertyTypesList.add(PropertyType.STRING); + propertyTypesList.add(DistNodeViewerComparator.VERSION_TYPE); final Table table = viewer.getTable(); table.setHeaderVisible(true); @@ -419,8 +419,8 @@ public class DistWkspSearchPage extends FormPage implements SlcNames { viewer.setContentProvider(new DistributionsContentProvider()); getSite().setSelectionProvider(viewer); - comparator = new NodeViewerComparator(2, - NodeViewerComparator.ASCENDING, propertiesList, + comparator = new DistNodeViewerComparator(2, + DistNodeViewerComparator.ASCENDING, propertiesList, propertyTypesList); viewer.setComparator(comparator); diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/ModularDistVersionOverviewPage.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/ModularDistVersionOverviewPage.java index d2b77497a..c32f2bb9e 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/ModularDistVersionOverviewPage.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/ModularDistVersionOverviewPage.java @@ -43,7 +43,7 @@ import org.argeo.slc.client.ui.dist.DistConstants; import org.argeo.slc.client.ui.dist.DistImages; import org.argeo.slc.client.ui.dist.commands.OpenModuleEditor; import org.argeo.slc.client.ui.dist.utils.AbstractHyperlinkListener; -import org.argeo.slc.client.ui.dist.utils.NodeViewerComparator; +import org.argeo.slc.client.ui.dist.utils.DistNodeViewerComparator; import org.argeo.slc.client.ui.specific.OpenJcrFile; import org.argeo.slc.client.ui.specific.OpenJcrFileCmdId; import org.argeo.slc.jcr.SlcNames; @@ -100,7 +100,7 @@ public class ModularDistVersionOverviewPage extends FormPage implements // private Node modularDistributionBase; // This page widgets - private NodeViewerComparator comparator; + private DistNodeViewerComparator comparator; private TableViewer viewer; private FormToolkit tk; private Text filterTxt; @@ -391,7 +391,7 @@ public class ModularDistVersionOverviewPage extends FormPage implements }); col.getColumn().addSelectionListener(getSelectionAdapter(2)); propertiesList.add(SLC_VERSION); - propertyTypesList.add(PropertyType.STRING); + propertyTypesList.add(DistNodeViewerComparator.VERSION_TYPE); // Exists in workspace col = new TableViewerColumn(viewer, SWT.NONE); @@ -415,8 +415,8 @@ public class ModularDistVersionOverviewPage extends FormPage implements viewer.setContentProvider(new DistributionsContentProvider()); getSite().setSelectionProvider(viewer); - comparator = new NodeViewerComparator(2, - NodeViewerComparator.ASCENDING, propertiesList, + comparator = new DistNodeViewerComparator(2, + DistNodeViewerComparator.ASCENDING, propertiesList, propertyTypesList); viewer.setComparator(comparator); diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/WkspCategoryBaseListPage.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/WkspCategoryBaseListPage.java index 751d26cdc..c1046adf6 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/WkspCategoryBaseListPage.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/WkspCategoryBaseListPage.java @@ -44,7 +44,7 @@ import org.argeo.slc.client.ui.dist.DistImages; import org.argeo.slc.client.ui.dist.DistPlugin; import org.argeo.slc.client.ui.dist.commands.OpenGenerateBinariesWizard; import org.argeo.slc.client.ui.dist.commands.OpenModuleEditor; -import org.argeo.slc.client.ui.dist.utils.NodeViewerComparator; +import org.argeo.slc.client.ui.dist.utils.DistNodeViewerComparator; import org.argeo.slc.jcr.SlcNames; import org.argeo.slc.jcr.SlcTypes; import org.argeo.slc.repo.RepoConstants; @@ -94,7 +94,7 @@ public class WkspCategoryBaseListPage extends FormPage implements SlcNames { private Session session; // This page widgets - private NodeViewerComparator comparator; + private DistNodeViewerComparator comparator; private TableViewer viewer; private FormToolkit tk; private Text filterTxt; @@ -309,8 +309,8 @@ public class WkspCategoryBaseListPage extends FormPage implements SlcNames { viewer.setContentProvider(new DistributionsContentProvider()); getSite().setSelectionProvider(viewer); - comparator = new NodeViewerComparator(0, - NodeViewerComparator.ASCENDING, propertiesList, + comparator = new DistNodeViewerComparator(0, + DistNodeViewerComparator.ASCENDING, propertiesList, propertyTypesList); viewer.setComparator(comparator); diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/ArtifactNamesComparator.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/ArtifactNamesComparator.java deleted file mode 100644 index 13b75fb7e..000000000 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/ArtifactNamesComparator.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.argeo.slc.client.ui.dist.utils; - -import org.argeo.eclipse.ui.TreeParent; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.jface.viewers.ViewerComparator; - -/** - * Enable comparison of two names with form org.argeo.slc-1.2.x - */ - -public class ArtifactNamesComparator extends ViewerComparator { - - @Override - public int category(Object element) { - if (element instanceof String) { - int lastInd = ((String) element).lastIndexOf('-'); - if (lastInd > 0) - return 10; - } - // unvalid names always last - return 5; - } - - @Override - public int compare(Viewer viewer, Object e1, Object e2) { - int cat1 = category(e1); - int cat2 = category(e2); - - if (cat1 != cat2) { - return cat1 - cat2; - } - - int result = 0; - - String s1, s2; - - if (e1 instanceof TreeParent) { - s1 = ((TreeParent) e1).getName(); - s2 = ((TreeParent) e2).getName(); - } else { - s1 = e1.toString(); - s2 = e2.toString(); - } - - - int i1 = s1.lastIndexOf('-'); - int i2 = s2.lastIndexOf('-'); - - - // Specific cases, unvalid Strings - if (i1 <0) - if (i2 <0) - return s1.compareTo(s2); - else - return 1; - else - if (i2 <0) - return -1; - - String aPref = s1.substring(0, s1.lastIndexOf('-')); - String aSuf = s1.substring(s1.lastIndexOf('-')); - - String bPref = s2.substring(0, s2.lastIndexOf('-')); - String bSuf = s2.substring(s2.lastIndexOf('-')); - - result = aPref.compareTo(bPref); - if (result != 0) - return result; - else - return bSuf.compareTo(aSuf); - - } -} \ No newline at end of file diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/NodeViewerComparator.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/DistNodeViewerComparator.java similarity index 84% rename from plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/NodeViewerComparator.java rename to plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/DistNodeViewerComparator.java index 7a9d0a47a..001f577db 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/NodeViewerComparator.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/DistNodeViewerComparator.java @@ -31,16 +31,24 @@ import org.argeo.ArgeoException; import org.argeo.eclipse.ui.GenericTableComparator; import org.eclipse.jface.viewers.Viewer; -public class NodeViewerComparator extends GenericTableComparator { +/** Add ability to order by name version and version */ +public class DistNodeViewerComparator extends GenericTableComparator { private final static Log log = LogFactory - .getLog(NodeViewerComparator.class); + .getLog(DistNodeViewerComparator.class); + + // Jcr property type goes to 12 + public final static int NAME_VERSION_TYPE = 100; + public final static int VERSION_TYPE = 101; protected List propertiesList; protected List propertyTypesList; protected Integer propertyType; protected String property; - public NodeViewerComparator(int defaultColIndex, int defaultDirection, + private NameVersionComparator nvc = new NameVersionComparator(); + private VersionComparator vc = new VersionComparator(); + + public DistNodeViewerComparator(int defaultColIndex, int defaultDirection, List propertiesList, List propertyTypesList) { super(defaultColIndex, defaultDirection); this.propertiesList = propertiesList; @@ -75,6 +83,12 @@ public class NodeViewerComparator extends GenericTableComparator { return 1; switch (propertyType) { + case NAME_VERSION_TYPE: + rc = nvc.compare(viewer, v1.getString(), v2.getString()); + break; + case VERSION_TYPE: + rc = vc.compare(viewer, v1.getString(), v2.getString()); + break; case PropertyType.STRING: rc = v1.getString().compareTo(v2.getString()); break; @@ -105,7 +119,7 @@ public class NodeViewerComparator extends GenericTableComparator { case PropertyType.LONG: long l1; long l2; - // FIXME sometimes an empty string is set instead of the id + // FIXME sometimes an empty string is set instead of the id try { l1 = v1.getLong(); } catch (ValueFormatException ve) { diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/NameVersionComparator.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/NameVersionComparator.java new file mode 100644 index 000000000..5cf57a40d --- /dev/null +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/NameVersionComparator.java @@ -0,0 +1,82 @@ +package org.argeo.slc.client.ui.dist.utils; + +import org.argeo.eclipse.ui.TreeParent; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerComparator; + +/** + * Enable comparison of two names version string with form org.argeo.slc-1.2.x. + * with following rules and assumptions: + *
    + *
  • + * Names are ordered using Lexicographical order
  • + *
  • + * Version are parsed and compared segment by segment; doing best effort to + * convert major, minor and micro to integer and compare them as such (to have + * 0.1 < 0.9 < 0.10 not 0.1 < 0.10 < 0.9).
  • + *
  • Version should not contain any dash (-), version segments should be + * separated by dots (.)
  • + *
+ */ + +public class NameVersionComparator extends ViewerComparator { + + private VersionComparator vc = new VersionComparator(); + + @Override + public int category(Object element) { + if (element instanceof String) { + int lastInd = ((String) element).lastIndexOf('-'); + if (lastInd > 0) + return 10; + } + // unvalid names always last + return 5; + } + + @Override + public int compare(Viewer viewer, Object e1, Object e2) { + int cat1 = category(e1); + int cat2 = category(e2); + + if (cat1 != cat2) { + return cat1 - cat2; + } + + int result = 0; + + String s1, s2; + + if (e1 instanceof TreeParent) { + s1 = ((TreeParent) e1).getName(); + s2 = ((TreeParent) e2).getName(); + } else { + s1 = e1.toString(); + s2 = e2.toString(); + } + + int i1 = s1.lastIndexOf('-'); + int i2 = s2.lastIndexOf('-'); + + // Specific cases, unvalid Strings + if (i1 < 0) + if (i2 < 0) + return s1.compareTo(s2); + else + return 1; + else if (i2 < 0) + return -1; + + String aName = s1.substring(0, s1.lastIndexOf('-')); + String aVersion = s1.substring(s1.lastIndexOf('-')); + + String bName = s2.substring(0, s2.lastIndexOf('-')); + String bVersion = s2.substring(s2.lastIndexOf('-')); + + result = aName.compareTo(bName); + if (result != 0) + return result; + else + return vc.compare(viewer, aVersion, bVersion); + } +} \ No newline at end of file diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/VersionComparator.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/VersionComparator.java new file mode 100644 index 000000000..4492b0669 --- /dev/null +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/utils/VersionComparator.java @@ -0,0 +1,68 @@ +package org.argeo.slc.client.ui.dist.utils; + +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerComparator; + +/** + * Enable comparison of two version string with form "1.2.5.qualifier" with + * following rules and assumptions: + *
    + *
  • + * Version are parsed and compared segment by segment; doing best effort to + * convert major, minor and micro to integer and compare them as such (to have + * 0.1 < 0.9 < 0.10 not 0.1 < 0.10 < 0.9).
  • + *
  • Version should not contain any dash (-), version segments should be + * separated by dots (.)
  • + *
+ */ + +public class VersionComparator extends ViewerComparator { + + @Override + public int compare(Viewer viewer, Object e1, Object e2) { + String s1 = (String) e1; + String s2 = (String) e2; + return compareVersion(s1, s2); + } + + /** + * Enable comparison of two versions of the form + * "major.minor.micro.qualifier". We assume the separator is always a "." + * and make best effort to convert major, minor and micro to int. + */ + private int compareVersion(String v1, String v2) { + String[] t1 = v1.split("\\."); + String[] t2 = v2.split("\\."); + + for (int i = 0; i < t1.length && i < t2.length; i++) { + int result = compareToken(t1[i], t2[i]); + if (result != 0) + return result; + } + if (t1.length > t2.length) + return 1; + else if (t1.length < t2.length) + return -1; + else + return 0; + } + + private int compareToken(String t1, String t2) { + if (t1 == null && t2 == null) + return 0; + else if (t1 == null) + return -1; + else if (t2 == null) + return 1; + + Integer i1 = null, i2 = null; + try { + i1 = new Integer(t1); + i2 = new Integer(t2); + } catch (NumberFormatException nfe) { + // the format is not valid we silently compare as String + return t1.compareTo(t2); + } + return i1.compareTo(i2); + } +} \ No newline at end of file -- 2.39.2