From 555307ce2a161d49efa7c6bdc9cb75b9135d66cc Mon Sep 17 00:00:00 2001 From: MrLetsplay Date: Wed, 26 Jun 2024 21:00:17 +0200 Subject: [PATCH] Fix file syncing --- .../java/me/mrletsplay/shareclient/ShareClient.java | 12 +++++++++--- .../mrletsplay/shareclient/util/SharedProject.java | 10 ++++++++++ .../me/mrletsplay/shareclient/util/SyncState.java | 10 ++++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 src/main/java/me/mrletsplay/shareclient/util/SyncState.java diff --git a/src/main/java/me/mrletsplay/shareclient/ShareClient.java b/src/main/java/me/mrletsplay/shareclient/ShareClient.java index f956835..90f1d90 100644 --- a/src/main/java/me/mrletsplay/shareclient/ShareClient.java +++ b/src/main/java/me/mrletsplay/shareclient/ShareClient.java @@ -35,6 +35,7 @@ import me.mrletsplay.shareclient.util.ProjectAndPath; import me.mrletsplay.shareclient.util.ProjectRelativePath; import me.mrletsplay.shareclient.util.ShareSession; import me.mrletsplay.shareclient.util.SharedProject; +import me.mrletsplay.shareclient.util.SyncState; import me.mrletsplay.shareclient.util.listeners.ShareClientDocumentListener; import me.mrletsplay.shareclient.util.listeners.ShareClientPageListener; import me.mrletsplay.shareclient.util.listeners.ShareClientPartListener; @@ -95,7 +96,7 @@ public class ShareClient extends AbstractUIPlugin implements MessageListener, Di }); }); - ResourcesPlugin.getWorkspace().addResourceChangeListener(event -> handleChange(event.getDelta()), IResourceChangeEvent.POST_CHANGE); + ResourcesPlugin.getWorkspace().addResourceChangeListener(event -> Display.getDefault().asyncExec(() -> handleChange(event.getDelta())), IResourceChangeEvent.POST_CHANGE); // TODO: handle PRE_CLOSE events? } @@ -105,13 +106,16 @@ public class ShareClient extends AbstractUIPlugin implements MessageListener, Di IResource resource = delta.getResource(); SharedProject project = session.getSharedProject(resource.getProject()); + if(project != null) { + if(project.getSyncState() == SyncState.SYNCING) return; // Project is not done syncing, ignore local changes + switch(delta.getKind()) { case IResourceDelta.ADDED -> { if(resource instanceof IFile file) { if(file.isDerived()) return; - Path filePath = file.getFullPath().toPath(); + Path filePath = file.getLocation().toPath(); ProjectAndPath path = getProjectAndPath(file); ProjectRelativePath relativePath = new ProjectRelativePath(project.getRemoteName(), path.path()); SharedDocument document = session.getSharedDocument(relativePath); @@ -396,6 +400,8 @@ public class ShareClient extends AbstractUIPlugin implements MessageListener, Di if(!sendFullSyncOrChecksum(connection, AddressableMessage.BROADCAST_SITE_ID, en.getKey(), en.getValue(), false)) return; } + + shared.setSyncState(SyncState.SYNCED); } private boolean sendFullSyncOrChecksum(RemoteConnection connection, int siteID, ProjectRelativePath relativePath, Path filePath, boolean checksum) { @@ -436,7 +442,7 @@ public class ShareClient extends AbstractUIPlugin implements MessageListener, Di private ProjectAndPath getProjectAndPath(IFile file) { IProject project = file.getProject(); Path projectLocation = project.getLocation().toPath(); - return new ProjectAndPath(file.getProject(), projectLocation.relativize(file.getFullPath().toPath()).toString()); + return new ProjectAndPath(file.getProject(), projectLocation.relativize(file.getLocation().toPath()).toString()); } private Map getProjectFiles(SharedProject project) { diff --git a/src/main/java/me/mrletsplay/shareclient/util/SharedProject.java b/src/main/java/me/mrletsplay/shareclient/util/SharedProject.java index 97c9591..3a571fe 100644 --- a/src/main/java/me/mrletsplay/shareclient/util/SharedProject.java +++ b/src/main/java/me/mrletsplay/shareclient/util/SharedProject.java @@ -9,11 +9,13 @@ public class SharedProject { private String remoteName; private IProject local; + private SyncState syncState; public SharedProject(String remoteName, IProject local) { super(); this.remoteName = remoteName; this.local = local; + this.syncState = SyncState.SYNCING; } public String getRemoteName() { @@ -24,4 +26,12 @@ public class SharedProject { return local; } + public void setSyncState(SyncState syncState) { + this.syncState = syncState; + } + + public SyncState getSyncState() { + return syncState; + } + } diff --git a/src/main/java/me/mrletsplay/shareclient/util/SyncState.java b/src/main/java/me/mrletsplay/shareclient/util/SyncState.java new file mode 100644 index 0000000..6cb2929 --- /dev/null +++ b/src/main/java/me/mrletsplay/shareclient/util/SyncState.java @@ -0,0 +1,10 @@ +package me.mrletsplay.shareclient.util; + +public enum SyncState { + + SYNCING, + SYNCED, + OUT_OF_SYNC, + ; + +}