You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2017/05/04 16:02:23 UTC

svn commit: r1793826 - in /sling/trunk/bundles/extensions/fsresource: ./ src/main/java/org/apache/sling/fsprovider/internal/ src/main/java/org/apache/sling/fsprovider/internal/mapper/ src/main/java/org/apache/sling/fsprovider/internal/parser/ src/test/...

Author: sseifert
Date: Thu May  4 16:02:22 2017
New Revision: 1793826

URL: http://svn.apache.org/viewvc?rev=1793826&view=rev
Log:
SLING-6829 FSResource: Support node descriptor files for folders and binary files

Added:
    sling/trunk/bundles/extensions/fsresource/src/test/resources/fs-test/folder2/folder21.xml   (with props)
    sling/trunk/bundles/extensions/fsresource/src/test/resources/fs-test/folder2/folder21/file21a.txt.xml   (with props)
Modified:
    sling/trunk/bundles/extensions/fsresource/pom.xml
    sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/ContentFileExtensions.java
    sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/FsResourceProvider.java
    sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/mapper/ContentFileResourceMapper.java
    sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/mapper/FileResource.java
    sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/mapper/FileResourceMapper.java
    sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileParserUtil.java
    sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileTypes.java
    sling/trunk/bundles/extensions/fsresource/src/test/java/org/apache/sling/fsprovider/internal/JsonContentTest.java
    sling/trunk/bundles/extensions/fsresource/src/test/java/org/apache/sling/fsprovider/internal/parser/ContentFileParserUtilTest.java

Modified: sling/trunk/bundles/extensions/fsresource/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/fsresource/pom.xml?rev=1793826&r1=1793825&r2=1793826&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/fsresource/pom.xml (original)
+++ sling/trunk/bundles/extensions/fsresource/pom.xml Thu May  4 16:02:22 2017
@@ -146,7 +146,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.jcr.contentparser</artifactId>
-            <version>1.0.0</version>
+            <version>1.0.1-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
         <dependency>

Modified: sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/ContentFileExtensions.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/ContentFileExtensions.java?rev=1793826&r1=1793825&r2=1793826&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/ContentFileExtensions.java (original)
+++ sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/ContentFileExtensions.java Thu May  4 16:02:22 2017
@@ -18,6 +18,9 @@
  */
 package org.apache.sling.fsprovider.internal;
 
+import static org.apache.sling.fsprovider.internal.parser.ContentFileTypes.JCR_XML_SUFFIX;
+import static org.apache.sling.fsprovider.internal.parser.ContentFileTypes.XML_SUFFIX;
+
 import java.io.File;
 import java.util.Collection;
 import java.util.List;
