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);
