Deleted old path implementation
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/PathOld.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/PathOld.java
deleted file mode 100644
index c4604e6..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/PathOld.java
+++ /dev/null
@@ -1,753 +0,0 @@
-package org.eclipse.core.runtime;

-

-/*

- * (c) Copyright IBM Corp. 2000, 2001.

- * All Rights Reserved.

- */

-import org.eclipse.core.internal.runtime.Assert;

-import java.util.*;

-import java.io.File;

-

-/** 

- * The standard implementation of the <code>IPath</code> interface.

- * Paths are always maintained in canonicalized form.  That is, parent

- * references (i.e., <code>../../</code>) and duplicate separators are 

- * resolved.  For example,

- * <pre>     new Path("/a/b").append("../foo/bar")</pre>

- * will yield the path

- * <pre>     /a/foo/bar</pre>

- * <p>

- * This class is not intended to be subclassed by clients but

- * may be instantiated.

- * </p>

- * @see IPath

- */

-public class PathOld implements IPath, Cloneable {

-	

-	/** The path string (never null). */

-	private String path = "";

-

-	/** The device id string. May be null if there is no device. */

-	private String device = null;

-

-	/** Constant root path string (<code>"/"</code>). */

-	private static final String ROOT_STRING = "/";

-

-	/** Constant value containing the root path with no device. */

-	public static final Path ROOT = new Path(ROOT_STRING);

-

-	/** Constant empty string value. */

-	private static final String EMPTY_STRING = "";

-

-	/** Constant value containing the empty path with no device. */

-	public static final Path EMPTY = new Path(EMPTY_STRING);

-/* (Intentionally not included in javadoc)

- * Private constructor.

- */

-private PathOld() {

-	

-	super();

-}

-

-/** 

- * Constructs a new path from the given string path.

- * The given string path must be valid.

- * The path is canonicalized and double slashes are removed

- * except at the beginning. (to handle UNC paths) All backslashes ('\')

- * are replaced with forward slashes. ('/')

- *

- * @param fullPath the string path

- * @see #isValidPath

- */

-public PathOld(String fullPath) {

-	super();

-	initialize(null, fullPath);

-}

-/** 

- * Constructs a new path from the given device id and string path.

- * The given string path must be valid.

- * The path is canonicalized and double slashes are removed except

- * at the beginning (to handle UNC paths). All backslashes ('\')

- * are replaced with forward slashes. ('/')

- *

- * @param device the device id

- * @param path the string path

- * @see #isValidPath

- * @see #setDevice

- */

-public PathOld(String device, String path) {

-	super();

-	initialize(device, path);

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#addFileExtension

- */

-public IPath addFileExtension(String extension) {

-	if (isRoot() || isEmpty() || hasTrailingSeparator())

-		return this;

-	return new Path(device, path + "." + extension);

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#addTrailingSeparator

- */

-public IPath addTrailingSeparator() {

-	if (hasTrailingSeparator() || isRoot()) {

-		return this;

-	}

-	Path result = (Path) clone();

-	result.setPath(path + SEPARATOR);

-	return result;

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#append(java.lang.String)

- */

-public IPath append(String tail) {

-

-	// Appending a zero length string has no effect.

-	int tailLength = tail.length();

-	if (tailLength == 0)

-		return this;

-

-	// Must retain compatibility with zero path length appending

-	// so do a slow append.

-	int pathLength = path.length();

-	if (pathLength == 0)

-		return append(new Path(tail));

-

-	// Figure out the leading separator case for the tail

-	// and trailing separator for the receiver.

-	boolean trailing = path.charAt(path.length() - 1) == SEPARATOR;

-	boolean leading = tail.charAt(0) == SEPARATOR;

-

-	// If the receiver has a trailing separator *and* the tail

-	// has a leading separator, we have at least one separator too many.

-	if (leading && trailing)

-		return append(tail.substring(1, tailLength));

-

-	// If the receiver does not have a trailing separator and the

-	// the tail does not have a leading separator then we will

-	// actually be appending "/" + tail.

-	String append;

-	int appendLength;

-	if (!trailing && !leading) {

-		append = ROOT_STRING.concat(tail);

-		appendLength = tailLength + 1;

-	} else {

-		append = tail;

-		appendLength = tailLength;

-	}

-

-	// Fast track the case of appending a segment

-	// known not to have any effect on canonicalization.

-

-	// Scan the tail looking for instances of "//" or

-	// "/../" or "/./" which are canon-breakers.

-	for (int i = 0; i < appendLength - 1; i++) {

-		char c = append.charAt(i);

-		if ((c == SEPARATOR) || (c == '.')) {

-			char lookAhead = append.charAt(i + 1);

-			if ((lookAhead == SEPARATOR) || (lookAhead == '.'))

-				// Have to do the slow append with re-canonicalization.

-				return append(new Path(tail));

-		}

-	}

-

-	// This is a fast-track append.

-	Path newPath = new Path();

-	newPath.device = device;

-	newPath.path = path.concat(append);

-	return newPath;
-}

-

-/* (Intentionally not included in javadoc)

- * @see IPath#append(IPath)

- */

-public IPath append(IPath tail) {

-	if (tail == null || tail.isEmpty() || tail.isRoot()) {

-		return this;

-	}

-	String tailPathPart = ((Path) tail).getPathPart();

-	if (tailPathPart.startsWith("/")) {

-		tailPathPart = tailPathPart.substring(1);

-	}

-	String newPath = (isRoot() || isEmpty() || hasTrailingSeparator()) ? path.concat(tailPathPart) : path + SEPARATOR + tailPathPart;

-	Path result = (Path) clone();

-	result.setPath(newPath);

-	result.collapseSlashes();

-	if (tailPathPart.startsWith("..") || tailPathPart.startsWith("./")) {

-		result.canonicalize();

-	}

-	return result;

-}

-/**

- * Destructively converts this path to its canonical form.

- * <p>

- * In its canonical form, a path does not have any

- * "." segments, and parent references ("..") are collapsed

- * where possible.

- * </p>

- * @return the canonicalized path

- */

-private void canonicalize() {

-	// Test to see if the receiver is already in canonical form.

-	if ((path.indexOf("/.") != -1) || (path.indexOf("./") != -1)) {

-		collapseParentReferences();

-	}

-}

-/* (Intentionally not included in javadoc)

- * Clones this object.

- */

-public Object clone() {

-	try {

-		return super.clone();

-	} catch (CloneNotSupportedException e) {

-		return null;

-	}

-}

-/**

- * Destructively removes all occurrences of ".." segments from this path.

- */

-private void collapseParentReferences() {

-	Stack stack = new Stack();

-	String[] segments = segments();

-	for (int i = 0; i < segments.length; i++) {

-		String segment = segments[i];

-		if (segment.equals("..")) {

-			if (stack.isEmpty()) {

-				// if the stack is empty we are going out of our scope 

-				// so we need to accumulate segments.  But only if the original

-				// path is relative.  If it is absolute then we can't go any higher than

-				// root so simply toss the .. references.

-				if (!isAbsolute())

-					stack.push(segment);

-			} else {

-				// if the top is '..' then we are accumulating segments so don't pop

-				if (stack.peek().equals(".."))

-					stack.push("..");

-				else

-					stack.pop();

-			}

-			//collapse current references

-		} else

-			if (!segment.equals(".") || (i == 0 && !isAbsolute()))

-				stack.push(segment);

-	}

-	StringBuffer newPath = new StringBuffer(stack.isEmpty() ? "" : (String) stack.pop());

-	while (!stack.isEmpty()) {

-		newPath.insert(0, SEPARATOR);

-		newPath.insert(0, (String) stack.pop());

-	}

-	if (isAbsolute()) {

-		newPath.insert(0, SEPARATOR);

-	}

-	if (hasTrailingSeparator()) {

-		newPath.append(SEPARATOR);

-	}

-	path = newPath.toString();

-}

-/*

- *

- */

-private void collapseSlashes() {

-	int length = path.length();

-	// if the path is only 0, 1 or 2 chars long then it could not possibly have illegal

-	// duplicate slashes.

-	if (length < 3)

-		return;

-	// check for an occurence of // in the path.  Start at index 1 to ensure we skip leading UNC //

-	// If there are no // then there is nothing to collapse so just return.

-	if (path.indexOf("//", 1) == -1)

-		return;

-	// We found an occurence of // in the path so do the slow collapse.

-	char[] result = new char[path.length()];

-	int count = 0;

-	boolean hasPrevious = false;

-	char[] characters = path.toCharArray();

-	for (int index = 0; index < characters.length; index++) {

-		char c = characters[index];

-		if (c == SEPARATOR) {

-			if (hasPrevious) {

-				// skip double slashes, except for beginning of UNC.

-				// note that a UNC path can't have a device.

-				if (device == null && index == 1) {

-					result[count] = c;

-					count++;

-				}

-			} else {

-				hasPrevious = true;

-				result[count] = c;

-				count++;

-			}

-		} else {

-			hasPrevious = false;

-			result[count] = c;

-			count++;

-		}

-	}

-	path = new String(result, 0, count);

-}

-/* (Intentionally not included in javadoc)

- * Compares objects for equality.

- */

-public boolean equals(Object obj) {

-	if (this == obj) {

-		return true;

-	}

-	if (!(obj instanceof IPath)) {

-		return false;

-	}

-	IPath target = (IPath) obj;

-	return removeTrailingSeparator().toString().equals(target.removeTrailingSeparator().toString());

-}

-

-/* (Intentionally not included in javadoc)

- * @see IPath#getDevice

- */

-public String getDevice() {

-	return device;

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#getFileExtension

- */

-public String getFileExtension() {

-	if (hasTrailingSeparator()) {

-		return null;

-	}

-	String lastSegment = lastSegment();

-	if (lastSegment == null) {

-		return null;

-	}

-	int index = lastSegment.lastIndexOf(".");

-	if (index == -1) {

-		return null;

-	}

-	return lastSegment.substring(index + 1);

-}

-/**

- * Returns the string representation of this path, without the device.

- *

- * @return the string path without the device

- */

-private String getPathPart() {

-	return path;

-}

-/* (Intentionally not included in javadoc)

- * Computes the hash code for this object.

- */

-public int hashCode() {

-	return removeTrailingSeparator().toString().hashCode();

-}

-

-/* (Intentionally not included in javadoc)

- * @see IPath#hasTrailingSeparator

- */

-public boolean hasTrailingSeparator() {

-	int len = path.length();

-	// len > 1 because ROOT is not considered to have a trailing separator.

-	return len > 1 && path.charAt(len-1) == SEPARATOR;

-}

-/**

- * Returns the index of the first character for the segment

- * with the given index.

- *

- * @param index a 0-based segment index

- * @return a 0-based character index

- */

-private int indexOfSegment(int index) {

-	int len = path.length();

-	int i = 0;

-	while (i < len && path.charAt(i) == SEPARATOR) {

-		++i;

-	}

-	int j = index;

-	while (i < len && --j >= 0) {

-		i = path.indexOf(SEPARATOR, i + 1);

-		if (i == -1) {

-			return -1;

-		}

-		++i;

-	}

-	if (i < len) {

-		return i;

-	}

-	return -1;

-}

-/*

- * Initialize the current path with the given string.

- */

-private void initialize(String device, String fullPath) {

-	Assert.isNotNull(fullPath);

-	this.device = device;

-	path = fullPath.replace('\\', SEPARATOR);

-	int i = path.indexOf(DEVICE_SEPARATOR);

-	if (i != -1) {

-		// if the specified device is null then set it to

-		// be whatever is defined in the path string

-		if (device == null)

-			this.device = path.substring(0, i + 1);

-		path = path.substring(i + 1, path.length());

-	}

-	collapseSlashes();

-	canonicalize();

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#isAbsolute

- */

-public boolean isAbsolute() {

-	return path.length() > 0 && (path.charAt(0) == SEPARATOR);

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#isEmpty

- */

-public boolean isEmpty() {

-	return path.length() == 0;

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#isPrefixOf

- */

-public boolean isPrefixOf(IPath anotherPath) {

-	Assert.isNotNull(anotherPath);

-	if (device == null) {

-		if (anotherPath.getDevice() != null) {

-			return false;

-		}

-	} else {

-		if (!device.equalsIgnoreCase(anotherPath.getDevice())) {

-			return false;

-		}

-	}

-	if (isEmpty() || (isRoot() && anotherPath.isAbsolute())) {

-		return true;

-	}

-	String possiblePrefix = hasTrailingSeparator() ? path.substring(0, path.length() - 1) : path;

-	String otherPath = ((Path) anotherPath).getPathPart();

-	if (!otherPath.startsWith(possiblePrefix)) {

-		return false;

-	}

-	return otherPath.length() == possiblePrefix.length() || otherPath.charAt(possiblePrefix.length()) == SEPARATOR;

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#isRoot

- */

-public boolean isRoot() {

-	return this == ROOT || (path.length() == 1 && path.charAt(0) == SEPARATOR);

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#isUNC

- */

-public boolean isUNC() {

-	if (device != null) 

-		return false;

-	if (path.length() < 2)

-		return false;

-	return path.charAt(0) == SEPARATOR && path.charAt(1) == SEPARATOR;

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#isValidPath

- */

-public boolean isValidPath(String path) {

-	// We allow "//" at the beginning for UNC paths

-	if (path.indexOf("//") > 0) {

-		return false;

-	}

-	Path test = new Path(path);

-	String[] segments = test.segments();

-	for (int i = 0; i < segments.length; i++) {

-		if (!test.isValidSegment(segments[i])) {

-			return false;

-		}

-	}

-	return true;

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#isValidSegment

- */

-public boolean isValidSegment(String segment) {

-	int size = segment.length();

-	if (size == 0) {

-		return false;

-	}

-	if (Character.isWhitespace(segment.charAt(0)) || Character.isWhitespace(segment.charAt(size - 1))) {

-		return false;

-	}

-	for (int i = 0; i < size; i++) {

-		char c = segment.charAt(i);

-		if (c == '/' || c == '\\' || c == ':') {

-			return false;

-		}

-	}

-	return true;

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#lastSegment

- */

-public String lastSegment() {

-	int end = path.length() - 1;

-	while (end >= 0 && path.charAt(end) == SEPARATOR) {

-		--end;

-	}

-	if (end < 0) {

-		return null;

-	}

-	int start = path.lastIndexOf(SEPARATOR, end - 1);

-	return path.substring((start == -1 ? 0 : start + 1), end + 1);

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#makeAbsolute

- */

-public IPath makeAbsolute() {

-	if (isAbsolute()) {

-		return this;

-	}

-	Path result = (Path) clone();

-	result.setPath(String.valueOf(SEPARATOR) + path);

-	return result;

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#makeRelative

- */

-public IPath makeRelative() {

-	if (!isAbsolute()) {

-		return this;

-	}

-	Path result = (Path) clone();

-	result.setPath(path.substring(1));

-	return result;

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#makeUNC

- */

-public IPath makeUNC(boolean toUNC) {

-	Path result = (Path) this.clone();

-

-	// if we are already in the right form then just return

-	if (!(toUNC ^ result.isUNC()))

-		return result;

-		

-	if (toUNC) {

-		result = (Path) result.setDevice(null);

-		String prefix = isAbsolute() ? String.valueOf(SEPARATOR) : String.valueOf(new char[] {SEPARATOR, SEPARATOR});

-		result.setPath(prefix.concat(result.getPathPart()));

-	} else {

-		// remove one of the leading slashes

-		result.setPath(path.substring(1, path.length()));

-	}

-	return result;

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#matchingFirstSegments

- */

-public int matchingFirstSegments(IPath anotherPath) {

-	Assert.isNotNull(anotherPath);

-	String[] local = segments();

-	String[] argument = anotherPath.segments();

-	int max = Math.min(local.length, argument.length);

-	int count = 0;

-	for (int i = 0; i < max; i++) {

-		if (!local[i].equals(argument[i])) {

-			return count;

-		}

-		count++;

-	}

-	return count;

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#removeFileExtension

- */

-public IPath removeFileExtension() {

-	String extension = getFileExtension();

-	if (extension == null || extension.equals("")) {

-		return this;

-	}

-	String lastSegment = lastSegment();

-	int index = lastSegment.lastIndexOf(extension) - 1;

-	return removeLastSegments(1).append(lastSegment.substring(0, index));

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#removeFirstSegments

- */

-public IPath removeFirstSegments(int count) {

-	if (count == 0) {

-		return this;

-	}

-	Assert.isLegal(count > 0);

-	int start = indexOfSegment(count);

-	Path result = (Path) clone();

-	if (start == -1) {

-		result.setPath(EMPTY_STRING);

-	} else {

-		result.setPath(path.substring(start));

-	}

-	return result;

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#removeLastSegments

- */

-public IPath removeLastSegments(int count) {

-	if (count == 0) {

-		return this;

-	}

-	Assert.isLegal(count > 0);

-	int index = hasTrailingSeparator() ? path.length() - 1 : path.length();

-	for (int i = 0; i < count; i++) {

-		index = path.lastIndexOf(SEPARATOR, index - 1);

-		if (index == -1) {

-			break;

-		}

-	}

-	Path result = (Path) clone();

-	if ((index == -1) || (index == 0)) {

-		result.setPath(isAbsolute() ? ROOT_STRING : EMPTY_STRING);

-		return result;

-	}

-	if (hasTrailingSeparator()) {

-		result.setPath(path.substring(0, index + 1));

-	} else {

-		result.setPath(path.substring(0, index));

-	}

-	return result;

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#removeTrailingSeparator

- */

-public IPath removeTrailingSeparator() {

-	if (!hasTrailingSeparator()) {

-		return this;

-	}

-	Path result = (Path) clone();

-	result.setPath(path.substring(0, path.length() - 1));

-	return result;

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#segment

- */

-public String segment(int index) {

-	int start = indexOfSegment(index);

-	if (start == -1) {

-		return null;

-	}

-	int end = path.indexOf(SEPARATOR, start + 1);

-	return end == -1 ? path.substring(start) : path.substring(start, end);

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#segmentCount

- */

-public int segmentCount() {

-	int len = path.length();

-	if (len == 0 || (len == 1 && path.charAt(0) == SEPARATOR)) {

-		return 0;

-	}

-	int count = 1;

-	int prev = -1;

-	int i;

-	while ((i = path.indexOf(SEPARATOR, prev + 1)) != -1) {

-		if (i != prev + 1 && i != len) {

-			++count;

-		}

-		prev = i;

-	}

-	if (path.charAt(len - 1) == SEPARATOR) {

-		--count;

-	}

-	return count;

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#segments

- */

-public String[] segments() {

-	// performance sensitive --- avoid creating garbage

-	int segmentCount = segmentCount();

-	String[] segments = new String[segmentCount];

-	if (segmentCount == 0) {

-		return new String[0];

-	}

-	int len = path.length();

-	// check for initial slash

-	int firstPosition = (path.charAt(0) == SEPARATOR) ? 1 : 0;

-	// check for UNC

-	if (firstPosition == 1 && isUNC())

-		firstPosition = 2;

-	int lastPosition = (path.charAt(len - 1) != SEPARATOR) ? len - 1 : len - 2;

-	// for non-empty paths, the number of segments is 

-	// the number of slashes plus 1, ignoring any leading

-	// and trailing slashes

-	int next = firstPosition;

-	for (int i = 0; i < segmentCount; i++) {

-		int start = next;

-		int end = path.indexOf(SEPARATOR, next);

-		if (end == -1) {

-			segments[i] = path.substring(start, lastPosition + 1);

-		} else {

-			segments[i] = path.substring(start, end);

-		}

-		next = end + 1;

-	}

-	return segments;

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#setDevice

- */

-public IPath setDevice(String value) {

-	if (value != null) {

-		Assert.isTrue(value.indexOf(IPath.DEVICE_SEPARATOR) == (value.length() - 1), "Last character should be the device separator");

-	}

-	Path result = (Path) clone();

-	result.device = value;

-	return result;

-}

-/**

- * Destructively sets the path to the given string.

- *

- * @param value a string path

- */

-private void setPath(String value) {

-	path = value;

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#toFile

- */

-public File toFile() {

-	return new File(toOSString());

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#toOSString

- */

-public String toOSString() {

-	String osPath = path.replace(SEPARATOR, File.separatorChar);

-	return device == null ? osPath : device.concat(osPath);

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#toString

- */

-public String toString() {

-	return device == null ? path : device.concat(path);

-}

-/* (Intentionally not included in javadoc)

- * @see IPath#uptoSegment

- */

-public IPath uptoSegment(int count) {

-	if (count == 0) {

-		return new Path("");

-	}

-	String source = hasTrailingSeparator() ? path.substring(0, path.length() - 1) : path;

-	int index = isAbsolute() ? 0 : -1;

-	for (int i = 0; i < count; i++) {

-		index = path.indexOf(SEPARATOR, index + 1);

-		if (index == -1) {

-			index = source.length();

-			break;

-		}

-	}

-	Path result = (Path) clone();

-	if ((index == -1) || (index == 0)) {

-		result.setPath(isAbsolute() ? ROOT_STRING : EMPTY_STRING);

-		return result;

-	}

-	if (hasTrailingSeparator()) {

-		result.setPath(path.substring(0, index + 1));

-	} else {

-		result.setPath(path.substring(0, index));

-	}

-	return result;

-}

-}