usr/src/java/adr/org/opensolaris/os/adr/APIVersion.java
author David Powell <david.e.powell@oracle.com>
Thu, 11 Aug 2011 15:41:42 -0700
changeset 764 ebb25c1dac73
parent 677 fbc09f84f958
permissions -rw-r--r--
18812 Support building with alternate java implementations

/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
 */

package org.opensolaris.os.adr;

public class APIVersion implements Comparable<APIVersion> {

    private int major_;
    private int minor_;
    private Stability stability_;

    /*
     * Default api versions
     */
    public static final APIVersion PRIVATE_VNONE =
	new APIVersion(Stability.PRIVATE, 0, 0);
    public static final APIVersion UNCOMMITTED_VNONE =
	new APIVersion(Stability.UNCOMMITTED, 0, 0);
    public static final APIVersion COMMITTED_VNONE =
	new APIVersion(Stability.COMMITTED, 0, 0);

    public APIVersion(Stability stability, int major, int minor) {
	assert (isValid(stability, major, minor));
	stability_ = stability;
	major_ = major;
	minor_ = minor;
    }

    public APIVersion(int major, int minor) {
	this(Stability.PRIVATE, major, minor);
    }

    /*
     * Comparable methods
     */

    @Override
    public int compareTo(APIVersion v) throws ClassCastException {
	if (this == v)
	    return 0;
	int diff = stability_.compareTo(v.getStability());
	if (diff == 0) {
	    diff = major_ - v.getMajor();
	    if (diff == 0) {
		diff = minor_ - v.getMinor();
	    }
	}
	return diff;
    }

    /*
     * Object methods
     */

    @Override
    public boolean equals(Object o) {
	if (this == o)
	    return true;
	if (!(o instanceof APIVersion))
	    return (false);
	APIVersion v = (APIVersion) o;
	return (stability_ == v.getStability() &&
	    major_ == v.getMajor() && minor_ == v.getMinor());
    }

    @Override
    public int hashCode() {
	int hash = 31 + (17 * major_) ^ minor_;
	hash = hash ^ (17 * stability_.hashCode());
	return hash;
    }

    @Override
    public String toString() {
	return String.format("%s(%s.%s)", stability_, major_, minor_);
    }

    /*
     * APIVersion methods
     */

    public int getMajor() {
	return major_;
    }

    public int getMinor() {
	return minor_;
    }

    public Stability getStability() {
	return stability_;
    }

    public static APIVersion getNone(Stability s) {
	if (s == Stability.COMMITTED)
	    return COMMITTED_VNONE;
	else if (s == Stability.UNCOMMITTED)
	    return UNCOMMITTED_VNONE;
	else
	    return PRIVATE_VNONE;
    }

    public static boolean isValid(Stability stability, int major, int minor) {
	return ((stability == Stability.PRIVATE ||
	    stability == Stability.UNCOMMITTED ||
	    stability == Stability.COMMITTED) &&
	    major >= 0 && minor >= 0);
    }
}