@@ -43,8 +46,15 @@ public final class ContentFileExtensions
     public String getSuffix(File file) {
         String fileName = "/" + file.getName();
         for (String suffix : contentFileSuffixes) {
-            if (StringUtils.endsWith(fileName, suffix)) {
-                return suffix;
+            if (StringUtils.equals(suffix, XML_SUFFIX)) {
+                if (StringUtils.endsWith(fileName, XML_SUFFIX) && !StringUtils.endsWith(fileName, JCR_XML_SUFFIX)) {
+                    return suffix;
+                }
+            }
+            else {
+                if (StringUtils.endsWith(fileName, suffix)) {
+                    return suffix;
+                }
             }
         }
         return null;

Modified: sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/FsResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/FsResourceProvider.java?rev=1793826&r1=1793825&r2=1793826&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/FsResourceProvider.java (original)
+++ sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/FsResourceProvider.java Thu May  4 16:02:22 2017
@@ -37,6 +37,7 @@ import org.apache.sling.fsprovider.inter
 import org.apache.sling.fsprovider.internal.mapper.FileVaultResourceMapper;
 import org.apache.sling.fsprovider.internal.parser.ContentFileCache;
 import org.apache.sling.fsprovider.internal.parser.ContentFileTypes;
+import org.apache.sling.jcr.contentparser.ContentType;
 import org.apache.sling.spi.resource.provider.ObservationReporter;
 import org.apache.sling.spi.resource.provider.ProviderContext;
 import org.apache.sling.spi.resource.provider.ResolveContext;
@@ -188,9 +189,9 @@ public final class FsResourceProvider ex
         else {
             // Sling-Initial-Content: mount folder/files an content files
             askParentResourceProvider = this.overlayParentResourceProvider;
-            rsrc = contentFileMapper.getResource(resolver, path);
+            rsrc = fileMapper.getResource(resolver, path);
             if (rsrc == null) {
-                rsrc = fileMapper.getResource(resolver, path);
+                rsrc = contentFileMapper.getResource(resolver, path);
             }
         }
         
@@ -235,7 +236,7 @@ public final class FsResourceProvider ex
             }
         }
         else {
-            // Sling-Initial-Content: get all matchind folders/files and content files
+            // Sling-Initial-Content: get all matching folders/files and content files
             askParentResourceProvider = this.overlayParentResourceProvider;
             children = contentFileMapper.getChildren(resolver, parent);
             if (children != null) {
@@ -322,12 +323,15 @@ public final class FsResourceProvider ex
         }
         else if (fsMode == FsMode.INITIAL_CONTENT) {
             overlayParentResourceProvider = !options.isOverwrite();
-            if (!options.getIgnoreImportProviders().contains("json")) {
+            if (!options.getIgnoreImportProviders().contains(ContentType.JSON.getExtension())) {
                 contentFileSuffixes.add(ContentFileTypes.JSON_SUFFIX);
             }
-            if (!options.getIgnoreImportProviders().contains("jcr.xml")) {
+            if (!options.getIgnoreImportProviders().contains(ContentType.JCR_XML.getExtension())) {
                 contentFileSuffixes.add(ContentFileTypes.JCR_XML_SUFFIX);
             }
+            if (!options.getIgnoreImportProviders().contains(ContentType.XML.getExtension())) {
+                contentFileSuffixes.add(ContentFileTypes.XML_SUFFIX);
+            }
         }
         ContentFileExtensions contentFileExtensions = new ContentFileExtensions(contentFileSuffixes);
         
@@ -336,7 +340,7 @@ public final class FsResourceProvider ex
             this.fileVaultMapper = new FileVaultResourceMapper(this.providerFile, filterXmlFile, this.contentFileCache);
         }
         else {
-            this.fileMapper = new FileResourceMapper(this.providerRoot, this.providerFile, contentFileExtensions);
+            this.fileMapper = new FileResourceMapper(this.providerRoot, this.providerFile, contentFileExtensions, this.contentFileCache);
             this.contentFileMapper = new ContentFileResourceMapper(this.providerRoot, this.providerFile,
                     contentFileExtensions, this.contentFileCache);
         }

Modified: sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/mapper/ContentFileResourceMapper.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/mapper/ContentFileResourceMapper.java?rev=1793826&r1=1793825&r2=1793826&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/mapper/ContentFileResourceMapper.java (original)
+++ sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/mapper/ContentFileResourceMapper.java Thu May  4 16:02:22 2017
@@ -88,7 +88,7 @@ public final class ContentFileResourceMa
                     List<Resource> childResources = new ArrayList<>();
                     for (File file : parentFile.listFiles()) {
                         String filenameSuffix = contentFileExtensions.getSuffix(file);
-                        if (filenameSuffix != null) {
+                        if (filenameSuffix != null && !isNodeDescriptor(file)) {
                             String path = parentPath + "/" + StringUtils.substringBeforeLast(file.getName(), filenameSuffix);
                             ContentFile contentFile = new ContentFile(file, path, null, contentFileCache);
                             childResources.add(new ContentFileResource(resolver, contentFile));
@@ -144,5 +144,15 @@ public final class ContentFileResourceMa
                 + (subPath != null ? "/" + subPath : "");
         return getFile(parentPath, nextSubPath);
     }
-
+    
+    private boolean isNodeDescriptor(File file) {
+        for (String filenameSuffix : contentFileExtensions.getSuffixes()) {
+            if (StringUtils.endsWith(file.getPath(), filenameSuffix)) {
+                File fileWithoutSuffix = new File(StringUtils.substringBeforeLast(file.getPath(), filenameSuffix));
+                return fileWithoutSuffix.exists();
+            }
+        }
+        return false;
+    }
+    
 }

Modified: sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/mapper/FileResource.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/mapper/FileResource.java?rev=1793826&r1=1793825&r2=1793826&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/mapper/FileResource.java (original)
+++ sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/mapper/FileResource.java Thu May  4 16:02:22 2017
@@ -28,6 +28,7 @@ import java.util.Calendar;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import org.apache.sling.adapter.annotations.Adaptable;
@@ -37,8 +38,12 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.ResourceMetadata;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.fsprovider.internal.ContentFileExtensions;
 import org.apache.sling.fsprovider.internal.FsResourceProvider;
 import org.apache.sling.fsprovider.internal.mapper.valuemap.ValueMapDecorator;
+import org.apache.sling.fsprovider.internal.parser.ContentElement;
+import org.apache.sling.fsprovider.internal.parser.ContentFileCache;
+import org.apache.sling.jcr.contentparser.ParserOptions;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -73,11 +78,18 @@ public final class FileResource extends
     // the file wrapped by this instance
     private final File file;
 
+    // the resource metadata, assigned on demand
+    private ResourceMetadata metaData;
+
     // the resource type, assigned on demand
     private String resourceType;
+    private String resourceSuperType;
+    
+    // valuemap is build on demand
+    private ValueMap valueMap;
 
-    // the resource metadata, assigned on demand
-    private ResourceMetadata metaData;
+    private final ContentFileExtensions contentFileExtensions;
+    private final ContentFileCache contentFileCache;
 
     private static final Logger log = LoggerFactory.getLogger(FileResource.class);
     
@@ -89,9 +101,16 @@ public final class FileResource extends
      * @param file The wrapped file
      */
     FileResource(ResourceResolver resolver, String resourcePath, File file) {
+        this(resolver, resourcePath, file, null, null);
+    }
+    
+    FileResource(ResourceResolver resolver, String resourcePath, File file,
+            ContentFileExtensions contentFileExtensions, ContentFileCache contentFileCache) {
         this.resolver = resolver;
         this.resourcePath = resourcePath;
         this.file = file;
+        this.contentFileExtensions = contentFileExtensions;
+        this.contentFileCache = contentFileCache;
     }
 
     /**
@@ -127,21 +146,21 @@ public final class FileResource extends
         return resolver;
     }
 
-    /**
-     * Returns <code>null</code>}
-     */
     public String getResourceSuperType() {
-        return null;
+        if (resourceSuperType == null) {
+            resourceSuperType = getValueMap().get("sling:resourceSuperType", String.class);
+        }
+        return resourceSuperType;
     }
 
-    /**
-     * Returns {@link #RESOURCE_TYPE_FILE} if this resource
-     * wraps a file. Otherwise {@link #RESOURCE_TYPE_FOLDER}
-     * is returned.
-     */
     public String getResourceType() {
         if (resourceType == null) {
-            resourceType = file.isFile() ? RESOURCE_TYPE_FILE : RESOURCE_TYPE_FOLDER;
+            ValueMap props = getValueMap();
+            resourceType = props.get("sling:resourceType", String.class);
+            if (resourceType == null) {
+                // fallback to jcr:primaryType when resource type not set
+                resourceType = props.get("jcr:primaryType", String.class);
+            }
         }
         return resourceType;
     }
@@ -177,20 +196,9 @@ public final class FileResource extends
             catch (MalformedURLException mue) {
                 log.info("adaptTo: Cannot convert the file path " + file + " to an URL", mue);
             }
-
         }
         else if (type == ValueMap.class) {
-            // this resource simulates nt:file/nt:folder behavior by returning it as resource type
-            // we should simulate the corresponding JCR properties in a value map as well
-            if (file.exists() && file.canRead()) {
-                Map<String,Object> props = new HashMap<String, Object>();
-                props.put("jcr:primaryType", getResourceType());
-                props.put("jcr:createdBy", "system");
-                Calendar lastModifed = Calendar.getInstance();
-                lastModifed.setTimeInMillis(file.lastModified());
-                props.put("jcr:created", lastModifed);
-                return (AdapterType) new ValueMapDecorator(props);
-            }
+            return (AdapterType) getValueMap();
         }
         return super.adaptTo(type);
     }
@@ -204,4 +212,50 @@ public final class FileResource extends
                 .build();
     }
 
