/*******************************************************************************
* Copyright (c) 2010 Robert Munteanu 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:
* Robert Munteanu - initial API and implementation
*******************************************************************************/
package com.itsolut.mantis.core;
import static com.itsolut.mantis.core.RepositoryCapability.CORRECT_BASE64_ENCODING;
import static com.itsolut.mantis.core.RepositoryCapability.ISSUE_HISTORY;
import static com.itsolut.mantis.core.RepositoryCapability.TAGS;
import java.util.EnumSet;
import java.util.Set;
import com.itsolut.mantis.core.exception.MantisException;
/**
* Represents the version of the remote repository and its capabilities
*
* @author Robert Munteanu
*
*/
public enum RepositoryVersion {
/**
* Versions 1.1.x up to 1.1.6
*/
VERSION_1_1_6_OR_LOWER("1.1.0 through 1.1.6", EnumSet.of(RepositoryCapability.CORRECT_BASE64_ENCODING)),
/**
* Versions 1.1.7 or higher
*/
VERSION_1_1_7_OR_HIGHER("1.1.7 or higher in the 1.1.x stream", EnumSet.noneOf(RepositoryCapability.class)),
/**
* Versions 1.2.0 or newer.
*
* <p>Supports target_version, task relations, requires
* Base64-encoding of attachments and has due date support.</p>
*/
VERSION_1_2_OR_HIGHER("1.2.0 to 1.2.1", EnumSet.complementOf(EnumSet.of(CORRECT_BASE64_ENCODING, TAGS, ISSUE_HISTORY))),
/**
* Versions 1.2.2 or newer.
*
* <p>Supports target_version, task relations, does not require
* Base64-encoding of attachments and has due date support.</p>
*/
VERSION_1_2_2_OR_HIGHER("1.2.2 to 1.2.8 ", allExcept(TAGS, ISSUE_HISTORY)),
/**
* Versions 1.2.9 or newer.
*
* <p>Supports target_version, task relations, does not require
* Base64-encoding of attachments, has due date support, supports tags.</p>
*
* <p>However, it does not support history retrieval</p>
*/
VERSION_1_2_9_OR_HIGHER("1.2.9 to 1.2.15", allExcept(ISSUE_HISTORY)),
/**
* Versions 1.2.9 or newer.
*
* <p>Supports target_version, task relations, does not require
* Base64-encoding of attachments, has due date support, supports tags.</p>
*/
VERSION_1_2_16_OR_HIGHER("1.2.16 or higher in the 1.2.x stream", EnumSet.allOf(RepositoryCapability.class)),
/**
* Versions 1.3 or newer.
*
* <p>Assumed to have all capabilities</p>
*/
VERSION_1_3_OR_HIGHER("1.3.x or higher", EnumSet.allOf(RepositoryCapability.class));
public static RepositoryVersion fromVersionString(String versionString) throws MantisException{
if ( versionString.startsWith("1.1"))
return extractMantisMinorVersion(versionString) > 6 ? VERSION_1_1_7_OR_HIGHER : VERSION_1_1_6_OR_LOWER;
if ( versionString.startsWith("1.2")) {
int minorVersion = extractMantisMinorVersion(versionString);
if ( minorVersion < 2)
return VERSION_1_2_OR_HIGHER;
else if ( minorVersion < 9)
return VERSION_1_2_2_OR_HIGHER;
else if ( minorVersion < 16)
return VERSION_1_2_9_OR_HIGHER;
else
return VERSION_1_2_16_OR_HIGHER;
}
if ( versionString.startsWith("1.3")) {
return VERSION_1_3_OR_HIGHER;
}
int major = extractMantisMajorVersion(versionString);
if ( major > 1 ) {
return VERSION_1_3_OR_HIGHER;
}
throw new MantisException("Unknown version " + versionString + " .");
}
private static EnumSet<RepositoryCapability> allExcept(RepositoryCapability... missingCapabilities) {
EnumSet<RepositoryCapability> capabilities = EnumSet.allOf(RepositoryCapability.class);
for ( RepositoryCapability missingCapability : missingCapabilities )
capabilities.remove(missingCapability);
return capabilities;
}
private static int extractMantisMajorVersion(String versionString) {
int majorVersionIndex= versionString.indexOf(".");
return Integer.parseInt(versionString.substring(0, majorVersionIndex));
}
private static int extractMantisMinorVersion(String versionString) {
int minorVersionIndex = versionString.lastIndexOf('.');
String minorVersionString = versionString.substring(minorVersionIndex + 1);
// Mantis has qualifiers appended, like -SVN or rc4, so we just look for all the digits we can find
StringBuilder builder = new StringBuilder(4);
for ( int i = 0; i < minorVersionString.length(); i++) {
char maybeDigit = minorVersionString.charAt(i);
if ( maybeDigit >= '0' && maybeDigit <= '9')
builder.append(maybeDigit);
else
break;
}
return Integer.parseInt(builder.toString());
}
private final EnumSet<RepositoryCapability> capabilities;
private final String description;
private RepositoryVersion(String description, EnumSet<RepositoryCapability> capabilities) {
this.capabilities = capabilities;
this.description = description;
}
public boolean isHasProperTaskRelations() {
return capabilities.contains(RepositoryCapability.TASK_RELATIONS);
}
public boolean isHasTargetVersionSupport() {
return capabilities.contains(RepositoryCapability.TARGET_VERSION);
}
public boolean hasCorrectBase64Encoding() {
return capabilities.contains(RepositoryCapability.CORRECT_BASE64_ENCODING);
}
public boolean isHasDueDateSupport() {
return capabilities.contains(RepositoryCapability.DUE_DATE);
}
public boolean isHasTimeTrackingSupport() {
return capabilities.contains(RepositoryCapability.TIME_TRACKING);
}
public boolean isHasTagSupport() {
return capabilities.contains(RepositoryCapability.TAGS);
}
public boolean isHasIssueHistorySupport() {
return capabilities.contains(RepositoryCapability.ISSUE_HISTORY);
}
public Set<RepositoryCapability> getMissingCapabilities() {
return EnumSet.complementOf(capabilities);
}
public String getDescription() {
return description;
}
}