Bug 514831 - do not throw exception if directory already exists

Files.createDirectory() behavior is different to
Files.createDirectories() and throws an exception in case directory
exists already, so we should take care to not propagate this exception
to clients.

Change-Id: Id522b8600fba4e46aab38f9dab89b7f928367280
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
diff --git a/bundles/org.eclipse.core.filesystem/src/org/eclipse/core/internal/filesystem/local/LocalFile.java b/bundles/org.eclipse.core.filesystem/src/org/eclipse/core/internal/filesystem/local/LocalFile.java
index c0a8218..207db1a 100644
--- a/bundles/org.eclipse.core.filesystem/src/org/eclipse/core/internal/filesystem/local/LocalFile.java
+++ b/bundles/org.eclipse.core.filesystem/src/org/eclipse/core/internal/filesystem/local/LocalFile.java
@@ -322,6 +322,11 @@
 			} else {
 				Files.createDirectories(file.toPath());
 			}
+		} catch (FileAlreadyExistsException e) {
+			if (!file.isDirectory()) {
+				String message = NLS.bind(Messages.failedCreateWrongType, filePath);
+				Policy.error(EFS.ERROR_WRONG_TYPE, message, e);
+			}
 		} catch (IOException e) {
 			checkReadOnlyParent(file, e);
 			checkTargetDoesNotExist(file, e);
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFolderTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFolderTest.java
index 70a7632..a0afd55 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFolderTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFolderTest.java
@@ -12,6 +12,8 @@
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
 import org.eclipse.core.resources.*;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.Platform;
@@ -121,4 +123,23 @@
 		assertTrue("4.3", file.isLocal(IResource.DEPTH_ZERO));
 
 	}
+
+	/**
+	 * Bug 514831: "shallow" mkdir fails if the directory already exists
+	 */
+	public void testBug514831() throws CoreException {
+		IWorkspaceRoot root = getWorkspace().getRoot();
+		IProject project = root.getProject("TestProject");
+		IFolder folder = project.getFolder("folder");
+
+		ensureExistsInWorkspace(project, true);
+		ensureExistsInWorkspace(new IResource[] {folder}, true);
+
+		IFileStore dir = EFS.getLocalFileSystem().fromLocalFile(folder.getLocation().toFile());
+		assertTrue(dir.fetchInfo().exists());
+
+		dir.mkdir(EFS.NONE, null);
+		dir.mkdir(EFS.SHALLOW, null);
+		// should not throw an exception
+	}
 }