+    @Override
+    public ValueMap getValueMap() {
+        if (valueMap == null) {
+            // this resource simulates nt:file/nt:folder behavior by returning it as resource type
+            // we should simulate the corresponding JCR properties in a value map as well
+            if (file.exists() && file.canRead()) {
+                Map<String,Object> props = new HashMap<String, Object>();
+                props.put("jcr:primaryType", file.isFile() ? RESOURCE_TYPE_FILE : RESOURCE_TYPE_FOLDER);
+                props.put("jcr:createdBy", "system");
+                
+                Calendar lastModifed = Calendar.getInstance();
+                lastModifed.setTimeInMillis(file.lastModified());
+                props.put("jcr:created", lastModifed);
+                
+                // overlay properties with those from node descriptor content file, if it exists
+                ContentElement content = getNodeDescriptorContent();
+                if (content != null) {
+                    for (Map.Entry<String, Object> entry : content.getProperties().entrySet()) {
+                        // skip primary type if it is the default type assigned by contentparser when none is defined
+                        if (StringUtils.equals(entry.getKey(), "jcr:primaryType")
+                                && StringUtils.equals((String)entry.getValue(), ParserOptions.DEFAULT_PRIMARY_TYPE)) {
+                            continue;
+                        }
+                        props.put(entry.getKey(), entry.getValue());
+                    }
+                }
+                
+                valueMap = new ValueMapDecorator(props);
+            }
+        }
+        return valueMap;
+    }
+    
+    private ContentElement getNodeDescriptorContent() {
+        if (contentFileExtensions == null || contentFileCache == null) {
+            return null;
+        }
+        for (String fileNameSuffix : contentFileExtensions.getSuffixes()) {
+            File fileWithSuffix = new File(file.getPath() + fileNameSuffix);
+            if (fileWithSuffix.exists() && fileWithSuffix.canRead()) {
+                return contentFileCache.get(resourcePath, fileWithSuffix);
+            }
+        }
+        return null;
+    }
+    
 }

