You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 10:23:29 UTC

[sling-org-apache-sling-testing-sling-mock] 13/37: SLING-5064 sling-mock: Register JCR node types for OSGi bundles in class path

This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to annotated tag org.apache.sling.testing.sling-mock-1.6.0
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-testing-sling-mock.git

commit 53bfbe5d2c121fe8666a5e45e496f96b1a01fe17
Author: Stefan Seifert <ss...@apache.org>
AuthorDate: Sat Sep 26 15:30:02 2015 +0000

    SLING-5064 sling-mock: Register JCR node types for OSGi bundles in class path
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/testing/mocks/sling-mock@1705475 13f79535-47bb-0310-9956-ffa450edef68
---
 .../context/ContextResourceResolverFactory.java    |   2 +-
 .../sling/context/NodeTypeDefinitionScanner.java   | 159 +++++++++++++++++++++
 .../testing/mock/sling/context/package-info.java   |   2 +-
 .../mock/sling/MockSlingScriptHelperTest.java      |   6 +
 .../context/AbstractSlingContextImplTest.java      |   1 +
 .../sling/context/ModelAdapterFactoryUtilTest.java |   1 +
 .../context/NodeTypeDefinitionScannerTest.java}    |  24 +++-
 .../loader/AbstractContentLoaderBinaryTest.java    |   1 +
 .../loader/AbstractContentLoaderJsonDamTest.java   |   1 +
 .../loader/AbstractContentLoaderJsonTest.java      |   1 +
 .../resource/AbstractJcrResourceResolverTest.java  |   1 +
 .../AbstractSlingCrudResourceResolverTest.java     |   1 +
 12 files changed, 194 insertions(+), 6 deletions(-)

diff --git a/src/main/java/org/apache/sling/testing/mock/sling/context/ContextResourceResolverFactory.java b/src/main/java/org/apache/sling/testing/mock/sling/context/ContextResourceResolverFactory.java
index 0b12486..2448e07 100644
--- a/src/main/java/org/apache/sling/testing/mock/sling/context/ContextResourceResolverFactory.java
+++ b/src/main/java/org/apache/sling/testing/mock/sling/context/ContextResourceResolverFactory.java
@@ -66,7 +66,7 @@ final class ContextResourceResolverFactory {
 
             return factory;
         } catch (Throwable ex) {
-            throw new RuntimeException("Unable to initialize " + type + " resource resolver factory.", ex);
+            throw new RuntimeException("Unable to initialize " + type + " resource resolver factory: " + ex.getMessage(), ex);
         }
     }
 
