SLING-8448 fsresource: Mark builtin properties as protected in "virtual JCR"
diff --git a/src/main/java/org/apache/sling/fsprovider/internal/mapper/jcr/FsPropertyDefinition.java b/src/main/java/org/apache/sling/fsprovider/internal/mapper/jcr/FsPropertyDefinition.java
index 85920cb..b406fd7 100644
--- a/src/main/java/org/apache/sling/fsprovider/internal/mapper/jcr/FsPropertyDefinition.java
+++ b/src/main/java/org/apache/sling/fsprovider/internal/mapper/jcr/FsPropertyDefinition.java
@@ -18,14 +18,29 @@
  */
 package org.apache.sling.fsprovider.internal.mapper.jcr;
 
+import java.util.HashSet;
+import java.util.Set;
+
 import javax.jcr.PropertyType;
 import javax.jcr.Value;
 import javax.jcr.nodetype.NodeType;
 import javax.jcr.nodetype.PropertyDefinition;
 import javax.jcr.version.OnParentVersionAction;
 
+import org.apache.jackrabbit.JcrConstants;
+
 class FsPropertyDefinition implements PropertyDefinition {
-    
+
+    private static final Set<String> PROTECTED_PROPERTY_NAMES = new HashSet<>();
+    static {
+        // from nt:base
+        PROTECTED_PROPERTY_NAMES.add(JcrConstants.JCR_PRIMARYTYPE);
+        PROTECTED_PROPERTY_NAMES.add(JcrConstants.JCR_MIXINTYPES);
+        // from mix:created
+        PROTECTED_PROPERTY_NAMES.add(JcrConstants.JCR_CREATED);
+        PROTECTED_PROPERTY_NAMES.add("jcr:createdBy");
+    }
+
     private final String name;
     
     public FsPropertyDefinition(String name) {
@@ -59,7 +74,7 @@
 
     @Override
     public boolean isProtected() {
-        return false;
+        return PROTECTED_PROPERTY_NAMES.contains(name);
     }
 
     @Override
diff --git a/src/test/java/org/apache/sling/fsprovider/internal/JsonContentTest.java b/src/test/java/org/apache/sling/fsprovider/internal/JsonContentTest.java
index 9d953f5..2daed26 100644
--- a/src/test/java/org/apache/sling/fsprovider/internal/JsonContentTest.java
+++ b/src/test/java/org/apache/sling/fsprovider/internal/JsonContentTest.java
@@ -43,6 +43,7 @@
 import javax.jcr.Value;
 import javax.jcr.nodetype.NodeType;
 
+import org.apache.jackrabbit.JcrConstants;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.fsprovider.internal.TestUtils.RegisterFsResourcePlugin;
@@ -161,10 +162,14 @@
         assertEquals("/fs-test/folder2/content/toolbar/profiles/jcr:content", node.getPath());
         assertEquals(6, node.getDepth());
         
+        assertTrue(node.hasProperty(JcrConstants.JCR_PRIMARYTYPE));
+        assertTrue(node.getProperty(JcrConstants.JCR_PRIMARYTYPE).getDefinition().isProtected());
+        
         assertTrue(node.hasProperty("jcr:title"));
         assertEquals(PropertyType.STRING, node.getProperty("jcr:title").getType());
         assertFalse(node.getProperty("jcr:title").isMultiple());
         assertEquals("jcr:title", node.getProperty("jcr:title").getDefinition().getName());
+        assertFalse(node.getProperty("jcr:title").getDefinition().isProtected());
         assertEquals("/fs-test/folder2/content/toolbar/profiles/jcr:content/jcr:title", node.getProperty("jcr:title").getPath());
         assertEquals("Profiles", node.getProperty("jcr:title").getString());
         assertEquals(PropertyType.BOOLEAN, node.getProperty("booleanProp").getType());