package com.demandware.studio.webdav;
import com.demandware.studio.projectWizard.DWModuleType;
import com.demandware.studio.settings.DWSettingsProvider;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.ApplicationComponent;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleType;
import com.intellij.openapi.progress.PerformInBackgroundOption;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.openapi.vfs.newvfs.BulkFileListener;
import com.intellij.openapi.vfs.newvfs.events.VFileEvent;
import com.intellij.util.messages.MessageBusConnection;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class DWBulkFileListener implements ApplicationComponent, BulkFileListener {
private MessageBusConnection connection;
private static Logger LOG = Logger.getInstance(DWBulkFileListener.class);
public DWBulkFileListener() {
connection = ApplicationManager.getApplication().getMessageBus().connect();
}
public void initComponent() {
connection.subscribe(VirtualFileManager.VFS_CHANGES, this);
}
public void disposeComponent() {
connection.disconnect();
}
@NotNull
public String getComponentName() {
return "DWBulkFileListener";
}
@Override
public void before(@NotNull List<? extends VFileEvent> events) {
}
@Override
public void after(@NotNull List<? extends VFileEvent> events) {
Project[] projects = ProjectManager.getInstance().getOpenProjects();
for (VFileEvent event : events) {
VirtualFile eventFile = event.getFile();
if (eventFile != null && !eventFile.isDirectory()) {
for (Project project : projects) {
Module module = ProjectRootManager.getInstance(project).getFileIndex().getModuleForFile(eventFile);
if (module != null) {
ModuleType CurrentModuleType = ModuleType.get(module);
// Bail out if auto uploads are not enabled.
if (!DWSettingsProvider.getInstance(module).getAutoUploadEnabled()) {
return;
}
if (CurrentModuleType instanceof DWModuleType) {
for (VirtualFile sourceRoot : ModuleRootManager.getInstance(module).getSourceRoots()) {
if (eventFile.getPath().contains(sourceRoot.getPath())) {
ProgressManager.getInstance().run(
new DWUpdateFileTask(
project,
module,
"Syncing files to: " + DWSettingsProvider.getInstance(module).getHostname(),
true,
PerformInBackgroundOption.ALWAYS_BACKGROUND,
sourceRoot.getPath(),
eventFile.getPath()
)
);
}
}
}
}
}
}
}
}
}