diff --git a/src/main/java/org/apache/sling/testing/mock/sling/context/NodeTypeDefinitionScanner.java b/src/main/java/org/apache/sling/testing/mock/sling/context/NodeTypeDefinitionScanner.java
new file mode 100644
index 0000000..da5f33a
--- /dev/null
+++ b/src/main/java/org/apache/sling/testing/mock/sling/context/NodeTypeDefinitionScanner.java
@@ -0,0 +1,159 @@
+/*
+ * 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.testing.mock.sling.context;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.jar.Attributes;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+
+import javax.jcr.NamespaceRegistry;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.ValueFactory;
+import javax.jcr.Workspace;
+import javax.jcr.nodetype.NodeTypeManager;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.jackrabbit.commons.cnd.CndImporter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class NodeTypeDefinitionScanner {
+    
+    private static final NodeTypeDefinitionScanner SINGLETON = new NodeTypeDefinitionScanner();
+    
+    private static final int MAX_ITERATIONS = 5;
+
+    private static final Logger log = LoggerFactory.getLogger(NodeTypeDefinitionScanner.class);
+    
+    private final List<String> nodeTypeDefinitions;
+        
+    private NodeTypeDefinitionScanner() {
+        nodeTypeDefinitions = findeNodeTypeDefinitions();
+    }
+    
+    public List<String> getNodeTypeDefinitions() {
+        return nodeTypeDefinitions;
+    }
+
+    /**
+     * Registers node types found in classpath in JCR repository.
+     * @param Session session
+     */
+    public void register(Session session) throws RepositoryException {
+      ClassLoader classLoader = getClass().getClassLoader();
+      Workspace workspace = session.getWorkspace();
+      NodeTypeManager nodeTypeManager = workspace.getNodeTypeManager();
+      NamespaceRegistry namespaceRegistry = workspace.getNamespaceRegistry();
+      ValueFactory valueFactory = session.getValueFactory();
+
+      // try registering node types multiple times because the ecact order is not known
+      List<String> nodeTypeResources = new ArrayList<String>(NodeTypeDefinitionScanner.get().getNodeTypeDefinitions());
+      int iteration = 0;
+      while (!nodeTypeResources.isEmpty()) {
+          registerAndRemoveSucceeds(nodeTypeResources, classLoader, nodeTypeManager, namespaceRegistry, valueFactory, false);
+          iteration++;
+          if (iteration >= MAX_ITERATIONS) {
+              break;
+          }
+      }
+      if (!nodeTypeResources.isEmpty()) {
+          registerAndRemoveSucceeds(nodeTypeResources, classLoader, nodeTypeManager, namespaceRegistry, valueFactory, true);
+      }
+    }
+    
+    private void registerAndRemoveSucceeds(List<String> nodeTypeResources, ClassLoader classLoader,
+            NodeTypeManager nodeTypeManager, NamespaceRegistry namespaceRegistry, ValueFactory valueFactory,
+            boolean logError) {
+        Iterator<String> nodeTypeResourcesIterator = nodeTypeResources.iterator();
+        while (nodeTypeResourcesIterator.hasNext()) {
+            String nodeTypeResource = nodeTypeResourcesIterator.next();
+            InputStream is = classLoader.getResourceAsStream(nodeTypeResource);
+            if (is == null) {
+                continue;
+            }
+            try {
+                Reader reader = new InputStreamReader(is);
+                CndImporter.registerNodeTypes(reader, nodeTypeResource, nodeTypeManager, namespaceRegistry, valueFactory, false);
+                nodeTypeResourcesIterator.remove();
+            }
+            catch (Throwable ex) {
+                if (logError) {
+                    log.warn("Unable to register node type: " + nodeTypeResource, ex);
+                }
+            }
+            finally {
+                IOUtils.closeQuietly(is);
+            }
+        }
+    }
+    
+    private static List<String> findeNodeTypeDefinitions() {
+        List<String> nodeTypeDefinitions = new ArrayList<String>();
+        try {
+            Enumeration<URL> resEnum = NodeTypeDefinitionScanner.class.getClassLoader().getResources(JarFile.MANIFEST_NAME);
+            while (resEnum.hasMoreElements()) {
+                try {
+                    URL url = (URL)resEnum.nextElement();
+                    InputStream is = url.openStream();
+                    if (is != null) {
+                        try {
+                            Manifest manifest = new Manifest(is);
+                            Attributes mainAttribs = manifest.getMainAttributes();
+                            String nodeTypeDefinitionList = mainAttribs.getValue("Sling-Nodetypes");
+                            String[] nodeTypeDefinitionArray = StringUtils.split(nodeTypeDefinitionList, ",");
+                            if (nodeTypeDefinitionArray != null) {
+                                for (String nodeTypeDefinition : nodeTypeDefinitionArray) {
+                                    if (!StringUtils.isBlank(nodeTypeDefinition)) {
+                                        nodeTypeDefinitions.add(StringUtils.trim(nodeTypeDefinition));
+                                    }
+                                }
+                            }
+                        }
+                        finally {
+                            is.close();
+                        }
+                    }
+                }
+                catch (Throwable ex) {
+                    log.warn("Unable to read JAR manifest.", ex);
+                }
+            }
+        }
+        catch (IOException ex2) {
+            log.warn("Unable to read JAR manifests.", ex2);
+        }
+        return nodeTypeDefinitions; 
+    }
+    
+    public static NodeTypeDefinitionScanner get() {
+        return SINGLETON;
+    }
+    
+}
diff --git a/src/main/java/org/apache/sling/testing/mock/sling/context/package-info.java b/src/main/java/org/apache/sling/testing/mock/sling/context/package-info.java
index da3413d..827160f 100644
--- a/src/main/java/org/apache/sling/testing/mock/sling/context/package-info.java
+++ b/src/main/java/org/apache/sling/testing/mock/sling/context/package-info.java
@@ -19,5 +19,5 @@
 /**
  * Sling context implementation for unit tests.
  */
-@aQute.bnd.annotation.Version("3.0")
+@aQute.bnd.annotation.Version("3.1")
 package org.apache.sling.testing.mock.sling.context;
diff --git a/src/test/java/org/apache/sling/testing/mock/sling/MockSlingScriptHelperTest.java b/src/test/java/org/apache/sling/testing/mock/sling/MockSlingScriptHelperTest.java
index bde6899..1096f0a 100644
--- a/src/test/java/org/apache/sling/testing/mock/sling/MockSlingScriptHelperTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/sling/MockSlingScriptHelperTest.java
@@ -29,6 +29,7 @@ import org.apache.sling.api.scripting.SlingScriptHelper;
 import org.apache.sling.testing.mock.osgi.MockOsgi;
 import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletRequest;
 import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletResponse;
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.osgi.framework.BundleContext;
@@ -49,6 +50,11 @@ public class MockSlingScriptHelperTest {
         this.bundleContext = MockOsgi.newBundleContext();
         this.scriptHelper = MockSling.newSlingScriptHelper(this.request, this.response, this.bundleContext);
     }