Modified: sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/mapper/FileResourceMapper.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/mapper/FileResourceMapper.java?rev=1793826&r1=1793825&r2=1793826&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/mapper/FileResourceMapper.java (original)
+++ sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/mapper/FileResourceMapper.java Thu May  4 16:02:22 2017
@@ -29,6 +29,7 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.fsprovider.internal.ContentFileExtensions;
 import org.apache.sling.fsprovider.internal.FsResourceMapper;
+import org.apache.sling.fsprovider.internal.parser.ContentFileCache;
 
 public final class FileResourceMapper implements FsResourceMapper {
 
@@ -42,19 +43,22 @@ public final class FileResourceMapper im
     private final File providerFile;
     
     private final ContentFileExtensions contentFileExtensions;
+    private final ContentFileCache contentFileCache;
     
-    public FileResourceMapper(String providerRoot, File providerFile, ContentFileExtensions contentFileExtensions) {
+    public FileResourceMapper(String providerRoot, File providerFile,
+            ContentFileExtensions contentFileExtensions, ContentFileCache contentFileCache) {
         this.providerRoot = providerRoot;
         this.providerRootPrefix = providerRoot.concat("/");
         this.providerFile = providerFile;
         this.contentFileExtensions = contentFileExtensions;
+        this.contentFileCache = contentFileCache;
     }
     
     @Override
     public Resource getResource(final ResourceResolver resolver, final String resourcePath) {
         File file = getFile(resourcePath);
         if (file != null) {
-            return new FileResource(resolver, resourcePath, file);
+            return new FileResource(resolver, resourcePath, file, contentFileExtensions, contentFileCache);
         }
         else {
             return null;
@@ -84,7 +88,7 @@ public final class FileResourceMapper im
                     if (providerRoot.startsWith(parentPathPrefix)) {
                         String relPath = providerRoot.substring(parentPathPrefix.length());
                         if (relPath.indexOf('/') < 0) {
-                            Resource res = new FileResource(resolver, providerRoot, providerFile);
+                            Resource res = new FileResource(resolver, providerRoot, providerFile, contentFileExtensions, contentFileCache);
                             return IteratorUtils.singletonIterator(res);
                         }
                     }
@@ -115,7 +119,7 @@ public final class FileResourceMapper im
             public Object transform(Object input) {
                 File file = (File)input;
                 String path = parentPath + "/" + file.getName();
-                return new FileResource(resolver, path, file);
+                return new FileResource(resolver, path, file, contentFileExtensions, contentFileCache);
             }
         });
     }

Modified: sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileParserUtil.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileParserUtil.java?rev=1793826&r1=1793825&r2=1793826&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileParserUtil.java (original)
+++ sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileParserUtil.java Thu May  4 16:02:22 2017
@@ -20,6 +20,7 @@ package org.apache.sling.fsprovider.inte
 
 import static org.apache.jackrabbit.vault.util.Constants.DOT_CONTENT_XML;
 import static org.apache.sling.fsprovider.internal.parser.ContentFileTypes.JCR_XML_SUFFIX;
+import static org.apache.sling.fsprovider.internal.parser.ContentFileTypes.XML_SUFFIX;
 import static org.apache.sling.fsprovider.internal.parser.ContentFileTypes.JSON_SUFFIX;
 
 import java.io.BufferedInputStream;
@@ -54,6 +55,7 @@ class ContentFileParserUtil {
         }
     }
     private static final ContentParser JCR_XML_PARSER = ContentParserFactory.create(ContentType.JCR_XML);
