From f4b5fb702cdc4dbf45673050519a29ff575ef22c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Dinis=20Ferreira?= Date: Sat, 30 May 2026 18:26:53 +0200 Subject: [PATCH] fix: minor robustness/logging cleanups from the inconsistency sweep - ScopeResourceDescriptionStrategy.getSourceText: guard a null parse result before dereferencing getRootNode() (resources without a node model exist, e.g. direct-linking storage), returning "" as for the proxy case. - DirectLinkingResourceStorageWritable: the node-model branch guarded getParseResult() but not getRootNode(); guard both. - CustomClassAwareEcoreGenerator: non-OK EMF generation diagnostics were logged at INFO, so warnings/errors were easy to miss; log them at WARN. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../generator/util/CustomClassAwareEcoreGenerator.java | 6 +++--- .../scope/resource/ScopeResourceDescriptionStrategy.java | 6 +++++- .../persistence/DirectLinkingResourceStorageWritable.java | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/com.avaloq.tools.ddk.xtext.generator/src/com/avaloq/tools/ddk/xtext/generator/util/CustomClassAwareEcoreGenerator.java b/com.avaloq.tools.ddk.xtext.generator/src/com/avaloq/tools/ddk/xtext/generator/util/CustomClassAwareEcoreGenerator.java index e33d519c8..e6566559c 100644 --- a/com.avaloq.tools.ddk.xtext.generator/src/com/avaloq/tools/ddk/xtext/generator/util/CustomClassAwareEcoreGenerator.java +++ b/com.avaloq.tools.ddk.xtext.generator/src/com/avaloq/tools/ddk/xtext/generator/util/CustomClassAwareEcoreGenerator.java @@ -111,21 +111,21 @@ public JControlModel getJControlModel() { Diagnostic diagnostic = generator.generate(model, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, new BasicMonitor()); if (diagnostic.getSeverity() != Diagnostic.OK) { - LOGGER.info(diagnostic); + LOGGER.warn(diagnostic); } } if (generateEdit) { Diagnostic editDiag = generator.generate(model, GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, new BasicMonitor()); if (editDiag.getSeverity() != Diagnostic.OK) { - LOGGER.info(editDiag); + LOGGER.warn(editDiag); } } if (generateEditor) { Diagnostic editorDiag = generator.generate(model, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, new BasicMonitor()); if (editorDiag.getSeverity() != Diagnostic.OK) { - LOGGER.info(editorDiag); + LOGGER.warn(editorDiag); } } } diff --git a/com.avaloq.tools.ddk.xtext.scope/src/com/avaloq/tools/ddk/xtext/scope/resource/ScopeResourceDescriptionStrategy.java b/com.avaloq.tools.ddk.xtext.scope/src/com/avaloq/tools/ddk/xtext/scope/resource/ScopeResourceDescriptionStrategy.java index b01535350..4b64173cb 100644 --- a/com.avaloq.tools.ddk.xtext.scope/src/com/avaloq/tools/ddk/xtext/scope/resource/ScopeResourceDescriptionStrategy.java +++ b/com.avaloq.tools.ddk.xtext.scope/src/com/avaloq/tools/ddk/xtext/scope/resource/ScopeResourceDescriptionStrategy.java @@ -70,6 +70,10 @@ private String getSourceText(final EObject obj) { LOG.warn("Could not resolve scope model " + EcoreUtil.getURI(obj)); return ""; } - return ((XtextResource) obj.eResource()).getParseResult().getRootNode().getText(); + final XtextResource resource = (XtextResource) obj.eResource(); + if (resource.getParseResult() == null) { + return ""; + } + return resource.getParseResult().getRootNode().getText(); } } diff --git a/com.avaloq.tools.ddk.xtext/src/com/avaloq/tools/ddk/xtext/resource/persistence/DirectLinkingResourceStorageWritable.java b/com.avaloq.tools.ddk.xtext/src/com/avaloq/tools/ddk/xtext/resource/persistence/DirectLinkingResourceStorageWritable.java index f5de304c6..e5da5cd72 100644 --- a/com.avaloq.tools.ddk.xtext/src/com/avaloq/tools/ddk/xtext/resource/persistence/DirectLinkingResourceStorageWritable.java +++ b/com.avaloq.tools.ddk.xtext/src/com/avaloq/tools/ddk/xtext/resource/persistence/DirectLinkingResourceStorageWritable.java @@ -105,7 +105,7 @@ protected void writeEntries(final StorageAwareResource resource, final ZipOutput if (storeNodeModel) { zipOut.putNextEntry(new ZipEntry("source")); //$NON-NLS-1$ try { - if (resource.getParseResult() != null) { + if (resource.getParseResult() != null && resource.getParseResult().getRootNode() != null) { StringReader in = new StringReader(resource.getParseResult().getRootNode().getText()); OutputStreamWriter out = new OutputStreamWriter(bufferedOutput, StandardCharsets.UTF_8); CharStreams.copy(in, out);