+    
+    @After
+    public void tearDown() {
+        this.resourceResolver.close();
+    }
 
     @Test
     public void testRequest() {
diff --git a/src/test/java/org/apache/sling/testing/mock/sling/context/AbstractSlingContextImplTest.java b/src/test/java/org/apache/sling/testing/mock/sling/context/AbstractSlingContextImplTest.java
index ddfa08a..514d063 100644
--- a/src/test/java/org/apache/sling/testing/mock/sling/context/AbstractSlingContextImplTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/sling/context/AbstractSlingContextImplTest.java
@@ -123,6 +123,7 @@ public abstract class AbstractSlingContextImplTest {
         OsgiServiceModel model = resolver.adaptTo(OsgiServiceModel.class);
         assertNotNull(model.getMimeTypeService());
         assertEquals("text/html", model.getMimeTypeService().getMimeType("html"));
+        resolver.close();
     }
 
     @Test
diff --git a/src/test/java/org/apache/sling/testing/mock/sling/context/ModelAdapterFactoryUtilTest.java b/src/test/java/org/apache/sling/testing/mock/sling/context/ModelAdapterFactoryUtilTest.java
index f150f07..b6d5850 100644
--- a/src/test/java/org/apache/sling/testing/mock/sling/context/ModelAdapterFactoryUtilTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/sling/context/ModelAdapterFactoryUtilTest.java
@@ -71,6 +71,7 @@ public class ModelAdapterFactoryUtilTest {
         assertNotNull(model);
         assertNotNull(model.getMimeTypeService());
         assertEquals("text/html", model.getMimeTypeService().getMimeType("html"));
+        resolver.close();
     }
 
     @Test
diff --git a/src/main/java/org/apache/sling/testing/mock/sling/context/package-info.java b/src/test/java/org/apache/sling/testing/mock/sling/context/NodeTypeDefinitionScannerTest.java
similarity index 61%
copy from src/main/java/org/apache/sling/testing/mock/sling/context/package-info.java
copy to src/test/java/org/apache/sling/testing/mock/sling/context/NodeTypeDefinitionScannerTest.java
index da3413d..63bdb50 100644
--- a/src/main/java/org/apache/sling/testing/mock/sling/context/package-info.java
+++ b/src/test/java/org/apache/sling/testing/mock/sling/context/NodeTypeDefinitionScannerTest.java
@@ -16,8 +16,24 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-/**
- * Sling context implementation for unit tests.
- */
-@aQute.bnd.annotation.Version("3.0")
 package org.apache.sling.testing.mock.sling.context;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.junit.Test;
+
+
+public class NodeTypeDefinitionScannerTest {
+
+    @Test
+    public void testGetNodeTypeDefinitions() throws Exception {
+        List<String> definitions = NodeTypeDefinitionScanner.get().getNodeTypeDefinitions();
+        
+        // ensure some node types from jcr.resource exist
+        assertTrue(definitions.contains("SLING-INF/nodetypes/folder.cnd"));
+        assertTrue(definitions.contains("SLING-INF/nodetypes/resource.cnd"));
+    }
+
+}
diff --git a/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderBinaryTest.java b/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderBinaryTest.java
index df41247..1194cdd 100644
--- a/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderBinaryTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderBinaryTest.java
@@ -82,6 +82,7 @@ public abstract class AbstractContentLoaderBinaryTest {
             resourceResolver.delete(content);
             resourceResolver.commit();
         }
+        resourceResolver.close();
     }
     
     @Test
diff --git a/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderJsonDamTest.java b/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderJsonDamTest.java
index db83b99..15bb442 100644
--- a/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderJsonDamTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderJsonDamTest.java
@@ -85,6 +85,7 @@ public abstract class AbstractContentLoaderJsonDamTest {
             resourceResolver.delete(content);
             resourceResolver.commit();
         }
+        this.resourceResolver.close();
     }
             
     @Test
diff --git a/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderJsonTest.java b/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderJsonTest.java
index ff1471b..38a3b58 100644
--- a/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderJsonTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderJsonTest.java
@@ -85,6 +85,7 @@ public abstract class AbstractContentLoaderJsonTest {
             resourceResolver.delete(content);
             resourceResolver.commit();
         }
+        this.resourceResolver.close();
     }
             
     @Test
diff --git a/src/test/java/org/apache/sling/testing/mock/sling/resource/AbstractJcrResourceResolverTest.java b/src/test/java/org/apache/sling/testing/mock/sling/resource/AbstractJcrResourceResolverTest.java
index 12960dd..2681fdd 100644
--- a/src/test/java/org/apache/sling/testing/mock/sling/resource/AbstractJcrResourceResolverTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/sling/resource/AbstractJcrResourceResolverTest.java
@@ -105,6 +105,7 @@ public abstract class AbstractJcrResourceResolverTest {
     @After
     public final void tearDown() {
         testRoot = null;
+        resourceResolver.close();
     }
 
     /**
diff --git a/src/test/java/org/apache/sling/testing/mock/sling/resource/AbstractSlingCrudResourceResolverTest.java b/src/test/java/org/apache/sling/testing/mock/sling/resource/AbstractSlingCrudResourceResolverTest.java
index 5226486..9880ef5 100644
--- a/src/test/java/org/apache/sling/testing/mock/sling/resource/AbstractSlingCrudResourceResolverTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/sling/resource/AbstractSlingCrudResourceResolverTest.java
@@ -107,6 +107,7 @@ public abstract class AbstractSlingCrudResourceResolverTest {
     @After
     public final void tearDown() {
         this.testRoot = null;
+        this.resourceResolver.close();
     }
 
     /**

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.