Author: rombert
Date: Thu Sep 12 15:55:57 2013
New Revision: 1522636

URL: http://svn.apache.org/r1522636
Log:
SLING-2989 - [Tooling] integrate with vlt once available

Follow vlt serialization rules closers, particularly in terms for full
vs partial coverage.

Added:
    
sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/SerializationKindManager.java
   (with props)
Modified:
    
sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/util/PathUtil.java
    
sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizard.java
    
sling/branches/tooling-ide-vlt/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java
    sling/branches/tooling-ide-vlt/tooling/ide/vlt-wrapper/META-INF/MANIFEST.MF

Modified: 
sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/util/PathUtil.java
URL: 
http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/util/PathUtil.java?rev=1522636&r1=1522635&r2=1522636&view=diff
==============================================================================
--- 
sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/util/PathUtil.java
 (original)
+++ 
sling/branches/tooling-ide-vlt/tooling/ide/api/src/org/apache/sling/ide/util/PathUtil.java
 Thu Sep 12 15:55:57 2013
@@ -32,4 +32,9 @@ public class PathUtil {
 
         throw new AssertionError("unreachable");
     }
+
+    public static String getName(String path) {
+
+        return path.substring(path.lastIndexOf('/') + 1);
+    }
 }

Modified: 
sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizard.java
URL: 
http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizard.java?rev=1522636&r1=1522635&r2=1522636&view=diff
==============================================================================
--- 
sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizard.java
 (original)
+++ 
sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizard.java
 Thu Sep 12 15:55:57 2013
@@ -34,6 +34,7 @@ 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;
@@ -42,6 +43,7 @@ import org.eclipse.core.resources.Resour
 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.core.runtime.Status;
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.viewers.IStructuredSelection;
@@ -87,6 +89,7 @@ public class ImportWizard extends Wizard
         final String repositoryPath = mainPage.getRepositoryPath();
         final IFile filterFile = mainPage.getFilterFile();
         try {
+            // TODO the headless logic should move to the service layer of 
reuse and testing
             getContainer().run(false, true, new IRunnableWithProgress() {
 
                 @Override
@@ -105,6 +108,15 @@ public class ImportWizard extends Wizard
                         
launchpad.setPublishState(ISlingLaunchpadServer.PUBLISH_STATE_NEVER, monitor);
                     }
 
+                    SerializationKindManager skm;
+                    
+                    try {
+                        skm = new SerializationKindManager();
+                        skm.init(repository);
+                    } catch (RepositoryException e1) {
+                        throw new InvocationTargetException(e1);
+                    }
+
                     Filter filter = null;
                     if (filterFile != null && filterFile.exists()) {
                         FilterLocator filterLocator = 
Activator.getDefault().getFilterLocator();
@@ -138,7 +150,7 @@ public class ImportWizard extends Wizard
                         // we create the root node and assume this is a folder
                         createRoot(project, projectRelativePath, 
repositoryPath);
 
-                        crawlChildrenAndImport(repository, filter, 
repositoryPath, project, projectRelativePath);
+                        crawlChildrenAndImport(repository, filter, 
repositoryPath, project, projectRelativePath, skm);
 
                         monitor.setTaskName("Import Complete");
                         monitor.worked(100);
@@ -210,6 +222,7 @@ public class ImportWizard extends Wizard
      * @param path the current path to import from
      * @param project the project to create resources in
      * @param projectRelativePath the path, relative to the project root, 
where the resources should be created
+     * @param skm 
      * @param tracer
      * @throws JSONException
      * @throws RepositoryException
@@ -218,7 +231,7 @@ public class ImportWizard extends Wizard
      */
        // TODO: This probably should be pushed into the service layer  
     private void crawlChildrenAndImport(Repository repository, Filter filter, 
String path, IProject project,
-            IPath projectRelativePath) throws RepositoryException, 
CoreException, IOException {
+            IPath projectRelativePath, SerializationKindManager skm) throws 
RepositoryException, CoreException, IOException {
 
         File contentSyncRoot = 
ProjectUtil.getSyncDirectoryFullPath(project).toFile();
 
@@ -228,23 +241,63 @@ public class ImportWizard extends Wizard
         ResourceProxy resource = 
executeCommand(repository.newListChildrenNodeCommand(path));
         String primaryType = (String) 
resource.getProperties().get(Repository.JCR_PRIMARY_TYPE);
  
-               if (Repository.NT_FILE.equals(primaryType)){
-            importFile(repository, path, project, projectRelativePath);
-               }else if (Repository.NT_FOLDER.equals(primaryType)){
-                       createFolder(project, projectRelativePath.append(path));
-               }else if(Repository.NT_RESOURCE.equals(primaryType)){
-                       //DO NOTHING
-        } else {
-                       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(serializationManager.getSerializationFilePath(path)),
-                    out.getBytes("UTF-8"));
+        System.out.println(primaryType + " -> " + 
skm.getSerializationKind(primaryType));
+        
+        // TODO we should know all node types for which to create files and 
folders
+
+        String serializationPath = 
serializationManager.getSerializationFilePath(path);
+        switch (skm.getSerializationKind(primaryType)) {
+            case FILE:
+                importFile(repository, path, project, projectRelativePath);
+                // TODO support ${filename}.dir serialization of properties
+                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"));
+                }
+                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"));
+                }
+                break;
+            }
+        }
 
         System.out.println("Children: " + resource.getChildren());
 
@@ -263,7 +316,7 @@ public class ImportWizard extends Wizard
             }
 
             crawlChildrenAndImport(repository, filter, child.getPath(), 
project,
-                    projectRelativePath);
+                    projectRelativePath, skm);
                }
        }
 