+    private static final ContentParser XML_PARSER = ContentParserFactory.create(ContentType.XML);
     
     private ContentFileParserUtil() {
         // static methods only
@@ -75,6 +77,9 @@ class ContentFileParserUtil {
             else if (StringUtils.equals(file.getName(), DOT_CONTENT_XML) || StringUtils.endsWith(file.getName(), JCR_XML_SUFFIX)) {
                 return parse(JCR_XML_PARSER, file);
             }
+            else if (StringUtils.endsWith(file.getName(), XML_SUFFIX) && !StringUtils.endsWith(file.getName(), JCR_XML_SUFFIX)) {
+                return parse(XML_PARSER, file);
+            }
         }
         catch (Throwable ex) {
             log.warn("Error parsing content from " + file.getPath(), ex);

Modified: sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileTypes.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileTypes.java?rev=1793826&r1=1793825&r2=1793826&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileTypes.java (original)
+++ sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileTypes.java Thu May  4 16:02:22 2017
@@ -31,6 +31,11 @@ public final class ContentFileTypes {
     public static final String JSON_SUFFIX = "." + ContentType.JSON.getExtension();
 
     /**
+     * XML content files.
+     */
+    public static final String XML_SUFFIX = "." + ContentType.XML.getExtension();
+        
+    /**
      * JCR XML content files.
      */
     public static final String JCR_XML_SUFFIX = "." + ContentType.JCR_XML.getExtension();

Modified: sling/trunk/bundles/extensions/fsresource/src/test/java/org/apache/sling/fsprovider/internal/JsonContentTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/fsresource/src/test/java/org/apache/sling/fsprovider/internal/JsonContentTest.java?rev=1793826&r1=1793825&r2=1793826&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/fsresource/src/test/java/org/apache/sling/fsprovider/internal/JsonContentTest.java (original)
+++ sling/trunk/bundles/extensions/fsresource/src/test/java/org/apache/sling/fsprovider/internal/JsonContentTest.java Thu May  4 16:02:22 2017
@@ -257,7 +257,22 @@ public class JsonContentTest {
 
         Resource child2 = children.get(1);
         assertEquals("folder21", child2.getName());
-        assertEquals("nt:folder", child2.getValueMap().get("jcr:primaryType", String.class));
+        assertEquals("sling:OrderedFolder", child2.getValueMap().get("jcr:primaryType", String.class));
+    }
+
+    @Test
+    public void testFile21aNodeDescriptor() throws RepositoryException {
+        Resource file21a = fsroot.getChild("folder2/folder21/file21a.txt");
+        assertEquals("nt:file", file21a.getResourceType());
+        assertEquals("/my/super/type", file21a.getResourceSuperType());
+        
+        ValueMap props = file21a.getValueMap();
+        assertEquals("nt:file", props.get("jcr:primaryType", String.class));
+        assertEquals("/my/super/type", props.get("sling:resourceSuperType", String.class));
+        assertEquals("en", props.get("jcr:language", String.class));
+        assertArrayEquals(new String[] { "mix:language" }, props.get("jcr:mixinTypes", String[].class));
+
+        assertNull(fsroot.getChild("folder2/folder21/file21a.txt.xml"));
     }
 
 }

Modified: sling/trunk/bundles/extensions/fsresource/src/test/java/org/apache/sling/fsprovider/internal/parser/ContentFileParserUtilTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/fsresource/src/test/java/org/apache/sling/fsprovider/internal/parser/ContentFileParserUtilTest.java?rev=1793826&r1=1793825&r2=1793826&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/fsresource/src/test/java/org/apache/sling/fsprovider/internal/parser/ContentFileParserUtilTest.java (original)
+++ sling/trunk/bundles/extensions/fsresource/src/test/java/org/apache/sling/fsprovider/internal/parser/ContentFileParserUtilTest.java Thu May  4 16:02:22 2017
@@ -60,4 +60,12 @@ public class ContentFileParserUtilTest {
         assertNull(content);
     }
 
+    @Test
+    public void testParseXml() {
+        File file = new File("src/test/resources/fs-test/folder2/folder21.xml");
+        ContentElement content = ContentFileParserUtil.parse(file);
+        assertNotNull(content);
+        assertEquals("sling:OrderedFolder", content.getProperties().get("jcr:primaryType"));
+    }
+
 }

Added: sling/trunk/bundles/extensions/fsresource/src/test/resources/fs-test/folder2/folder21.xml
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/fsresource/src/test/resources/fs-test/folder2/folder21.xml?rev=1793826&view=auto
==============================================================================
--- sling/trunk/bundles/extensions/fsresource/src/test/resources/fs-test/folder2/folder21.xml (added)
+++ sling/trunk/bundles/extensions/fsresource/src/test/resources/fs-test/folder2/folder21.xml Thu May  4 16:02:22 2017
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<node>
+  <primaryNodeType>sling:OrderedFolder</primaryNodeType>
+</node>

Propchange: sling/trunk/bundles/extensions/fsresource/src/test/resources/fs-test/folder2/folder21.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/bundles/extensions/fsresource/src/test/resources/fs-test/folder2/folder21.xml
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Thu May  4 16:02:22 2017
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/trunk/bundles/extensions/fsresource/src/test/resources/fs-test/folder2/folder21.xml
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/trunk/bundles/extensions/fsresource/src/test/resources/fs-test/folder2/folder21/file21a.txt.xml
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/fsresource/src/test/resources/fs-test/folder2/folder21/file21a.txt.xml?rev=1793826&view=auto
==============================================================================
--- sling/trunk/bundles/extensions/fsresource/src/test/resources/fs-test/folder2/folder21/file21a.txt.xml (added)
+++ sling/trunk/bundles/extensions/fsresource/src/test/resources/fs-test/folder2/folder21/file21a.txt.xml Thu May  4 16:02:22 2017
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<node>
+  <name>file21a.txt</name>
+  <mixinNodeType>mix:language</mixinNodeType>
+  <property>
+    <name>jcr:language</name>
+    <value>en</value>
+    <type>String</type>
+  </property>
+  <property>
+    <name>sling:resourceSuperType</name>
+    <value>/my/super/type</value>
+    <type>String</type>
+  </property>
+</node>

Propchange: sling/trunk/bundles/extensions/fsresource/src/test/resources/fs-test/folder2/folder21/file21a.txt.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/bundles/extensions/fsresource/src/test/resources/fs-test/folder2/folder21/file21a.txt.xml
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Thu May  4 16:02:22 2017
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/trunk/bundles/extensions/fsresource/src/test/resources/fs-test/folder2/folder21/file21a.txt.xml
------------------------------------------------------------------------------
    svn:mime-type = text/plain