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 <[email protected]> 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. */ [email protected]("3.0") [email protected]("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. - */ [email protected]("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 "[email protected]" <[email protected]>.
