Skip to content
This repository has been archived by the owner on Sep 30, 2019. It is now read-only.

Commit

Permalink
arouel#133 : replaced alphanum by other implementation
Browse files Browse the repository at this point in the history
Thomas Draier committed Sep 29, 2016
1 parent 43f6147 commit 3df9453
Showing 5 changed files with 84 additions and 199 deletions.
9 changes: 3 additions & 6 deletions modules/uadetector-core/NOTICE.txt
Original file line number Diff line number Diff line change
@@ -24,13 +24,10 @@ the same directory as this file, for the license terms of the components that
this product depends on.

-------------------------------------------------------------------------------
This product contains a modified version of Dave Koelle's Alphanum Algorithm,
which can be obtained at:
This product uses a version of Olivier Oudot's compareNatural code, licensed
under CC BY-SA 3.0:

* LICENSE:
* LICENSE.alphanum.txt (GNU LGPL 2.1 or above)
* HOMEPAGE:
* http://www.davekoelle.com/alphanum.html
* https://creativecommons.org/licenses/by-sa/3.0/

This product uses a version of Jaroslav Mallat's UAS Data, which can be
obtained at:
Original file line number Diff line number Diff line change
@@ -27,7 +27,7 @@

import net.sf.qualitycheck.Check;
import net.sf.qualitycheck.exception.IllegalStateOfArgumentException;
import net.sf.uadetector.internal.util.AlphanumComparator;
import net.sf.uadetector.internal.util.NaturalOrderComparator;

/**
* The {@code VersionNumber} class represents the version number of an operating system or User-Agent.<br>
@@ -313,7 +313,7 @@ public int compareTo(@Nullable final ReadableVersionNumber other) {
} else {
Check.notNull(other.getGroups(), "other.getGroups()");
final int length = groups.size() < other.getGroups().size() ? groups.size() : other.getGroups().size();
final AlphanumComparator comparator = new AlphanumComparator();
final NaturalOrderComparator comparator = new NaturalOrderComparator();
result = comparator.compare(toVersionString(groups.subList(0, length)), toVersionString(other.getGroups().subList(0, length)));
if (result == 0) {
result = groups.size() > other.getGroups().size() ? 1 : groups.size() < other.getGroups().size() ? -1 : 0;

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
* Copyright 2014 Olivier Oudot
*
* THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR
* "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
* AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
*
* BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE.
* TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN
* CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
*
* https://creativecommons.org/licenses/by-sa/3.0/
*/
package net.sf.uadetector.internal.util;

import java.util.*;

