[java-identity-provider] branch main updated: IDP-1652 - Support easier integration into configuration by plugins

Scott Cantor cantor.2 at osu.edu
Mon Sep 21 18:45:00 UTC 2020


This is an automated email from the git hooks/post-receive script.

scantor pushed a commit to branch main
in repository java-identity-provider.

View the commit online:
http://git.shibboleth.net/view/?p=java-identity-provider.git;a=commit;h=b939d3b9ed54c715e586b534ca0ac695102288d7

The following commit(s) were added to refs/heads/main by this push:
       new  b939d3b9e IDP-1652 - Support easier integration into configuration by plugins
b939d3b9e is described below

commit b939d3b9ed54c715e586b534ca0ac695102288d7
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Mon Sep 21 14:44:56 2020 -0400

    IDP-1652 - Support easier integration into configuration by plugins
    
    https://issues.shibboleth.net/jira/browse/IDP-1652
    
    Auto-wire AttributeRegistry naming functions.
---
 .../transcoding/AttributeTranscoderRegistry.java   | 25 +++++++++
 .../attribute/transcoding/BasicNamingFunction.java | 65 ++++++++++++++++++++++
 .../policyrule/saml/impl/BaseMetadataTests.java    |  4 +-
 .../impl/AttributeRegistryServiceStrategy.java     | 30 ++++++----
 .../impl/AttributeTranscoderRegistryImpl.java      | 16 ++----
 .../impl/AttributeTranscoderRegistryImplTest.java  | 12 +++-
 .../CASScopedStringAttributeTranscoderTest.java    |  5 +-
 .../impl/CASStringAttributeTranscoderTest.java     |  5 +-
 .../net/shibboleth/idp/conf/global-system.xml      | 38 +++++++------
 .../net/shibboleth/idp/conf/services-system.xml    |  3 +-
 .../impl/SAML1ByteAttributeTranscoderTest.java     |  5 +-
 .../SAML1ScopedStringAttributeTranscoderTest.java  |  5 +-
 .../impl/SAML1StringAttributeTranscoderTest.java   |  5 +-
 .../impl/SAML2ByteAttributeTranscoderTest.java     |  5 +-
 .../SAML2ScopedStringAttributeTranscoderTest.java  |  5 +-
 .../impl/SAML2StringAttributeTranscoderTest.java   |  5 +-
 .../SAML2XMLObjectAttributeTranscoderTest.java     |  5 +-
 .../impl/AddAttributeStatementToAssertionTest.java | 15 ++---
 .../impl/AddAttributeStatementToAssertionTest.java | 13 +++--
 .../impl/metadata/attribute-registry-service.xml   | 28 +++++++---
 .../idp/saml/impl/metadata/attribute-registry.xml  |  6 --
 .../idp/saml/impl/profile/saml1Mapper.xml          | 13 +++--
 .../idp/saml/impl/profile/saml2Mapper.xml          | 13 +++--
 23 files changed, 225 insertions(+), 101 deletions(-)

diff --git a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AttributeTranscoderRegistry.java b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AttributeTranscoderRegistry.java
index b36ba9876..b9b25ed8b 100644
--- a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AttributeTranscoderRegistry.java
+++ b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AttributeTranscoderRegistry.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.attribute.transcoding;
 import java.util.Collection;
 import java.util.Locale;
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.concurrent.ThreadSafe;
@@ -107,5 +108,29 @@ public interface AttributeTranscoderRegistry extends IdentifiedComponent {
      */
     @Nonnull @NonnullElements @Unmodifiable <T> Collection<TranscodingRule> getTranscodingRules(
             @Nonnull final T from);
+
+    /**
+     * Interface to a naming function that allows an object to be turned into a unique string name.
+     * 
+     * @param <T> type of object
+     * 
+     * @since 4.1.0
+     */
+    interface NamingFunction<T> {
+        
+        /**
+         * Gets the type of object supported.
+         * 
+         * @return object type
+         */
+        @Nonnull Class<T> getType();
         
+        /**
+         * Gets the function that produces a name for an input object.
+         * 
+         * @return naming function
+         */
+        @Nonnull Function<T,String> getFunction();
+    }
+
 }
