[java-identity-provider] branch master updated: IDP-1434 - Redesign Attribute encoding/decoding as a service

Scott Cantor cantor.2 at osu.edu
Mon Jun 3 14:13:22 EDT 2019


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

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

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

The following commit(s) were added to refs/heads/master by this push:
       new  303611e   IDP-1434 - Redesign Attribute encoding/decoding as a service
303611e is described below

commit 303611e93e4b2f568424ecfc1fdd216aed5e60aa
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Mon Jun 3 14:13:19 2019 -0400

    IDP-1434 - Redesign Attribute encoding/decoding as a service
    
    https://issues.shibboleth.net/jira/browse/IDP-1434
    
    Add display name/desc support for all rules.
---
 .../transcoding/AbstractAttributeTranscoder.java   |  7 +-
 .../transcoding/AttributeTranscoderRegistry.java   |  6 ++
 .../idp/attribute/transcoding/TranscodingRule.java | 84 ++++++++++++++++++++++
 .../impl/AttributeTranscoderRegistryImplTest.java  | 14 ++++
 4 files changed, 110 insertions(+), 1 deletion(-)

diff --git a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AbstractAttributeTranscoder.java b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AbstractAttributeTranscoder.java
index 14a2500..351c970 100644
--- a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AbstractAttributeTranscoder.java
+++ b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AbstractAttributeTranscoder.java
@@ -89,7 +89,12 @@ public abstract class AbstractAttributeTranscoder<T> extends AbstractInitializab
             return null;
         }
         
