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


Reply via email to