492212: update FRAMEWORK_VERSION to 3.21

Change-Id: I7c20436dd9973a5c834f9deda1ac1913d30b713b
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=492212
diff --git a/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/CoreUtil.java b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/CoreUtil.java
index 9e6140d..cc25cdd 100644
--- a/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/CoreUtil.java
+++ b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/CoreUtil.java
@@ -1,340 +1,340 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2016 Tasktop Technologies 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:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.mylyn.commons.core;
-
-import java.util.Map;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.Version;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-
-/**
- * @since 3.0
- * @author Steffen Pingel
- * @author Benjamin Muskalla
- * @noinstantiate This class is not intended to be instantiated by clients.
- */
-public class CoreUtil {
-
-	/**
-	 * @since 3.0
-	 */
-	public static final boolean TEST_MODE;
-
-	static {
-		String application = System.getProperty("eclipse.application", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		if (application.length() > 0) {
-			TEST_MODE = application.endsWith("testapplication") || application.endsWith("uitest"); //$NON-NLS-1$ //$NON-NLS-2$
-		} else {
-			// eclipse 3.3 does not the eclipse.application property
-			String commands = System.getProperty("eclipse.commands", ""); //$NON-NLS-1$ //$NON-NLS-2$
-			TEST_MODE = commands.contains("testapplication\n"); //$NON-NLS-1$
-		}
-	}
-
-	private static final String FRAMEWORK_VERSION = "3.20.0"; //$NON-NLS-1$
-
-	private static final SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
-	static {
-		saxParserFactory.setNamespaceAware(true);
-	}
-
-	/**
-	 * Returns a string representation of <code>object</code>. If object is a map or array the returned string will
-	 * contains a comma separated list of contained elements.
-	 * 
-	 * @since 3.4
-	 */
-	public static String toString(Object object) {
-		StringBuilder sb = new StringBuilder();
-		toString(sb, object);
-		return sb.toString();
-	}
-
-	private static void toString(StringBuilder sb, Object object) {
-		if (object instanceof Object[]) {
-			sb.append("["); //$NON-NLS-1$
-			Object[] entries = (Object[]) object;
-			boolean prependSeparator = false;
-			for (Object entry : entries) {
-				if (prependSeparator) {
-					sb.append(", "); //$NON-NLS-1$
-				}
-				toString(sb, entry);
-				prependSeparator = true;
-			}
-			sb.append("]"); //$NON-NLS-1$
-		} else if (object instanceof Map<?, ?>) {
-			sb.append("{"); //$NON-NLS-1$
-			boolean prependSeparator = false;
-			for (Map.Entry<?, ?> entry : ((Map<?, ?>) object).entrySet()) {
-				if (prependSeparator) {
-					sb.append(", "); //$NON-NLS-1$
-				}
-				toString(sb, entry.getKey());
-				sb.append("="); //$NON-NLS-1$
-				toString(sb, entry.getValue());
-				prependSeparator = true;
-			}
-			sb.append("}"); //$NON-NLS-1$
-		} else {
-			sb.append(object);
-		}
-	}
-
-	/**
-	 * Returns the version of the bundle.
-	 * 
-	 * @since 3.7
-	 * @deprecated use {@link Bundle#getVersion()} instead
-	 */
-	@Deprecated
-	public static Version getVersion(Bundle bundle) {
-		return bundle.getVersion();
-	}
-
-	/**
-	 * Returns true, if <code>o1</code> is equal to <code>o2</code> or <code>o1</code> and <code>o2</code> are
-	 * <code>null</code>.
-	 * 
-	 * @see Object#equals(Object)
-	 * @since 3.7
-	 */
-	public static boolean areEqual(Object o1, Object o2) {
-		if (o1 == null) {
-			return (o2 == null);
-		} else {
-			return o1.equals(o2);
-		}
-	}
-
-	/**
-	 * Compares <code>o1</code> and <code>o2</code>.
-	 * 
-	 * @since 3.7
-	 * @return a negative integer, 0, or a positive, if o1 is less than o2, o1 equals o2 or o1 is more than o2; null is
-	 *         considered less than any value
-	 */
-	public static <T> int compare(Comparable<T> o1, T o2) {
-		if (o1 == null) {
-			return (o2 != null) ? 1 : 0;
-		} else if (o2 == null) {
-			return -1;
-		}
-		return o1.compareTo(o2);
-	}
-
-	/**
-	 * Compares a boolean value.
-	 * 
-	 * @since 3.7
-	 * @see Boolean#equals(Object)
-	 */
-	public static boolean propertyEquals(boolean value, Object expectedValue) {
-		return (expectedValue == null) ? value == true : Boolean.valueOf(value).equals(expectedValue);
-	}
-
-	/**
-	 * Disables logging through the Apache commons logging system by default. This can be overridden by specifying the
-	 * <code>org.apache.commons.logging.Log</code> system property.
-	 * 
-	 * @since 3.7
-	 */
-	public static void initializeLoggingSettings() {
-		defaultSystemProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * Only sets system property if they are not already set to a value.
-	 */
-	private static void defaultSystemProperty(String key, String defaultValue) {
-		if (System.getProperty(key) == null) {
-			System.setProperty(key, defaultValue);
-		}
-	}
-
-	/**
-	 * Returns the version of the Java runtime.
-	 * 
-	 * @since 3.7
-	 * @return {@link Version#emptyVersion} if the version can not be determined
-	 */
-	public static Version getRuntimeVersion() {
-		Version result = parseRuntimeVersion(System.getProperty("java.runtime.version")); //$NON-NLS-1$
-		if (result == Version.emptyVersion) {
-			result = parseRuntimeVersion(System.getProperty("java.version")); //$NON-NLS-1$
-		}
-		return result;
-	}
-
-	private static Version parseRuntimeVersion(String versionString) {
-		if (versionString != null) {
-			int firstSeparator = versionString.indexOf('.');
-			if (firstSeparator != -1) {
-				try {
-					int secondSeparator = versionString.indexOf('.', firstSeparator + 1);
-					if (secondSeparator != -1) {
-						int index = findLastNumberIndex(versionString, secondSeparator);
-						String qualifier = versionString.substring(index + 1);
-						if (qualifier.startsWith("_") && qualifier.length() > 1) { //$NON-NLS-1$
-							versionString = versionString.substring(0, index + 1) + "." + qualifier.substring(1); //$NON-NLS-1$
-						} else {
-							versionString = versionString.substring(0, index + 1);
-						}
-						return new Version(versionString);
-					}
-					return new Version(versionString.substring(0,
-							findLastNumberIndex(versionString, firstSeparator) + 1));
-				} catch (IllegalArgumentException e) {
-					// ignore
-				}
-			}
-		}
-		return Version.emptyVersion;
-	}
-
-	private static int findLastNumberIndex(String versionString, int secondSeparator) {
-		int lastDigit = secondSeparator;
-		for (int i = secondSeparator + 1; i < versionString.length(); i++) {
-			if (Character.isDigit(versionString.charAt(i))) {
-				lastDigit++;
-			} else {
-				break;
-			}
-		}
-		if (lastDigit == secondSeparator) {
-			return secondSeparator - 1;
-		}
-		return lastDigit;
-	}
-
-	/**
-	 * Returns the running Mylyn version without the qualifier.
-	 * 
-	 * @since 3.7
-	 */
-	public static Version getFrameworkVersion() {
-		return new Version(FRAMEWORK_VERSION);
-	}
-
-	/**
-	 * Returns a representation of <code>name</code> that is a valid file name.
-	 * 
-	 * @since 3.7
-	 */
-	public static String asFileName(String name) {
-		StringBuffer sb = new StringBuffer(name.length());
-		char[] chars = name.toCharArray();
-		for (char c : chars) {
-			if (c >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '.') {
-				sb.append(c);
-			} else {
-				sb.append("%" + Integer.toHexString(c).toUpperCase()); //$NON-NLS-1$
-			}
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Returns the decoded form of <code>text</code>.
-	 * 
-	 * @since 3.8
-	 * @see #encode(String)
-	 * @throws IllegalArgumentException
-	 *             if text is not in a valid form, i.e. it was not encoded using {@link CoreUtil#encode(String)}
-	 */
-	public static String decode(String text) {
-		boolean escaped = false;
-		StringBuilder sb = new StringBuilder(text.length());
-		StringBuilder escapedText = new StringBuilder(4);
-		char[] chars = text.toCharArray();
-		for (char c : chars) {
-			if (c >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '.') {
-				if (escaped) {
-					escapedText.append(c);
-				} else {
-					sb.append(c);
-				}
-			} else if (c == '%') {
-				if (escaped) {
-					throw new IllegalArgumentException("Unexpected '%' sign in '" + text + "'"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-				escaped = !escaped;
-			} else if (c == '_') {
-				if (!escaped) {
-					throw new IllegalArgumentException("Unexpected '_' sign in '" + text + "'"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-				try {
-					sb.append((char) Integer.parseInt(escapedText.toString(), 16));
-					escapedText.setLength(0);
-				} catch (NumberFormatException e) {
-					throw new IllegalArgumentException("Invalid escape code in '" + text + "'"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-				escaped = !escaped;
-			} else {
-				throw new IllegalArgumentException("Unexpected character '" + c + "' in '" + text + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * An encoded form of <code>text</code> that is suitable as a filename.
-	 * 
-	 * @param text
-	 *            the string to encode
-	 * @see #decode(String)
-	 * @since 3.8
-	 */
-	public static String encode(String text) {
-		StringBuilder sb = new StringBuilder(text.length());
-		char[] chars = text.toCharArray();
-		for (char c : chars) {
-			if (c >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '.') {
-				sb.append(c);
-			} else {
-				sb.append("%"); //$NON-NLS-1$
-				sb.append(Integer.toHexString(c).toUpperCase());
-				sb.append("_"); //$NON-NLS-1$
-			}
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Returns a new {@link XMLReader} instance using default factories.
-	 * 
-	 * @since 3.9
-	 */
-	public static SAXParser newSaxParser() throws SAXException {
-		try {
-			return saxParserFactory.newSAXParser();
-		} catch (ParserConfigurationException e) {
-			throw new SAXException(e);
-		}
-	}
-
-	/**
-	 * Returns a new {@link XMLReader} instance using default factories.
-	 * 
-	 * @since 3.9
-	 */
-	public static XMLReader newXmlReader() throws SAXException {
-		return newSaxParser().getXMLReader();
-	}
-
-}
+/*******************************************************************************

+ * Copyright (c) 2004, 2016 Tasktop Technologies 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:

+ *     Tasktop Technologies - initial API and implementation

+ *******************************************************************************/

+

+package org.eclipse.mylyn.commons.core;

+

+import java.util.Map;

+

+import javax.xml.parsers.ParserConfigurationException;

+import javax.xml.parsers.SAXParser;

+import javax.xml.parsers.SAXParserFactory;

+

+import org.osgi.framework.Bundle;

+import org.osgi.framework.Version;

+import org.xml.sax.SAXException;

+import org.xml.sax.XMLReader;

+

+/**

+ * @since 3.0

+ * @author Steffen Pingel

+ * @author Benjamin Muskalla

+ * @noinstantiate This class is not intended to be instantiated by clients.

+ */

+public class CoreUtil {

+

+	/**

+	 * @since 3.0

+	 */

+	public static final boolean TEST_MODE;

+

+	static {

+		String application = System.getProperty("eclipse.application", ""); //$NON-NLS-1$ //$NON-NLS-2$

+		if (application.length() > 0) {

+			TEST_MODE = application.endsWith("testapplication") || application.endsWith("uitest"); //$NON-NLS-1$ //$NON-NLS-2$

+		} else {

+			// eclipse 3.3 does not the eclipse.application property

+			String commands = System.getProperty("eclipse.commands", ""); //$NON-NLS-1$ //$NON-NLS-2$

+			TEST_MODE = commands.contains("testapplication\n"); //$NON-NLS-1$

+		}

+	}

+

+	private static final String FRAMEWORK_VERSION = "3.21.0"; //$NON-NLS-1$

+

+	private static final SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();

+	static {

+		saxParserFactory.setNamespaceAware(true);

+	}

+

+	/**

+	 * Returns a string representation of <code>object</code>. If object is a map or array the returned string will

+	 * contains a comma separated list of contained elements.

+	 *

+	 * @since 3.4

+	 */

+	public static String toString(Object object) {

+		StringBuilder sb = new StringBuilder();

+		toString(sb, object);

+		return sb.toString();

+	}

+

+	private static void toString(StringBuilder sb, Object object) {

+		if (object instanceof Object[]) {

+			sb.append("["); //$NON-NLS-1$

+			Object[] entries = (Object[]) object;

+			boolean prependSeparator = false;

+			for (Object entry : entries) {

+				if (prependSeparator) {

+					sb.append(", "); //$NON-NLS-1$

+				}

+				toString(sb, entry);

+				prependSeparator = true;

+			}

+			sb.append("]"); //$NON-NLS-1$

+		} else if (object instanceof Map<?, ?>) {

+			sb.append("{"); //$NON-NLS-1$

+			boolean prependSeparator = false;

+			for (Map.Entry<?, ?> entry : ((Map<?, ?>) object).entrySet()) {

+				if (prependSeparator) {

+					sb.append(", "); //$NON-NLS-1$

+				}

+				toString(sb, entry.getKey());

+				sb.append("="); //$NON-NLS-1$

+				toString(sb, entry.getValue());

+				prependSeparator = true;

+			}

+			sb.append("}"); //$NON-NLS-1$

+		} else {

+			sb.append(object);

+		}

+	}

+

+	/**

+	 * Returns the version of the bundle.

+	 *

+	 * @since 3.7

+	 * @deprecated use {@link Bundle#getVersion()} instead

+	 */

+	@Deprecated

+	public static Version getVersion(Bundle bundle) {

+		return bundle.getVersion();

+	}

+

+	/**

+	 * Returns true, if <code>o1</code> is equal to <code>o2</code> or <code>o1</code> and <code>o2</code> are

+	 * <code>null</code>.

+	 *

+	 * @see Object#equals(Object)

+	 * @since 3.7

+	 */

+	public static boolean areEqual(Object o1, Object o2) {

+		if (o1 == null) {

+			return (o2 == null);

+		} else {

+			return o1.equals(o2);

+		}

+	}

+

+	/**

+	 * Compares <code>o1</code> and <code>o2</code>.

+	 *

+	 * @since 3.7

+	 * @return a negative integer, 0, or a positive, if o1 is less than o2, o1 equals o2 or o1 is more than o2; null is

+	 *         considered less than any value

+	 */

+	public static <T> int compare(Comparable<T> o1, T o2) {

+		if (o1 == null) {

+			return (o2 != null) ? 1 : 0;

+		} else if (o2 == null) {

+			return -1;

+		}

+		return o1.compareTo(o2);

+	}

+

+	/**

+	 * Compares a boolean value.

+	 *

+	 * @since 3.7

+	 * @see Boolean#equals(Object)

+	 */

+	public static boolean propertyEquals(boolean value, Object expectedValue) {

+		return (expectedValue == null) ? value == true : Boolean.valueOf(value).equals(expectedValue);

+	}

+

+	/**

+	 * Disables logging through the Apache commons logging system by default. This can be overridden by specifying the

+	 * <code>org.apache.commons.logging.Log</code> system property.

+	 *

+	 * @since 3.7

+	 */

+	public static void initializeLoggingSettings() {

+		defaultSystemProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog"); //$NON-NLS-1$ //$NON-NLS-2$

+	}

+

+	/**

+	 * Only sets system property if they are not already set to a value.

+	 */

+	private static void defaultSystemProperty(String key, String defaultValue) {

+		if (System.getProperty(key) == null) {

+			System.setProperty(key, defaultValue);

+		}

+	}

+

+	/**

+	 * Returns the version of the Java runtime.

+	 *

+	 * @since 3.7

+	 * @return {@link Version#emptyVersion} if the version can not be determined

+	 */

+	public static Version getRuntimeVersion() {

+		Version result = parseRuntimeVersion(System.getProperty("java.runtime.version")); //$NON-NLS-1$

+		if (result == Version.emptyVersion) {

+			result = parseRuntimeVersion(System.getProperty("java.version")); //$NON-NLS-1$

+		}

+		return result;

+	}

+

+	private static Version parseRuntimeVersion(String versionString) {

+		if (versionString != null) {

+			int firstSeparator = versionString.indexOf('.');

+			if (firstSeparator != -1) {

+				try {

+					int secondSeparator = versionString.indexOf('.', firstSeparator + 1);

+					if (secondSeparator != -1) {

+						int index = findLastNumberIndex(versionString, secondSeparator);

+						String qualifier = versionString.substring(index + 1);

+						if (qualifier.startsWith("_") && qualifier.length() > 1) { //$NON-NLS-1$

+							versionString = versionString.substring(0, index + 1) + "." + qualifier.substring(1); //$NON-NLS-1$

+						} else {

+							versionString = versionString.substring(0, index + 1);

+						}

+						return new Version(versionString);

+					}

+					return new Version(

+							versionString.substring(0, findLastNumberIndex(versionString, firstSeparator) + 1));

+				} catch (IllegalArgumentException e) {

+					// ignore

+				}

+			}

+		}

+		return Version.emptyVersion;

+	}

+

+	private static int findLastNumberIndex(String versionString, int secondSeparator) {

+		int lastDigit = secondSeparator;

+		for (int i = secondSeparator + 1; i < versionString.length(); i++) {

+			if (Character.isDigit(versionString.charAt(i))) {

+				lastDigit++;

+			} else {

+				break;

+			}

+		}

+		if (lastDigit == secondSeparator) {

+			return secondSeparator - 1;

+		}

+		return lastDigit;

+	}

+

+	/**

+	 * Returns the running Mylyn version without the qualifier.

+	 *

+	 * @since 3.7

+	 */

+	public static Version getFrameworkVersion() {

+		return new Version(FRAMEWORK_VERSION);

+	}

+

+	/**

+	 * Returns a representation of <code>name</code> that is a valid file name.

+	 *

+	 * @since 3.7

+	 */

+	public static String asFileName(String name) {

+		StringBuffer sb = new StringBuffer(name.length());

+		char[] chars = name.toCharArray();

+		for (char c : chars) {

+			if (c >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '.') {

+				sb.append(c);

+			} else {

+				sb.append("%" + Integer.toHexString(c).toUpperCase()); //$NON-NLS-1$

+			}

+		}

+		return sb.toString();

+	}

+

+	/**

+	 * Returns the decoded form of <code>text</code>.

+	 *

+	 * @since 3.8

+	 * @see #encode(String)

+	 * @throws IllegalArgumentException

+	 *             if text is not in a valid form, i.e. it was not encoded using {@link CoreUtil#encode(String)}

+	 */

+	public static String decode(String text) {

+		boolean escaped = false;

+		StringBuilder sb = new StringBuilder(text.length());

+		StringBuilder escapedText = new StringBuilder(4);

+		char[] chars = text.toCharArray();

+		for (char c : chars) {

+			if (c >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '.') {

+				if (escaped) {

+					escapedText.append(c);

+				} else {

+					sb.append(c);

+				}

+			} else if (c == '%') {

+				if (escaped) {

+					throw new IllegalArgumentException("Unexpected '%' sign in '" + text + "'"); //$NON-NLS-1$ //$NON-NLS-2$

+				}

+				escaped = !escaped;

+			} else if (c == '_') {

+				if (!escaped) {

+					throw new IllegalArgumentException("Unexpected '_' sign in '" + text + "'"); //$NON-NLS-1$ //$NON-NLS-2$

+				}

+				try {

+					sb.append((char) Integer.parseInt(escapedText.toString(), 16));

+					escapedText.setLength(0);

+				} catch (NumberFormatException e) {

+					throw new IllegalArgumentException("Invalid escape code in '" + text + "'"); //$NON-NLS-1$ //$NON-NLS-2$

+				}

+				escaped = !escaped;

+			} else {

+				throw new IllegalArgumentException("Unexpected character '" + c + "' in '" + text + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

+			}

+		}

+		return sb.toString();

+	}

+

+	/**

+	 * An encoded form of <code>text</code> that is suitable as a filename.

+	 *

+	 * @param text

+	 *            the string to encode

+	 * @see #decode(String)

+	 * @since 3.8

+	 */

+	public static String encode(String text) {

+		StringBuilder sb = new StringBuilder(text.length());

+		char[] chars = text.toCharArray();

+		for (char c : chars) {

+			if (c >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '.') {

+				sb.append(c);

+			} else {

+				sb.append("%"); //$NON-NLS-1$

+				sb.append(Integer.toHexString(c).toUpperCase());

+				sb.append("_"); //$NON-NLS-1$

+			}

+		}

+		return sb.toString();

+	}

+

+	/**

+	 * Returns a new {@link XMLReader} instance using default factories.

+	 *

+	 * @since 3.9

+	 */

+	public static SAXParser newSaxParser() throws SAXException {

+		try {

+			return saxParserFactory.newSAXParser();

+		} catch (ParserConfigurationException e) {

+			throw new SAXException(e);

+		}

+	}

+

+	/**

+	 * Returns a new {@link XMLReader} instance using default factories.

+	 *

+	 * @since 3.9

+	 */

+	public static XMLReader newXmlReader() throws SAXException {

+		return newSaxParser().getXMLReader();

+	}

+

+}