\ No newline at end of file
diff --git a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/BasicNamingFunction.java b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/BasicNamingFunction.java
new file mode 100644
index 000000000..027dd2f1f
--- /dev/null
+++ b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/BasicNamingFunction.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID 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 net.shibboleth.idp.attribute.transcoding;
+
+import java.util.function.Function;
+
+import javax.annotation.Nonnull;
+
+import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry.NamingFunction;
+import net.shibboleth.utilities.java.support.annotation.ParameterName;
+import net.shibboleth.utilities.java.support.logic.Constraint;
+
+/**
+ * Basic implementation of a {@link NamingFunction}.
+ * 
+ * @param <T> type of object
+ * 
+ * @since 4.1.0
+ */
+public class BasicNamingFunction<T> implements NamingFunction<T> {
+
+    /** Object type. */
+    @Nonnull private final Class<T> objectType;
+    
+    /** Naming function. */
+    @Nonnull private final Function<T,String> namingFunction;
+    
+    /**
+     * Constructor.
+     *
+     * @param claz object type
+     * @param function naming function
+     */
+    public BasicNamingFunction(@Nonnull @ParameterName(name="claz") final Class<T> claz,
+            @Nonnull @ParameterName(name="function") final Function<T,String> function) {
+        objectType = Constraint.isNotNull(claz, "Object type cannot be null");
+        namingFunction = Constraint.isNotNull(function, "Naming function cannot be null");
+    }
+    
+    /** {@inheritDoc} */
+    @Nonnull public Class<T> getType() {
+        return objectType;
+    }
+
+    /** {@inheritDoc} */
+    @Nonnull public Function<T, String> getFunction() {
+        return namingFunction;
+    }
+
+}
\ No newline at end of file
diff --git a/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/BaseMetadataTests.java b/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/BaseMetadataTests.java
index 39ac55d94..a7b498418 100644
--- a/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/BaseMetadataTests.java
+++ b/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/BaseMetadataTests.java
@@ -22,6 +22,7 @@ import java.util.Collections;
 
 import net.shibboleth.ext.spring.testing.MockApplicationContext;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
+import net.shibboleth.idp.attribute.transcoding.BasicNamingFunction;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
 import net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML2AttributeTranscoder;
 import net.shibboleth.idp.saml.metadata.impl.AttributeMappingNodeProcessor;
