You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2025/04/10 15:34:00 UTC

(sling-ide-tooling) branch issue/SLING-7599 created (now 59d2612f)

This is an automated email from the ASF dual-hosted git repository.

rombert pushed a change to branch issue/SLING-7599
in repository https://gitbox.apache.org/repos/asf/sling-ide-tooling.git


      at 59d2612f SLING-7599 - Stop using String for paths

This branch includes the following new commits:

     new 59d2612f SLING-7599 - Stop using String for paths

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(sling-ide-tooling) 01/01: SLING-7599 - Stop using String for paths

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to branch issue/SLING-7599
in repository https://gitbox.apache.org/repos/asf/sling-ide-tooling.git

commit 59d2612f2cd4c3a40f0064b7bd33c701b762080e
Author: Robert Munteanu <ro...@apache.org>
AuthorDate: Thu Apr 10 12:26:52 2025 +0200

    SLING-7599 - Stop using String for paths
    
    User WorkspaceFile in SerializationManager.isSerializationFile and getSerializationFilePath
---
 .../sling/ide/eclipse/ui/nav/model/JcrNode.java    | 20 ++++----
 .../ide/serialization/SerializationManager.java    |  8 ++--
 .../content/impl/DefaultSyncCommandFactory.java    | 55 +++++++++-------------
 shared/impl-resource/pom.xml                       |  6 +++
 .../SimpleXmlSerializationManager.java             | 13 +++--
 .../SimpleXmlSerializationManagerTest.java         | 28 +++++++++--
 .../vlt/serialization/VltSerializationManager.java | 27 ++++++++---
 7 files changed, 96 insertions(+), 61 deletions(-)

diff --git a/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNode.java b/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNode.java
index c136d404..ca8c6cd0 100644
--- a/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNode.java
+++ b/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNode.java
@@ -36,6 +36,7 @@ import javax.jcr.nodetype.PropertyDefinition;
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.jackrabbit.util.ISO9075;
+import org.apache.sling.ide.eclipse.core.EclipseResources;
 import org.apache.sling.ide.eclipse.core.ProjectUtil;
 import org.apache.sling.ide.eclipse.core.ServerUtil;
 import org.apache.sling.ide.eclipse.core.internal.Activator;
@@ -47,6 +48,7 @@ import org.apache.sling.ide.log.Logger;
 import org.apache.sling.ide.serialization.SerializationKind;
 import org.apache.sling.ide.serialization.SerializationKindManager;
 import org.apache.sling.ide.serialization.SerializationManager;
+import org.apache.sling.ide.sync.content.WorkspaceFile;
 import org.apache.sling.ide.transport.NodeTypeRegistry;
 import org.apache.sling.ide.transport.Repository;
 import org.apache.sling.ide.transport.RepositoryException;
@@ -79,7 +81,6 @@ import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.dnd.TransferData;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IActionFilter;
 import org.eclipse.ui.IContributorResourceAdapter;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.actions.CopyFilesAndFoldersOperation;
