[java-identity-provider] branch feature/IDP-1434 updated: Adjust configuration of transcoding rules using a go-between class.

Scott Cantor cantor.2 at osu.edu
Tue May 7 10:57:03 EDT 2019


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

scantor pushed a commit to branch feature/IDP-1434
in repository java-identity-provider.

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

The following commit(s) were added to refs/heads/feature/IDP-1434 by this push:
       new  1ccd73b   Adjust configuration of transcoding rules using a go-between class.
1ccd73b is described below

commit 1ccd73b4e751e309ff2b77740c76d7c2c75ed722
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Tue May 7 10:57:00 2019 -0400

    Adjust configuration of transcoding rules using a go-between class.
---
 .../impl/AttributeTranscoderRegistryImpl.java      | 16 ++--
 .../transcoding/impl/TranscodingRule.java          | 68 +++++++++++++++++
 .../impl/AttributeTranscoderRegistryImplTest.java  |  6 +-
 .../spring/enc/BaseAttributeEncoderParser.java     |  7 +-
 .../impl/AttributeRegistryServiceStrategy.java     | 19 +----
 .../spring/BaseEncoderDefinitionParserTest.java    | 13 ++--
 .../attribute/resolver/spring/enc/Regressions.java |  6 +-
 .../enc/SAML1Base64AttributeEncoderParserTest.java | 14 +---
 ...AML1ScopedStringAttributeEncoderParserTest.java | 14 +---
 .../enc/SAML1StringAttributeEncoderParserTest.java | 14 +---
 .../SAML1XMLObjectAttributeEncoderParserTest.java  | 14 +---
 .../enc/SAML2Base64AttributeEncoderParserTest.java | 14 +---
 ...AML2ScopedStringAttributeEncoderParserTest.java | 14 +---
 .../enc/SAML2StringAttributeEncoderParserTest.java | 14 +---
 .../SAML2XMLObjectAttributeEncoderParserTest.java  | 14 +---
 .../system/conf/attribute-registry-system.xml      |  3 +
 .../impl/SAML1ByteAttributeTranscoderTest.java     |  3 +-
 .../SAML1ScopedStringAttributeTranscoderTest.java  |  3 +-
 .../impl/SAML1StringAttributeTranscoderTest.java   |  3 +-
 .../impl/SAML2ByteAttributeTranscoderTest.java     |  3 +-
 .../SAML2ScopedStringAttributeTranscoderTest.java  |  3 +-
 .../impl/SAML2StringAttributeTranscoderTest.java   |  3 +-
 .../SAML2XMLObjectAttributeTranscoderTest.java     |  3 +-
 .../impl/AddAttributeStatementToAssertionTest.java | 10 ++-
 .../impl/AddAttributeStatementToAssertionTest.java | 10 ++-
 .../idp/saml/impl/profile/saml1Mapper.xml          | 85 ++++++++++++++--------
 .../idp/saml/impl/profile/saml2Mapper.xml          | 77 +++++++++++++-------
 27 files changed, 256 insertions(+), 197 deletions(-)

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 b55d36c..c72eac8 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
@@ -106,7 +106,7 @@ public class AttributeTranscoderRegistryImpl extends AbstractServiceableComponen
      * 
      * <p>The rules MUST contain at least:</p>
      * <ul>
