[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