-        return doDecode(profileRequestContext, input, rule);
+        final IdPAttribute attribute = doDecode(profileRequestContext, input, rule);
+        
+        attribute.setDisplayNames(rule.getDisplayNames());
+        attribute.setDisplayDescriptions(rule.getDescriptions());
+        
+        return attribute;
     }
     
     
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 13a3ddb..2a500d9 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
@@ -52,6 +52,12 @@ public interface AttributeTranscoderRegistry extends IdentifiedComponent {
     /** Property name for accessing relying parties to wrap an activation condition around. */
     @Nonnull @NotEmpty static final String PROP_RELYINGPARTIES = "relyingParties";
     
+    /** Property prefix for language-specific display name of attribute. */
+    @Nonnull @NotEmpty static final String PROP_DISPLAY_NAME = "displayName.";
+
+    /** Property prefix for language-specific description of attribute. */
+    @Nonnull @NotEmpty static final String PROP_DESCRIPTION = "description.";
+    
     /**
      * Obtains a set of instructions for encoding an input {@link IdPAttribute} into a target type.
      * 
diff --git a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/TranscodingRule.java b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/TranscodingRule.java
index 89bcf88..63495f8 100644
--- a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/TranscodingRule.java
+++ b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/TranscodingRule.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.attribute.transcoding;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.HashMap;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
 
@@ -28,10 +29,15 @@ import javax.annotation.Nullable;
 
 import org.springframework.core.io.Resource;
 
+import com.google.common.collect.ImmutableMap;
+
 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;
 import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.utilities.java.support.annotation.constraint.NotLive;
+import net.shibboleth.utilities.java.support.annotation.constraint.Unmodifiable;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
 
 /**
  * Wrapper around a {@link Map} representing a rule for transcoding, used to
@@ -42,6 +48,12 @@ public class TranscodingRule {
     /** Underlying map containing the rule. */
     @Nonnull @NonnullElements private final Map<String,Object> rule;
     
+    /** Map of locale-specific display names. */
+    @Nonnull @NonnullElements private Map<Locale,String> displayNames;
+    
+    /** Map of locale-specific descriptions. */
+    @Nonnull @NonnullElements private Map<Locale,String> descriptions;
+    
     /**
      * Constructor.
      * 
@@ -59,6 +71,8 @@ public class TranscodingRule {
      */
     public TranscodingRule(@Nonnull @NonnullElements @ParameterName(name="map") final Map<String,Object> map) {
         rule = new HashMap<>(map);
+        processDisplayNames();
+        processDescriptions();
     }
 
     /**
@@ -84,6 +98,8 @@ public class TranscodingRule {
                         rule.put((String) k, v);
                     }
                 });
+        processDisplayNames();
+        processDescriptions();
     }
 
     /**
@@ -135,8 +151,76 @@ public class TranscodingRule {
             return defValue;
         }
     }
+    
+    /**
+     * Get the display names to attach to any {@link IdPAttribute} objects created by this transcoder.
+     * 
+     * @return map of locale-based names
+     */
+    @Nonnull @NonnullElements @NotLive @Unmodifiable public Map<Locale,String> getDisplayNames() {
+        return displayNames;
+    }
 
     /**
+     * Get the descriptions to attach to any {@link IdPAttribute} objects created by this transcoder.
+     * 
+     * @return map of locale-based descriptions
+     */
+    @Nonnull @NonnullElements @NotLive @Unmodifiable public Map<Locale,String> getDescriptions() {
+        return descriptions;
+    }
+    
+    /**
+     * Process any properties that start with {@link AttributeTranscoderRegistry.PROP_DISPLAY_NAME} and
+     * create a Locale map around them.
+     */
+    private void processDisplayNames() {
+        
+        final ImmutableMap.Builder<Locale,String> builder = ImmutableMap.builder();
+        
+        for (final Map.Entry<String,Object> entry : rule.entrySet()) {
+            if (entry.getValue() instanceof String
+                    && entry.getKey().startsWith(AttributeTranscoderRegistry.PROP_DISPLAY_NAME)) {
+                
+                final String lang = StringSupport.trimOrNull(
+                        entry.getKey().substring(AttributeTranscoderRegistry.PROP_DISPLAY_NAME.length()));
+                if (lang != null) {
+                    builder.put(Locale.forLanguageTag(lang), (String) entry.getValue());
+                } else {
+                    builder.put(Locale.getDefault(), (String) entry.getValue());
+                }
+            }
+        }
+        
+        displayNames = builder.build();
+    }
+
+    /**
+     * Process any properties that start with {@link AttributeTranscoderRegistry.PROP_DESCRIPTION} and
+     * create a Locale map around them.
+     */
+    private void processDescriptions() {
+        
+        final ImmutableMap.Builder<Locale,String> builder = ImmutableMap.builder();
+        
+        for (final Map.Entry<String,Object> entry : rule.entrySet()) {
+            if (entry.getValue() instanceof String
+                    && entry.getKey().startsWith(AttributeTranscoderRegistry.PROP_DESCRIPTION)) {
+                
+                final String lang = StringSupport.trimOrNull(
+                        entry.getKey().substring(AttributeTranscoderRegistry.PROP_DESCRIPTION.length()));
+                if (lang != null) {
+                    builder.put(Locale.forLanguageTag(lang), (String) entry.getValue());
+                } else {
+                    builder.put(Locale.getDefault(), (String) entry.getValue());
+                }
+            }
+        }
+        
+        descriptions = builder.build();
+    }
+    
+    /**
      * Build a new rule from a property set resource.
      * 
      * @param resource a property set to initialize the map
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 918d8af..74bc0e0 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
@@ -23,6 +23,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 
 import static org.testng.Assert.*;
@@ -64,6 +65,10 @@ public class AttributeTranscoderRegistryImplTest {
         final Map<String,Object> ruleset1 = new HashMap<>();
         ruleset1.put(AttributeTranscoderRegistry.PROP_ID, "foo");
         ruleset1.put(AttributeTranscoderRegistry.PROP_TRANSCODER, transcoder);
+        ruleset1.put(AttributeTranscoderRegistry.PROP_DISPLAY_NAME + Locale.ENGLISH.toLanguageTag(), "English name");
+        ruleset1.put(AttributeTranscoderRegistry.PROP_DESCRIPTION + Locale.ENGLISH.toLanguageTag(), "English desc");
+        ruleset1.put(AttributeTranscoderRegistry.PROP_DISPLAY_NAME + Locale.CANADA_FRENCH.toLanguageTag(), "Canadian French name");
+        ruleset1.put(AttributeTranscoderRegistry.PROP_DESCRIPTION + Locale.CANADA_FRENCH.toLanguageTag(), "Canadian French desc");
         ruleset1.put("name", "bar");
         
         final Map<String,Object> ruleset2 = new HashMap<>();
@@ -162,6 +167,11 @@ public class AttributeTranscoderRegistryImplTest {
         
         assertEquals(attributes.get(0).getId(), "foo");
         assertTrue(attributes.get(0).getValues().isEmpty());
+        
+        assertEquals(attributes.get(0).getDisplayNames().get(Locale.forLanguageTag("en")), "English name");
+        assertEquals(attributes.get(0).getDisplayDescriptions().get(Locale.forLanguageTag("en")), "English desc");
+        assertEquals(attributes.get(0).getDisplayNames().get(Locale.forLanguageTag("fr-ca")), "Canadian French name");
+        assertEquals(attributes.get(0).getDisplayDescriptions().get(Locale.forLanguageTag("fr-ca")), "Canadian French desc");
     }
 
     @Test public void testDecodeTwoNoValues() throws AttributeDecodingException {
@@ -179,9 +189,13 @@ public class AttributeTranscoderRegistryImplTest {
         
         assertEquals(attributes.get(0).getId(), "foo");
         assertTrue(attributes.get(0).getValues().isEmpty());
+        assertTrue(attributes.get(0).getDisplayNames().isEmpty());
+        assertTrue(attributes.get(0).getDisplayDescriptions().isEmpty());
 
         assertEquals(attributes.get(1).getId(), "foo2");
         assertTrue(attributes.get(1).getValues().isEmpty());
+        assertTrue(attributes.get(1).getDisplayNames().isEmpty());
+        assertTrue(attributes.get(1).getDisplayDescriptions().isEmpty());
     }
 
     @Test public void testEncodeStringValues() throws AttributeEncodingException {

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


More information about the commits mailing list