org.eclipse.skalli.model.ext.maven.MavenVersionsComparator.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.skalli.model.ext.maven.MavenVersionsComparator.java

Source

/*******************************************************************************
 * 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;
        }

    }
}