public class NaturalOrderComparator implements Comparator {

@Override
public int compare(Object o1, Object o2) {
return compareNatural(o1 != null ? o1.toString() : "", o2 != null ? o2.toString() : "");
}

public static final int compareNatural(String s1, String s2) {
// Skip all identical characters
int len1 = s1.length();
int len2 = s2.length();
int i;
char c1, c2;
for (i = 0, c1 = 0, c2 = 0; (i < len1) && (i < len2) && (c1 = s1.charAt(i)) == (c2 = s2.charAt(i)); i++) ;

// Check end of string
if (c1 == c2)
return (len1 - len2);

// Check digit in first string
if (Character.isDigit(c1)) {
// Check digit only in first string
if (!Character.isDigit(c2))
return ((i > 0) && Character.isDigit(s1.charAt(i - 1)) ? 1 : c1 - c2);

// Scan all integer digits
int x1, x2;
for (x1 = i + 1; (x1 < len1) && Character.isDigit(s1.charAt(x1)); x1++) ;
for (x2 = i + 1; (x2 < len2) && Character.isDigit(s2.charAt(x2)); x2++) ;

// Longer integer wins, first digit otherwise
return (x2 == x1 ? c1 - c2 : x1 - x2);
}

// Check digit only in second string
if (Character.isDigit(c2))
return ((i > 0) && Character.isDigit(s2.charAt(i - 1)) ? -1 : c1 - c2);

// No digits
return (c1 - c2);
}


}
Original file line number Diff line number Diff line change
@@ -29,61 +29,61 @@ public class AlphanumComparatorTest {
public void compare_0_0() {
final String charA = "0";
final String charB = "0";
assertThat(new AlphanumComparator().compare(charA, charB)).isEqualTo(0);
assertThat(new NaturalOrderComparator().compare(charA, charB)).isEqualTo(0);
}

@Test
public void compare_0_0000() {
final String charA = "0";
final String charB = "0000";
assertThat(new AlphanumComparator().compare(charA, charB)).isEqualTo(-3);
assertThat(new AlphanumComparator().compare(charB, charA)).isEqualTo(3);
assertThat(new NaturalOrderComparator().compare(charA, charB)).isLessThan(0);
assertThat(new NaturalOrderComparator().compare(charB, charA)).isGreaterThan(0);
}

@Test
public void compare_00001_00001() {
final String charA = "00001";
final String charB = "00001";
assertThat(new AlphanumComparator().compare(charA, charB)).isEqualTo(0);
assertThat(new NaturalOrderComparator().compare(charA, charB)).isEqualTo(0);
}

@Test
public void compare_02_2() {
final String charA = "02";
final String charB = "2";
assertThat(new AlphanumComparator().compare(charA, charB)).isEqualTo(1);
assertThat(new AlphanumComparator().compare(charB, charA)).isEqualTo(-1);
assertThat(new NaturalOrderComparator().compare(charA, charB)).isGreaterThan(0);
assertThat(new NaturalOrderComparator().compare(charB, charA)).isLessThan(0);
}

@Test
public void compare_02_20() {
final String charA = "02";
final String charB = "20";
assertThat(new AlphanumComparator().compare(charA, charB)).isEqualTo(-2);
assertThat(new AlphanumComparator().compare(charB, charA)).isEqualTo(2);
assertThat(new NaturalOrderComparator().compare(charA, charB)).isLessThan(0);
assertThat(new NaturalOrderComparator().compare(charB, charA)).isGreaterThan(0);
}

@Test
public void compare_0A_0000A() {
final String charA = "0A";
final String charB = "0000A";
assertThat(new AlphanumComparator().compare(charA, charB)).isEqualTo(-3);
assertThat(new AlphanumComparator().compare(charB, charA)).isEqualTo(3);
assertThat(new NaturalOrderComparator().compare(charA, charB)).isLessThan(0);
assertThat(new NaturalOrderComparator().compare(charB, charA)).isGreaterThan(0);
}

@Test
public void compare_differentFlags() {
final String version1 = "0";
final String version2 = "00";
assertThat(new AlphanumComparator().compare(version1, version2)).isEqualTo(-1);
assertThat(new AlphanumComparator().compare(version2, version1)).isEqualTo(1);
assertThat(new NaturalOrderComparator().compare(version1, version2)).isLessThan(0);
assertThat(new NaturalOrderComparator().compare(version2, version1)).isGreaterThan(0);
}

@Test
public void compare_identical() {
final String version1 = "000-12";
final String version2 = "000-12";
assertThat(new AlphanumComparator().compare(version1, version2)).isEqualTo(0);
assertThat(new NaturalOrderComparator().compare(version1, version2)).isEqualTo(0);
}

@Test
@@ -112,56 +112,33 @@ public void compare_list() {
final List<String> scrambled = Arrays.asList(src.toArray(new String[] {}));
Collections.copy(scrambled, src);
Collections.shuffle(scrambled);
Collections.sort(scrambled, new AlphanumComparator());
Collections.sort(scrambled, new NaturalOrderComparator());

assertThat(scrambled).isEqualTo(src);
}

@Test
public void compare_null_1() {
new AlphanumComparator().compare(null, null);
new NaturalOrderComparator().compare(null, null);
}

@Test
public void compare_null_2() {
final String version = "1";
new AlphanumComparator().compare(null, version);
new NaturalOrderComparator().compare(null, version);
}

@Test
public void compare_null_3() {
final String version = "2";
new AlphanumComparator().compare(version, null);
new NaturalOrderComparator().compare(version, null);
}

@Test
public void compare_same() {
final String version = "4";
assertThat(new AlphanumComparator().compare(version, version)).isEqualTo(0);
assertThat(new NaturalOrderComparator().compare(version, version)).isEqualTo(0);
}

@Test
public void compareDigits_001_xyz() {
final String charA = "001";
final String charB = "xyz";
assertThat(AlphanumComparator.compareDigits(charA, charB)).isEqualTo(-72);
assertThat(AlphanumComparator.compareDigits(charB, charA)).isEqualTo(72);
}

@Test
public void compareDigits_1_00() {
final String charA = "1";
final String charB = "00";
assertThat(AlphanumComparator.compareDigits(charA, charB)).isEqualTo(-1);
assertThat(AlphanumComparator.compareDigits(charB, charA)).isEqualTo(1);
}

@Test
public void compareDigits_abc_xyz() {
final String charA = "abc";
final String charB = "xyz";
assertThat(AlphanumComparator.compareDigits(charA, charB)).isEqualTo(-23);
assertThat(AlphanumComparator.compareDigits(charB, charA)).isEqualTo(23);
}

}

0 comments on commit 3df9453

Please sign in to comment.