From 38f5bcb900fd591acc9e14ebf393ca3b3aebf907 Mon Sep 17 00:00:00 2001 From: marhali Date: Fri, 14 Oct 2022 16:02:20 +0200 Subject: [PATCH] fix loosing settings on IDE restart Resolves #186 Resolves #164 --- CHANGELOG.md | 8 +- .../settings/ProjectSettingsState.java | 143 ++++++++++++++---- .../settings/ProjectSettingsServiceTest.java | 31 ++++ .../easyi18n/settings/SettingsTestPreset.java | 88 +++++++++++ 4 files changed, 235 insertions(+), 35 deletions(-) create mode 100644 src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java create mode 100644 src/test/java/de/marhali/easyi18n/settings/SettingsTestPreset.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 909485b..2d4d141 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,12 +3,14 @@ # easy-i18n Changelog ## [Unreleased] +### Fixed +- Some settings are not retained on IDE restarts ## [4.2.3] -### Changed -- Removed warning about missing configuration during project initialization +### Changed +- Removed warning about missing configuration during project initialization -### Fixed +### Fixed - Folding support for Vue files ## [4.2.2] diff --git a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java index 9392f27..a8648a2 100644 --- a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java +++ b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java @@ -1,5 +1,7 @@ package de.marhali.easyi18n.settings; +import com.intellij.util.xmlb.annotations.Property; + import de.marhali.easyi18n.io.parser.ParserStrategyType; import de.marhali.easyi18n.io.folder.FolderStrategyType; import de.marhali.easyi18n.settings.presets.DefaultPreset; @@ -7,87 +9,112 @@ import de.marhali.easyi18n.settings.presets.DefaultPreset; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Objects; + /** * Represents the project-specific configuration of this plugin. * @author marhali */ public class ProjectSettingsState implements ProjectSettings { - private static final ProjectSettings defaults = new DefaultPreset(); - // Resource Configuration - private String localesDirectory; - private FolderStrategyType folderStrategy; - private ParserStrategyType parserStrategy; - private String filePattern; + @Property private String localesDirectory; + @Property private FolderStrategyType folderStrategy; + @Property private ParserStrategyType parserStrategy; + @Property private String filePattern; - private Boolean includeSubDirs; - private Boolean sorting; + @Property private Boolean includeSubDirs; + @Property private boolean sorting; // Editor configuration - private String namespaceDelimiter; - private String sectionDelimiter; - private String contextDelimiter; - private String pluralDelimiter; - private String defaultNamespace; - private String previewLocale; + @Property private String namespaceDelimiter; + @Property private String sectionDelimiter; + @Property private String contextDelimiter; + @Property private String pluralDelimiter; + @Property private String defaultNamespace; + @Property private String previewLocale; - private Boolean nestedKeys; - private Boolean assistance; + @Property private Boolean nestedKeys; + @Property private Boolean assistance; // Experimental configuration - private Boolean alwaysFold; + @Property private Boolean alwaysFold; - public ProjectSettingsState() {} + public ProjectSettingsState() { + this(new DefaultPreset()); + } + + public ProjectSettingsState(ProjectSettings defaults) { + // Apply defaults on initialization + this.localesDirectory = defaults.getLocalesDirectory(); + this.folderStrategy = defaults.getFolderStrategy(); + this.parserStrategy = defaults.getParserStrategy(); + this.filePattern = defaults.getFilePattern(); + + this.includeSubDirs = defaults.isIncludeSubDirs(); + this.sorting = defaults.isSorting(); + + this.namespaceDelimiter = defaults.getNamespaceDelimiter(); + this.sectionDelimiter = defaults.getSectionDelimiter(); + this.contextDelimiter = defaults.getContextDelimiter(); + this.pluralDelimiter = defaults.getPluralDelimiter(); + this.defaultNamespace = defaults.getDefaultNamespace(); + this.previewLocale = defaults.getPreviewLocale(); + + this.nestedKeys = defaults.isNestedKeys(); + this.assistance = defaults.isAssistance(); + + this.alwaysFold = defaults.isAlwaysFold(); + } @Override public @Nullable String getLocalesDirectory() { - return localesDirectory != null ? localesDirectory : defaults.getLocalesDirectory(); + return localesDirectory; } @Override public @NotNull FolderStrategyType getFolderStrategy() { - return folderStrategy != null ? folderStrategy : defaults.getFolderStrategy(); + return folderStrategy; } @Override public @NotNull ParserStrategyType getParserStrategy() { - return parserStrategy != null ? parserStrategy : defaults.getParserStrategy(); + return parserStrategy; } @Override public @NotNull String getFilePattern() { - return filePattern != null ? filePattern : defaults.getFilePattern(); + return filePattern; } @Override public boolean isIncludeSubDirs() { - return includeSubDirs != null ? includeSubDirs : defaults.isIncludeSubDirs(); + return includeSubDirs; } @Override public boolean isSorting() { - return sorting != null ? sorting : defaults.isSorting(); + return sorting; } @Override public @Nullable String getNamespaceDelimiter() { - return namespaceDelimiter != null ? namespaceDelimiter : defaults.getNamespaceDelimiter(); + return namespaceDelimiter; } @Override public @NotNull String getSectionDelimiter() { - return sectionDelimiter != null ? sectionDelimiter : defaults.getSectionDelimiter(); + return sectionDelimiter; } @Override public @Nullable String getContextDelimiter() { - return contextDelimiter != null ? contextDelimiter : defaults.getContextDelimiter(); + return contextDelimiter; } @Override public @Nullable String getPluralDelimiter() { - return pluralDelimiter != null ? pluralDelimiter : defaults.getPluralDelimiter(); + return pluralDelimiter; } @Nullable @@ -98,22 +125,22 @@ public class ProjectSettingsState implements ProjectSettings { @Override public @NotNull String getPreviewLocale() { - return previewLocale != null ? previewLocale : defaults.getPreviewLocale(); + return previewLocale; } @Override public boolean isNestedKeys() { - return nestedKeys != null ? nestedKeys : defaults.isNestedKeys(); + return nestedKeys; } @Override public boolean isAssistance() { - return assistance != null ? assistance : defaults.isAssistance(); + return assistance; } @Override public boolean isAlwaysFold() { - return alwaysFold != null ? alwaysFold : defaults.isAlwaysFold(); + return alwaysFold; } public void setLocalesDirectory(String localesDirectory) { @@ -175,4 +202,56 @@ public class ProjectSettingsState implements ProjectSettings { public void setAlwaysFold(Boolean alwaysFold) { this.alwaysFold = alwaysFold; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ProjectSettingsState that = (ProjectSettingsState) o; + return sorting == that.sorting + && folderStrategy == that.folderStrategy + && parserStrategy == that.parserStrategy + && Objects.equals(localesDirectory, that.localesDirectory) + && Objects.equals(filePattern, that.filePattern) + && Objects.equals(includeSubDirs, that.includeSubDirs) + && Objects.equals(namespaceDelimiter, that.namespaceDelimiter) + && Objects.equals(sectionDelimiter, that.sectionDelimiter) + && Objects.equals(contextDelimiter, that.contextDelimiter) + && Objects.equals(pluralDelimiter, that.pluralDelimiter) + && Objects.equals(defaultNamespace, that.defaultNamespace) + && Objects.equals(previewLocale, that.previewLocale) + && Objects.equals(nestedKeys, that.nestedKeys) + && Objects.equals(assistance, that.assistance) + && Objects.equals(alwaysFold, that.alwaysFold); + } + + @Override + public int hashCode() { + return Objects.hash( + localesDirectory, folderStrategy, parserStrategy, filePattern, includeSubDirs, + sorting, namespaceDelimiter, sectionDelimiter, contextDelimiter, pluralDelimiter, + defaultNamespace, previewLocale, nestedKeys, assistance, alwaysFold + ); + } + + @Override + public String toString() { + return "ProjectSettingsState{" + + "localesDirectory='" + localesDirectory + '\'' + + ", folderStrategy=" + folderStrategy + + ", parserStrategy=" + parserStrategy + + ", filePattern='" + filePattern + '\'' + + ", includeSubDirs=" + includeSubDirs + + ", sorting=" + sorting + + ", namespaceDelimiter='" + namespaceDelimiter + '\'' + + ", sectionDelimiter='" + sectionDelimiter + '\'' + + ", contextDelimiter='" + contextDelimiter + '\'' + + ", pluralDelimiter='" + pluralDelimiter + '\'' + + ", defaultNamespace='" + defaultNamespace + '\'' + + ", previewLocale='" + previewLocale + '\'' + + ", nestedKeys=" + nestedKeys + + ", assistance=" + assistance + + ", alwaysFold=" + alwaysFold + + '}'; + } } diff --git a/src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java b/src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java new file mode 100644 index 0000000..94c774f --- /dev/null +++ b/src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java @@ -0,0 +1,31 @@ +package de.marhali.easyi18n.settings; + +import com.intellij.testFramework.fixtures.BasePlatformTestCase; +import com.intellij.util.xmlb.XmlSerializerUtil; + +import de.marhali.easyi18n.settings.presets.DefaultPreset; + +/** + * Tests for the project settings service itself. + * @author marhali + */ +public class ProjectSettingsServiceTest extends BasePlatformTestCase { + public void testSettingsDefaultPreset() { + ProjectSettingsState state = ProjectSettingsService.get(getProject()).getState(); + assertEquals(state, new ProjectSettingsState(new DefaultPreset())); + } + + public void testPersistenceState() { + ProjectSettingsState previous = new ProjectSettingsState(new SettingsTestPreset()); + ProjectSettingsState after = XmlSerializerUtil.createCopy(previous); + assertEquals(previous, after); + } + + public void testPersistenceSingle() { + ProjectSettingsState previous = new ProjectSettingsState(); + previous.setLocalesDirectory("mySinglePropTest"); + + ProjectSettingsState after = XmlSerializerUtil.createCopy(previous); + assertEquals("mySinglePropTest", after.getLocalesDirectory()); + } +} diff --git a/src/test/java/de/marhali/easyi18n/settings/SettingsTestPreset.java b/src/test/java/de/marhali/easyi18n/settings/SettingsTestPreset.java new file mode 100644 index 0000000..2415fe3 --- /dev/null +++ b/src/test/java/de/marhali/easyi18n/settings/SettingsTestPreset.java @@ -0,0 +1,88 @@ +package de.marhali.easyi18n.settings; + +import de.marhali.easyi18n.io.folder.FolderStrategyType; +import de.marhali.easyi18n.io.parser.ParserStrategyType; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Settings preset to test the functionality of the settings service. + * @author marhali + */ +public class SettingsTestPreset implements ProjectSettings { + @Override + public @Nullable String getLocalesDirectory() { + return "myCustomLocalesDirectory"; + } + + @Override + public @NotNull FolderStrategyType getFolderStrategy() { + return FolderStrategyType.MODULARIZED_NAMESPACE; + } + + @Override + public @NotNull ParserStrategyType getParserStrategy() { + return ParserStrategyType.JSON5; + } + + @Override + public @NotNull String getFilePattern() { + return "*.testfile.json5"; + } + + @Override + public boolean isIncludeSubDirs() { + return true; + } + + @Override + public boolean isSorting() { + return false; + } + + @Override + public @Nullable String getNamespaceDelimiter() { + return "nsDelim"; + } + + @Override + public @NotNull String getSectionDelimiter() { + return "sctDelim"; + } + + @Override + public @Nullable String getContextDelimiter() { + return "ctxDelim"; + } + + @Override + public @Nullable String getPluralDelimiter() { + return "plDelim"; + } + + @Override + public @Nullable String getDefaultNamespace() { + return "defNs"; + } + + @Override + public @NotNull String getPreviewLocale() { + return "prevLocale"; + } + + @Override + public boolean isNestedKeys() { + return true; + } + + @Override + public boolean isAssistance() { + return false; + } + + @Override + public boolean isAlwaysFold() { + return false; + } +}