blob: eef8490459bdf36325cd0926e9ab91a81ea3defd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010-2014 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.skalli.model.ext.maven;
import java.util.Comparator;
import org.apache.commons.lang.StringUtils;
/**
* A "simplified" comparator for Maven versions.
*
* The version string is split at '.' and '-' characters.
* Parts that are numbers are compared numerically. All other parts are compared like strings.
*/
class MavenVersionsComparator implements Comparator<String> {
enum SortOrder {
ASCENDING,
DESCENDING
}
private SortOrder order = SortOrder.ASCENDING;
public MavenVersionsComparator() {
this(SortOrder.ASCENDING);
}
public MavenVersionsComparator(SortOrder order) {
this.order = order;
}
/* (non-Javadoc)
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
@Override
public int compare(String version1, String version2) {
if (SortOrder.DESCENDING.equals(this.order)) {
return -1 * compareLatestAsLowest(version1, version2);
} else {
return compareLatestAsLowest(version1, version2);
}
};
public int compareLatestAsLowest(String version1, String version2) {
if (version1.equals(version2)) {
return 0;
}
String[] v1Parts = StringUtils.split(version1, ".-");
String[] v2Parts = StringUtils.split(version2, ".-");
int minLength = Math.min(v1Parts.length, v2Parts.length);
for (int i = 0; i < minLength; i++) {
String str1 = v1Parts[i];
String str2 = v2Parts[i];
try {
int val1 = Integer.valueOf(str1);
int val2 = Integer.valueOf(str2);
int result = val1 < val2 ? -1 : ((val1 == val2) ? 0 : +1);
if (result != 0) {
return result;
}
} catch (NumberFormatException e) {
int result = str1.compareTo(str2);
if (result != 0) {
return result;
}
}
}
if (version1.length() == version2.length()) {
return 0;
} else if (version1.length() < version2.length()) {
return -1;
} else {
return +1;
}
}
}