Added: 
sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/SerializationKindManager.java
URL: 
http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/SerializationKindManager.java?rev=1522636&view=auto
==============================================================================
--- 
sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/SerializationKindManager.java
 (added)
+++ 
sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/SerializationKindManager.java
 Thu Sep 12 15:55:57 2013
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.ide.eclipse.ui.internal;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.sling.ide.transport.Repository;
+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;
+
+// TODO this should be made API after merging the vlt branch back to trunk
+public class SerializationKindManager {
+
+    // TODO this list should be picked up from the config.xml file, not 
hardcoded
+    private final Set<String> fullMetadataNodeTypes = new HashSet<String>();
+    {
+        fullMetadataNodeTypes.add("rep:AccessControl");
+        fullMetadataNodeTypes.add("rep:Policy");
+        fullMetadataNodeTypes.add("cq:Widget");
+        fullMetadataNodeTypes.add("cq:EditConfig");
+        fullMetadataNodeTypes.add("cq:WorkflowModel");
+        fullMetadataNodeTypes.add("vlt:FullCoverage");
+        fullMetadataNodeTypes.add("mix:language");
+        fullMetadataNodeTypes.add("sling:OsgiConfig");
+    }
+    private final Set<String> fileNodeTypes = new HashSet<String>();
+    private final Set<String> folderNodeTypes = new HashSet<String>();
+
+    public void init(Repository repository) throws RepositoryException {
+
+        // first pass, init the mappings
+        Map<String, String[]> nodeTypesToParentNodeTypes = new HashMap<String, 
String[]>();
+
+        Result<ResourceProxy> jcrSystem = 
repository.newListChildrenNodeCommand("/jcr:system/jcr:nodeTypes").execute();
+        for (ResourceProxy child : jcrSystem.get().getChildren()) {
+            String nodeType = PathUtil.getName(child.getPath());
+            String[] superTypes = (String[]) 
child.getProperties().get("jcr:supertypes");
+
+            if (superTypes.length == 0) {
+                continue;
+            }
+
+            nodeTypesToParentNodeTypes.put(nodeType, superTypes);
+        }
+
+        // detect node types which have an nt:file or nt:folder parent in the 
hierarchy
+        for (String nodeType : nodeTypesToParentNodeTypes.keySet()) {
+            SerializationKind serializationKind = 
getSerializationKind(nodeType, nodeTypesToParentNodeTypes);
+            if (serializationKind == null) {
+                // don't care
+                continue;
+            }
+            switch (serializationKind) {
+                case FILE:
+                    fileNodeTypes.add(nodeType);
+                    break;
+                case FOLDER:
+                    folderNodeTypes.add(nodeType);
+                    break;
+                default:
+                    // don't care
+                    break;
+            }
+
+        }
+    }
+
+    private SerializationKind getSerializationKind(String nodeType, 
Map<String, String[]> nodeTypesToParentNodeTypes) {
+
+        if (Repository.NT_FILE.equals(nodeType)) {
+            return SerializationKind.FILE;
+        }
+
+        if (Repository.NT_FOLDER.equals(nodeType)) {
+            return SerializationKind.FOLDER;
+        }
+
+        String[] parents = nodeTypesToParentNodeTypes.get(nodeType);
+        if (parents == null)
+            return null;
+
+        for (String parent : parents) {
+            SerializationKind parentSerializationKind = 
getSerializationKind(parent, nodeTypesToParentNodeTypes);
+            if (parentSerializationKind != null) {
+                return parentSerializationKind;
+            }
+        }
+
+        return null;
+    }
+
+    public SerializationKind getSerializationKind(String nodeTypeName) {
+
+        if (fileNodeTypes.contains(nodeTypeName)) {
+            return SerializationKind.FILE;
+        }
+
+        if (folderNodeTypes.contains(nodeTypeName)) {
+            return SerializationKind.FOLDER;
+        }
+
+        if (fullMetadataNodeTypes.contains(nodeTypeName)) {
+            return SerializationKind.METADATA_FULL;
+        }
+
+        return SerializationKind.METADATA_PARTIAL;
+    }
+
+    enum SerializationKind {
+        FILE, FOLDER, METADATA_PARTIAL, METADATA_FULL;
+    }
+}

