diff --git a/src/main/java/se/simonsoft/cms/item/structure/CmsLabelVersion.java b/src/main/java/se/simonsoft/cms/item/structure/CmsLabelVersion.java index 264cb4a..1f04060 100644 --- a/src/main/java/se/simonsoft/cms/item/structure/CmsLabelVersion.java +++ b/src/main/java/se/simonsoft/cms/item/structure/CmsLabelVersion.java @@ -128,6 +128,10 @@ public List getVersionSegmentsSort() { return getSortable(this.segments, false); } + public List getVersionSegmentsNumeric() { + return getNumeric(this.segments); + } + /** * @return list of Pre-Release version identifiers (excl identifiers preceeding the last hyphen) */ @@ -182,6 +186,35 @@ private static String getSortable(String s) { } } + private static List getNumeric(List segments) { + ArrayList l = new ArrayList<>(segments.size()); + for (String s: segments) { + l.add(getNumeric(s)); + } + return l; + } + + private static Long getNumeric(String s) { + if (s.matches("^[0-9]+$")) { + return Long.valueOf(s); + } else if (s.matches("^[a-zA-Z]+$")) { + if (s.length() > 1) { + // TODO: Investigate if we can support 10 chars with 36 as multiplier. + throw new NumberFormatException("The version identifier must not exceed 1 character: " + s); + } + + Long r = 0L; + for (int i = 0; i < s.length(); i++) { + int v = Character.getNumericValue(s.charAt(i)); + // TODO: Decide multiplier (100 / 36 / 40 / 50 / 64). + r = 100*r + v; + } + return r; + } else { + throw new NumberFormatException("For version identifier: " + s); + } + } + @Override public int compareTo(CmsLabelVersion o) { return this.getLabelSort().compareTo(o.getLabelSort()); diff --git a/src/test/java/se/simonsoft/cms/item/structure/CmsLabelVersionTest.java b/src/test/java/se/simonsoft/cms/item/structure/CmsLabelVersionTest.java index 474e393..b2bc31e 100644 --- a/src/test/java/se/simonsoft/cms/item/structure/CmsLabelVersionTest.java +++ b/src/test/java/se/simonsoft/cms/item/structure/CmsLabelVersionTest.java @@ -77,6 +77,7 @@ public void testSimple1() { assertEquals(1, l.getSegments().size()); assertEquals("A", l.getSegments().get(0)); assertEquals("@@@@@@@@@A", l.getSegmentsSort().get(0)); + assertEquals(Long.valueOf(10), l.getVersionSegmentsNumeric().get(0)); assertEquals("A", l.toString()); } @@ -130,6 +131,8 @@ public void testSimple2() { assertEquals("2", l.getSegments().get(1)); assertEquals("@@@@@@@@@A", l.getSegmentsSort().get(0)); assertEquals("/////////2", l.getSegmentsSort().get(1)); + assertEquals(Long.valueOf(10), l.getVersionSegmentsNumeric().get(0)); + assertEquals(Long.valueOf(2), l.getVersionSegmentsNumeric().get(1)); } @Test @@ -144,6 +147,9 @@ public void testSimple3() { assertEquals("@@@@@@@@@A", l.getSegmentsSort().get(0)); assertEquals("/////////2", l.getSegmentsSort().get(1)); assertEquals("//////1234", l.getSegmentsSort().get(2)); + assertEquals(Long.valueOf(10), l.getVersionSegmentsNumeric().get(0)); + assertEquals(Long.valueOf(2), l.getVersionSegmentsNumeric().get(1)); + assertEquals(Long.valueOf(1234), l.getVersionSegmentsNumeric().get(2)); } @Test @@ -194,6 +200,12 @@ public void testLongSegment() { // Long segments simply not padded. assertEquals("@@@@@@@@@A", l.getSegmentsSort().get(0)); assertEquals("abcdeXfghijk", l.getSegmentsSort().get(1)); assertEquals("//////1234", l.getSegmentsSort().get(2)); + + try { + l.getVersionSegmentsNumeric(); + fail("should fail, string too long"); + } catch (NumberFormatException e) { + } } @Test