From 7559e4d1f702eea64dc2384aef0d72f6ba4ebd7e Mon Sep 17 00:00:00 2001 From: marhali Date: Tue, 11 Jan 2022 11:18:26 +0100 Subject: [PATCH] Optimize exception handling on IO ops Resolves #76 --- CHANGELOG.md | 1 + .../easyi18n/io/json/JsonIOStrategy.java | 28 +++++++------ .../io/json/ModularizedJsonIOStrategy.java | 40 ++++++++++--------- .../io/properties/PropertiesIOStrategy.java | 28 +++++++------ .../easyi18n/io/yaml/YamlIOStrategy.java | 28 +++++++------ .../easyi18n/util/NotificationHelper.java | 18 +++++++++ src/main/resources/messages.properties | 3 +- 7 files changed, 87 insertions(+), 59 deletions(-) create mode 100644 src/main/java/de/marhali/easyi18n/util/NotificationHelper.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 543bbb7..cc90b8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - Support for dots within key nodes in YAML files ### Changed +- Improve exception handling on IO operations - Update Qodana to latest version - Allow tool-window rendering in dumb mode diff --git a/src/main/java/de/marhali/easyi18n/io/json/JsonIOStrategy.java b/src/main/java/de/marhali/easyi18n/io/json/JsonIOStrategy.java index b6e9f0d..0e32211 100644 --- a/src/main/java/de/marhali/easyi18n/io/json/JsonIOStrategy.java +++ b/src/main/java/de/marhali/easyi18n/io/json/JsonIOStrategy.java @@ -12,6 +12,7 @@ import com.intellij.openapi.vfs.VirtualFile; import de.marhali.easyi18n.io.IOStrategy; import de.marhali.easyi18n.model.SettingsState; import de.marhali.easyi18n.model.TranslationData; +import de.marhali.easyi18n.util.NotificationHelper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -68,27 +69,28 @@ public class JsonIOStrategy implements IOStrategy { TranslationData data = new TranslationData(state.isSortKeys(), state.isNestedKeys()); - try { - for(VirtualFile file : directory.getChildren()) { - if(file.isDirectory() || !isFileRelevant(state, file)) { - continue; - } + for(VirtualFile file : directory.getChildren()) { + if(file.isDirectory() || !isFileRelevant(state, file)) { + continue; + } - String locale = file.getNameWithoutExtension(); - data.addLocale(locale); + String locale = file.getNameWithoutExtension(); + data.addLocale(locale); + try { JsonObject tree = GSON.fromJson(new InputStreamReader(file.getInputStream(), file.getCharset()), JsonObject.class); JsonMapper.read(locale, tree, data.getRootNode()); + + } catch (Exception e) { + NotificationHelper.createIOError(file.getName(), this.getClass(), e); + result.accept(null); + return; } - - result.accept(data); - - } catch(IOException e) { - e.printStackTrace(); - result.accept(null); } + + result.accept(data); }); } diff --git a/src/main/java/de/marhali/easyi18n/io/json/ModularizedJsonIOStrategy.java b/src/main/java/de/marhali/easyi18n/io/json/ModularizedJsonIOStrategy.java index d025284..518fe48 100644 --- a/src/main/java/de/marhali/easyi18n/io/json/ModularizedJsonIOStrategy.java +++ b/src/main/java/de/marhali/easyi18n/io/json/ModularizedJsonIOStrategy.java @@ -12,6 +12,7 @@ import de.marhali.easyi18n.io.IOStrategy; import de.marhali.easyi18n.model.SettingsState; import de.marhali.easyi18n.model.TranslationData; import de.marhali.easyi18n.model.TranslationNode; +import de.marhali.easyi18n.util.NotificationHelper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -82,38 +83,39 @@ public class ModularizedJsonIOStrategy implements IOStrategy { TranslationData data = new TranslationData(state.isSortKeys(), state.isNestedKeys()); VirtualFile[] localeDirectories = directory.getChildren(); - try { - for(VirtualFile localeDir : localeDirectories) { - String locale = localeDir.getNameWithoutExtension(); - data.addLocale(locale); + for(VirtualFile localeDir : localeDirectories) { + String locale = localeDir.getNameWithoutExtension(); + data.addLocale(locale); - // Read all underlying module files - for(VirtualFile module : localeDir.getChildren()) { - if(module.isDirectory() || !isFileRelevant(state, module)) { - continue; - } + // Read all underlying module files + for(VirtualFile module : localeDir.getChildren()) { + if(module.isDirectory() || !isFileRelevant(state, module)) { + continue; + } - String moduleName = module.getNameWithoutExtension(); + String moduleName = module.getNameWithoutExtension(); - TranslationNode moduleNode = data.getNode(moduleName) != null - ? data.getNode(moduleName) - : new TranslationNode(state.isSortKeys() ? new TreeMap<>() : new LinkedHashMap<>()); + TranslationNode moduleNode = data.getNode(moduleName) != null + ? data.getNode(moduleName) + : new TranslationNode(state.isSortKeys() ? new TreeMap<>() : new LinkedHashMap<>()); + try { JsonObject tree = GSON.fromJson(new InputStreamReader(module.getInputStream(), module.getCharset()), JsonObject.class); JsonMapper.read(locale, tree, moduleNode); data.getRootNode().setChildren(moduleName, moduleNode); + + } catch (Exception e) { + NotificationHelper.createIOError(locale + " / " + moduleName, this.getClass(), e); + result.accept(null); + return; } } - - result.accept(data); - - } catch(IOException e) { - e.printStackTrace(); - result.accept(null); } + + result.accept(data); }); } diff --git a/src/main/java/de/marhali/easyi18n/io/properties/PropertiesIOStrategy.java b/src/main/java/de/marhali/easyi18n/io/properties/PropertiesIOStrategy.java index 580bb69..23d9f2a 100644 --- a/src/main/java/de/marhali/easyi18n/io/properties/PropertiesIOStrategy.java +++ b/src/main/java/de/marhali/easyi18n/io/properties/PropertiesIOStrategy.java @@ -8,6 +8,7 @@ import com.intellij.openapi.vfs.VirtualFile; import de.marhali.easyi18n.io.IOStrategy; import de.marhali.easyi18n.model.SettingsState; import de.marhali.easyi18n.model.TranslationData; +import de.marhali.easyi18n.util.NotificationHelper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -60,26 +61,27 @@ public class PropertiesIOStrategy implements IOStrategy { TranslationData data = new TranslationData(state.isSortKeys(), state.isNestedKeys()); - try { - for(VirtualFile file : directory.getChildren()) { - if(file.isDirectory() || !isFileRelevant(state, file)) { - continue; - } + for(VirtualFile file : directory.getChildren()) { + if(file.isDirectory() || !isFileRelevant(state, file)) { + continue; + } - String locale = file.getNameWithoutExtension(); - data.addLocale(locale); + String locale = file.getNameWithoutExtension(); + data.addLocale(locale); + try { SortableProperties properties = new SortableProperties(state.isSortKeys()); properties.load(new InputStreamReader(file.getInputStream(), file.getCharset())); PropertiesMapper.read(locale, properties, data); + + } catch (Exception e) { + NotificationHelper.createIOError(file.getName(), this.getClass(), e); + result.accept(null); + return; } - - result.accept(data); - - } catch(IOException e) { - e.printStackTrace(); - result.accept(null); } + + result.accept(data); }); } diff --git a/src/main/java/de/marhali/easyi18n/io/yaml/YamlIOStrategy.java b/src/main/java/de/marhali/easyi18n/io/yaml/YamlIOStrategy.java index d36e25a..79b6424 100644 --- a/src/main/java/de/marhali/easyi18n/io/yaml/YamlIOStrategy.java +++ b/src/main/java/de/marhali/easyi18n/io/yaml/YamlIOStrategy.java @@ -8,6 +8,7 @@ import com.intellij.openapi.vfs.VirtualFile; import de.marhali.easyi18n.io.IOStrategy; import de.marhali.easyi18n.model.SettingsState; import de.marhali.easyi18n.model.TranslationData; +import de.marhali.easyi18n.util.NotificationHelper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -67,27 +68,28 @@ public class YamlIOStrategy implements IOStrategy { TranslationData data = new TranslationData(state.isSortKeys(), state.isNestedKeys()); - try { - for(VirtualFile file : directory.getChildren()) { - if(file.isDirectory() || !isFileRelevant(state, file)) { - continue; - } + for(VirtualFile file : directory.getChildren()) { + if(file.isDirectory() || !isFileRelevant(state, file)) { + continue; + } - String locale = file.getNameWithoutExtension(); - data.addLocale(locale); + String locale = file.getNameWithoutExtension(); + data.addLocale(locale); + try { try(Reader reader = new InputStreamReader(file.getInputStream(), file.getCharset())) { Section section = Section.parseToMap(reader); YamlMapper.read(locale, section, data.getRootNode()); } + + } catch (Exception e) { + NotificationHelper.createIOError(file.getName(), this.getClass(), e); + result.accept(null); + return; } - - result.accept(data); - - } catch(IOException e) { - e.printStackTrace(); - result.accept(null); } + + result.accept(data); }); } diff --git a/src/main/java/de/marhali/easyi18n/util/NotificationHelper.java b/src/main/java/de/marhali/easyi18n/util/NotificationHelper.java new file mode 100644 index 0000000..3fb1c3f --- /dev/null +++ b/src/main/java/de/marhali/easyi18n/util/NotificationHelper.java @@ -0,0 +1,18 @@ +package de.marhali.easyi18n.util; + +import com.intellij.openapi.diagnostic.Logger; + +import java.text.MessageFormat; +import java.util.ResourceBundle; + +/** + * Utility tool to support creating notifications with detailed information like exception traces. + * @author marhali + */ +public class NotificationHelper { + public static void createIOError(String fileName, Class ioStrategy, Exception ex) { + ResourceBundle bundle = ResourceBundle.getBundle("messages"); + String message = MessageFormat.format(bundle.getString("error.io"), fileName, ioStrategy.getSimpleName()); + Logger.getInstance(ioStrategy).error(message, ex.getCause()); + } +} \ No newline at end of file diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index 7292936..eea38f5 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -18,4 +18,5 @@ settings.path.prefix=Path prefix settings.preview=Preview locale settings.keys.sort=Sort translation keys alphabetically settings.keys.nested=Nest translation keys if possible -settings.editor.assistance=I18n key completion, annotation and reference inside editor \ No newline at end of file +settings.editor.assistance=I18n key completion, annotation and reference inside editor +error.io=Could not process file {0} with {1}. Unwanted files can be ignored via Translation file pattern option. \ No newline at end of file