-     *  <li>{@link #PROP_ID} - an {@link AttributeTranscoder} instance supporting the type</li>
+     *  <li>{@link #PROP_ID} - internal attribute ID to map to/from</li>
      *  <li>{@link #PROP_TRANSCODER} - an {@link AttributeTranscoder} instance supporting the type</li>
      * </ul>
      * 
@@ -114,7 +114,7 @@ public class AttributeTranscoderRegistryImpl extends AbstractServiceableComponen
      * 
      * @param mappings transcoding rulesets
      */
-    public void setTranscoderRegistry(@Nonnull @NonnullElements final Collection<Map<String,Object>> mappings) {
+    public void setTranscoderRegistry(@Nonnull @NonnullElements final Collection<TranscodingRule> mappings) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         
        transcodingRegistry.clear();
@@ -123,20 +123,20 @@ public class AttributeTranscoderRegistryImpl extends AbstractServiceableComponen
             return;
         }
         
-        for (final Map<String,Object> mapping : Collections2.filter(mappings, Predicates.notNull())) {
+        for (final TranscodingRule mapping : Collections2.filter(mappings, Predicates.notNull())) {
             
-            final Object prop = mapping.get(PROP_ID);
+            final Object prop = mapping.getMap().get(PROP_ID);
             final String internalId = StringSupport.trimOrNull(prop instanceof String ? (String) prop : null);
             if (internalId != null) {
 
-                final Predicate activationCondition = buildActivationCondition(mapping);
+                final Predicate activationCondition = buildActivationCondition(mapping.getMap());
                 if (activationCondition != null) {
-                    mapping.put(PROP_CONDITION, activationCondition);
+                    mapping.getMap().put(PROP_CONDITION, activationCondition);
                 } else {
-                    mapping.remove(PROP_CONDITION);
+                    mapping.getMap().remove(PROP_CONDITION);
                 }
                 
-                addMapping(internalId, mapping);
+                addMapping(internalId, mapping.getMap());
             }
         }
     }
diff --git a/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/TranscodingRule.java b/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/TranscodingRule.java
new file mode 100644
index 0000000..52c163f
--- /dev/null
+++ b/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/TranscodingRule.java
@@ -0,0 +1,68 @@
+/*
+ * 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.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
+
+import net.shibboleth.idp.attribute.transcoding.AttributeTranscoder;
+import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
+import net.shibboleth.utilities.java.support.annotation.ParameterName;
+import net.shibboleth.utilities.java.support.annotation.constraint.Live;
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
+
+/**
+ * Wrapper around a {@link Map} representing a rule for transcoding, used to
+ * detect and load the rules at runtime from a Spring context.
+ */
+public class TranscodingRule {
+
+    /** Underlying map containing the rule. */
+    @Nonnull @NonnullElements private final Map<String,Object> rule;
+    
+    /**
+     * Constructor.
+     * 
+     * @param map a map containing the rule
+     * 
+     * <p>The rule MUST contain at least:</p>
+     * <ul>
+     *  <li>
+     *  {@link AttributeTranscoderRegistry#PROP_ID} - internal attribute ID to map to/from
+     *  </li>
+     *  <li>
+     *  {@link AttributeTranscoderRegistry#PROP_TRANSCODER} - {@link AttributeTranscoder} instance supporting the type
+     *  </li>
+     * </ul>
+     */
+    public TranscodingRule(@Nonnull @NonnullElements @ParameterName(name="map") final Map<String,Object> map) {
+        rule = new HashMap<>(map);
+    }
+ 
+    /**
+     * Access the underlying mapping rule.
+     * 
+     * @return the map representing the rule
+     */
+    @Nonnull @NonnullElements @Live public Map<String,Object> getMap() {
+        return rule;
+    }
+    
+}
\ No newline at end of file
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 fcf1dec..6b0a089 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
@@ -82,7 +82,11 @@ public class AttributeTranscoderRegistryImplTest {
         ruleset4.put(AttributeTranscoderRegistry.PROP_TRANSCODER, "net.shibboleth.idp.attribute.transcoding.impl.PairTranscoder");
         ruleset4.put("name", "baz");
         
-        registry.setTranscoderRegistry(Arrays.asList(ruleset1, ruleset2, ruleset3, ruleset4));
+        registry.setTranscoderRegistry(Arrays.asList(
+                new TranscodingRule(ruleset1),
+                new TranscodingRule(ruleset2),
+                new TranscodingRule(ruleset3),
+                new TranscodingRule(ruleset4)));
         
         registry.initialize();
     }
diff --git a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/BaseAttributeEncoderParser.java b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/BaseAttributeEncoderParser.java
index 08030e5..1bdda33 100644
--- a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/BaseAttributeEncoderParser.java
+++ b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/BaseAttributeEncoderParser.java
@@ -17,13 +17,13 @@
 
 package net.shibboleth.idp.attribute.resolver.spring.enc;
 
-import java.util.Collections;
 import java.util.Map;
 
 import javax.annotation.Nonnull;
 
 import net.shibboleth.idp.attribute.resolver.spring.impl.AttributeResolverNamespaceHandler;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
+import net.shibboleth.idp.attribute.transcoding.impl.TranscodingRule;
 import net.shibboleth.idp.profile.logic.ScriptedPredicate;
 import net.shibboleth.idp.profile.spring.relyingparty.metadata.ScriptTypeBeanParser;
 import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
@@ -53,8 +53,8 @@ public abstract class BaseAttributeEncoderParser extends AbstractSingleBeanDefin
 
     /** {@inheritDoc} */
     @Override
-    protected Class<?> getBeanClass(final Element element) {
-        return Collections.class;
+    protected Class<TranscodingRule> getBeanClass(final Element element) {
+        return TranscodingRule.class;
     }
     
     /** {@inheritDoc} */
@@ -75,7 +75,6 @@ public abstract class BaseAttributeEncoderParser extends AbstractSingleBeanDefin
 
         final ManagedMap rule = new ManagedMap();
 
-        builder.setFactoryMethod("singletonList");
         builder.addConstructorArgValue(rule);
         
         if (config.getParentNode() instanceof Element && ((Element)config.getParentNode()).hasAttributeNS(null, "id")) {
diff --git a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/transcoding/spring/impl/AttributeRegistryServiceStrategy.java b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/transcoding/spring/impl/AttributeRegistryServiceStrategy.java
index 18103d9..8601fe9 100644
--- a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/transcoding/spring/impl/AttributeRegistryServiceStrategy.java
+++ b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/transcoding/spring/impl/AttributeRegistryServiceStrategy.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.attribute.transcoding.spring.impl;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Map;
 import java.util.function.Function;
@@ -29,11 +28,9 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.ApplicationContext;
 
-import com.google.common.base.Predicates;
-import com.google.common.collect.Collections2;
-
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
+import net.shibboleth.idp.attribute.transcoding.impl.TranscodingRule;
 import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
 import net.shibboleth.utilities.java.support.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
@@ -71,21 +68,11 @@ public class AttributeRegistryServiceStrategy extends AbstractIdentifiableInitia
 
         final Map<Class<?>,Function<?,String>> namingRegistryBean = appContext.getBean(namingRegistry, Map.class);
         
-        final Collection<Collection> mappingBeans = appContext.getBeansOfType(Collection.class).values();
-        
-        final Collection<Map<String,Object>> mappings = new ArrayList<>();
-        
-        for (final Collection c : Collections2.filter(mappingBeans, Predicates.notNull())) {
-            for (final Object o : c) {
-                if (o instanceof Map) {
-                    mappings.add((Map<String,Object>) o);
-                }
-            }
-        }
+        final Collection<TranscodingRule> mappingBeans = appContext.getBeansOfType(TranscodingRule.class).values();
 
         final AttributeTranscoderRegistryImpl registry = new AttributeTranscoderRegistryImpl();
         registry.setNamingRegistry(namingRegistryBean);
-        registry.setTranscoderRegistry(mappings);
+        registry.setTranscoderRegistry(mappingBeans);
         registry.setId(getId());
         registry.setApplicationContext(appContext);
 
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/BaseEncoderDefinitionParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/BaseEncoderDefinitionParserTest.java
index a38f64d..807ea81 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/BaseEncoderDefinitionParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/BaseEncoderDefinitionParserTest.java
@@ -20,7 +20,6 @@ package net.shibboleth.idp.attribute.resolver.spring;
 import static net.shibboleth.idp.saml.attribute.transcoding.SAMLAttributeTranscoder.PROP_ENCODE_TYPE;
 import static org.testng.Assert.assertTrue;
 
-import java.util.Collection;
 import java.util.Map;
 
 import org.springframework.context.support.GenericApplicationContext;
@@ -29,16 +28,18 @@ import org.springframework.core.env.StandardEnvironment;
 import org.springframework.mock.env.MockPropertySource;
 import org.testng.annotations.Test;
 
+import net.shibboleth.idp.attribute.transcoding.impl.TranscodingRule;
+
 /**
  * Base class for testing Attribute Encoding Parsers
  */
 public abstract class BaseEncoderDefinitionParserTest extends BaseAttributeDefinitionParserTest {
 
-    protected Collection<Map<String,Object>> getAttributeTranscoderRule(final String fileName) {
+    protected TranscodingRule getAttributeTranscoderRule(final String fileName) {
         return getAttributeTranscoderRule(fileName, null, null);
     }
     
-    protected Collection<Map<String,Object>> getAttributeTranscoderRule(final String fileName,final boolean activation, final Boolean encodeType) {
+    protected TranscodingRule getAttributeTranscoderRule(final String fileName,final boolean activation, final Boolean encodeType) {
         final String encodeTypeString;
         if (null == encodeType) {
             encodeTypeString = null;
@@ -50,7 +51,7 @@ public abstract class BaseEncoderDefinitionParserTest extends BaseAttributeDefin
         return getAttributeTranscoderRule(fileName, activation?"true":"false", encodeTypeString);
     }
 
-    private Collection<Map<String,Object>> getAttributeTranscoderRule(final String fileName,
+    private TranscodingRule getAttributeTranscoderRule(final String fileName,
             final String activationValue,
             final String encodeType) {
 
@@ -70,12 +71,12 @@ public abstract class BaseEncoderDefinitionParserTest extends BaseAttributeDefin
         return getAttributeTranscoderRule(fileName, context);
     }
     
-    protected Collection<Map<String,Object>> getAttributeTranscoderRule(final String fileName, final GenericApplicationContext context) {
+    protected TranscodingRule getAttributeTranscoderRule(final String fileName, final GenericApplicationContext context) {
 
         setTestContext(context);
         context.setDisplayName("ApplicationContext for enccoder");
 
-        return getBean(ENCODER_FILE_PATH + fileName, Collection.class, context);
+        return getBean(ENCODER_FILE_PATH + fileName, TranscodingRule.class, context);
 
     }
 
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/Regressions.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/Regressions.java
index b5e6083..7530f29 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/Regressions.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/Regressions.java
@@ -28,6 +28,7 @@ import org.testng.annotations.Test;
 import net.shibboleth.idp.attribute.resolver.AttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.spring.BaseAttributeDefinitionParserTest;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
+import net.shibboleth.idp.attribute.transcoding.impl.TranscodingRule;
 import net.shibboleth.idp.saml.attribute.transcoding.impl.SAML2StringAttributeTranscoder;
 
 /**
@@ -42,13 +43,12 @@ public class Regressions extends BaseAttributeDefinitionParserTest {
         context.refresh();
      
         Collection<AttributeDefinition> definitions = context.getBeansOfType(AttributeDefinition.class).values();
-        Collection<Collection> transcoderRules = context.getBeansOfType(Collection.class).values();
+        Collection<TranscodingRule> transcoderRules = context.getBeansOfType(TranscodingRule.class).values();
         
         assertEquals(definitions.size(), 1);
         assertEquals(transcoderRules.size(), 1);
-        assertEquals(transcoderRules.iterator().next().size(), 1);
         
-        final Map<String,Object> rule = (Map<String, Object>) transcoderRules.iterator().next().iterator().next();
+        final Map<String,Object> rule = transcoderRules.iterator().next().getMap();
         assertEquals(rule.get(AttributeTranscoderRegistry.PROP_ID), "skillsoftdept");
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML2StringAttributeTranscoder);
     }
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1Base64AttributeEncoderParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1Base64AttributeEncoderParserTest.java
index 5df39f6..cacbd1e 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1Base64AttributeEncoderParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1Base64AttributeEncoderParserTest.java
@@ -22,7 +22,6 @@ import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
-import java.util.Collection;
 import java.util.Map;
 import java.util.function.Predicate;
 
@@ -43,11 +42,8 @@ public class SAML1Base64AttributeEncoderParserTest extends BaseEncoderDefinition
   
     protected void testWithProperties(final boolean activation, final Boolean encodeType) {
         
-        final Collection<Map<String,Object>> rules =
-                getAttributeTranscoderRule("resolver/saml1Base64.xml", activation, encodeType);
-        assertEquals(rules.size(), 1);
-        
-        final Map<String,Object> rule = rules.iterator().next();
+        final Map<String,Object> rule =
+                getAttributeTranscoderRule("resolver/saml1Base64.xml", activation, encodeType).getMap();
 
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML1ByteAttributeTranscoder);
         assertEquals(rule.get(SAMLAttributeTranscoder.PROP_NAME), "SAML1_BASE64_ATTRIBUTE_NAME");
@@ -58,11 +54,7 @@ public class SAML1Base64AttributeEncoderParserTest extends BaseEncoderDefinition
 
     
     @Test public void defaultCase() {
-        final Collection<Map<String,Object>> rules =
-                getAttributeTranscoderRule("resolver/saml1Base64Default.xml");
-        assertEquals(rules.size(), 1);
-        
-        final Map<String,Object> rule = rules.iterator().next();
+        final Map<String,Object> rule = getAttributeTranscoderRule("resolver/saml1Base64Default.xml").getMap();
 
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML1ByteAttributeTranscoder);
         assertEquals(rule.get(SAML1AttributeTranscoder.PROP_NAME), "Base64_ATTRIBUTE");
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1ScopedStringAttributeEncoderParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1ScopedStringAttributeEncoderParserTest.java
index 06de6e4..cbbcb5a 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1ScopedStringAttributeEncoderParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1ScopedStringAttributeEncoderParserTest.java
@@ -22,7 +22,6 @@ import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
-import java.util.Collection;
 import java.util.Map;
 import java.util.function.Predicate;
 
@@ -43,11 +42,8 @@ public class SAML1ScopedStringAttributeEncoderParserTest extends BaseEncoderDefi
 
     protected void testWithProperties(final boolean activation, final Boolean encodeType) {
         
-        final Collection<Map<String,Object>> rules =
-                getAttributeTranscoderRule("resolver/saml1Scoped.xml", activation, encodeType);
-        assertEquals(rules.size(), 1);
-        
-        final Map<String,Object> rule = rules.iterator().next();
+        final Map<String,Object> rule =
+                getAttributeTranscoderRule("resolver/saml1Scoped.xml", activation, encodeType).getMap();
 
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML1ScopedStringAttributeTranscoder);
         assertEquals(rule.get(SAMLAttributeTranscoder.PROP_NAME), "SAML1_SCOPED_ATTRIBUTE_NAME");
@@ -61,11 +57,7 @@ public class SAML1ScopedStringAttributeEncoderParserTest extends BaseEncoderDefi
 
     
     @Test public void defaultCase() {
-        final Collection<Map<String,Object>> rules =
-                getAttributeTranscoderRule("resolver/saml1ScopedDefault.xml");
-        assertEquals(rules.size(), 1);
-        
-        final Map<String,Object> rule = rules.iterator().next();
+        final Map<String,Object> rule = getAttributeTranscoderRule("resolver/saml1ScopedDefault.xml").getMap();
 
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML1ScopedStringAttributeTranscoder);
         assertEquals(rule.get(SAMLAttributeTranscoder.PROP_NAME), "saml1_scoped_name");
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1StringAttributeEncoderParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1StringAttributeEncoderParserTest.java
index f6de6f8..ee124ba 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1StringAttributeEncoderParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1StringAttributeEncoderParserTest.java
@@ -22,7 +22,6 @@ import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
-import java.util.Collection;
 import java.util.Map;
 import java.util.function.Predicate;
 
@@ -43,11 +42,8 @@ public class SAML1StringAttributeEncoderParserTest extends BaseEncoderDefinition
 
     protected void testWithProperties(final boolean activation, final Boolean encodeType) {
         
-        final Collection<Map<String,Object>> rules =
-                getAttributeTranscoderRule("resolver/saml1String.xml", activation, encodeType);
-        assertEquals(rules.size(), 1);
-        
-        final Map<String,Object> rule = rules.iterator().next();
+        final Map<String,Object> rule =
+                getAttributeTranscoderRule("resolver/saml1String.xml", activation, encodeType).getMap();
 
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML1StringAttributeTranscoder);
         assertEquals(rule.get(SAMLAttributeTranscoder.PROP_NAME), "SAML1_STRING_ATTRIBUTE_NAME");
@@ -58,11 +54,7 @@ public class SAML1StringAttributeEncoderParserTest extends BaseEncoderDefinition
 
     
     @Test public void defaultCase() {
-        final Collection<Map<String,Object>> rules =
-                getAttributeTranscoderRule("resolver/saml1StringDefault.xml");
-        assertEquals(rules.size(), 1);
-        
-        final Map<String,Object> rule = rules.iterator().next();
+        final Map<String,Object> rule = getAttributeTranscoderRule("resolver/saml1StringDefault.xml").getMap();
 
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML1StringAttributeTranscoder);
         assertEquals(rule.get(SAMLAttributeTranscoder.PROP_NAME), "ATTRIBUTE");
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1XMLObjectAttributeEncoderParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1XMLObjectAttributeEncoderParserTest.java
index 89b54ec..7f9f62a 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1XMLObjectAttributeEncoderParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1XMLObjectAttributeEncoderParserTest.java
@@ -22,7 +22,6 @@ import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
-import java.util.Collection;
 import java.util.Map;
 import java.util.function.Predicate;
 
@@ -43,11 +42,8 @@ public class SAML1XMLObjectAttributeEncoderParserTest extends BaseEncoderDefinit
 
     protected void testWithProperties(final boolean activation, final Boolean encodeType) {
         
-        final Collection<Map<String,Object>> rules =
-                getAttributeTranscoderRule("resolver/saml1XmlObject.xml", activation, encodeType);
-        assertEquals(rules.size(), 1);
-        
-        final Map<String,Object> rule = rules.iterator().next();
+        final Map<String,Object> rule =
+                getAttributeTranscoderRule("resolver/saml1XmlObject.xml", activation, encodeType).getMap();
 
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML1XMLObjectAttributeTranscoder);
         assertEquals(rule.get(SAMLAttributeTranscoder.PROP_NAME), "SAML1_XMLObject_ATTRIBUTE_NAME");
@@ -57,11 +53,7 @@ public class SAML1XMLObjectAttributeEncoderParserTest extends BaseEncoderDefinit
 }
     
     @Test public void defaultCase() {
-        final Collection<Map<String,Object>> rules =
-                getAttributeTranscoderRule("resolver/saml1XmlObjectDefault.xml");
-        assertEquals(rules.size(), 1);
-        
-        final Map<String,Object> rule = rules.iterator().next();
+        final Map<String,Object> rule = getAttributeTranscoderRule("resolver/saml1XmlObjectDefault.xml").getMap();
 
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML1XMLObjectAttributeTranscoder);
         assertEquals(rule.get(SAMLAttributeTranscoder.PROP_NAME), "XMLObject_ATTRIBUTE");
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2Base64AttributeEncoderParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2Base64AttributeEncoderParserTest.java
index 90d3a80..17c6e54 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2Base64AttributeEncoderParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2Base64AttributeEncoderParserTest.java
@@ -22,7 +22,6 @@ import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
-import java.util.Collection;
 import java.util.Map;
 import java.util.function.Predicate;
 
@@ -43,11 +42,8 @@ public class SAML2Base64AttributeEncoderParserTest extends BaseEncoderDefinition
 
     protected void testWithProperties(final boolean activation, final Boolean encodeType) {
         
-        final Collection<Map<String,Object>> rules =
-                getAttributeTranscoderRule("resolver/saml2Base64.xml", activation, encodeType);
-        assertEquals(rules.size(), 1);
-        
-        final Map<String,Object> rule = rules.iterator().next();
+        final Map<String,Object> rule =
+                getAttributeTranscoderRule("resolver/saml2Base64.xml", activation, encodeType).getMap();
 
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML2ByteAttributeTranscoder);
         assertEquals(rule.get(SAMLAttributeTranscoder.PROP_NAME), "Saml2Base64_ATTRIBUTE_NAME");
@@ -58,11 +54,7 @@ public class SAML2Base64AttributeEncoderParserTest extends BaseEncoderDefinition
     }
     
     @Test public void defaultCase() {
-        final Collection<Map<String,Object>> rules =
-                getAttributeTranscoderRule("resolver/saml2Base64Default.xml");
-        assertEquals(rules.size(), 1);
-        
-        final Map<String,Object> rule = rules.iterator().next();
+        final Map<String,Object> rule = getAttributeTranscoderRule("resolver/saml2Base64Default.xml").getMap();
 
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML2ByteAttributeTranscoder);
         assertEquals(rule.get(SAMLAttributeTranscoder.PROP_NAME), "Base64Name");
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2ScopedStringAttributeEncoderParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2ScopedStringAttributeEncoderParserTest.java
index 9a89f00..1741af2 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2ScopedStringAttributeEncoderParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2ScopedStringAttributeEncoderParserTest.java
@@ -22,7 +22,6 @@ import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
-import java.util.Collection;
 import java.util.Map;
 import java.util.function.Predicate;
 
@@ -43,11 +42,8 @@ public class SAML2ScopedStringAttributeEncoderParserTest extends BaseEncoderDefi
 
     protected void testWithProperties(final boolean activation, final Boolean encodeType) {
         
-        final Collection<Map<String,Object>> rules =
-                getAttributeTranscoderRule("resolver/saml2Scoped.xml", activation, encodeType);
-        assertEquals(rules.size(), 1);
-        
-        final Map<String,Object> rule = rules.iterator().next();
+        final Map<String,Object> rule =
+                getAttributeTranscoderRule("resolver/saml2Scoped.xml", activation, encodeType).getMap();
 
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML2ScopedStringAttributeTranscoder);
         assertEquals(rule.get(SAMLAttributeTranscoder.PROP_NAME), "ATTRIBUTE_NAME");
@@ -61,11 +57,7 @@ public class SAML2ScopedStringAttributeEncoderParserTest extends BaseEncoderDefi
     }
     
     @Test public void defaultCase() {
-        final Collection<Map<String,Object>> rules =
-                getAttributeTranscoderRule("resolver/saml2ScopedDefault.xml");
-        assertEquals(rules.size(), 1);
-        
-        final Map<String,Object> rule = rules.iterator().next();
+        final Map<String,Object> rule = getAttributeTranscoderRule("resolver/saml2ScopedDefault.xml").getMap();
 
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML2ScopedStringAttributeTranscoder);
         assertEquals(rule.get(SAMLAttributeTranscoder.PROP_NAME), "name");
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2StringAttributeEncoderParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2StringAttributeEncoderParserTest.java
index f2aa97e..67cb02c 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2StringAttributeEncoderParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2StringAttributeEncoderParserTest.java
@@ -22,7 +22,6 @@ import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
-import java.util.Collection;
 import java.util.Map;
 import java.util.function.Predicate;
 
@@ -43,11 +42,8 @@ public class SAML2StringAttributeEncoderParserTest extends BaseEncoderDefinition
   
     protected void testWithProperties(final boolean activation, final Boolean encodeType) {
         
-        final Collection<Map<String,Object>> rules =
-                getAttributeTranscoderRule("resolver/saml2String.xml", activation, encodeType);
-        assertEquals(rules.size(), 1);
-        
-        final Map<String,Object> rule = rules.iterator().next();
+        final Map<String,Object> rule =
+                getAttributeTranscoderRule("resolver/saml2String.xml", activation, encodeType).getMap();
 
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML2StringAttributeTranscoder);
         assertEquals(rule.get(SAMLAttributeTranscoder.PROP_NAME), "Saml2String_ATTRIBUTE_NAME");
@@ -58,11 +54,7 @@ public class SAML2StringAttributeEncoderParserTest extends BaseEncoderDefinition
     }
     
     @Test public void defaultCase() {
-        final Collection<Map<String,Object>> rules =
-                getAttributeTranscoderRule("resolver/saml2StringDefault.xml");
-        assertEquals(rules.size(), 1);
-        
-        final Map<String,Object> rule = rules.iterator().next();
+        final Map<String,Object> rule = getAttributeTranscoderRule("resolver/saml2StringDefault.xml").getMap();
 
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML2StringAttributeTranscoder);
         assertEquals(rule.get(SAMLAttributeTranscoder.PROP_NAME), "Saml2StringName");
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2XMLObjectAttributeEncoderParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2XMLObjectAttributeEncoderParserTest.java
index 545c861..513cc6a 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2XMLObjectAttributeEncoderParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2XMLObjectAttributeEncoderParserTest.java
@@ -22,7 +22,6 @@ import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
-import java.util.Collection;
 import java.util.Map;
 import java.util.function.Predicate;
 
@@ -43,11 +42,8 @@ public class SAML2XMLObjectAttributeEncoderParserTest extends BaseEncoderDefinit
 
     protected void testWithProperties(final boolean activation, final Boolean encodeType) {
         
-        final Collection<Map<String,Object>> rules =
-                getAttributeTranscoderRule("resolver/saml2XmlObject.xml", activation, encodeType);
-        assertEquals(rules.size(), 1);
-        
-        final Map<String,Object> rule = rules.iterator().next();
+        final Map<String,Object> rule =
+                getAttributeTranscoderRule("resolver/saml2XmlObject.xml", activation, encodeType).getMap();
 
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML2XMLObjectAttributeTranscoder);
         assertEquals(rule.get(SAMLAttributeTranscoder.PROP_NAME), "Saml2XmlObject_ATTRIBUTE_NAME");
@@ -58,11 +54,7 @@ public class SAML2XMLObjectAttributeEncoderParserTest extends BaseEncoderDefinit
     }
 
     @Test public void defaultCase() {
-        final Collection<Map<String,Object>> rules =
-                getAttributeTranscoderRule("resolver/saml2XmlObjectDefault.xml");
-        assertEquals(rules.size(), 1);
-        
-        final Map<String,Object> rule = rules.iterator().next();
+        final Map<String,Object> rule = getAttributeTranscoderRule("resolver/saml2XmlObjectDefault.xml").getMap();
 
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML2XMLObjectAttributeTranscoder);
         assertEquals(rule.get(SAMLAttributeTranscoder.PROP_NAME), "XmlObjectName");
diff --git a/idp-conf/src/main/resources/system/conf/attribute-registry-system.xml b/idp-conf/src/main/resources/system/conf/attribute-registry-system.xml
index c8c2a48..f63ec12 100644
--- a/idp-conf/src/main/resources/system/conf/attribute-registry-system.xml
+++ b/idp-conf/src/main/resources/system/conf/attribute-registry-system.xml
@@ -39,4 +39,7 @@
         </entry>
     </util:map>
     
+    <bean id="shibboleth.TranscodingRule"
+        class="net.shibboleth.idp.attribute.transcoding.impl.TranscodingRule" abstract="true" />
+    
 </beans>
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 7764a6c..8047cc4 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
@@ -36,6 +36,7 @@ import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
 import net.shibboleth.idp.attribute.transcoding.TranscoderSupport;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
+import net.shibboleth.idp.attribute.transcoding.impl.TranscodingRule;
 import net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML1AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAML1AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAMLAttributeTranscoder;
@@ -100,7 +101,7 @@ public class SAML1ByteAttributeTranscoderTest extends OpenSAMLInitBaseTestCase {
         ruleset1.put(SAMLAttributeTranscoder.PROP_NAME, ATTR_NAME);
         ruleset1.put(SAML1AttributeTranscoder.PROP_NAMESPACE, ATTR_NAMESPACE);
         
-        registry.setTranscoderRegistry(Collections.singletonList(ruleset1));
+        registry.setTranscoderRegistry(Collections.singletonList(new TranscodingRule(ruleset1)));
         
         registry.initialize();
     }
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 2f1536e..3d689e7 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
@@ -35,6 +35,7 @@ import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
 import net.shibboleth.idp.attribute.transcoding.TranscoderSupport;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
+import net.shibboleth.idp.attribute.transcoding.impl.TranscodingRule;
 import net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML1AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAML1AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAMLAttributeTranscoder;
@@ -109,7 +110,7 @@ public class SAML1ScopedStringAttributeTranscoderTest extends OpenSAMLInitBaseTe
         ruleset1.put(SAML1ScopedStringAttributeTranscoder.PROP_SCOPE_DELIMITER, DELIMITER);
         ruleset1.put(SAML1ScopedStringAttributeTranscoder.PROP_SCOPE_TYPE, "attribute");
         
-        registry.setTranscoderRegistry(Collections.singletonList(ruleset1));
+        registry.setTranscoderRegistry(Collections.singletonList(new TranscodingRule(ruleset1)));
         
         registry.initialize();
     }
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 88d2fbe..0534a08 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
@@ -35,6 +35,7 @@ import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
 import net.shibboleth.idp.attribute.transcoding.TranscoderSupport;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
+import net.shibboleth.idp.attribute.transcoding.impl.TranscodingRule;
 import net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML1AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAML1AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAMLAttributeTranscoder;
@@ -97,7 +98,7 @@ public class SAML1StringAttributeTranscoderTest extends OpenSAMLInitBaseTestCase
         ruleset1.put(SAMLAttributeTranscoder.PROP_NAME, ATTR_NAME);
         ruleset1.put(SAML1AttributeTranscoder.PROP_NAMESPACE, ATTR_NAMESPACE);
         
-        registry.setTranscoderRegistry(Collections.singletonList(ruleset1));
+        registry.setTranscoderRegistry(Collections.singletonList(new TranscodingRule(ruleset1)));
         
         registry.initialize();
     }
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 962d91c..e87c469 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
@@ -36,6 +36,7 @@ import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
 import net.shibboleth.idp.attribute.transcoding.TranscoderSupport;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
+import net.shibboleth.idp.attribute.transcoding.impl.TranscodingRule;
 import net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML2AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAML2AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAMLAttributeTranscoder;
@@ -102,7 +103,7 @@ public class SAML2ByteAttributeTranscoderTest extends OpenSAMLInitBaseTestCase {
         ruleset1.put(SAML2AttributeTranscoder.PROP_NAME_FORMAT, ATTR_NAMEFORMAT);
         ruleset1.put(SAML2AttributeTranscoder.PROP_FRIENDLY_NAME, ATTR_FRIENDLYNAME);
         
-        registry.setTranscoderRegistry(Collections.singletonList(ruleset1));
+        registry.setTranscoderRegistry(Collections.singletonList(new TranscodingRule(ruleset1)));
         
         registry.initialize();
     }
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 8e7f786..4e059bf 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
@@ -35,6 +35,7 @@ import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
 import net.shibboleth.idp.attribute.transcoding.TranscoderSupport;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
+import net.shibboleth.idp.attribute.transcoding.impl.TranscodingRule;
 import net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML2AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAML2AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAMLAttributeTranscoder;
@@ -104,7 +105,7 @@ public class SAML2ScopedStringAttributeTranscoderTest extends OpenSAMLInitBaseTe
         ruleset1.put(SAML2ScopedStringAttributeTranscoder.PROP_SCOPE_DELIMITER, DELIMITER);
         ruleset1.put(SAML2ScopedStringAttributeTranscoder.PROP_SCOPE_TYPE, "inline");
         
-        registry.setTranscoderRegistry(Collections.singletonList(ruleset1));
+        registry.setTranscoderRegistry(Collections.singletonList(new TranscodingRule(ruleset1)));
         
         registry.initialize();
     }
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 34244fe..e5e2ab3 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
@@ -35,6 +35,7 @@ import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
 import net.shibboleth.idp.attribute.transcoding.TranscoderSupport;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
+import net.shibboleth.idp.attribute.transcoding.impl.TranscodingRule;
 import net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML2AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAML2AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAMLAttributeTranscoder;
@@ -99,7 +100,7 @@ public class SAML2StringAttributeTranscoderTest extends OpenSAMLInitBaseTestCase
         ruleset1.put(SAML2AttributeTranscoder.PROP_NAME_FORMAT, ATTR_NAMEFORMAT);
         ruleset1.put(SAML2AttributeTranscoder.PROP_FRIENDLY_NAME, ATTR_FRIENDLYNAME);
         
-        registry.setTranscoderRegistry(Collections.singletonList(ruleset1));
+        registry.setTranscoderRegistry(Collections.singletonList(new TranscodingRule(ruleset1)));
         
         registry.initialize();
     }
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 67742bb..5b2e6f8 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
@@ -37,6 +37,7 @@ import net.shibboleth.idp.attribute.XMLObjectAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
 import net.shibboleth.idp.attribute.transcoding.TranscoderSupport;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
+import net.shibboleth.idp.attribute.transcoding.impl.TranscodingRule;
 import net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML2AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAML2AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAMLAttributeTranscoder;
@@ -106,7 +107,7 @@ public class SAML2XMLObjectAttributeTranscoderTest extends OpenSAMLInitBaseTestC
         ruleset1.put(SAML2AttributeTranscoder.PROP_NAME_FORMAT, ATTR_NAMEFORMAT);
         ruleset1.put(SAML2AttributeTranscoder.PROP_FRIENDLY_NAME, ATTR_FRIENDLYNAME);
         
-        registry.setTranscoderRegistry(Collections.singletonList(ruleset1));
+        registry.setTranscoderRegistry(Collections.singletonList(new TranscodingRule(ruleset1)));
         
         registry.initialize();
     }
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 5ea95d2..274928a 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
@@ -32,6 +32,7 @@ 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.impl.AttributeTranscoderRegistryImpl;
+import net.shibboleth.idp.attribute.transcoding.impl.TranscodingRule;
 import net.shibboleth.idp.profile.ActionTestingSupport;
 import net.shibboleth.idp.profile.IdPEventIds;
 import net.shibboleth.idp.profile.RequestContextBuilder;
@@ -123,7 +124,10 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
         rule2_1.put(SAMLAttributeTranscoder.PROP_NAME, MY_NAME_2);
         rule2_1.put(SAML1AttributeTranscoder.PROP_NAMESPACE, MY_NAMESPACE);
 
-        registry.setTranscoderRegistry(Arrays.asList(rule1_1, rule1_2, rule2_1));
+        registry.setTranscoderRegistry(Arrays.asList(
+                new TranscodingRule(rule1_1),
+                new TranscodingRule(rule1_2),
+                new TranscodingRule(rule2_1)));
         
         registry.initialize();
         
@@ -187,7 +191,7 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
         rule.put(SAMLAttributeTranscoder.PROP_NAME, MY_NAME_1);
         rule.put(SAML1AttributeTranscoder.PROP_NAMESPACE, MY_NAMESPACE);
         
-        localregistry.setTranscoderRegistry(Collections.singletonList(rule));
+        localregistry.setTranscoderRegistry(Collections.singletonList(new TranscodingRule(rule)));
         localregistry.initialize();
         
         action.setTranscoderRegistry(new RegistryService(localregistry));
@@ -223,7 +227,7 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
         rule.put(SAMLAttributeTranscoder.PROP_NAME, MY_NAME_1);
         rule.put(SAML1AttributeTranscoder.PROP_NAMESPACE, MY_NAMESPACE);
         
-        localregistry.setTranscoderRegistry(Collections.singletonList(rule));
+        localregistry.setTranscoderRegistry(Collections.singletonList(new TranscodingRule(rule)));
         localregistry.initialize();
         
         action.setTranscoderRegistry(new RegistryService(localregistry));
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 7a2ca86..252e802 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
@@ -32,6 +32,7 @@ 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.impl.AttributeTranscoderRegistryImpl;
+import net.shibboleth.idp.attribute.transcoding.impl.TranscodingRule;
 import net.shibboleth.idp.profile.ActionTestingSupport;
 import net.shibboleth.idp.profile.IdPEventIds;
 import net.shibboleth.idp.profile.RequestContextBuilder;
@@ -122,7 +123,10 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
         rule2_1.put(SAMLAttributeTranscoder.PROP_NAME, MY_NAME_2);
         rule2_1.put(SAML2AttributeTranscoder.PROP_NAME_FORMAT, MY_NAMESPACE);
 
-        registry.setTranscoderRegistry(Arrays.asList(rule1_1, rule1_2, rule2_1));
+        registry.setTranscoderRegistry(Arrays.asList(
+                new TranscodingRule(rule1_1),
+                new TranscodingRule(rule1_2),
+                new TranscodingRule(rule2_1)));
         registry.initialize();
         
         action = new AddAttributeStatementToAssertion();
@@ -185,7 +189,7 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
         rule.put(SAMLAttributeTranscoder.PROP_NAME, MY_NAME_1);
         rule.put(SAML2AttributeTranscoder.PROP_NAME_FORMAT, MY_NAMESPACE);
         
-        localregistry.setTranscoderRegistry(Collections.singletonList(rule));
+        localregistry.setTranscoderRegistry(Collections.singletonList(new TranscodingRule(rule)));
         localregistry.initialize();
         
         action.setTranscoderRegistry(new RegistryService(localregistry));
@@ -221,7 +225,7 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
         rule.put(SAMLAttributeTranscoder.PROP_NAME, MY_NAME_1);
         rule.put(SAML2AttributeTranscoder.PROP_NAME_FORMAT, MY_NAMESPACE);
         
-        localregistry.setTranscoderRegistry(Collections.singletonList(rule));
+        localregistry.setTranscoderRegistry(Collections.singletonList(new TranscodingRule(rule)));
         localregistry.initialize();
         
         action.setTranscoderRegistry(new RegistryService(localregistry));
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 efb5c11..8a88e7c 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
@@ -16,42 +16,65 @@
     <bean id="SAML1ScopedStringTranscoder"
         class="net.shibboleth.idp.saml.attribute.transcoding.impl.SAML1ScopedStringAttributeTranscoder" />
    
+    <bean id="shibboleth.TranscodingRule"
+        class="net.shibboleth.idp.attribute.transcoding.impl.TranscodingRule" abstract="true" />
+   
     <util:list id="DefaultAttributeRegistry">
-    
-        <map>
-            <entry key="id" value="eduPersonAssurance" />
-            <entry key="transcoder" value-ref="SAML1StringTranscoder" />
-            <entry key="name" value="urn:oid:1.3.6.1.4.1.5923.1.1.1.11" />
-            <entry key="namespace" value="basic" />
-        </map>
+
+        <bean parent="shibboleth.TranscodingRule">
+            <constructor-arg>    
+		        <map>
+		            <entry key="id" value="eduPersonAssurance" />
+		            <entry key="transcoder" value-ref="SAML1StringTranscoder" />
+		            <entry key="name" value="urn:oid:1.3.6.1.4.1.5923.1.1.1.11" />
+		            <entry key="namespace" value="basic" />
+		        </map>
+            </constructor-arg>
+        </bean>
         
-        <map>
-            <entry key="id" value="eduPersonAssurance" />
-            <entry key="transcoder" value-ref="SAML1StringTranscoder" />
-            <entry key="name" value="http://example.org/name/for/Attribute" />
-            <entry key="namespace" value="basic" />
-        </map>
+        <bean parent="shibboleth.TranscodingRule">
+            <constructor-arg>    
+		        <map>
+		            <entry key="id" value="eduPersonAssurance" />
+		            <entry key="transcoder" value-ref="SAML1StringTranscoder" />
+		            <entry key="name" value="http://example.org/name/for/Attribute" />
+		            <entry key="namespace" value="basic" />
+		        </map>
+            </constructor-arg>
+        </bean>
 
-        <map>
-            <entry key="id" value="otherPersonAssurance" />
-            <entry key="transcoder" value-ref="SAML1StringTranscoder" />
-            <entry key="name" value="urn:oid:1.3.6.1.4.1.5923.1.1.1.11" />
-            <entry key="namespace" value="basic" />
-        </map>
+        <bean parent="shibboleth.TranscodingRule">
+            <constructor-arg>    
+		        <map>
+		            <entry key="id" value="otherPersonAssurance" />
+		            <entry key="transcoder" value-ref="SAML1StringTranscoder" />
+		            <entry key="name" value="urn:oid:1.3.6.1.4.1.5923.1.1.1.11" />
+		            <entry key="namespace" value="basic" />
+		        </map>
+            </constructor-arg>
+        </bean>
 
-        <map>
-            <entry key="id" value="eduPersonScopedAffiliation" />
-            <entry key="transcoder" value-ref="SAML1ScopedStringTranscoder" />
-            <entry key="name" value="urn:oid:1.3.6.1.4.1.5923.1.1.1.9" />
-            <entry key="namespace" value="basic" />
-        </map>
+        <bean parent="shibboleth.TranscodingRule">
+            <constructor-arg>    
+		        <map>
+		            <entry key="id" value="eduPersonScopedAffiliation" />
+		            <entry key="transcoder" value-ref="SAML1ScopedStringTranscoder" />
+		            <entry key="name" value="urn:oid:1.3.6.1.4.1.5923.1.1.1.9" />
+		            <entry key="namespace" value="basic" />
+		        </map>
+            </constructor-arg>
+        </bean>
 
-        <map>
-            <entry key="id" value="eduPersonTargetedID" />
-            <entry key="transcoder" value-ref="SAML1ScopedStringTranscoder" />
-            <entry key="name" value="urn:oid:1.3.6.1.4.1.5923.1.1.1.10" />
-            <entry key="namespace" value="basic" />
-        </map>
+        <bean parent="shibboleth.TranscodingRule">
+            <constructor-arg>    
+		        <map>
+		            <entry key="id" value="eduPersonTargetedID" />
+		            <entry key="transcoder" value-ref="SAML1ScopedStringTranscoder" />
+		            <entry key="name" value="urn:oid:1.3.6.1.4.1.5923.1.1.1.10" />
+		            <entry key="namespace" value="basic" />
+		        </map>
+            </constructor-arg>
+        </bean>
 
     </util:list>
     
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 fc33dd2..88f878f 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
@@ -18,39 +18,62 @@
     <bean id="SAML2XMLObjectTranscoder"
         class="net.shibboleth.idp.saml.attribute.transcoding.impl.SAML2XMLObjectAttributeTranscoder" />
 
+    <bean id="shibboleth.TranscodingRule"
+        class="net.shibboleth.idp.attribute.transcoding.impl.TranscodingRule" abstract="true" />
+
     <util:list id="DefaultAttributeRegistry">
     
-        <map>
-            <entry key="id" value="eduPersonAssurance" />
-            <entry key="transcoder" value-ref="SAML2StringTranscoder" />
-            <entry key="name" value="urn:oid:1.3.6.1.4.1.5923.1.1.1.11" />
-        </map>
+        <bean parent="shibboleth.TranscodingRule">
+            <constructor-arg>
+		        <map>
+		            <entry key="id" value="eduPersonAssurance" />
+		            <entry key="transcoder" value-ref="SAML2StringTranscoder" />
+		            <entry key="name" value="urn:oid:1.3.6.1.4.1.5923.1.1.1.11" />
+		        </map>
+            </constructor-arg>
+        </bean>
         
-        <map>
-            <entry key="id" value="eduPersonAssurance" />
-            <entry key="transcoder" value-ref="SAML2StringTranscoder" />
-            <entry key="name" value="http://example.org/name/for/Attribute" />
-            <entry key="nameFormat" value="http://example.org/Format" />
-        </map>
+        <bean parent="shibboleth.TranscodingRule">
+            <constructor-arg>    
+		        <map>
+		            <entry key="id" value="eduPersonAssurance" />
+		            <entry key="transcoder" value-ref="SAML2StringTranscoder" />
+		            <entry key="name" value="http://example.org/name/for/Attribute" />
+		            <entry key="nameFormat" value="http://example.org/Format" />
+		        </map>
+            </constructor-arg>
+        </bean>
 
-        <map>
-            <entry key="id" value="otherPersonAssurance" />
-            <entry key="transcoder" value-ref="SAML2StringTranscoder" />
-            <entry key="name" value="urn:oid:1.3.6.1.4.1.5923.1.1.1.11" />
-        </map>
+        <bean parent="shibboleth.TranscodingRule">
+            <constructor-arg>    
+		        <map>
+		            <entry key="id" value="otherPersonAssurance" />
+		            <entry key="transcoder" value-ref="SAML2StringTranscoder" />
+		            <entry key="name" value="urn:oid:1.3.6.1.4.1.5923.1.1.1.11" />
+		        </map>
+            </constructor-arg>
+        </bean>
 
-        <map>
-            <entry key="id" value="eduPersonScopedAffiliation" />
-            <entry key="transcoder" value-ref="SAML2ScopedStringTranscoder" />
-            <entry key="scopeDelimiter" value="#" />
-            <entry key="name" value="urn:oid:1.3.6.1.4.1.5923.1.1.1.9" />
-        </map>
+        <bean parent="shibboleth.TranscodingRule">
+            <constructor-arg>    
+		        <map>
+		            <entry key="id" value="eduPersonScopedAffiliation" />
+		            <entry key="transcoder" value-ref="SAML2ScopedStringTranscoder" />
+		            <entry key="scopeDelimiter" value="#" />
+		            <entry key="name" value="urn:oid:1.3.6.1.4.1.5923.1.1.1.9" />
+		        </map>
+            </constructor-arg>
+        </bean>
 
-        <map>
-            <entry key="id" value="eduPersonTargetedID" />
-            <entry key="transcoder" value-ref="SAML2XMLObjectTranscoder" />
-            <entry key="name" value="urn:oid:1.3.6.1.4.1.5923.1.1.1.10" />
-        </map>
+        <bean parent="shibboleth.TranscodingRule">
+            <constructor-arg>    
+		        <map>
+		            <entry key="id" value="eduPersonTargetedID" />
+		            <entry key="transcoder" value-ref="SAML2XMLObjectTranscoder" />
+		            <entry key="name" value="urn:oid:1.3.6.1.4.1.5923.1.1.1.10" />
+		        </map>
+            </constructor-arg>
+        </bean>
 
     </util:list>
 	

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


More information about the commits mailing list