Propchange: 
sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/SerializationKindManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
sling/branches/tooling-ide-vlt/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/SerializationKindManager.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

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=1522636&r1=1522635&r2=1522636&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
 Thu Sep 12 15:55:57 2013
@@ -20,16 +20,19 @@ import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URISyntaxException;
 import java.util.Map;
 
 import javax.jcr.Credentials;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 
+import org.apache.jackrabbit.vault.fs.Mounter;
 import org.apache.jackrabbit.vault.fs.api.Aggregate;
 import org.apache.jackrabbit.vault.fs.api.RepositoryAddress;
 import org.apache.jackrabbit.vault.fs.api.VaultFile;
@@ -37,6 +40,8 @@ import org.apache.jackrabbit.vault.fs.ap
 import org.apache.jackrabbit.vault.fs.config.ConfigurationException;
 import org.apache.jackrabbit.vault.fs.impl.io.DocViewSerializer;
 import org.apache.jackrabbit.vault.util.Constants;
+import org.apache.jackrabbit.vault.util.PlatformNameFormat;
+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.SerializationManager;
@@ -46,6 +51,32 @@ import org.xml.sax.SAXException;
 
 public class VltSerializationManager implements SerializationManager {
 
+    public static void main(String[] args) throws RepositoryException, 
URISyntaxException, IOException {
+        RepositoryAddress address = new 
RepositoryAddress("http://localhost:8080/server/root";);
+        Repository repo = new RepositoryProvider().getRepository(address);
+        Session session = repo.login(new SimpleCredentials("admin", 
"admin".toCharArray()));
+
+        VaultFileSystem fs = Mounter.mount(null, null, address, "/", session);
+
+        String[] attempts = new String[] { "/rep:policy", "/var" };
+
+        for (String attempt : attempts) {
+            VaultFile vaultFile = fs.getFile(attempt);
+
+            System.out.println(attempt + " -> " + vaultFile);
+        }
+
+        for (String attempt : attempts) {
+
+            attempt = PlatformNameFormat.getPlatformPath(attempt) + ".xml";
+
+            VaultFile vaultFile = fs.getFile(attempt);
+
+            System.out.println(attempt + " -> " + vaultFile);
+        }
+
+    }
+
     private VaultFsLocator fsLocator;
 
     @Override
@@ -75,6 +106,8 @@ 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 IOException {
 
@@ -95,12 +128,20 @@ public class VltSerializationManager imp
 
             VaultFile vaultFile = fs.getFile(resource.getPath());
             if (vaultFile == null) {
-                // TODO proper logging ; discover if this is expected or not
-                System.err.println("No vaultFile at path " + 
resource.getPath());
-                return null;
+
+                // TODO - not sure why we need to try both ... not a 
performance impact but ugly nonetheless
+                String platformPath = 
PlatformNameFormat.getPlatformPath(resource.getPath()) + ".xml";
+                vaultFile = fs.getFile(platformPath);
+
+                if (vaultFile == null) {
+                    // TODO proper logging ; discover if this is expected or 
not
+                    System.err.println("No vaultFile at path " + 
resource.getPath());
+                    return null;
+                }
             }
 
             Aggregate aggregate = vaultFile.getAggregate();
+
             if (aggregate == null)
                 throw new IllegalArgumentException("No aggregate found for 
path " + resource.getPath());
 

Modified: 
sling/branches/tooling-ide-vlt/tooling/ide/vlt-wrapper/META-INF/MANIFEST.MF
URL: 
http://svn.apache.org/viewvc/sling/branches/tooling-ide-vlt/tooling/ide/vlt-wrapper/META-INF/MANIFEST.MF?rev=1522636&r1=1522635&r2=1522636&view=diff
==============================================================================
--- sling/branches/tooling-ide-vlt/tooling/ide/vlt-wrapper/META-INF/MANIFEST.MF 
(original)
+++ sling/branches/tooling-ide-vlt/tooling/ide/vlt-wrapper/META-INF/MANIFEST.MF 
Thu Sep 12 15:55:57 2013
@@ -45,6 +45,7 @@ Import-Package: org.apache.commons.httpc
  org.apache.commons.httpclient.methods.multipart;version="3.1.0",
  org.apache.commons.httpclient.params;version="3.1.0",
  org.apache.commons.httpclient.util;version="3.1.0",
+ org.apache.commons.collections,
  org.apache.commons.collections.map,
  org.apache.commons.collections.list,
  org.apache.commons.collections.iterators,


Reply via email to