diff --git a/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/internal/efsextension/tests/EFSExtensionTests.java b/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/internal/efsextension/tests/EFSExtensionTests.java index e05d2756de4..b3b565633e3 100644 --- a/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/internal/efsextension/tests/EFSExtensionTests.java +++ b/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/internal/efsextension/tests/EFSExtensionTests.java @@ -20,6 +20,7 @@ import junit.framework.TestSuite; import org.eclipse.cdt.utils.EFSExtensionManager; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Platform; /** * Tests the EFSExtensionManager and EFSExtensionProvider classes, as well as the EFSExtensionProvider extension point. @@ -235,7 +236,11 @@ public class EFSExtensionTests extends TestCase { String path = EFSExtensionManager.getDefault().getMappedPath(originalURI); - assertEquals(path, "/c:/foo"); + if (Platform.getOS().equals(Platform.WS_WIN32)) { + assertEquals(path, "c:/foo"); + } else { + assertEquals(path, "/c:/foo"); + } } public void testGetPathFromURI() { @@ -248,7 +253,11 @@ public class EFSExtensionTests extends TestCase { String path = EFSExtensionManager.getDefault().getMappedPath(originalURI); - assertEquals(path, "/c:/foo"); + if (Platform.getOS().equals(Platform.WS_WIN32)) { + assertEquals(path, "c:/foo"); + } else { + assertEquals(path, "/c:/foo"); + } } public void testExtension() { diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/EFSExtensionProvider.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/EFSExtensionProvider.java index 7e8712bfe2f..74e6b8ee748 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/EFSExtensionProvider.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/EFSExtensionProvider.java @@ -10,38 +10,39 @@ *******************************************************************************/ package org.eclipse.cdt.core; -import java.io.File; import java.net.URI; import java.net.URISyntaxException; +import org.eclipse.core.filesystem.EFS; import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.URIUtil; /** * Abstract class providing the basis for supplementary support classes that can extract meaningful - * information from and provide useful operations on EFS filesystems. This allows for operations that can - * operate on virtual EFS filesystems (where IFileStores are just links to other IFileStores), or that operate + * information from and provide useful operations on EFS file-systems. This allows for operations that can + * operate on virtual EFS file-systems (where IFileStores are just links to other IFileStores), or that operate * on the physical file backed by an IFileStore, without having to know the implementation details of a given - * EFS filesystem. - * - * Provides a default implementation that assumes that URIs for the given filesystem map directly to resources - * in the physical filesystem, and that the path component of the URI is a direct representation of the - * absolute path to the file in the physical filesystem. - * - * Clients wishing to support a filesystem with different behaviour should extend this class and override its + * EFS file-system. + * + * Provides a default implementation that assumes that URIs for the given file-system map directly to resources + * in the physical file-system, and that the path component of the URI is a direct representation of the + * absolute path to the file in the physical file-system. + * + * Clients wishing to support a file-system with different behavior should extend this class and override its * methods where appropriate. - * + * * Clients should not typically call methods on this class or its descendants directly. Instead, they should * call the appropriate method in FileSystemUtilityManager so that said manager can properly route calls to - * the proper utility, depending on the filesystem. - * - * EXPERIMENTAL. This class or interface has been added as part of a work in progress. There - * is no guarantee that this API will work or that it will remain the same. Please do not use this API without + * the proper utility, depending on the file-system. + * + * EXPERIMENTAL. This class or interface has been added to CDT 7.0 as part of a work in progress. + * There is no guarantee that this API will work or that it will remain the same. Please do not use this API without * consulting with the CDT team. - * + * * @author crecoskie * @since 5.2 - * + * */ public abstract class EFSExtensionProvider { @@ -49,20 +50,28 @@ public abstract class EFSExtensionProvider { * If the EFS store represented by locationURI is backed by a physical file, gets the path corresponding * to the underlying file as the operating system on hosting machine would see it. In the future, it would * be better if EFS had an API for this. - * + * * @param locationURI * @return String representing the path, or null if there is an error or if there is no such * physical file. */ public String getPathFromURI(URI locationURI) { - return new File(locationURI).getAbsolutePath(); + String path = locationURI.getPath(); + String schema = locationURI.getScheme(); + if (schema != null && schema.equals(EFS.SCHEME_FILE) && Platform.getOS().equals(Platform.WS_WIN32)) { + // URI path on Windows is represented as "/C:/path" + if (path != null && path.matches("/[A-Za-z]:.*")) { //$NON-NLS-1$ + path = path.substring(1); + } + } + return path; } /** - * In the case of a virtual filesystem, where URIs in the given filesystem are just soft links in EFS to - * URIs in other filesystems, returns the URI that this URI links to. If the filesystem is not virtual, + * In the case of a virtual file-system, where URIs in the given file-system are just soft links in EFS to + * URIs in other file-systems, returns the URI that this URI links to. If the file-system is not virtual, * then this method acts as an identity mapping. - * + * * @param locationURI * @return A URI corresponding to the linked store, or null on error. */ @@ -74,25 +83,25 @@ public abstract class EFSExtensionProvider { * Creates a new URI which clones the contents of the original URI, but with the path replaced by the * given absolute path, such that calling getPathFromURI() on the returned URI will return the given path. Returns * null on error. - * + * * The default implementation places the path in the path field of the URI, ensuring that there is a leading slash. * It also determines whether or not to convert backslashes in the provided path based on whether or not the * local operating system's file separator is a backslash, thus ensuring proper behaviour for URIs corresponding - * to the local filesystem. - * + * to the local file-system. + * * @param locationOnSameFilesystem * @param path An absolute path. * @return URI */ public URI createNewURIFromPath(URI locationOnSameFilesystem, String path) { URI uri = locationOnSameFilesystem; - + Path p = new Path(path); String pathString = p.toString(); // to convert any backslashes to slashes if we are on Windows final int length = pathString.length(); StringBuffer pathBuf = new StringBuffer(length + 1); - // force the path to be absolute + // force the path to be absolute including Windows where URI path is represented as "/C:/path" if (length > 0 && (pathString.charAt(0) != '/')) { pathBuf.append('/'); } @@ -100,9 +109,9 @@ public abstract class EFSExtensionProvider { if (pathString.startsWith("//")) //$NON-NLS-1$ pathBuf.append('/').append('/'); pathBuf.append(pathString); - + try { - //Bug 326957 - EFSExtensionProvider does not handle URI's correctly + //Bug 326957 - EFSExtensionProvider does not handle URI's correctly return new URI(uri.getScheme(), uri.getAuthority(), pathBuf.toString(), // replaced! uri.getQuery(), uri.getFragment()); } catch (URISyntaxException e) { @@ -112,15 +121,15 @@ public abstract class EFSExtensionProvider { } /** - * For filesystems that map the path to a physical file in one filesystem (say on a remote machine) to + * For file-systems that map the path to a physical file in one file-system (say on a remote machine) to * another path (say, on the local machine), this method returns the path that the store maps to. I.e., it * returns the path that the path returned by getPathFromURI(URI locationURI) maps to. If there is no such * mapping, then an identity mapping of the paths is assumed. - * - * Typically if a filesystem maps one filesytem to another, it will place the mapped path in the path + * + * Typically if a file-system maps one file-system to another, it will place the mapped path in the path * field of its URIs (which the default implementation assumes), but this is not guaranteed to be so for - * all filesystem implementations. - * + * all file-system implementations. + * * @return String representing the path, or null on error. */ public String getMappedPath(URI locationURI) { @@ -128,9 +137,9 @@ public abstract class EFSExtensionProvider { } /** - * Returns true if the given URI is part of a virtual filesystem and thus points to another underlying - * URI. Returns false otherwise. By default, filesystems are assumed to be non-virtual. - * + * Returns true if the given URI is part of a virtual file-system and thus points to another underlying + * URI. Returns false otherwise. By default, file-systems are assumed to be non-virtual. + * * @param locationURI * @return boolean */ @@ -140,12 +149,12 @@ public abstract class EFSExtensionProvider { /** * Creates a new URI with the same components as the baseURI, except that calling - * getPathFromURI() on the new URI will return a path that has the extension appended to + * getPathFromURI() on the new URI will return a path that has the extension appended to * the path returned by baseURI.getPathFromURI() - * + * * The default implementation assumes that the path component of the URI is used * to store the path. - * + * * @param baseURI * @param extension * @return the new URI, or null on error. diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ErrorParserManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ErrorParserManager.java index 3dc57672c5e..54e062665cb 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ErrorParserManager.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ErrorParserManager.java @@ -71,7 +71,7 @@ public class ErrorParserManager extends OutputStream implements IConsoleParser, * @since 5.4 */ public static final String BUILD_CONTEXT = "build"; //$NON-NLS-1$ - + private int nOpens; private int lineCounter=0; @@ -221,16 +221,7 @@ public class ErrorParserManager extends OutputStream implements IConsoleParser, */ public void pushDirectory(IPath dir) { if (dir != null) { - URI uri; - URI workingDirectoryURI = getWorkingDirectoryURI(); - if (!dir.isAbsolute()) { - uri = URIUtil.append(workingDirectoryURI, dir.toString()); - } else { - uri = toURI(dir); - if (uri == null) { - return; - } - } + URI uri = toURI(dir); pushDirectoryURI(uri); } } @@ -485,18 +476,9 @@ outer: * @return - file in the workspace or {@code null} if such a file doesn't exist */ protected IFile findFileInWorkspace(IPath path) { - URI uri; - if (!path.isAbsolute()) { - URI workingDirectoryURI = getWorkingDirectoryURI(); - uri = EFSExtensionManager.getDefault().append(workingDirectoryURI, path.toString()); - } - else { - uri = toURI(path); - if (uri == null) { - return null; - } - } - return findFileInWorkspace(uri); + URI uri = toURI(path); + IFile file = findFileInWorkspace(uri); + return file; } /** @@ -728,10 +710,7 @@ outer: } /** - * Converts a location {@link IPath} to an {@link URI}. Contrary to - * {@link URIUtil#toURI(IPath)} this method does not assume that the path belongs - * to local file system. - * + * Converts a location {@link IPath} to an {@link URI}. * The returned URI uses the scheme and authority of the current working directory * as returned by {@link #getWorkingDirectoryURI()} * @@ -740,16 +719,15 @@ outer: * @since 5.1 */ private URI toURI(IPath path) { -// try { - URI baseURI = getWorkingDirectoryURI(); - String uriString = path.toString(); + URI uri = null; + URI workingDirectoryURI = getWorkingDirectoryURI(); + if (path.isAbsolute()) { + uri = EFSExtensionManager.getDefault().createNewURIFromPath(workingDirectoryURI, path.toString()); + } else { + uri = EFSExtensionManager.getDefault().append(workingDirectoryURI, path.toString()); + } - // On Windows "C:/folder/" -> "/C:/folder/" - if (path.isAbsolute() && uriString.charAt(0) != IPath.SEPARATOR) { - uriString = IPath.SEPARATOR + uriString; - } - - return EFSExtensionManager.getDefault().createNewURIFromPath(baseURI, uriString); + return uri; } /** @@ -828,7 +806,7 @@ outer: public static String[] getErrorParserAvailableIdsInContext(String context) { return ErrorParserExtensionManager.getErrorParserAvailableIdsInContext(context); } - + /** * @return IDs of error parsers contributed through error parser extension point. * @since 5.2