--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2010, 2012 Sonatype, Inc.
+ * 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:
+ * Sonatype, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.aether.version;
+
+/**
+ * A range of versions.
+ */
+public interface VersionRange
+{
+
+ /**
+ * Determines whether the specified version is contained within this range.
+ *
+ * @param version The version to test, must not be {@code null}.
+ * @return {@code true} if this range contains the specified version, {@code false} otherwise.
+ */
+ boolean containsVersion( Version version );
+
+ /**
+ * Gets a lower bound (if any) for this range. If existent, this range does not contain any version smaller than its
+ * lower bound. Note that complex version ranges might exclude some versions even within their bounds.
+ *
+ * @return A lower bound for this range or {@code null} is there is none.
+ */
+ Bound getLowerBound();
+
+ /**
+ * Gets an upper bound (if any) for this range. If existent, this range does not contain any version greater than
+ * its upper bound. Note that complex version ranges might exclude some versions even within their bounds.
+ *
+ * @return An upper bound for this range or {@code null} is there is none.
+ */
+ Bound getUpperBound();
+
+ /**
+ * A bound of a version range.
+ */
+ static final class Bound
+ {
+
+ private final Version version;
+
+ private final boolean inclusive;
+
+ /**
+ * Creates a new bound with the specified properties.
+ *
+ * @param version The bounding version, must not be {@code null}.
+ * @param inclusive A flag whether the specified version is included in the range or not.
+ */
+ public Bound( Version version, boolean inclusive )
+ {
+ if ( version == null )
+ {
+ throw new IllegalArgumentException( "version missing" );
+ }
+ this.version = version;
+ this.inclusive = inclusive;
+ }
+
+ /**
+ * Gets the bounding version.
+ *
+ * @return The bounding version, never {@code null}.
+ */
+ public Version getVersion()
+ {
+ return version;
+ }
+
+ /**
+ * Indicates whether the bounding version is included in the range or not.
+ *
+ * @return {@code true} if the bounding version is included in the range, {@code false} if not.
+ */
+ public boolean isInclusive()
+ {
+ return inclusive;
+ }
+
+ @Override
+ public boolean equals( Object obj )
+ {
+ if ( obj == this )
+ {
+ return true;
+ }
+ else if ( obj == null || !getClass().equals( obj.getClass() ) )
+ {
+ return false;
+ }
+
+ Bound that = (Bound) obj;
+ return inclusive == that.inclusive && version.equals( that.version );
+ }
+
+ @Override
+ public int hashCode()
+ {
+ int hash = 17;
+ hash = hash * 31 + version.hashCode();
+ hash = hash * 31 + ( inclusive ? 1 : 0 );
+ return hash;
+ }
+
+ @Override
+ public String toString()
+ {
+ return String.valueOf( version );
+ }
+
+ }
+
+}