@@ -67,7 +68,8 @@ public class BaseMetadataTests extends XMLObjectBaseTestCase {
         
         final AttributeTranscoderRegistryImpl registry = new AttributeTranscoderRegistryImpl();
         registry.setId("test");
-        registry.setNamingRegistry(Collections.singletonMap(Attribute.class, new AbstractSAML2AttributeTranscoder.NamingFunction()));
+        registry.setNamingRegistry(Collections.singletonList(
+                new BasicNamingFunction<>(Attribute.class, new AbstractSAML2AttributeTranscoder.NamingFunction())));
         registry.setApplicationContext(new MockApplicationContext());
         registry.initialize();
         
diff --git a/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeRegistryServiceStrategy.java b/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeRegistryServiceStrategy.java
index a83cc5ca2..c7ed10fed 100644
--- a/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeRegistryServiceStrategy.java
+++ b/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeRegistryServiceStrategy.java
@@ -19,7 +19,8 @@ package net.shibboleth.idp.attribute.transcoding.impl;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Map;
+import java.util.Collections;
+import java.util.List;
 import java.util.function.Function;
 
 import javax.annotation.Nonnull;
@@ -27,15 +28,16 @@ import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
 
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
+import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry.NamingFunction;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
 import net.shibboleth.utilities.java.support.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 import net.shibboleth.utilities.java.support.component.ComponentSupport;
-import net.shibboleth.utilities.java.support.primitive.StringSupport;
 import net.shibboleth.utilities.java.support.service.ServiceException;
 import net.shibboleth.utilities.java.support.service.ServiceableComponent;
 
@@ -49,24 +51,30 @@ public class AttributeRegistryServiceStrategy extends AbstractIdentifiableInitia
     @Nonnull private final Logger log = LoggerFactory.getLogger(AttributeRegistryServiceStrategy.class);
 
     /** Name of bean to supply naming function registry property. */
-    @Nullable @NotEmpty private String namingRegistry;
+    @Nullable @NonnullElements private Collection<NamingFunction<?>> namingRegistry;
     
     /**
-     * Set the name of the bean providing the {@link AttributeTranscoderRegistryImpl#setNamingRegistry(Map)} value.
+     * Sets the collection of {@link NamingFunction}s to install into the registry.
      * 
-     * @param beanName name of bean of type {@link Map}
+     * <p>This is done for auto-wiring exposure since plugins may be supplying additional functions
+     * outside the registry's own service context.</p>
+     * 
+     * @param namingFunctions collection of functions to install
      */
-    public void setNamingRegistry(@Nullable @NotEmpty final String beanName) {
+    @Autowired
+    public void setNamingRegistry(@Nullable @NonnullElements final Collection<NamingFunction<?>> namingFunctions) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         
-        namingRegistry = StringSupport.trimOrNull(beanName);
+        if (namingFunctions != null) {
+            namingRegistry = List.copyOf(namingFunctions);
+        } else {
+            namingRegistry = Collections.emptyList();
+        }
     }
     
     /** {@inheritDoc} */
     @Nullable public ServiceableComponent<AttributeTranscoderRegistry> apply(
             @Nullable final ApplicationContext appContext) {
-
-        final Map<Class<?>,Function<?,String>> namingRegistryBean = appContext.getBean(namingRegistry, Map.class);
         
         final Collection<TranscodingRule> mappingBeans = appContext.getBeansOfType(TranscodingRule.class).values();
         final Collection<TranscodingRuleLoader> loaderBeans =
@@ -83,7 +91,7 @@ public class AttributeRegistryServiceStrategy extends AbstractIdentifiableInitia
         final AttributeTranscoderRegistryImpl registry = new AttributeTranscoderRegistryImpl();
         registry.setId(getId());
         registry.setApplicationContext(appContext);
-        registry.setNamingRegistry(namingRegistryBean);
+        registry.setNamingRegistry(namingRegistry);
         registry.setTranscoderRegistry(holder);
 
         try {
diff --git a/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java b/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java
index 096d9b051..2f1483dff 100644
--- a/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java
+++ b/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java
@@ -90,22 +90,18 @@ public class AttributeTranscoderRegistryImpl extends AbstractServiceableComponen
     /**
      * Installs registry of naming functions mapped against the types of objects they support.
      * 
-     * @param registry map of types to naming functions
+     * @param registry collection of naming functions for indexing
      */
-    public void setNamingRegistry(@Nonnull @NonnullElements final Map<Class<?>,Function<?,String>> registry) {
+    public void setNamingRegistry(@Nullable @NonnullElements final Collection<NamingFunction<?>> registry) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         
         namingFunctionRegistry.clear();
         
-        if (registry == null) {
-            return;
+        if (registry != null) {
+            registry.forEach(nf -> {
+                namingFunctionRegistry.put(nf.getType(), nf.getFunction());
+                });
         }
-        
-        registry.forEach((k,v) -> {
-            if (k != null && v != null) {
-                namingFunctionRegistry.put(k, v);
-            }
-        });
     }
 
     /**
diff --git a/idp-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java b/idp-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java
index 2b6656c00..a86b7a2f9 100644
--- a/idp-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java
+++ b/idp-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java
@@ -24,6 +24,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.function.Function;
 
 import static org.testng.Assert.*;
 import org.testng.annotations.AfterClass;
@@ -40,9 +41,10 @@ import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoder;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
+import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry.NamingFunction;
+import net.shibboleth.idp.attribute.transcoding.BasicNamingFunction;
 import net.shibboleth.idp.attribute.transcoding.TranscoderSupport;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
-import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
 import net.shibboleth.utilities.java.support.collection.Pair;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 
@@ -58,7 +60,13 @@ public class AttributeTranscoderRegistryImplTest {
         registry = new AttributeTranscoderRegistryImpl();
         registry.setId("test");
         
-        registry.setNamingRegistry(Collections.singletonMap(Pair.class, (Pair<?,?> p) -> "{Pair}" + p.getFirst().toString()));
+        final NamingFunction nf = new BasicNamingFunction<>(Pair.class,
+                new Function<Pair,String>() {
+                    public String apply(final Pair p) {
+                        return "{Pair}" + p.getFirst().toString();
+                    }
+            });
+        registry.setNamingRegistry(Collections.singletonList(nf));
         
         final PairTranscoder transcoder = new PairTranscoder();
         transcoder.initialize();
diff --git a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASScopedStringAttributeTranscoderTest.java b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASScopedStringAttributeTranscoderTest.java
index 6380fa70f..20434a5ad 100644
--- a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASScopedStringAttributeTranscoderTest.java
+++ b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASScopedStringAttributeTranscoderTest.java
@@ -33,6 +33,7 @@ import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.ScopedStringAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
+import net.shibboleth.idp.attribute.transcoding.BasicNamingFunction;
 import net.shibboleth.idp.attribute.transcoding.TranscoderSupport;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
@@ -67,8 +68,8 @@ public class CASScopedStringAttributeTranscoderTest {
         final CASScopedStringAttributeTranscoder transcoder = new CASScopedStringAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonMap(transcoder.getEncodedType(),
-                new AbstractCASAttributeTranscoder.NamingFunction()));
+        registry.setNamingRegistry(Collections.singletonList(
+                new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractCASAttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
         ruleset1.put(AttributeTranscoderRegistry.PROP_ID, ATTR_ID);
diff --git a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASStringAttributeTranscoderTest.java b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASStringAttributeTranscoderTest.java
index ede574406..78a8489d2 100644
--- a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASStringAttributeTranscoderTest.java
+++ b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASStringAttributeTranscoderTest.java
@@ -37,6 +37,7 @@ import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.ScopedStringAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
+import net.shibboleth.idp.attribute.transcoding.BasicNamingFunction;
 import net.shibboleth.idp.attribute.transcoding.TranscoderSupport;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
@@ -63,8 +64,8 @@ public class CASStringAttributeTranscoderTest {
         final CASStringAttributeTranscoder transcoder = new CASStringAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonMap(transcoder.getEncodedType(),
-                new AbstractCASAttributeTranscoder.NamingFunction()));
+        registry.setNamingRegistry(Collections.singletonList(
+                new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractCASAttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
         ruleset1.put(AttributeTranscoderRegistry.PROP_ID, ATTR_ID);
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/conf/global-system.xml b/idp-conf-impl/src/main/resources/net/shibboleth/idp/conf/global-system.xml
index 2083038bb..09791c8a4 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/conf/global-system.xml
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/conf/global-system.xml
@@ -105,6 +105,7 @@
                 <value>idp.authn.resolveAttribute</value>
                 <value>idp.nameid.saml1.legacyGenerator</value>
                 <value>idp.nameid.saml2.legacyGenerator</value>
+                <value>idp.service.attribute.registry.namingRegistry</value>
             </list>
         </property>
     </bean>
@@ -328,23 +329,26 @@
         p:useDefaultTimeZone="#{getObject('shibboleth.AuditDefaultTimeZone') ?: false}"
         p:fieldReplacements="#{getObject('shibboleth.AuditFieldReplacementMap')}" />
 
-    <!-- Default attribute mapping support for new registry service, exposed here for extension use. -->
-            
-    <bean id="shibboleth.DefaultNamingRegistry"
-            class="org.springframework.beans.factory.config.MapFactoryBean">
-        <property name="sourceMap">
-            <map>
-                <entry key="#{T(org.opensaml.saml.saml2.core.Attribute)}">
-                    <bean class="net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML2AttributeTranscoder.NamingFunction" />
-                </entry>
-                <entry key="#{T(org.opensaml.saml.saml1.core.AttributeDesignator)}">
-                    <bean class="net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML1AttributeTranscoder.NamingFunction" />
-                </entry>
-                <entry key="#{T(net.shibboleth.idp.cas.attribute.Attribute)}">
-                    <bean class="net.shibboleth.idp.cas.attribute.AbstractCASAttributeTranscoder.NamingFunction" />
-                </entry>
-            </map>
-        </property>
+    <!-- Default attribute mapping support for registry service, exposed here for extension use. -->
+
+    <bean id="shibboleth.RegistryNamingFunction" abstract="true"
+        class="net.shibboleth.idp.attribute.transcoding.BasicNamingFunction" />
+
+    <!-- Built-in naming functions. -->
+    <bean parent="shibboleth.RegistryNamingFunction" c:claz="org.opensaml.saml.saml2.core.Attribute">
+        <constructor-arg name="function">
+            <bean class="net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML2AttributeTranscoder.NamingFunction" />
+        </constructor-arg>    
+    </bean>
+    <bean parent="shibboleth.RegistryNamingFunction" c:claz="org.opensaml.saml.saml1.core.AttributeDesignator">
+        <constructor-arg name="function">
+            <bean class="net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML1AttributeTranscoder.NamingFunction" />
+        </constructor-arg>    
+    </bean>
+    <bean parent="shibboleth.RegistryNamingFunction" c:claz="net.shibboleth.idp.cas.attribute.Attribute">
+        <constructor-arg name="function">
+            <bean class="net.shibboleth.idp.cas.attribute.AbstractCASAttributeTranscoder.NamingFunction" />
+        </constructor-arg>    
     </bean>
 
  </beans>
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/conf/services-system.xml b/idp-conf-impl/src/main/resources/net/shibboleth/idp/conf/services-system.xml
index 0b3b3289d..14de4d60c 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/conf/services-system.xml
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/conf/services-system.xml
@@ -62,8 +62,7 @@
 	        p:beanFactoryPostProcessors-ref="shibboleth.PropertySourcesPlaceholderConfigurer">
 	    <constructor-arg name="claz" value="net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry" />
 	    <constructor-arg name="strategy">
-	       <bean class="net.shibboleth.idp.attribute.transcoding.impl.AttributeRegistryServiceStrategy"
-	           p:namingRegistry="#{'%{idp.service.attribute.registry.namingRegistry:shibboleth.DefaultNamingRegistry}'.trim()}" />
+	       <bean class="net.shibboleth.idp.attribute.transcoding.impl.AttributeRegistryServiceStrategy" />
 	    </constructor-arg>
     </bean>
     <bean id ="shibboleth.DefaultAttributeRegistryResources" class="net.shibboleth.ext.spring.factory.CombiningListFactoryBean"
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ByteAttributeTranscoderTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ByteAttributeTranscoderTest.java
index 885b2f10d..a58414610 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ByteAttributeTranscoderTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ByteAttributeTranscoderTest.java
@@ -34,6 +34,7 @@ import net.shibboleth.idp.attribute.IdPRequestedAttribute;
 import net.shibboleth.idp.attribute.ScopedStringAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
+import net.shibboleth.idp.attribute.transcoding.BasicNamingFunction;
 import net.shibboleth.idp.attribute.transcoding.TranscoderSupport;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
@@ -93,8 +94,8 @@ public class SAML1ByteAttributeTranscoderTest extends OpenSAMLInitBaseTestCase {
         final SAML1ByteAttributeTranscoder transcoder = new SAML1ByteAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonMap(transcoder.getEncodedType(),
-                new AbstractSAML1AttributeTranscoder.NamingFunction()));
+        registry.setNamingRegistry(Collections.singletonList(
+                new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractSAML1AttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
         ruleset1.put(AttributeTranscoderRegistry.PROP_ID, ATTR_NAME);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ScopedStringAttributeTranscoderTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ScopedStringAttributeTranscoderTest.java
index 3c6beb6b1..93378002e 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ScopedStringAttributeTranscoderTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ScopedStringAttributeTranscoderTest.java
@@ -33,6 +33,7 @@ import net.shibboleth.idp.attribute.IdPRequestedAttribute;
 import net.shibboleth.idp.attribute.ScopedStringAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
+import net.shibboleth.idp.attribute.transcoding.BasicNamingFunction;
 import net.shibboleth.idp.attribute.transcoding.TranscoderSupport;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
@@ -97,8 +98,8 @@ public class SAML1ScopedStringAttributeTranscoderTest extends OpenSAMLInitBaseTe
         final SAML1ScopedStringAttributeTranscoder transcoder = new SAML1ScopedStringAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonMap(transcoder.getEncodedType(),
-                new AbstractSAML1AttributeTranscoder.NamingFunction()));
+        registry.setNamingRegistry(Collections.singletonList(
+                new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractSAML1AttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
         ruleset1.put(AttributeTranscoderRegistry.PROP_ID, ATTR_NAME);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1StringAttributeTranscoderTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1StringAttributeTranscoderTest.java
index 516c1e618..77128ae83 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1StringAttributeTranscoderTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1StringAttributeTranscoderTest.java
@@ -33,6 +33,7 @@ import net.shibboleth.idp.attribute.IdPRequestedAttribute;
 import net.shibboleth.idp.attribute.ScopedStringAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
+import net.shibboleth.idp.attribute.transcoding.BasicNamingFunction;
 import net.shibboleth.idp.attribute.transcoding.TranscoderSupport;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
@@ -87,8 +88,8 @@ public class SAML1StringAttributeTranscoderTest extends OpenSAMLInitBaseTestCase
         final SAML1StringAttributeTranscoder transcoder = new SAML1StringAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonMap(transcoder.getEncodedType(),
-                new AbstractSAML1AttributeTranscoder.NamingFunction()));
+        registry.setNamingRegistry(Collections.singletonList(
+                new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractSAML1AttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
         ruleset1.put(AttributeTranscoderRegistry.PROP_ID, ATTR_NAME);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ByteAttributeTranscoderTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ByteAttributeTranscoderTest.java
index 2452c4e85..0bdfd83db 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ByteAttributeTranscoderTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ByteAttributeTranscoderTest.java
@@ -49,6 +49,7 @@ import net.shibboleth.idp.attribute.IdPRequestedAttribute;
 import net.shibboleth.idp.attribute.ScopedStringAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
+import net.shibboleth.idp.attribute.transcoding.BasicNamingFunction;
 import net.shibboleth.idp.attribute.transcoding.TranscoderSupport;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
@@ -94,8 +95,8 @@ public class SAML2ByteAttributeTranscoderTest extends OpenSAMLInitBaseTestCase {
         final SAML2ByteAttributeTranscoder transcoder = new SAML2ByteAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonMap(transcoder.getEncodedType(),
-                new AbstractSAML2AttributeTranscoder.NamingFunction()));
+        registry.setNamingRegistry(Collections.singletonList(
+                new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractSAML2AttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
         ruleset1.put(AttributeTranscoderRegistry.PROP_ID, ATTR_NAME);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ScopedStringAttributeTranscoderTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ScopedStringAttributeTranscoderTest.java
index 1608dd9a1..5c88674ba 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ScopedStringAttributeTranscoderTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ScopedStringAttributeTranscoderTest.java
@@ -33,6 +33,7 @@ import net.shibboleth.idp.attribute.IdPRequestedAttribute;
 import net.shibboleth.idp.attribute.ScopedStringAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
+import net.shibboleth.idp.attribute.transcoding.BasicNamingFunction;
 import net.shibboleth.idp.attribute.transcoding.TranscoderSupport;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
@@ -91,8 +92,8 @@ public class SAML2ScopedStringAttributeTranscoderTest extends OpenSAMLInitBaseTe
         final SAML2ScopedStringAttributeTranscoder transcoder = new SAML2ScopedStringAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonMap(transcoder.getEncodedType(),
-                new AbstractSAML2AttributeTranscoder.NamingFunction()));
+        registry.setNamingRegistry(Collections.singletonList(
+                new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractSAML2AttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
         ruleset1.put(AttributeTranscoderRegistry.PROP_ID, ATTR_NAME);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2StringAttributeTranscoderTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2StringAttributeTranscoderTest.java
index 7cf451fab..89968b76b 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2StringAttributeTranscoderTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2StringAttributeTranscoderTest.java
@@ -32,6 +32,7 @@ import net.shibboleth.idp.attribute.IdPRequestedAttribute;
 import net.shibboleth.idp.attribute.ScopedStringAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
+import net.shibboleth.idp.attribute.transcoding.BasicNamingFunction;
 import net.shibboleth.idp.attribute.transcoding.TranscoderSupport;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
@@ -87,8 +88,8 @@ public class SAML2StringAttributeTranscoderTest extends OpenSAMLInitBaseTestCase
         final SAML2StringAttributeTranscoder transcoder = new SAML2StringAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonMap(transcoder.getEncodedType(),
-                new AbstractSAML2AttributeTranscoder.NamingFunction()));
+        registry.setNamingRegistry(Collections.singletonList(
+                new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractSAML2AttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
         ruleset1.put(AttributeTranscoderRegistry.PROP_ID, ATTR_NAME);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2XMLObjectAttributeTranscoderTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2XMLObjectAttributeTranscoderTest.java
index 5ee1386e4..6a84d18b4 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2XMLObjectAttributeTranscoderTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2XMLObjectAttributeTranscoderTest.java
@@ -34,6 +34,7 @@ import net.shibboleth.idp.attribute.IdPRequestedAttribute;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.XMLObjectAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
+import net.shibboleth.idp.attribute.transcoding.BasicNamingFunction;
 import net.shibboleth.idp.attribute.transcoding.TranscoderSupport;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
@@ -92,8 +93,8 @@ public class SAML2XMLObjectAttributeTranscoderTest extends OpenSAMLInitBaseTestC
         final SAML2XMLObjectAttributeTranscoder transcoder = new SAML2XMLObjectAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonMap(transcoder.getEncodedType(),
-                new AbstractSAML2AttributeTranscoder.NamingFunction()));
+        registry.setNamingRegistry(Collections.singletonList(
+                new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractSAML2AttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
         ruleset1.put(AttributeTranscoderRegistry.PROP_ID, ATTR_NAME);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAttributeStatementToAssertionTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAttributeStatementToAssertionTest.java
index 1defbe594..91f3eb645 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAttributeStatementToAssertionTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAttributeStatementToAssertionTest.java
@@ -31,6 +31,7 @@ import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.context.AttributeContext;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
+import net.shibboleth.idp.attribute.transcoding.BasicNamingFunction;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
 import net.shibboleth.idp.profile.IdPEventIds;
@@ -98,8 +99,8 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
         registry = new AttributeTranscoderRegistryImpl();
         registry.setId("test");
         
-        registry.setNamingRegistry(Collections.singletonMap(AttributeDesignator.class,
-                new AbstractSAML1AttributeTranscoder.NamingFunction()));
+        registry.setNamingRegistry(Collections.singletonList(
+                new BasicNamingFunction<>(AttributeDesignator.class, new AbstractSAML1AttributeTranscoder.NamingFunction())));
 
         final SAML1StringAttributeTranscoder transcoder = new SAML1StringAttributeTranscoder();
         transcoder.initialize();
@@ -197,9 +198,9 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
         final AttributeTranscoderRegistryImpl localregistry = new AttributeTranscoderRegistryImpl();
         localregistry.setId("test");
         
-        localregistry.setNamingRegistry(Collections.singletonMap(AttributeDesignator.class,
-                new AbstractSAML1AttributeTranscoder.NamingFunction()));
-        
+        localregistry.setNamingRegistry(Collections.singletonList(
+                new BasicNamingFunction<>(AttributeDesignator.class, new AbstractSAML1AttributeTranscoder.NamingFunction())));
+
         final MockSAML1StringAttributeTranscoder transcoder = new MockSAML1StringAttributeTranscoder();
         transcoder.initialize();
         
@@ -238,8 +239,8 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
         final AttributeTranscoderRegistryImpl localregistry = new AttributeTranscoderRegistryImpl();
         localregistry.setId("test");
         
-        localregistry.setNamingRegistry(Collections.singletonMap(AttributeDesignator.class,
-                new AbstractSAML1AttributeTranscoder.NamingFunction()));
+        localregistry.setNamingRegistry(Collections.singletonList(
+                new BasicNamingFunction<>(AttributeDesignator.class, new AbstractSAML1AttributeTranscoder.NamingFunction())));
 
         final MockSAML1StringAttributeTranscoder transcoder = new MockSAML1StringAttributeTranscoder();
         transcoder.initialize();
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAttributeStatementToAssertionTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAttributeStatementToAssertionTest.java
index 66daedddd..738756655 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAttributeStatementToAssertionTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAttributeStatementToAssertionTest.java
@@ -31,6 +31,7 @@ import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.context.AttributeContext;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
+import net.shibboleth.idp.attribute.transcoding.BasicNamingFunction;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
 import net.shibboleth.idp.profile.IdPEventIds;
@@ -100,8 +101,8 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
         registry = new AttributeTranscoderRegistryImpl();
         registry.setId("test");
         
-        registry.setNamingRegistry(Collections.singletonMap(Attribute.class,
-                new AbstractSAML2AttributeTranscoder.NamingFunction()));
+        registry.setNamingRegistry(Collections.singletonList(
+                new BasicNamingFunction<>(Attribute.class, new AbstractSAML2AttributeTranscoder.NamingFunction())));
 
         final SAML2StringAttributeTranscoder transcoder = new SAML2StringAttributeTranscoder();
         transcoder.initialize();
@@ -205,8 +206,8 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
         final AttributeTranscoderRegistryImpl localregistry = new AttributeTranscoderRegistryImpl();
         localregistry.setId("test");
         
-        localregistry.setNamingRegistry(Collections.singletonMap(Attribute.class,
-                new AbstractSAML2AttributeTranscoder.NamingFunction()));
+        localregistry.setNamingRegistry(Collections.singletonList(
+                new BasicNamingFunction<>(Attribute.class, new AbstractSAML2AttributeTranscoder.NamingFunction())));
         
         final MockSAML2StringAttributeTranscoder transcoder = new MockSAML2StringAttributeTranscoder();
         transcoder.initialize();
@@ -246,8 +247,8 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
         final AttributeTranscoderRegistryImpl localregistry = new AttributeTranscoderRegistryImpl();
         localregistry.setId("test");
         
-        localregistry.setNamingRegistry(Collections.singletonMap(Attribute.class,
-                new AbstractSAML2AttributeTranscoder.NamingFunction()));
+        localregistry.setNamingRegistry(Collections.singletonList(
+                new BasicNamingFunction<>(Attribute.class, new AbstractSAML2AttributeTranscoder.NamingFunction())));
 
         final MockSAML2StringAttributeTranscoder transcoder = new MockSAML2StringAttributeTranscoder();
         transcoder.initialize();
diff --git a/idp-saml-impl/src/test/resources/net/shibboleth/idp/saml/impl/metadata/attribute-registry-service.xml b/idp-saml-impl/src/test/resources/net/shibboleth/idp/saml/impl/metadata/attribute-registry-service.xml
index 271cd9a1b..a97baa7ba 100644
--- a/idp-saml-impl/src/test/resources/net/shibboleth/idp/saml/impl/metadata/attribute-registry-service.xml
+++ b/idp-saml-impl/src/test/resources/net/shibboleth/idp/saml/impl/metadata/attribute-registry-service.xml
@@ -1,24 +1,34 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
+        xmlns:context="http://www.springframework.org/schema/context"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:util="http://www.springframework.org/schema/util"
         xmlns:p="http://www.springframework.org/schema/p"
         xmlns:c="http://www.springframework.org/schema/c"
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                             http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
         default-init-method="initialize"
         default-destroy-method="destroy">
-        
-    <bean id="shibboleth.AttributeRegistryService" class="net.shibboleth.ext.spring.service.ReloadableSpringService" p:failFast="true"
-        p:reloadCheckDelay="0">
 
-        <constructor-arg name="claz"
-            value="net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry" />
-        <constructor-arg name="strategy">
-            <bean class="net.shibboleth.idp.attribute.transcoding.impl.AttributeRegistryServiceStrategy"
-                p:id="shibboleth.AttributeRegistryService"
-                p:namingRegistry="DefaultNamingRegistry" />
+    <!-- Needed to allow for auto-wiring of descriptors and other componnents. -->
+    <context:annotation-config />
+        
+    <bean id="SAML2NamingFunction" class="net.shibboleth.idp.attribute.transcoding.BasicNamingFunction"
+            c:claz="org.opensaml.saml.saml2.core.Attribute">
+        <constructor-arg name="function">
+            <bean class="net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML2AttributeTranscoder.NamingFunction" />
         </constructor-arg>
+    </bean>
+    
+    <bean id="RegistryServiceStrategy" class="net.shibboleth.idp.attribute.transcoding.impl.AttributeRegistryServiceStrategy"
+        p:id="shibboleth.AttributeRegistryService" />
+
+    <bean id="shibboleth.AttributeRegistryService" class="net.shibboleth.ext.spring.service.ReloadableSpringService"
+            c:claz="net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry"
+            c:strategy-ref="RegistryServiceStrategy"
+            p:failFast="true"
+            p:reloadCheckDelay="0">
         <property name="serviceConfigurations">
             <util:list>
                 <value>net/shibboleth/idp/saml/impl/metadata/attribute-registry.xml</value>
diff --git a/idp-saml-impl/src/test/resources/net/shibboleth/idp/saml/impl/metadata/attribute-registry.xml b/idp-saml-impl/src/test/resources/net/shibboleth/idp/saml/impl/metadata/attribute-registry.xml
index c71cafc34..307cf3132 100644
--- a/idp-saml-impl/src/test/resources/net/shibboleth/idp/saml/impl/metadata/attribute-registry.xml
+++ b/idp-saml-impl/src/test/resources/net/shibboleth/idp/saml/impl/metadata/attribute-registry.xml
@@ -21,12 +21,6 @@
     <bean id="SAML2XMLObjectTranscoder"
         class="net.shibboleth.idp.saml.attribute.transcoding.impl.SAML2XMLObjectAttributeTranscoder" />
 
-    <util:map id="DefaultNamingRegistry">
-        <entry key="#{T(org.opensaml.saml.saml2.core.Attribute)}">
-            <bean class="net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML2AttributeTranscoder.NamingFunction" />
-        </entry>
-    </util:map>
-        
     <bean id="shibboleth.TranscodingRuleLoader"
         class="net.shibboleth.idp.attribute.transcoding.impl.TranscodingRuleLoader"
         c:dir="net/shibboleth/idp/saml/impl/metadata/rules" />
diff --git a/idp-saml-impl/src/test/resources/net/shibboleth/idp/saml/impl/profile/saml1Mapper.xml b/idp-saml-impl/src/test/resources/net/shibboleth/idp/saml/impl/profile/saml1Mapper.xml
index fc1f0de0b..f26fd38ae 100644
--- a/idp-saml-impl/src/test/resources/net/shibboleth/idp/saml/impl/profile/saml1Mapper.xml
+++ b/idp-saml-impl/src/test/resources/net/shibboleth/idp/saml/impl/profile/saml1Mapper.xml
@@ -2,6 +2,7 @@
 <beans xmlns="http://www.springframework.org/schema/beans"
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 	xmlns:util="http://www.springframework.org/schema/util"
+    xmlns:c="http://www.springframework.org/schema/c"
 	xmlns:p="http://www.springframework.org/schema/p"
 	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 	   http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
@@ -78,15 +79,15 @@
 
     </util:list>
     
-    <util:map id="DefaultNamingRegistry">
-        <entry key="#{T(org.opensaml.saml.saml1.core.AttributeDesignator)}">
+    <bean id="SAML1NamingFunction" class="net.shibboleth.idp.attribute.transcoding.BasicNamingFunction"
+            c:claz="org.opensaml.saml.saml1.core.AttributeDesignator">
+        <constructor-arg name="function">
             <bean class="net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML1AttributeTranscoder.NamingFunction" />
-        </entry>
-    </util:map>
-
+        </constructor-arg>
+    </bean>
 
     <bean id="AttributeTranscoderRegistry" class="net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl"
-        p:namingRegistry-ref="DefaultNamingRegistry"
+        p:namingRegistry-ref="SAML1NamingFunction"
         p:transcoderRegistry-ref="DefaultAttributeRegistry" />
         
 </beans>
diff --git a/idp-saml-impl/src/test/resources/net/shibboleth/idp/saml/impl/profile/saml2Mapper.xml b/idp-saml-impl/src/test/resources/net/shibboleth/idp/saml/impl/profile/saml2Mapper.xml
index 6d1ee6f10..acb33001f 100644
--- a/idp-saml-impl/src/test/resources/net/shibboleth/idp/saml/impl/profile/saml2Mapper.xml
+++ b/idp-saml-impl/src/test/resources/net/shibboleth/idp/saml/impl/profile/saml2Mapper.xml
@@ -2,6 +2,7 @@
 <beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:util="http://www.springframework.org/schema/util"
+    xmlns:c="http://www.springframework.org/schema/c"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
@@ -77,15 +78,15 @@
 
     </util:list>
 	
-    <util:map id="DefaultNamingRegistry">
-        <entry key="#{T(org.opensaml.saml.saml2.core.Attribute)}">
+    <bean id="SAML2NamingFunction" class="net.shibboleth.idp.attribute.transcoding.BasicNamingFunction"
+            c:claz="org.opensaml.saml.saml2.core.Attribute">
+        <constructor-arg name="function">
             <bean class="net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML2AttributeTranscoder.NamingFunction" />
-        </entry>
-    </util:map>
-
+        </constructor-arg>
+    </bean>
 
     <bean id="AttributeTranscoderRegistry" class="net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl"
-        p:namingRegistry-ref="DefaultNamingRegistry"
+        p:namingRegistry-ref="SAML2NamingFunction"
         p:transcoderRegistry-ref="DefaultAttributeRegistry" />
 	
 </beans>

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list