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 <[email protected]>
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);

Reply via email to