blob: 567f124b5ca88419db87fd642c4bc50c1e11ce57 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003-2009 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.e4.internal.languages.javascript;
import org.osgi.framework.Version;
/**
* This class represents a version range.
* @since 3.1
* @noextend This class is not intended to be subclassed by clients.
*/
public class JSVersionRange {
private static final Version versionMax = new Version(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE);
/**
* An empty version
*/
public static final JSVersionRange emptyRange = new JSVersionRange(null);
private final Version minVersion;
private final boolean includeMin;
private final Version maxVersion;
private final boolean includeMax;
/**
* Constructs a VersionRange with the specified minVersion and maxVersion.
* @param minVersion the minimum version of the range
* @param maxVersion the maximum version of the range
*/
public JSVersionRange(Version minVersion, boolean includeMin, Version maxVersion, boolean includeMax) {
this.minVersion = minVersion;
this.includeMin = includeMin;
this.maxVersion = maxVersion;
this.includeMax = includeMax;
}
/**
* Constructs a VersionRange from the given versionRange String.
* @param versionRange a version range String that specifies a range of
* versions.
*/
public JSVersionRange(String versionRange) {
if (versionRange == null || versionRange.length() == 0) {
minVersion = Version.emptyVersion;
includeMin = true;
maxVersion = JSVersionRange.versionMax;
includeMax = true;
return;
}
versionRange = versionRange.trim();
if (versionRange.charAt(0) == '[' || versionRange.charAt(0) == '(') {
int comma = versionRange.indexOf(',');
if (comma < 0)
throw new IllegalArgumentException();
char last = versionRange.charAt(versionRange.length() - 1);
if (last != ']' && last != ')')
throw new IllegalArgumentException();
minVersion = Version.parseVersion(versionRange.substring(1, comma).trim());
includeMin = versionRange.charAt(0) == '[';
maxVersion = Version.parseVersion(versionRange.substring(comma + 1, versionRange.length() - 1).trim());
includeMax = last == ']';
} else {
minVersion = Version.parseVersion(versionRange.trim());
includeMin = true;
maxVersion = JSVersionRange.versionMax;
includeMax = true;
}
}
/**
* Returns the minimum Version of this VersionRange
* @return the minimum Version of this VersionRange
*/
public Version getMinimum() {
return minVersion;
}
/**
* Indicates if the minimum version is included in the version range.
* @return true if the minimum version is included in the version range;
* otherwise false is returned
*/
public boolean getIncludeMinimum() {
return includeMin;
}
/**
* Returns the maximum Version of this VersionRange
* @return the maximum Version of this VersionRange
*/
public Version getMaximum() {
return maxVersion;
}
/**
* Indicates if the maximum version is included in the version range.
* @return true if the maximum version is included in the version range;
* otherwise false is returned
*/
public boolean getIncludeMaximum() {
return includeMax;
}
/**
* Returns whether the given version is included in this VersionRange.
* This will depend on the minimum and maximum versions of this VersionRange
* and the given version.
*
* @param version a version to be tested for inclusion in this VersionRange.
* (may be <code>null</code>)
* @return <code>true</code> if the version is include,
* <code>false</code> otherwise
*/
public boolean isIncluded(Version version) {
Version minRequired = getMinimum();
if (minRequired == null)
return true;
if (version == null)
return false;
Version maxRequired = getMaximum() == null ? JSVersionRange.versionMax : getMaximum();
int minCheck = includeMin ? 0 : 1;
int maxCheck = includeMax ? 0 : -1;
return version.compareTo(minRequired) >= minCheck && version.compareTo(maxRequired) <= maxCheck;
}
public boolean equals(Object object) {
if (!(object instanceof JSVersionRange))
return false;
JSVersionRange vr = (JSVersionRange) object;
if (minVersion != null && vr.getMinimum() != null) {
if (minVersion.equals(vr.getMinimum()) && includeMin == vr.includeMin)
if (maxVersion != null && vr.getMaximum() != null) {
if (maxVersion.equals(vr.getMaximum()) && includeMax == vr.includeMax)
return true;
} else
return maxVersion == vr.getMaximum();
} else {
return minVersion == vr.getMinimum();
}
return false;
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (maxVersion != null ? maxVersion.hashCode() : JSVersionRange.versionMax.hashCode());
result = prime * result + (minVersion != null ? minVersion.hashCode() : Version.emptyVersion.hashCode());
result = prime * result + (includeMax ? 1231 : 1237);
result = prime * result + (includeMin ? 1231 : 1237);
return result;
}
public String toString() {
if (minVersion == null)
return Version.emptyVersion.toString();
if (JSVersionRange.versionMax.equals(maxVersion))
return minVersion.toString();
StringBuffer result = new StringBuffer();
result.append(includeMin ? '[' : '(');
result.append(minVersion);
result.append(',');
result.append(maxVersion);
result.append(includeMax ? ']' : ')');
return result.toString();
}
}