From deb0d72a67b95b1e656c1a506e9de97829b009a2 Mon Sep 17 00:00:00 2001 From: Karsten Thoms Date: Wed, 15 Apr 2015 08:29:33 +0200 Subject: [PATCH] [443574] Add IFileSystemAccessExtension4 with method isFile Signed-off-by: Karsten Thoms --- .../generator/AbstractFileSystemAccess2.java | 44 ++++++++++++++----- .../IFileSystemAccessExtension4.java | 28 ++++++++++++ .../generator/JavaIoFileSystemAccess.java | 9 ++++ .../generator/JavaIoFileSystemAccessTest.java | 2 + 4 files changed, 73 insertions(+), 10 deletions(-) create mode 100644 plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/IFileSystemAccessExtension4.java diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/AbstractFileSystemAccess2.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/AbstractFileSystemAccess2.java index 02aa9d23f..36e69fb59 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/AbstractFileSystemAccess2.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/AbstractFileSystemAccess2.java @@ -7,18 +7,20 @@ *******************************************************************************/ package org.eclipse.xtext.generator; +import java.io.IOException; import java.io.InputStream; import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.xtext.util.RuntimeIOException; /** - * - * Abstract base class for file system access supporting {@link IFileSystemAccessExtension3}. - * + * + * Abstract base class for file system access supporting {@link IFileSystemAccessExtension3} and {@link IFileSystemAccessExtension4}. + * * @author Sven Efftinge - Initial contribution and API * @since 2.4 */ -public abstract class AbstractFileSystemAccess2 extends AbstractFileSystemAccess implements IFileSystemAccessExtension3 { +public abstract class AbstractFileSystemAccess2 extends AbstractFileSystemAccess implements IFileSystemAccessExtension3, IFileSystemAccessExtension4 { /** * @since 2.4 @@ -44,17 +46,39 @@ public abstract class AbstractFileSystemAccess2 extends AbstractFileSystemAccess return readTextFile(fileName, DEFAULT_OUTPUT); } - + /** * Sets the context to further configure this file system access instance. - * - * @param context - a context from which project configuration can be obtained. Supported context types - * depend on the concrete implementation, but {@link Resource} is usually a good fit. - * + * + * @param context - a context from which project configuration can be obtained. Supported context types + * depend on the concrete implementation, but {@link Resource} is usually a good fit. + * * @since 2.8 */ public void setContext(Object context) { // do nothing } - + + /** + * {@inheritDoc} + * @since 2.9 + */ + @Override + public boolean isFile(String path, String outputConfigurationName) throws RuntimeIOException { + InputStream is = null; + try { + is = readBinaryFile(path, outputConfigurationName); + if (is != null) { + try { + is.close(); + } catch (IOException e) { + throw new RuntimeIOException(e); + } + } + return is!=null; // no exception => file exists + } catch (RuntimeIOException e) { + return false; + } + } + } diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/IFileSystemAccessExtension4.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/IFileSystemAccessExtension4.java new file mode 100644 index 000000000..b1132b1c1 --- /dev/null +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/IFileSystemAccessExtension4.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2015 itemis AG (http://www.itemis.eu) 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 + *******************************************************************************/ +package org.eclipse.xtext.generator; + +import org.eclipse.xtext.util.RuntimeIOException; + +/** + * This interface extends {@link IFileSystemAccess} with the capability to check files for existence. + * + * @author Karsten Thoms - Initial contribution and API + * @since 2.9 + */ +public interface IFileSystemAccessExtension4 { + + /** + * Tests whether the file exists at the location denoted by the output configuration. + * @param path using '/' as path separator + * @param outputConfigurationName the name of the output configuration + * @return true when the file at the given path exists and is a normal file. Will return false when + * the path belongs to a directory. + */ + boolean isFile (String path, String outputConfigurationName) throws RuntimeIOException; +} diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/JavaIoFileSystemAccess.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/JavaIoFileSystemAccess.java index 76840b1f2..1dc3a2826 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/JavaIoFileSystemAccess.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/JavaIoFileSystemAccess.java @@ -235,4 +235,13 @@ public class JavaIoFileSystemAccess extends AbstractFileSystemAccess2 { throw new RuntimeIOException(e); } } + + /** + * {@inheritDoc} + */ + @Override + public boolean isFile(String path, String outputConfigurationName) throws RuntimeIOException { + File file = getFile(path, outputConfigurationName); + return file!=null && file.exists() && file.isFile(); + } } diff --git a/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/generator/JavaIoFileSystemAccessTest.java b/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/generator/JavaIoFileSystemAccessTest.java index a5fa460b8..6cfe574c5 100644 --- a/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/generator/JavaIoFileSystemAccessTest.java +++ b/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/generator/JavaIoFileSystemAccessTest.java @@ -55,6 +55,8 @@ public class JavaIoFileSystemAccessTest extends Assert { binFile = new File(dir, "Y"); assertTrue(binFile.exists()); + assertFalse(fileSystemAccess.isFile("tmp", IFileSystemAccess.DEFAULT_OUTPUT)); // isFile evaluates to false for directories + assertTrue(fileSystemAccess.isFile("tmp/Y", IFileSystemAccess.DEFAULT_OUTPUT)); assertTrue(binFile.isFile()); InputStream stream = fileSystemAccess.readBinaryFile("tmp/Y"); try {