Author: rombert Date: Fri Sep 13 13:33:44 2013 New Revision: 1522921 URL: http://svn.apache.org/r1522921 Log: SLING-2989 - [Tooling] integrate with vlt once available
Take into account more vlt-supplied information about the serialization format. Added: sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationData.java (with props) Modified: sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportRepositoryContentAction.java sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManager.java sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/META-INF/MANIFEST.MF sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java Added: sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationData.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationData.java?rev=1522921&view=auto ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationData.java (added) +++ sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationData.java Fri Sep 13 13:33:44 2013 @@ -0,0 +1,47 @@ +package org.apache.sling.ide.serialization; +public class SerializationData { + + private final byte[] contents; + private final String nameHint; + private final SerializationKind serializationKind; + private final String fileOrFolderNameHint; + + public static SerializationData empty(String fileOrFolderNameHint, SerializationKind serializationKind) { + return new SerializationData(fileOrFolderNameHint, null, null, serializationKind); + } + + public SerializationData(String fileOrFolderNameHint, String nameHint, byte[] contents, + SerializationKind serializationKind) { + this.fileOrFolderNameHint = fileOrFolderNameHint; + this.contents = contents; + this.nameHint = nameHint; + this.serializationKind = serializationKind; + } + + public String getFileOrFolderNameHint() { + return fileOrFolderNameHint; + } + + public byte[] getContents() { + return contents; + } + + public String getNameHint() { + return nameHint; + } + + public SerializationKind getSerializationKind() { + return serializationKind; + } + + public boolean hasContents() { + + return contents != null && contents.length > 0; + } + + @Override + public String toString() { + return "[SerializationData# fileOrFolderNameHint: " + fileOrFolderNameHint + ", nameHint: " + nameHint + + ", serializationKind: " + serializationKind + ", contents?" + (hasContents()) + "]"; + } +} \ No newline at end of file Propchange: sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationData.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationData.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Rev URL Modified: sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java?rev=1522921&r1=1522920&r2=1522921&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/serialization/SerializationManager.java Fri Sep 13 13:33:44 2013 @@ -37,10 +37,8 @@ public interface SerializationManager { String getSerializationFilePath(String baseFilePath); - String buildSerializationData(File contentSyncRoot, ResourceProxy resource, RepositoryInfo repositoryInfo) + SerializationData buildSerializationData(File contentSyncRoot, ResourceProxy resource, RepositoryInfo repositoryInfo) throws SerializationException; Map<String, Object> readSerializationData(InputStream source) throws IOException; - - SerializationKind getSerializationKind(String primaryType); } Modified: sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportRepositoryContentAction.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportRepositoryContentAction.java?rev=1522921&r1=1522920&r2=1522921&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportRepositoryContentAction.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportRepositoryContentAction.java Fri Sep 13 13:33:44 2013 @@ -28,6 +28,7 @@ import org.apache.sling.ide.eclipse.core import org.apache.sling.ide.filter.Filter; import org.apache.sling.ide.filter.FilterLocator; import org.apache.sling.ide.filter.FilterResult; +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.serialization.SerializationKindManager; @@ -37,7 +38,6 @@ import org.apache.sling.ide.transport.Re import org.apache.sling.ide.transport.RepositoryException; import org.apache.sling.ide.transport.ResourceProxy; import org.apache.sling.ide.transport.Result; -import org.apache.sling.ide.util.PathUtil; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; @@ -45,7 +45,6 @@ import org.eclipse.core.resources.IResou import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.Path; import org.eclipse.wst.server.core.IServer; // intentionally does not implement IRunnableWithProgress to cut dependency on JFace @@ -188,75 +187,47 @@ public class ImportRepositoryContentActi + projectRelativePath + ")"); ResourceProxy resource = executeCommand(repository.newListChildrenNodeCommand(path)); - String primaryType = (String) resource.getProperties().get(Repository.JCR_PRIMARY_TYPE); - - SerializationKind serializationKind = serializationManager.getSerializationKind(primaryType); - System.out.println(primaryType + " -> " + serializationKind); // TODO we should know all node types for which to create files and folders + SerializationData serializationData = serializationManager.buildSerializationData(contentSyncRoot, resource, + repository.getRepositoryInfo()); + System.out.println("For resource at path " + resource.getPath() + " got serialization data " + + serializationData); - String serializationPath = serializationManager.getSerializationFilePath(path); - switch (serializationKind) { - case FILE: { - importFile(repository, path, project, projectRelativePath); + if (serializationData == null) { + System.err.println("Skipping resource at " + resource.getPath() + " since we got no serialization data."); + return; + } + + IPath fileOrFolderPath = projectRelativePath.append(serializationData.getFileOrFolderNameHint()); - ResourceProxy resourceToSerialize = executeCommand(repository - .newGetNodeContentCommand(path)); + switch (serializationData.getSerializationKind()) { + case FILE: { + byte[] contents = executeCommand(repository.newGetNodeCommand(path)); + importFile(project, fileOrFolderPath, contents); - String out = serializationManager.buildSerializationData(contentSyncRoot, - resourceToSerialize, repository.getRepositoryInfo()); - if (out != null) { - IPath directoryPath = projectRelativePath.append(path + ".dir"); + if (serializationData.hasContents()) { + // TODO - should we abstract out .dir serialization? + IPath directoryPath = fileOrFolderPath.addFileExtension("dir"); createFolder(project, directoryPath); - // TODO remove hardcoding of .content.xml name here - createFile(project, directoryPath.append(".content.xml"), out.getBytes("UTF-8")); + createFile(project, directoryPath.append(serializationData.getNameHint()), + serializationData.getContents()); } - break; } case FOLDER: case METADATA_PARTIAL: { - createFolder(project, projectRelativePath.append(path)); - ResourceProxy resourceToSerialize = executeCommand(repository - .newGetNodeContentCommand(path)); - - String out = serializationManager.buildSerializationData(contentSyncRoot, - resourceToSerialize, repository.getRepositoryInfo()); - if (out != null) { - createFile(project, projectRelativePath.append(serializationPath), - out.getBytes("UTF-8")); + createFolder(project, fileOrFolderPath); + if (serializationData.hasContents()) { + createFile(project, fileOrFolderPath.append(serializationData.getNameHint()), + serializationData.getContents()); } break; } case METADATA_FULL: { - ResourceProxy resourceToSerialize = executeCommand(repository - .newGetNodeContentCommand(path)); - - String out = serializationManager.buildSerializationData(contentSyncRoot, - resourceToSerialize, repository.getRepositoryInfo()); - - if (out != null) { - // TODO - picking the base name based on serialization kind is not supported by the - // API... - // so for now this is one big hack to have vlt-compatible checkouts - IPath serializationPathPath = Path.fromPortableString(serializationPath); - if (!resourceToSerialize.getPath().equals("/") - && serializationPath.endsWith(".content.xml")) { - String name = PathUtil.getName(path); - if (name.indexOf(':') != -1) { - name = '_' + name.replace(':', '_'); - } - name += ".xml"; - serializationPath = serializationPath.replace(".content.xml", name); - - // some of the logic should be reused from AbstractArtifact - serializationPathPath = Path.fromPortableString(serializationPath) - .removeFirstSegments(1); - } - - createFile(project, projectRelativePath.append(serializationPathPath), - out.getBytes("UTF-8")); + if (serializationData.hasContents()) { + createFile(project, fileOrFolderPath, serializationData.getContents()); } break; } @@ -264,7 +235,7 @@ public class ImportRepositoryContentActi System.out.println("Children: " + resource.getChildren()); - if (serializationKind == SerializationKind.METADATA_FULL) { + if (serializationData.getSerializationKind() == SerializationKind.METADATA_FULL) { return; } @@ -293,13 +264,10 @@ public class ImportRepositoryContentActi return result.get(); } - private void importFile(Repository repository, String path, IProject project, IPath destinationPath) - throws RepositoryException, CoreException { - - System.out.println("importFile: " + path + " -> " + destinationPath); + private void importFile(IProject project, IPath destinationPath, byte[] content) + throws CoreException { - byte[] node = executeCommand(repository.newGetNodeCommand(path)); - createFile(project, destinationPath.append(path), node); + createFile(project, destinationPath, content); } private void createFolder(IProject project, IPath destinationPath) throws CoreException { Modified: sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManager.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManager.java?rev=1522921&r1=1522920&r2=1522921&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManager.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-resource/src/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManager.java Fri Sep 13 13:33:44 2013 @@ -16,10 +16,10 @@ */ package org.apache.sling.ide.impl.resource.serialization; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.io.StringWriter; import java.util.HashMap; import java.util.Map; @@ -34,8 +34,8 @@ import javax.xml.transform.sax.SAXTransf import javax.xml.transform.sax.TransformerHandler; import javax.xml.transform.stream.StreamResult; +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.serialization.SerializationManager; import org.apache.sling.ide.transport.RepositoryInfo; import org.apache.sling.ide.transport.ResourceProxy; @@ -100,7 +100,8 @@ public class SimpleXmlSerializationManag } @Override - public String buildSerializationData(File contentSyncRoot, ResourceProxy resource, RepositoryInfo repositoryInfo) + public SerializationData buildSerializationData(File contentSyncRoot, ResourceProxy resource, + RepositoryInfo repositoryInfo) throws SerializationException { if (resource == null) { @@ -116,8 +117,8 @@ public class SimpleXmlSerializationManag try { SAXTransformerFactory f = (SAXTransformerFactory) SAXTransformerFactory.newInstance(); - StringWriter sw = new StringWriter(); - StreamResult sr = new StreamResult(sw); + ByteArrayOutputStream result = new ByteArrayOutputStream(); + StreamResult sr = new StreamResult(result); TransformerHandler handler = f.newTransformerHandler(); Transformer t = handler.getTransformer(); @@ -145,7 +146,8 @@ public class SimpleXmlSerializationManag endElement(handler, TAG_RESOURCE); handler.endDocument(); - return sw.toString(); + // TODO - also add the serialization type + return new SerializationData(resource.getPath(), CONTENT_XML, result.toByteArray(), null); } catch (TransformerConfigurationException e) { // TODO proper exception handling throw new RuntimeException(e); @@ -180,12 +182,6 @@ public class SimpleXmlSerializationManag public void init(org.apache.sling.ide.transport.Repository repository, File contentSyncRoot) throws SerializationException { } - @Override - public SerializationKind getSerializationKind(String primaryType) { - // TODO - implement - throw new UnsupportedOperationException("Not implemented"); - } - static class SerializationDataHandler extends DefaultHandler { private Map<String, Object> result; private String propertyName; Modified: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/META-INF/MANIFEST.MF URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/META-INF/MANIFEST.MF?rev=1522921&r1=1522920&r2=1522921&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/META-INF/MANIFEST.MF (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/META-INF/MANIFEST.MF Fri Sep 13 13:33:44 2013 @@ -19,5 +19,6 @@ Import-Package: javax.jcr, org.apache.sling.ide.filter, org.apache.sling.ide.serialization, org.apache.sling.ide.transport, + org.apache.sling.ide.util, org.osgi.service.event;version="1.3.0" Service-Component: OSGI-INF/*.xml Modified: sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java URL: http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java?rev=1522921&r1=1522920&r2=1522921&view=diff ============================================================================== --- sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java (original) +++ sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java Fri Sep 13 13:33:44 2013 @@ -16,6 +16,8 @@ */ package org.apache.sling.ide.impl.vlt.serialization; +import static org.apache.sling.ide.util.PathUtil.getName; + import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; @@ -54,6 +56,7 @@ import org.apache.jackrabbit.vault.util. import org.apache.jackrabbit.vault.util.RepositoryProvider; import org.apache.sling.ide.impl.vlt.RepositoryUtils; import org.apache.sling.ide.impl.vlt.VaultFsLocator; +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.serialization.SerializationKindManager; @@ -171,11 +174,12 @@ public class VltSerializationManager imp this.fsLocator = null; } - // TODO - the return type could look like (byte[] contents, String nameHint, SerializationKind sk) - @Override - public String buildSerializationData(File contentSyncRoot, ResourceProxy resource, RepositoryInfo repositoryInfo) - throws SerializationException { + public SerializationData buildSerializationData(File contentSyncRoot, ResourceProxy resource, + RepositoryInfo repositoryInfo) throws SerializationException { + + // TODO - there is a small mismatch here since we're doing remote calls to the repository + // but taking a resourceProxy - not sure if we'll run into problems down the road or not // TODO - there might be a performance problem with getting the session on-demand each time // the resolution might be to have a SerializationManager instance kept per 'transaction' @@ -193,24 +197,41 @@ public class VltSerializationManager imp VaultFileSystem fs = fsLocator.getFileSystem(address, contentSyncRoot, session); VaultFile vaultFile = fs.getFile(resource.getPath()); + String platformPath = resource.getPath(); if (vaultFile == null) { // TODO - not sure why we need to try both ... not a performance impact but ugly nonetheless - String platformPath = PlatformNameFormat.getPlatformPath(resource.getPath()) + ".xml"; + platformPath = PlatformNameFormat.getPlatformPath(resource.getPath()) + ".xml"; vaultFile = fs.getFile(platformPath); if (vaultFile == null) { - // TODO proper logging ; discover if this is expected or not + platformPath = PlatformNameFormat.getPlatformPath(resource.getPath()); + vaultFile = fs.getFile(platformPath); + } + + if (vaultFile == null) { + // TODO proper logging ; discover if this is expected or not and fail hard if it's not System.err.println("No vaultFile at path " + resource.getPath()); return null; } } + String nameHint = getName(platformPath); + String fileOrFolderPathHint = vaultFile.getPath(); + Aggregate aggregate = vaultFile.getAggregate(); if (aggregate == null) throw new IllegalArgumentException("No aggregate found for path " + resource.getPath()); + SerializationKind serializationKind = skm.getSerializationKind(aggregate.getNode().getPrimaryNodeType() + .getName()); + + if (resource.getPath().equals("/") || serializationKind == SerializationKind.METADATA_PARTIAL + || serializationKind == SerializationKind.FILE || serializationKind == SerializationKind.FOLDER) { + nameHint = Constants.DOT_CONTENT_XML; + } + Aggregator aggregator = fs.getAggregateManager().getAggregator(aggregate.getNode(), null); if (aggregator instanceof FileAggregator) { // TODO - copy-pasted from FileAggregator, and really does not belong here... @@ -234,13 +255,13 @@ public class VltSerializationManager imp boolean needsDir = !MimeTypes.matches(aggregate.getNode().getName(), mimeType, MimeTypes.APPLICATION_OCTET_STREAM); if (!needsDir) { - return null; + return SerializationData.empty(fileOrFolderPathHint, serializationKind); } } else if (aggregator instanceof GenericAggregator) { // TODO - copy-pasted from GenericAggregator if (aggregate.getNode().getPrimaryNodeType().getName().equals("nt:folder") && aggregate.getNode().getMixinNodeTypes().length == 0) { - return null; + return SerializationData.empty(fileOrFolderPathHint, serializationKind); } } @@ -249,10 +270,9 @@ public class VltSerializationManager imp ByteArrayOutputStream out = new ByteArrayOutputStream(); s.writeContent(out); - String stringResult = out.toString("UTF-8"); - if (stringResult.isEmpty()) - return null; - return stringResult; + byte[] result = out.toByteArray(); + + return new SerializationData(fileOrFolderPathHint, nameHint, result, serializationKind); } catch (RepositoryException e) { throw new SerializationException(e); @@ -290,9 +310,4 @@ public class VltSerializationManager imp throw new IOException(e); } } - - @Override - public SerializationKind getSerializationKind(String primaryType) { - return skm.getSerializationKind(primaryType); - } }