From 6997cb069792008aebbbe3a474b54830817ba129 Mon Sep 17 00:00:00 2001 From: Christian Dietrich Date: Fri, 1 Dec 2017 09:54:43 +0100 Subject: [PATCH 1/4] [tracing] NPE thrown when a file is generated without traces https://github.com/eclipse/xtext-core/issues/359 Signed-off-by: Christian Dietrich --- .../generator/JavaIoFileSystemAccess.java | 5 ++++- .../generator/URIBasedFileSystemAccess.xtend | 17 +++++++++++------ .../internal/AbstractTraceForURIProvider.java | 6 +++++- .../trace/node/GeneratorNodeProcessor.xtend | 3 +++ .../generator/URIBasedFileSystemAccess.java | 19 ++++++++++++++----- .../trace/node/GeneratorNodeProcessor.java | 3 +++ 6 files changed, 40 insertions(+), 13 deletions(-) diff --git a/org.eclipse.xtext/src/org/eclipse/xtext/generator/JavaIoFileSystemAccess.java b/org.eclipse.xtext/src/org/eclipse/xtext/generator/JavaIoFileSystemAccess.java index 871a23d24..e9d241176 100644 --- a/org.eclipse.xtext/src/org/eclipse/xtext/generator/JavaIoFileSystemAccess.java +++ b/org.eclipse.xtext/src/org/eclipse/xtext/generator/JavaIoFileSystemAccess.java @@ -23,6 +23,7 @@ import org.eclipse.emf.common.util.URI; import org.eclipse.xtext.generator.trace.AbstractTraceRegion; import org.eclipse.xtext.generator.trace.ITraceRegionProvider; import org.eclipse.xtext.generator.trace.TraceFileNameProvider; +import org.eclipse.xtext.generator.trace.TraceNotFoundException; import org.eclipse.xtext.generator.trace.TraceRegionSerializer; import org.eclipse.xtext.parser.IEncodingProvider; import org.eclipse.xtext.resource.IResourceServiceProvider; @@ -129,7 +130,9 @@ public class JavaIoFileSystemAccess extends AbstractFileSystemAccess2 { traceSerializer.writeTraceRegionTo(traceRegion, out); if(callBack != null) callBack.fileAdded(traceFile); - } finally { + } catch (TraceNotFoundException e) { + // ok + }finally { out.close(); } } diff --git a/org.eclipse.xtext/src/org/eclipse/xtext/generator/URIBasedFileSystemAccess.xtend b/org.eclipse.xtext/src/org/eclipse/xtext/generator/URIBasedFileSystemAccess.xtend index 1ad075fd4..a57d30f80 100644 --- a/org.eclipse.xtext/src/org/eclipse/xtext/generator/URIBasedFileSystemAccess.xtend +++ b/org.eclipse.xtext/src/org/eclipse/xtext/generator/URIBasedFileSystemAccess.xtend @@ -10,6 +10,9 @@ package org.eclipse.xtext.generator import com.google.common.io.ByteStreams import com.google.common.io.CharStreams import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream +import java.io.File +import java.io.FileNotFoundException import java.io.InputStream import java.io.InputStreamReader import org.eclipse.emf.common.util.URI @@ -21,9 +24,7 @@ import org.eclipse.xtext.generator.trace.TraceFileNameProvider import org.eclipse.xtext.generator.trace.TraceRegionSerializer import org.eclipse.xtext.parser.IEncodingProvider import org.eclipse.xtext.util.RuntimeIOException -import java.io.ByteArrayOutputStream -import java.io.File -import java.io.FileNotFoundException +import org.eclipse.xtext.generator.trace.TraceNotFoundException /** * A file system access implementation that is based on EMF URIs and URIConverter @@ -93,9 +94,13 @@ class URIBasedFileSystemAccess extends AbstractFileSystemAccess2 { if (isGenerateTraces && contents instanceof ITraceRegionProvider) { var String traceFileName = traceFileNameProvider.getTraceFromJava(generatedFile) val out = new ByteArrayOutputStream() - var AbstractTraceRegion traceRegion = (contents as ITraceRegionProvider).getTraceRegion() - traceRegionSerializer.writeTraceRegionTo(traceRegion, out) - generateFile(traceFileName, outputConfigName, new ByteArrayInputStream(out.toByteArray)) + try { + var AbstractTraceRegion traceRegion = (contents as ITraceRegionProvider).getTraceRegion() + traceRegionSerializer.writeTraceRegionTo(traceRegion, out) + generateFile(traceFileName, outputConfigName, new ByteArrayInputStream(out.toByteArray)) + } catch (TraceNotFoundException e) { + // ok + } } } diff --git a/org.eclipse.xtext/src/org/eclipse/xtext/generator/trace/internal/AbstractTraceForURIProvider.java b/org.eclipse.xtext/src/org/eclipse/xtext/generator/trace/internal/AbstractTraceForURIProvider.java index 54123d27a..68fda3603 100644 --- a/org.eclipse.xtext/src/org/eclipse/xtext/generator/trace/internal/AbstractTraceForURIProvider.java +++ b/org.eclipse.xtext/src/org/eclipse/xtext/generator/trace/internal/AbstractTraceForURIProvider.java @@ -205,7 +205,11 @@ public abstract class AbstractTraceForURIProvider Date: Fri, 1 Dec 2017 11:11:13 +0100 Subject: [PATCH 2/4] implemented review feedback Signed-off-by: Christian Dietrich --- .../eclipse/xtext/generator/JavaIoFileSystemAccess.java | 9 ++++++--- .../xtext/generator/URIBasedFileSystemAccess.xtend | 2 +- .../xtext/generator/URIBasedFileSystemAccess.java | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/org.eclipse.xtext/src/org/eclipse/xtext/generator/JavaIoFileSystemAccess.java b/org.eclipse.xtext/src/org/eclipse/xtext/generator/JavaIoFileSystemAccess.java index e9d241176..bb1400e48 100644 --- a/org.eclipse.xtext/src/org/eclipse/xtext/generator/JavaIoFileSystemAccess.java +++ b/org.eclipse.xtext/src/org/eclipse/xtext/generator/JavaIoFileSystemAccess.java @@ -123,17 +123,20 @@ public class JavaIoFileSystemAccess extends AbstractFileSystemAccess2 { try { if (contents instanceof ITraceRegionProvider) { String traceFileName = traceFileNameProvider.getTraceFromJava(generatedFile); - File traceFile = getFile(traceFileName, outputConfigName); - OutputStream out = new BufferedOutputStream(new FileOutputStream(traceFile)); + OutputStream out = null; try { AbstractTraceRegion traceRegion = ((ITraceRegionProvider) contents).getTraceRegion(); + File traceFile = getFile(traceFileName, outputConfigName); + out = new BufferedOutputStream(new FileOutputStream(traceFile)); traceSerializer.writeTraceRegionTo(traceRegion, out); if(callBack != null) callBack.fileAdded(traceFile); } catch (TraceNotFoundException e) { // ok }finally { - out.close(); + if (out != null) { + out.close(); + } } } } catch (FileNotFoundException e) { diff --git a/org.eclipse.xtext/src/org/eclipse/xtext/generator/URIBasedFileSystemAccess.xtend b/org.eclipse.xtext/src/org/eclipse/xtext/generator/URIBasedFileSystemAccess.xtend index a57d30f80..12349d1a3 100644 --- a/org.eclipse.xtext/src/org/eclipse/xtext/generator/URIBasedFileSystemAccess.xtend +++ b/org.eclipse.xtext/src/org/eclipse/xtext/generator/URIBasedFileSystemAccess.xtend @@ -93,9 +93,9 @@ class URIBasedFileSystemAccess extends AbstractFileSystemAccess2 { protected def void generateTrace(String generatedFile, String outputConfigName, CharSequence contents) { if (isGenerateTraces && contents instanceof ITraceRegionProvider) { var String traceFileName = traceFileNameProvider.getTraceFromJava(generatedFile) - val out = new ByteArrayOutputStream() try { var AbstractTraceRegion traceRegion = (contents as ITraceRegionProvider).getTraceRegion() + val out = new ByteArrayOutputStream() traceRegionSerializer.writeTraceRegionTo(traceRegion, out) generateFile(traceFileName, outputConfigName, new ByteArrayInputStream(out.toByteArray)) } catch (TraceNotFoundException e) { diff --git a/org.eclipse.xtext/xtend-gen/org/eclipse/xtext/generator/URIBasedFileSystemAccess.java b/org.eclipse.xtext/xtend-gen/org/eclipse/xtext/generator/URIBasedFileSystemAccess.java index bb0446e3e..7bdfd22aa 100644 --- a/org.eclipse.xtext/xtend-gen/org/eclipse/xtext/generator/URIBasedFileSystemAccess.java +++ b/org.eclipse.xtext/xtend-gen/org/eclipse/xtext/generator/URIBasedFileSystemAccess.java @@ -132,9 +132,9 @@ public class URIBasedFileSystemAccess extends AbstractFileSystemAccess2 { try { if ((this.isGenerateTraces() && (contents instanceof ITraceRegionProvider))) { String traceFileName = this.traceFileNameProvider.getTraceFromJava(generatedFile); - final ByteArrayOutputStream out = new ByteArrayOutputStream(); try { AbstractTraceRegion traceRegion = ((ITraceRegionProvider) contents).getTraceRegion(); + final ByteArrayOutputStream out = new ByteArrayOutputStream(); this.traceRegionSerializer.writeTraceRegionTo(traceRegion, out); byte[] _byteArray = out.toByteArray(); ByteArrayInputStream _byteArrayInputStream = new ByteArrayInputStream(_byteArray); From d9e4a5d265bff411715b961077feaa86454a4da0 Mon Sep 17 00:00:00 2001 From: Christian Dietrich Date: Fri, 1 Dec 2017 11:37:27 +0100 Subject: [PATCH 3/4] more review feedback Signed-off-by: Christian Dietrich --- .../org/eclipse/xtext/generator/URIBasedFileSystemAccess.xtend | 2 +- .../org/eclipse/xtext/generator/URIBasedFileSystemAccess.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/org.eclipse.xtext/src/org/eclipse/xtext/generator/URIBasedFileSystemAccess.xtend b/org.eclipse.xtext/src/org/eclipse/xtext/generator/URIBasedFileSystemAccess.xtend index 12349d1a3..e8b0d6466 100644 --- a/org.eclipse.xtext/src/org/eclipse/xtext/generator/URIBasedFileSystemAccess.xtend +++ b/org.eclipse.xtext/src/org/eclipse/xtext/generator/URIBasedFileSystemAccess.xtend @@ -92,9 +92,9 @@ class URIBasedFileSystemAccess extends AbstractFileSystemAccess2 { protected def void generateTrace(String generatedFile, String outputConfigName, CharSequence contents) { if (isGenerateTraces && contents instanceof ITraceRegionProvider) { - var String traceFileName = traceFileNameProvider.getTraceFromJava(generatedFile) try { var AbstractTraceRegion traceRegion = (contents as ITraceRegionProvider).getTraceRegion() + var String traceFileName = traceFileNameProvider.getTraceFromJava(generatedFile) val out = new ByteArrayOutputStream() traceRegionSerializer.writeTraceRegionTo(traceRegion, out) generateFile(traceFileName, outputConfigName, new ByteArrayInputStream(out.toByteArray)) diff --git a/org.eclipse.xtext/xtend-gen/org/eclipse/xtext/generator/URIBasedFileSystemAccess.java b/org.eclipse.xtext/xtend-gen/org/eclipse/xtext/generator/URIBasedFileSystemAccess.java index 7bdfd22aa..3a05c097d 100644 --- a/org.eclipse.xtext/xtend-gen/org/eclipse/xtext/generator/URIBasedFileSystemAccess.java +++ b/org.eclipse.xtext/xtend-gen/org/eclipse/xtext/generator/URIBasedFileSystemAccess.java @@ -131,9 +131,9 @@ public class URIBasedFileSystemAccess extends AbstractFileSystemAccess2 { protected void generateTrace(final String generatedFile, final String outputConfigName, final CharSequence contents) { try { if ((this.isGenerateTraces() && (contents instanceof ITraceRegionProvider))) { - String traceFileName = this.traceFileNameProvider.getTraceFromJava(generatedFile); try { AbstractTraceRegion traceRegion = ((ITraceRegionProvider) contents).getTraceRegion(); + String traceFileName = this.traceFileNameProvider.getTraceFromJava(generatedFile); final ByteArrayOutputStream out = new ByteArrayOutputStream(); this.traceRegionSerializer.writeTraceRegionTo(traceRegion, out); byte[] _byteArray = out.toByteArray(); From 3b4910adaeabdbb1f7f74a13903283c44c16a4af Mon Sep 17 00:00:00 2001 From: Christian Dietrich Date: Fri, 1 Dec 2017 11:38:35 +0100 Subject: [PATCH 4/4] more review feedback Signed-off-by: Christian Dietrich --- .../src/org/eclipse/xtext/generator/JavaIoFileSystemAccess.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.eclipse.xtext/src/org/eclipse/xtext/generator/JavaIoFileSystemAccess.java b/org.eclipse.xtext/src/org/eclipse/xtext/generator/JavaIoFileSystemAccess.java index bb1400e48..aec9e4944 100644 --- a/org.eclipse.xtext/src/org/eclipse/xtext/generator/JavaIoFileSystemAccess.java +++ b/org.eclipse.xtext/src/org/eclipse/xtext/generator/JavaIoFileSystemAccess.java @@ -122,10 +122,10 @@ public class JavaIoFileSystemAccess extends AbstractFileSystemAccess2 { protected void generateTrace(String generatedFile, String outputConfigName, CharSequence contents) { try { if (contents instanceof ITraceRegionProvider) { - String traceFileName = traceFileNameProvider.getTraceFromJava(generatedFile); OutputStream out = null; try { AbstractTraceRegion traceRegion = ((ITraceRegionProvider) contents).getTraceRegion(); + String traceFileName = traceFileNameProvider.getTraceFromJava(generatedFile); File traceFile = getFile(traceFileName, outputConfigName); out = new BufferedOutputStream(new FileOutputStream(traceFile)); traceSerializer.writeTraceRegionTo(traceRegion, out);