@@ -374,7 +375,7 @@ public class JcrNode implements IAdaptable {
 					}
 					List<JcrNode> newNodes = new LinkedList<>();
                     for (Iterator<IResource> it = membersList.iterator(); it.hasNext();) {
-						IResource iResource = (IResource) it.next();
+						IResource iResource = it.next();
 						JcrNode node;
 						if (DirNode.isDirNode(iResource)) {
 							node = new DirNode(this, (Element)null, iResource);
@@ -408,9 +409,12 @@ public class JcrNode implements IAdaptable {
     }
 
     private boolean isVaultFile(IResource iResource) {
+        if ( ! (iResource instanceof IFile) ) {
+            return false;
+        }
 
         return Activator.getDefault().getSerializationManager()
-                .isSerializationFile(iResource.getLocation().toOSString());
+                .isSerializationFile((WorkspaceFile) EclipseResources.create(iResource));
 	}
     
     protected boolean childShouldNotBeShown(IResource resource) {
@@ -579,13 +583,13 @@ public class JcrNode implements IAdaptable {
 			return null;//properties;
 		} else if (adapter == IFile.class) {
 			if (resource instanceof IFile) {
-				return (IFile)resource;
+				return resource;
 			} else {
 				return null;
 			}
 		} else if ( adapter == IFolder.class) {
 		    if ( resource instanceof IFolder ) {
-		        return (IFolder) resource;
+		        return resource;
 		    } else {
 		        return null;
 		    }
@@ -786,7 +790,7 @@ public class JcrNode implements IAdaptable {
         try {
             skm.init(repo);
             //TODO: mixins not yet supported
-            return skm.getSerializationKind(nodeType, new ArrayList<String>());
+            return skm.getSerializationKind(nodeType, new ArrayList<>());
         } catch (RepositoryException e) {
             e.printStackTrace();
             return getFallbackSerializationKind(nodeType);
@@ -836,7 +840,7 @@ public class JcrNode implements IAdaptable {
 	                // trigger a publish, as folder creation is not propagated to 
 	                // the SlingLaunchpadBehavior otherwise
 	                //TODO: make configurable? Fix in Eclipse/WST?
-	                ServerUtil.triggerIncrementalBuild((IFolder)resource, null);
+	                ServerUtil.triggerIncrementalBuild(resource, null);
 	            }
 	        } catch (CoreException e) {
 	            Activator.getDefault().getPluginLogger().error("Error creating child "+childNodeName+": "+e, e);
@@ -1378,7 +1382,7 @@ public class JcrNode implements IAdaptable {
         }
         
         IFolder contentSyncRoot = ProjectUtil.getSyncDirectory(getProject());
-        IFile file = (IFile) u.file;
+        IFile file = u.file;
         try (InputStream contents = file.getContents() ){
             String resourceLocation = file.getFullPath().makeRelativeTo(contentSyncRoot.getFullPath())
                     .toPortableString();
diff --git a/shared/api/src/main/java/org/apache/sling/ide/serialization/SerializationManager.java b/shared/api/src/main/java/org/apache/sling/ide/serialization/SerializationManager.java
index 3f56aec2..0af1b545 100644
--- a/shared/api/src/main/java/org/apache/sling/ide/serialization/SerializationManager.java
+++ b/shared/api/src/main/java/org/apache/sling/ide/serialization/SerializationManager.java
@@ -20,6 +20,8 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.apache.sling.ide.sync.content.WorkspaceFile;
+import org.apache.sling.ide.sync.content.WorkspaceResource;
 import org.apache.sling.ide.transport.Repository;
 import org.apache.sling.ide.transport.ResourceProxy;
 
@@ -31,7 +33,7 @@ public interface SerializationManager {
      * @param filePath the filesystem path
      * @return
      */
-    boolean isSerializationFile(String filePath);
+    boolean isSerializationFile(WorkspaceFile file);
 
     /**
      * @param serializationFilePath the full OS path to the serialization file
@@ -40,11 +42,11 @@ public interface SerializationManager {
     String getBaseResourcePath(String serializationFilePath);
 
     /**
-     * @param baseFilePath the filesystem path of the resource
+     * @param baseResource the resource to get the serialisation path for
      * @param serializationKind
      * @return
      */
-    String getSerializationFilePath(String baseFilePath, SerializationKind serializationKind);
+    WorkspaceFile getSerializationFilePath(WorkspaceResource baseResource, SerializationKind serializationKind);
 
     String getRepositoryPath(String osPath);
 
diff --git a/shared/api/src/main/java/org/apache/sling/ide/sync/content/impl/DefaultSyncCommandFactory.java b/shared/api/src/main/java/org/apache/sling/ide/sync/content/impl/DefaultSyncCommandFactory.java
index d7de2c4b..f11329a4 100644
--- a/shared/api/src/main/java/org/apache/sling/ide/sync/content/impl/DefaultSyncCommandFactory.java
+++ b/shared/api/src/main/java/org/apache/sling/ide/sync/content/impl/DefaultSyncCommandFactory.java
@@ -19,8 +19,6 @@ package org.apache.sling.ide.sync.content.impl;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
@@ -37,7 +35,6 @@ import org.apache.sling.ide.sync.content.SyncCommandFactory;
 import org.apache.sling.ide.sync.content.WorkspaceDirectory;
 import org.apache.sling.ide.sync.content.WorkspaceFile;
 import org.apache.sling.ide.sync.content.WorkspacePath;
-import org.apache.sling.ide.sync.content.WorkspacePaths;
 import org.apache.sling.ide.sync.content.WorkspaceResource;
 import org.apache.sling.ide.transport.Command;
 import org.apache.sling.ide.transport.CommandContext;
@@ -93,12 +90,10 @@ public class DefaultSyncCommandFactory implements SyncCommandFactory {
         
         // verify whether a resource being deleted does not signal that the content structure
         // was rearranged under a covering parent aggregate
-        Path serializationFilePath = Paths.get(serializationManager.getSerializationFilePath(repositoryPath,
-                SerializationKind.FOLDER));
+        WorkspaceFile serializationFile = serializationManager.getSerializationFilePath(resource,
+                SerializationKind.FOLDER);
         
-        WorkspacePath serializationFileLocalPath = resource.getProject().getSyncDirectory().getLocalPath().append(WorkspacePaths.fromOsPath(serializationFilePath));
-
-        ResourceProxy coveringParentData = findSerializationDataFromCoveringParent(resource, repositoryPath, serializationFileLocalPath);
+        ResourceProxy coveringParentData = findSerializationDataFromCoveringParent(resource, repositoryPath, serializationFile.getLocalPath());
         if (coveringParentData != null) {
             logger.trace("Found covering resource data ( repository path = {0} ) for resource at {1},  skipping deletion and performing an update instead",
                             coveringParentData.getPath(), resource.getLocalPath());
@@ -134,13 +129,9 @@ public class DefaultSyncCommandFactory implements SyncCommandFactory {
        logger.trace("Found plain nt:folder candidate at {0}, trying to find a covering resource for it",
 localFile);
        
-       WorkspacePath orig = serializationFilePath;
 
        WorkspacePath syncDirPath = localFile.getProject().getSyncDirectory().getLocalPath();
-       serializationFilePath = localFile.getProject().getLocalPath().relativize(serializationFilePath);
-       if ( serializationFilePath == null )
-           throw new RuntimeException("Unable to get relative path from " + localFile.getProject().getLocalPath() + " to " + orig);
-       serializationFilePath = serializationFilePath.absolute();
+       WorkspacePath projectPath = localFile.getProject().getLocalPath();
        
        while (!syncDirPath.equals(serializationFilePath)) {
            serializationFilePath = serializationFilePath.getParent();
@@ -148,8 +139,9 @@ localFile);
            if ( serializationFilePath.asPortableString().lastIndexOf('/') == 0 ) {
                break;
            }
-           WorkspaceDirectory folderWithPossibleSerializationFile = localFile.getProject().getDirectory(serializationFilePath);
            
+           WorkspacePath projectRelativePath = projectPath.relativize(serializationFilePath);
+           WorkspaceDirectory folderWithPossibleSerializationFile = localFile.getProject().getDirectory(projectRelativePath);
            
            if (!folderWithPossibleSerializationFile.exists()) {
                logger.trace("No folder found at {0}, moving up to the next level", serializationFilePath);
@@ -158,20 +150,13 @@ localFile);
 
            // it's safe to use a specific SerializationKind since this scenario is only valid for METADATA_PARTIAL
            // coverage
-           String possibleSerializationFilePath = serializationManager.getSerializationFilePath(
-                   folderWithPossibleSerializationFile.getOSPath().toString(),
+           WorkspaceFile possibleSerializationFile = serializationManager.getSerializationFilePath(
+                   folderWithPossibleSerializationFile,
                    SerializationKind.METADATA_PARTIAL);
 
-           logger.trace("Looking for serialization data in {0}", possibleSerializationFilePath);
-           if (serializationManager.isSerializationFile(possibleSerializationFilePath)) {
-               
-               Path parentFileSerializationOSPath = localFile.getProject().getSyncDirectory().getOSPath().
-                       relativize(Paths.get(possibleSerializationFilePath));
-
-               WorkspacePath parentSerializationFilePath = new WorkspacePath(parentFileSerializationOSPath.toString())
-                       .absolute();
+           logger.trace("Looking for serialization data in {0}", possibleSerializationFile);
+           if (serializationManager.isSerializationFile(possibleSerializationFile)) {
                
-               WorkspaceFile possibleSerializationFile = localFile.getProject().getSyncDirectory().getFile(parentSerializationFilePath);
                if (!possibleSerializationFile.exists()) {
                    logger.trace("Potential serialization data file {0} does not exist, moving up to the next level",
                            possibleSerializationFile.getLocalPath());
@@ -180,8 +165,10 @@ localFile);
                
                ResourceProxy serializationData;
                try (InputStream contents = possibleSerializationFile.getContents()) {
+                   
+                   String serialisationFilePath = possibleSerializationFile.getPathRelativeToSyncDir().absolute().asPortableString();
                    serializationData = serializationManager.readSerializationData(
-                           parentSerializationFilePath.asPortableString(), contents);
+                           serialisationFilePath, contents);
                }
 
                String repositoryPath = serializationManager.getRepositoryPath(resourceLocation);
@@ -190,7 +177,7 @@ localFile);
 
                logger.trace(
                        "Found possible serialization data at {0}. Resource :{1} ; our resource: {2}. Covered: {3}",
-                       parentSerializationFilePath, potentialPath, repositoryPath, covered);
+                       possibleSerializationFile, potentialPath, repositoryPath, covered);
                // note what we don't need to normalize the children here since this resource's data is covered by
                // another resource
                if (covered) {
@@ -217,7 +204,8 @@ localFile);
        return info;
    }
    
-   public ResourceAndInfo buildResourceAndInfo(WorkspaceResource resource, Repository repository) throws IOException {
+   @Override
+public ResourceAndInfo buildResourceAndInfo(WorkspaceResource resource, Repository repository) throws IOException {
 
        if ( !resource.exists() ) {
            return null;
@@ -244,7 +232,7 @@ localFile);
 
        ResourceProxy resourceProxy = null;
 
-       if (serializationManager.isSerializationFile(resource.getOSPath().toString())) {
+       if (resource instanceof WorkspaceFile && serializationManager.isSerializationFile((WorkspaceFile) resource)) {
            WorkspaceFile file = (WorkspaceFile) resource;
            try (InputStream contents = file.getContents()) {
                String resourceLocation = file.getPathRelativeToSyncDir().asPortableString();
@@ -279,8 +267,8 @@ localFile);
                WorkspaceDirectory folder = (WorkspaceDirectory) resource;
                WorkspaceResource contentXml = folder.getFile(new WorkspacePath(".content.xml"));
                // .dir serialization holder ; nothing to process here, the .content.xml will trigger the actual work
-               if (contentXml.exists()
-                       && serializationManager.isSerializationFile(contentXml.getOSPath().toString())) {
+               if (contentXml.exists() && (contentXml instanceof WorkspaceFile)
+                       && serializationManager.isSerializationFile((WorkspaceFile) contentXml)) {
                    return null;
                }
            }
@@ -324,9 +312,8 @@ localFile);
        }
 
        String resourceLocation = changedResource.getPathRelativeToSyncDir().asPortableString();
-       String serializationFilePath = serializationManager.getSerializationFilePath(
-               resourceLocation, serializationKind);
-       WorkspaceFile serializationResource = changedResource.getProject().getSyncDirectory().getFile(new WorkspacePath(serializationFilePath));
+       WorkspaceFile serializationResource = serializationManager.getSerializationFilePath(
+               changedResource, serializationKind);
 
        if (!serializationResource.exists() && changedResource instanceof WorkspaceDirectory) {
            ResourceProxy dataFromCoveringParent = findSerializationDataFromCoveringParent(changedResource,
diff --git a/shared/impl-resource/pom.xml b/shared/impl-resource/pom.xml
index 1db21da6..3850a09c 100644
--- a/shared/impl-resource/pom.xml
+++ b/shared/impl-resource/pom.xml
@@ -69,5 +69,11 @@
             <version>1.4</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.sling.ide</groupId>
+            <artifactId>org.apache.sling.ide.sync-fs</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManager.java b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManager.java
index eefe97dd..0314d3b0 100644
--- a/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManager.java
+++ b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManager.java
@@ -42,6 +42,10 @@ import org.apache.sling.ide.serialization.SerializationDataBuilder;
 import org.apache.sling.ide.serialization.SerializationException;
 import org.apache.sling.ide.serialization.SerializationKind;
 import org.apache.sling.ide.serialization.SerializationManager;
+import org.apache.sling.ide.sync.content.WorkspaceDirectory;
+import org.apache.sling.ide.sync.content.WorkspaceFile;
+import org.apache.sling.ide.sync.content.WorkspacePath;
+import org.apache.sling.ide.sync.content.WorkspaceResource;
 import org.apache.sling.ide.transport.Repository;
 import org.apache.sling.ide.transport.ResourceProxy;
 import org.osgi.service.component.annotations.Component;
@@ -61,13 +65,13 @@ public class SimpleXmlSerializationManager implements SerializationManager, Seri
     private static final String CONTENT_XML = ".content.xml";
 
     @Override
-    public boolean isSerializationFile(String filePath) {
-        return filePath.endsWith(CONTENT_XML);
+    public boolean isSerializationFile(WorkspaceFile file) {
+        return file.getLocalPath().getName().equals(CONTENT_XML);
     }
 
     @Override
-    public String getSerializationFilePath(String baseFilePath, SerializationKind serializationKind) {
-        return baseFilePath + File.separatorChar + CONTENT_XML;
+    public WorkspaceFile getSerializationFilePath(WorkspaceResource resource, SerializationKind serializationKind) {
+        return ( (WorkspaceDirectory) resource).getFile(new WorkspacePath(CONTENT_XML));
     }
 
     @Override
@@ -187,6 +191,7 @@ public class SimpleXmlSerializationManager implements SerializationManager, Seri
     /* (non-Javadoc)
      * @see org.apache.sling.ide.serialization.SerializationManager#destroy()
      */
+    @Override
     public void destroy() {
     }
 
diff --git a/shared/impl-resource/src/test/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.java b/shared/impl-resource/src/test/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.java
index a3563f6c..a403f338 100644
--- a/shared/impl-resource/src/test/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.java
+++ b/shared/impl-resource/src/test/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.java
@@ -25,12 +25,18 @@ import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.file.Paths;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.sling.ide.content.sync.fs.impl.FSWorkspaceDirectory;
+import org.apache.sling.ide.content.sync.fs.impl.FSWorkspaceFile;
+import org.apache.sling.ide.content.sync.fs.impl.FSWorkspaceProject;
 import org.apache.sling.ide.serialization.SerializationData;
 import org.apache.sling.ide.serialization.SerializationException;
 import org.apache.sling.ide.serialization.SerializationKind;
+import org.apache.sling.ide.sync.content.WorkspaceDirectory;
+import org.apache.sling.ide.sync.content.WorkspaceFile;
 import org.apache.sling.ide.transport.ResourceProxy;
 import org.custommonkey.xmlunit.XMLUnit;
 import org.junit.Before;
@@ -57,7 +63,7 @@ public class SimpleXmlSerializationManagerTest {
     public void emptySerializedData() throws SerializationException, SAXException {
 
         SerializationData serializationData = sm.newBuilder(null, null).buildSerializationData(null,
-                newResourceWithProperties(new HashMap<String, Object>()));
+                newResourceWithProperties(new HashMap<>()));
 
         assertThat(serializationData, is(nullValue()));
     }
@@ -137,23 +143,23 @@ public class SimpleXmlSerializationManagerTest {
     @Test
     public void serializationFileMatches() {
 
-        assertThat(sm.isSerializationFile(".content.xml"), is(true));
+        assertThat(sm.isSerializationFile(fileMustExist(".content.xml")), is(true));
 
     }
 
     @Test
     public void serializationFileDoesNotMatch() {
 
-        assertThat(sm.isSerializationFile("content.json"), is(false));
+        assertThat(sm.isSerializationFile(fileMustExist("content.json")), is(false));
 
     }
 
     @Test
     public void serializationFileLocation() {
         
-        String serializationFilePath = sm.getSerializationFilePath("jcr_root", SerializationKind.FOLDER);
+        WorkspaceFile serializationFilePath = sm.getSerializationFilePath(directoryMustExist("content"), SerializationKind.FOLDER);
         
-        assertThat(serializationFilePath, is("jcr_root" + File.separatorChar + ".content.xml"));
+        assertThat(serializationFilePath.getPathRelativeToSyncDir().absolute().asPortableString(), is("/content/.content.xml"));
     }
 
     @Test
@@ -170,4 +176,16 @@ public class SimpleXmlSerializationManagerTest {
         assertThat(basePath, is(""));
     }
     
+    private WorkspaceFile fileMustExist(String fileName) {
+        File ioFile = Paths.get("root", "project", "jcr_root", fileName).toFile();
+        FSWorkspaceProject project = new FSWorkspaceProject(ioFile.getParentFile().getParentFile(), ioFile.getParentFile().getParentFile(), null);
+        return new FSWorkspaceFile(ioFile, project);
+    }
+    
+    private WorkspaceDirectory directoryMustExist(String dirName) {
+        File ioFile = Paths.get("root", "project", "jcr_root", dirName).toFile();
+        FSWorkspaceProject project = new FSWorkspaceProject(ioFile.getParentFile().getParentFile(), ioFile.getParentFile().getParentFile(), null);
+        return new FSWorkspaceDirectory(ioFile, project);
+    }
+    
 }
diff --git a/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java
index 2186fffd..cf0a3c34 100644
--- a/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java
+++ b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java
@@ -44,6 +44,11 @@ import org.apache.sling.ide.serialization.SerializationDataBuilder;
 import org.apache.sling.ide.serialization.SerializationException;
 import org.apache.sling.ide.serialization.SerializationKind;
 import org.apache.sling.ide.serialization.SerializationManager;
+import org.apache.sling.ide.sync.content.WorkspaceDirectory;
+import org.apache.sling.ide.sync.content.WorkspaceFile;
+import org.apache.sling.ide.sync.content.WorkspacePath;
+import org.apache.sling.ide.sync.content.WorkspaceProject;
+import org.apache.sling.ide.sync.content.WorkspaceResource;
 import org.apache.sling.ide.transport.ResourceProxy;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
@@ -103,9 +108,8 @@ public class VltSerializationManager implements SerializationManager {
     }
 
     @Override
-    public boolean isSerializationFile(String filePath) {
+    public boolean isSerializationFile(WorkspaceFile file) {
         
-        File file = new File(filePath);
         String fileName = file.getName();
         if (fileName.equals(Constants.DOT_CONTENT_XML)) {
             return true;
@@ -118,7 +122,7 @@ public class VltSerializationManager implements SerializationManager {
         // TODO - refrain from doing I/O here
         // TODO - copied from TransactionImpl
         
-        try (InputStream in = new BufferedInputStream(new FileInputStream(file))) {
+        try (InputStream in = file.getContents()) {
             return DocViewParser.isDocView(new InputSource(in));
         } catch (IOException e) {
             throw new RuntimeException(e);
@@ -163,16 +167,25 @@ public class VltSerializationManager implements SerializationManager {
     }
 
     @Override
-    public String getSerializationFilePath(String baseFilePath, SerializationKind serializationKind) {
+    public WorkspaceFile getSerializationFilePath(WorkspaceResource resource, SerializationKind serializationKind) {
 
         switch (serializationKind) {
             case FOLDER:
             case METADATA_PARTIAL:
-                return baseFilePath + File.separatorChar + Constants.DOT_CONTENT_XML;
+                // normally we would assume that the resource is a WorkspaceDirectory. However, the API contract is quite
+                // loose and we normally receive WorkspaceFile instances as well. So we rebuild an equivalent WorkspaceDirectory
+                // object to allow the logic to work in all cases.
+                WorkspacePath path = resource.getLocalPath();
+                WorkspacePath projectRelativePath = resource.getProject().getLocalPath().relativize(path);
+                return resource.getProject().getDirectory(projectRelativePath)
+                        .getFile(new WorkspacePath(Constants.DOT_CONTENT_XML));
             case METADATA_FULL:
-                return baseFilePath;
+                return (WorkspaceFile) resource;
             case FILE:
-                return baseFilePath + ".dir" + File.separatorChar + Constants.DOT_CONTENT_XML;
+                WorkspaceProject project = resource.getProject();
+                WorkspaceDirectory parentDir = project.getDirectory(resource.getLocalPath().getParent());
+                return parentDir.getDirectory(new WorkspacePath(resource.getName() + ".dir"))
+                        .getFile(new WorkspacePath(Constants.DOT_CONTENT_XML));
         }
 
         throw new IllegalArgumentException("Unsupported serialization kind " + serializationKind);