This is an automated email from the ASF dual-hosted git repository.
diru pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-sitemap.git
The following commit(s) were added to refs/heads/master by this push:
new 51ddda0 SLING-11088: fix cardinality of extension provider ref (#9)
51ddda0 is described below
commit 51ddda03e89d6138ab17da104ad7526ad4772850
Author: Dirk Rudolph <[email protected]>
AuthorDate: Tue Jan 25 11:58:15 2022 +0100
SLING-11088: fix cardinality of extension provider ref (#9)
---
.../extensions/ExtensionProviderManager.java | 4 +-
.../extensions/ExtensionProviderManagerTest.java | 79 ++++++++++++++++++++++
2 files changed, 81 insertions(+), 2 deletions(-)
diff --git
a/src/main/java/org/apache/sling/sitemap/impl/builder/extensions/ExtensionProviderManager.java
b/src/main/java/org/apache/sling/sitemap/impl/builder/extensions/ExtensionProviderManager.java
index d3a0aec..3d6ae01 100644
---
a/src/main/java/org/apache/sling/sitemap/impl/builder/extensions/ExtensionProviderManager.java
+++
b/src/main/java/org/apache/sling/sitemap/impl/builder/extensions/ExtensionProviderManager.java
@@ -38,7 +38,7 @@ import java.util.*;
name = "providers",
bind = "bindExtensionProvider",
unbind = "unbindExtensionProvider",
- cardinality = ReferenceCardinality.OPTIONAL,
+ cardinality = ReferenceCardinality.MULTIPLE,
policyOption = ReferencePolicyOption.GREEDY
)
})
@@ -93,7 +93,7 @@ public class ExtensionProviderManager {
public ExtensionFactory getExtensionFactory(Class<? extends Extension>
extensionInterface) {
for (Holder holder : providers.values()) {
if
(holder.extensionInterface.equals(extensionInterface.getName())) {
- // get the right prefix for the namespace. this may be
different then the holder's prefix as there may
+ // get the right prefix for the namespace. this may be
different from the holder's prefix as there may
// be many providers for one namespace defining different
prefixes. the one with the highest service
// ranking wins.
return new ExtensionFactory(holder.getProvider(),
holder.namespace,
diff --git
a/src/test/java/org/apache/sling/sitemap/impl/builder/extensions/ExtensionProviderManagerTest.java
b/src/test/java/org/apache/sling/sitemap/impl/builder/extensions/ExtensionProviderManagerTest.java
new file mode 100644
index 0000000..e40454a
--- /dev/null
+++
b/src/test/java/org/apache/sling/sitemap/impl/builder/extensions/ExtensionProviderManagerTest.java
@@ -0,0 +1,79 @@
+/*
+ * 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.sitemap.impl.builder.extensions;
+
+import org.apache.sling.sitemap.builder.Extension;
+import org.apache.sling.sitemap.spi.builder.SitemapExtensionProvider;
+import org.apache.sling.testing.mock.sling.junit5.SlingContext;
+import org.apache.sling.testing.mock.sling.junit5.SlingContextExtension;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+@ExtendWith({SlingContextExtension.class, MockitoExtension.class})
+class ExtensionProviderManagerTest {
+
+ final SlingContext context = new SlingContext();
+
+ interface Ext1 extends Extension {
+ }
+
+ interface Ext2 extends Extension {
+ }
+
+ @Mock
+ SitemapExtensionProvider extension1;
+ @Mock
+ SitemapExtensionProvider extension2;
+
+ @Test
+ void testWithMultipleExtensionProviders() {
+ context.registerService(
+ SitemapExtensionProvider.class,
+ extension1,
+ SitemapExtensionProvider.PROPERTY_INTERFACE,
Ext1.class.getName(),
+ SitemapExtensionProvider.PROPERTY_PREFIX, "a",
+ SitemapExtensionProvider.PROPERTY_LOCAL_NAME, "ext1",
+ SitemapExtensionProvider.PROPERTY_NAMESPACE,
"https://example.com/");
+ context.registerService(
+ SitemapExtensionProvider.class,
+ extension2,
+ SitemapExtensionProvider.PROPERTY_INTERFACE,
Ext2.class.getName(),
+ SitemapExtensionProvider.PROPERTY_PREFIX, "b",
+ SitemapExtensionProvider.PROPERTY_LOCAL_NAME, "ext2",
+ SitemapExtensionProvider.PROPERTY_NAMESPACE,
"https://example.com/");
+
+ ExtensionProviderManager subject =
context.registerInjectActivateService(new ExtensionProviderManager());
+
+ ExtensionFactory factory1 = subject.getExtensionFactory(Ext1.class);
+ assertNotNull(factory1);
+ ExtensionFactory factory2 = subject.getExtensionFactory(Ext2.class);
+ assertNotNull(factory2);
+
+ // they share the same namespace and so the prefix must be equal
+ assertEquals(factory1.getPrefix(), factory2.getPrefix());
+
+ assertEquals(1, subject.getNamespaces().size());
+ assertEquals("a", subject.getNamespaces().get("https://example.com/"));
+ }
+}