reload instance after i18n file change

This commit is contained in:
Marcel Haßlinger 2021-11-10 20:05:16 +01:00
parent d0aff2f816
commit 4aac4161db
2 changed files with 78 additions and 2 deletions

View File

@ -1,6 +1,8 @@
package de.marhali.easyi18n;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.vfs.*;
import de.marhali.easyi18n.io.IOStrategy;
import de.marhali.easyi18n.io.json.JsonIOStrategy;
@ -9,6 +11,7 @@ import de.marhali.easyi18n.io.properties.PropertiesIOStrategy;
import de.marhali.easyi18n.io.yaml.YamlIOStrategy;
import de.marhali.easyi18n.model.SettingsState;
import de.marhali.easyi18n.model.TranslationData;
import de.marhali.easyi18n.service.FileChangeListener;
import de.marhali.easyi18n.service.SettingsService;
import org.jetbrains.annotations.NotNull;
@ -31,13 +34,18 @@ public class DataStore {
new PropertiesIOStrategy()
));
private final Project project;
private final @NotNull Project project;
private final @NotNull FileChangeListener changeListener;
private @NotNull TranslationData data;
protected DataStore(Project project) {
protected DataStore(@NotNull Project project) {
this.project = project;
this.data = new TranslationData(true, true); // Initialize with hard-coded configuration
this.changeListener = new FileChangeListener(project);
VirtualFileManager.getInstance().addAsyncFileListener(
this.changeListener, Disposer.newDisposable("EasyI18n"));
}
public @NotNull TranslationData getData() {
@ -58,6 +66,8 @@ public class DataStore {
return;
}
this.changeListener.updateLocalesPath(localesPath);
IOStrategy strategy = this.determineStrategy(state, localesPath);
strategy.read(this.project, localesPath, state, (data) -> {

View File

@ -0,0 +1,66 @@
package de.marhali.easyi18n.service;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.AsyncFileListener;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.newvfs.events.VFileEvent;
import de.marhali.easyi18n.InstanceManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.List;
/**
* Listens for file changes inside configured @localesPath. See {@link AsyncFileListener}.
* Will trigger the reload function of the i18n instance if a relevant file was changed.
* @author marhali
*/
public class FileChangeListener implements AsyncFileListener {
private static final Logger logger = Logger.getInstance(FileChangeListener.class);
private final @NotNull Project project;
private @Nullable String localesPath;
public FileChangeListener(@NotNull Project project) {
this.project = project;
this.localesPath = null; // Wait for any update before listening to file changes
}
public void updateLocalesPath(@Nullable String localesPath) {
if(localesPath != null && !localesPath.isEmpty()) {
VirtualFile file = LocalFileSystem.getInstance().findFileByIoFile(new File(localesPath));
if(file != null && file.isDirectory()) {
this.localesPath = file.getPath();
return;
}
}
this.localesPath = null;
}
@Override
public ChangeApplier prepareChange(@NotNull List<? extends @NotNull VFileEvent> events) {
return new ChangeApplier() {
@Override
public void afterVfsChange() {
if(localesPath != null) {
events.forEach((e) -> {
if(e.getPath().contains(localesPath)) { // Perform reload
logger.debug("Detected file change. Reloading instance...");
InstanceManager manager = InstanceManager.get(project);
manager.store().loadFromPersistenceLayer((success) -> {
manager.bus().propagate().onUpdateData(manager.store().getData());
});
}
});
}
}
};
}
}