From 98ed17615ac23195ac9b615552617825ba251dfd Mon Sep 17 00:00:00 2001 From: Jj! Date: Thu, 7 Mar 2019 12:22:20 -0600 Subject: [PATCH 1/3] [NOISSUE] fix overrides in filters refactor --- .../filters/EntityAttributesFilter.java | 2 +- .../JPAEntityDescriptorServiceImpl.java | 14 +-- .../ui/service/JPAEntityServiceImpl.java | 87 +------------ .../util/ModelRepresentationConversions.java | 115 ++++++++++-------- .../AuxiliaryJPAEntityServiceTests.groovy | 3 +- .../admin/ui/util/TestObjectGenerator.groovy | 4 +- 6 files changed, 77 insertions(+), 148 deletions(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/EntityAttributesFilter.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/EntityAttributesFilter.java index 86a2181c7..9d68c39b3 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/EntityAttributesFilter.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/EntityAttributesFilter.java @@ -68,6 +68,6 @@ private void rebuildAttributes() { @PostLoad public void intoTransientRepresentation() { this.attributeRelease = getAttributeReleaseListFromAttributeList(this.attributes); - this.relyingPartyOverrides = getRelyingPartyOverridesRepresentationFromAttributeList(attributes); + this.relyingPartyOverrides = getRelyingPartyOverridesRepresentationFromAttributeList(this.attributes); } } \ No newline at end of file diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java index 49823c008..5137773b5 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java @@ -66,6 +66,7 @@ import java.util.stream.Collectors; import static edu.internet2.tier.shibboleth.admin.util.ModelRepresentationConversions.getStringListOfAttributeValues; +import static edu.internet2.tier.shibboleth.admin.util.ModelRepresentationConversions.getValueFromXMLObject; /** * Default implementation of {@link EntityDescriptorService} @@ -684,18 +685,9 @@ public EntityDescriptorRepresentation createRepresentationFromDescriptor(org.ope return representation; } + // TODO: remove private String getValueFromXMLObject(XMLObject xmlObject) { - String objectType = xmlObject.getClass().getSimpleName(); - switch (objectType) { - case "XSAny": - return ((XSAny)xmlObject).getTextContent(); - case "XSString": - return ((XSString)xmlObject).getValue(); - case "XSBoolean": - return ((XSBoolean)xmlObject).getStoredValue(); - default: - throw new RuntimeException(String.format("Unsupported XML Object type [%s]", objectType)); - } + return ModelRepresentationConversions.getValueFromXMLObject(xmlObject); } @Override diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityServiceImpl.java index 7afbac551..111adb394 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityServiceImpl.java @@ -17,6 +17,8 @@ import java.util.List; import java.util.Map; +import static edu.internet2.tier.shibboleth.admin.util.ModelRepresentationConversions.getAttributeFromObjectAndRelyingPartyOverrideProperty; + public class JPAEntityServiceImpl implements EntityService { @Autowired @@ -64,95 +66,16 @@ public List getAttributeListFromEntityRepresentation(EntityDescriptor @Override public edu.internet2.tier.shibboleth.admin.ui.domain.Attribute getAttributeFromAttributeReleaseList(List attributeReleaseList) { - edu.internet2.tier.shibboleth.admin.ui.domain.Attribute attribute = ((AttributeBuilder) openSamlObjects - .getBuilderFactory() - .getBuilder(edu.internet2.tier.shibboleth.admin.ui.domain.Attribute.DEFAULT_ELEMENT_NAME)) - .buildObject(); - - attribute.setName(MDDCConstants.RELEASE_ATTRIBUTES); - - attributeReleaseList.forEach(attributeRelease -> { - XSString xsString = (XSString) openSamlObjects - .getBuilderFactory() - .getBuilder(XSString.TYPE_NAME) - .buildObject(AttributeValue.DEFAULT_ELEMENT_NAME, XSString.TYPE_NAME); - xsString.setValue(attributeRelease); - attribute.getAttributeValues().add(xsString); - }); - - return attribute; + return (edu.internet2.tier.shibboleth.admin.ui.domain.Attribute) ModelRepresentationConversions.getAttributeListFromAttributeReleaseList(attributeReleaseList).get(0); } @Override public List getAttributeListFromAttributeReleaseList(List attributeReleaseList) { - List attributeList = new ArrayList<>(); - - if (attributeReleaseList != null && attributeReleaseList.size() > 0) { - attributeList.add(attributeUtility.createAttributeWithStringValues(MDDCConstants.RELEASE_ATTRIBUTES, attributeReleaseList)); - } - - return (List)(List)attributeList; - } - - edu.internet2.tier.shibboleth.admin.ui.domain.Attribute getAttributeFromObjectAndRelyingPartyOverrideProperty(Object o, RelyingPartyOverrideProperty overrideProperty) { - switch (ModelRepresentationConversions.AttributeTypes.valueOf(overrideProperty.getDisplayType().toUpperCase())) { - case BOOLEAN: - if ((o instanceof Boolean && ((Boolean)o)) || - (o instanceof String) && Boolean.valueOf((String)o)) { - if (overrideProperty.getPersistType() != null && - !overrideProperty.getPersistType().equalsIgnoreCase("boolean")) { - return attributeUtility.createAttributeWithStringValues(overrideProperty.getAttributeName(), - overrideProperty.getAttributeFriendlyName(), - overrideProperty.getPersistValue()); - } else { - if (o instanceof String) { - return attributeUtility.createAttributeWithBooleanValue(overrideProperty.getAttributeName(), - overrideProperty.getAttributeFriendlyName(), - Boolean.valueOf((String) o)); - } else { - Boolean value = Boolean.valueOf(overrideProperty.getInvert()) ^ (Boolean)o; - return attributeUtility.createAttributeWithBooleanValue(overrideProperty.getAttributeName(), - overrideProperty.getAttributeFriendlyName(), - value); - } - } - } - return null; - case INTEGER: - return attributeUtility.createAttributeWithIntegerValue(overrideProperty.getAttributeName(), - overrideProperty.getAttributeFriendlyName(), - Integer.valueOf((String) o)); - case STRING: - return attributeUtility.createAttributeWithStringValues(overrideProperty.getAttributeName(), - overrideProperty.getAttributeFriendlyName(), - (String) o); - case SET: - return attributeUtility.createAttributeWithStringValues(overrideProperty.getAttributeName(), - overrideProperty.getAttributeFriendlyName(), - (List) o); - case LIST: - return attributeUtility.createAttributeWithStringValues(overrideProperty.getAttributeName(), - overrideProperty.getAttributeFriendlyName(), - (List) o); - default: - throw new UnsupportedOperationException("getAttributeListFromRelyingPartyOverridesRepresentation was called with an unsupported type (" + overrideProperty.getDisplayType() + ")!"); - } + return ModelRepresentationConversions.getAttributeListFromAttributeReleaseList(attributeReleaseList); } @Override public List getAttributeListFromRelyingPartyOverridesRepresentation(Map relyingPartyOverridesRepresentation) { - List overridePropertyList = customPropertiesConfiguration.getOverrides(); - List list = new ArrayList<>(); - - for (Map.Entry entry : relyingPartyOverridesRepresentation.entrySet()) { - String key = (String) entry.getKey(); - RelyingPartyOverrideProperty overrideProperty = overridePropertyList.stream().filter(op -> op.getName().equals(key)).findFirst().get(); - edu.internet2.tier.shibboleth.admin.ui.domain.Attribute attribute = getAttributeFromObjectAndRelyingPartyOverrideProperty(entry.getValue(), overrideProperty); - if (attribute != null) { - list.add(attribute); - } - } - - return (List) (List) list; + return ModelRepresentationConversions.getAttributeListFromRelyingPartyOverridesRepresentation(relyingPartyOverridesRepresentation); } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/util/ModelRepresentationConversions.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/util/ModelRepresentationConversions.java index 08c5431e2..afdae5ce7 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/util/ModelRepresentationConversions.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/util/ModelRepresentationConversions.java @@ -127,9 +127,9 @@ public static Object getOverrideFromAttribute(Attribute attribute) { case BOOLEAN: if (relyingPartyOverrideProperty.getPersistType() != null && (!relyingPartyOverrideProperty.getPersistType().equalsIgnoreCase("boolean"))) { - return true; + return relyingPartyOverrideProperty.getPersistValue().equals(getValueFromXMLObject(attributeValues.get(0))); } else { - return Boolean.valueOf(((XSBoolean) attributeValues.get(0)).getStoredValue()); + return Boolean.valueOf(relyingPartyOverrideProperty.getInvert()) ^ Boolean.valueOf(((XSBoolean) attributeValues.get(0)).getStoredValue()); } case INTEGER: return ((XSInteger) attributeValues.get(0)).getValue(); @@ -147,6 +147,20 @@ public static Object getOverrideFromAttribute(Attribute attribute) { } } + public static String getValueFromXMLObject(XMLObject xmlObject) { + String objectType = xmlObject.getClass().getSimpleName(); + switch (objectType) { + case "XSAny": + return ((XSAny)xmlObject).getTextContent(); + case "XSString": + return ((XSString)xmlObject).getValue(); + case "XSBoolean": + return ((XSBoolean)xmlObject).getStoredValue(); + default: + throw new RuntimeException(String.format("Unsupported XML Object type [%s]", objectType)); + } + } + public static List getAttributeListFromAttributeReleaseList(List attributeReleaseList) { List attributeList = new ArrayList<>(); @@ -166,55 +180,9 @@ public static List getAttributeListFromA for (Map.Entry entry : relyingPartyOverridesRepresentation.entrySet()) { String key = (String) entry.getKey(); RelyingPartyOverrideProperty overrideProperty = overridePropertyList.stream().filter(op -> op.getName().equals(key)).findFirst().get(); - switch (AttributeTypes.valueOf(overrideProperty.getDisplayType().toUpperCase())) { - case BOOLEAN: - if (overrideProperty.getPersistType() != null && - !overrideProperty.getPersistType().equals(overrideProperty.getDisplayType())) { - list.add(ATTRIBUTE_UTILITY.createAttributeWithStringValues(overrideProperty.getAttributeName(), - overrideProperty.getAttributeFriendlyName(), - overrideProperty.getPersistValue())); - } else { - list.add(ATTRIBUTE_UTILITY.createAttributeWithBooleanValue(overrideProperty.getAttributeName(), - overrideProperty.getAttributeFriendlyName(), - (Boolean) entry.getValue())); - } - break; - case INTEGER: - list.add(ATTRIBUTE_UTILITY.createAttributeWithIntegerValue(overrideProperty.getAttributeName(), - overrideProperty.getAttributeFriendlyName(), - (Integer) entry.getValue())); - break; - case STRING: - list.add(ATTRIBUTE_UTILITY.createAttributeWithStringValues(overrideProperty.getAttributeName(), - overrideProperty.getAttributeFriendlyName(), - (String) entry.getValue())); - break; - case SET: - Set setValues; - if (entry.getValue() instanceof Set) { - setValues = (Set) entry.getValue(); - } else if (entry.getValue() instanceof List) { - setValues = new HashSet<>(); - setValues.addAll((List) entry.getValue()); - } else { - throw new UnsupportedOperationException("The collection passed from the UI is neither a Set or List. This shouldn't happen. Fix this!"); - } - if (setValues.size() > 0) { - list.add(ATTRIBUTE_UTILITY.createAttributeWithStringValues(overrideProperty.getAttributeName(), - overrideProperty.getAttributeFriendlyName(), - new ArrayList<>(setValues))); - } - break; - case LIST: - List listValues = (List) entry.getValue(); - if (listValues.size() > 0) { - list.add(ATTRIBUTE_UTILITY.createAttributeWithStringValues(overrideProperty.getAttributeName(), - overrideProperty.getAttributeFriendlyName(), - listValues)); - } - break; - default: - throw new UnsupportedOperationException("getAttributeListFromRelyingPartyOverridesRepresentation was called with an unsupported type (" + overrideProperty.getDisplayType() + ")!"); + Attribute attribute = getAttributeFromObjectAndRelyingPartyOverrideProperty(entry.getValue(), overrideProperty); + if (attribute != null) { + list.add(attribute); } } } @@ -222,6 +190,51 @@ public static List getAttributeListFromA return (List) (List) list; } + public static Attribute getAttributeFromObjectAndRelyingPartyOverrideProperty(Object o, RelyingPartyOverrideProperty overrideProperty) { + switch (ModelRepresentationConversions.AttributeTypes.valueOf(overrideProperty.getDisplayType().toUpperCase())) { + case BOOLEAN: + if ((o instanceof Boolean && ((Boolean)o)) || + (o instanceof String) && Boolean.valueOf((String)o)) { + if (overrideProperty.getPersistType() != null && + !overrideProperty.getPersistType().equalsIgnoreCase("boolean")) { + return ATTRIBUTE_UTILITY.createAttributeWithStringValues(overrideProperty.getAttributeName(), + overrideProperty.getAttributeFriendlyName(), + overrideProperty.getPersistValue()); + } else { + if (o instanceof String) { + return ATTRIBUTE_UTILITY.createAttributeWithBooleanValue(overrideProperty.getAttributeName(), + overrideProperty.getAttributeFriendlyName(), + Boolean.valueOf((String) o)); + } else { + Boolean value = Boolean.valueOf(overrideProperty.getInvert()) ^ (Boolean)o; + return ATTRIBUTE_UTILITY.createAttributeWithBooleanValue(overrideProperty.getAttributeName(), + overrideProperty.getAttributeFriendlyName(), + value); + } + } + } + return null; + case INTEGER: + return ATTRIBUTE_UTILITY.createAttributeWithIntegerValue(overrideProperty.getAttributeName(), + overrideProperty.getAttributeFriendlyName(), + Integer.valueOf((String) o)); + case STRING: + return ATTRIBUTE_UTILITY.createAttributeWithStringValues(overrideProperty.getAttributeName(), + overrideProperty.getAttributeFriendlyName(), + (String) o); + case SET: + return ATTRIBUTE_UTILITY.createAttributeWithStringValues(overrideProperty.getAttributeName(), + overrideProperty.getAttributeFriendlyName(), + (List) o); + case LIST: + return ATTRIBUTE_UTILITY.createAttributeWithStringValues(overrideProperty.getAttributeName(), + overrideProperty.getAttributeFriendlyName(), + (List) o); + default: + throw new UnsupportedOperationException("getAttributeListFromRelyingPartyOverridesRepresentation was called with an unsupported type (" + overrideProperty.getDisplayType() + ")!"); + } + } + public enum AttributeTypes { BOOLEAN, diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/AuxiliaryJPAEntityServiceTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/AuxiliaryJPAEntityServiceTests.groovy index 92c2627aa..2e70f1884 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/AuxiliaryJPAEntityServiceTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/AuxiliaryJPAEntityServiceTests.groovy @@ -5,6 +5,7 @@ import edu.internet2.tier.shibboleth.admin.ui.domain.RelyingPartyOverridePropert import edu.internet2.tier.shibboleth.admin.ui.domain.XSBoolean import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects import edu.internet2.tier.shibboleth.admin.util.AttributeUtility +import edu.internet2.tier.shibboleth.admin.util.ModelRepresentationConversions import spock.lang.Shared import spock.lang.Specification import spock.lang.Unroll @@ -33,7 +34,7 @@ class AuxiliaryJPAEntityServiceTests extends Specification { displayType: 'boolean', invert: 'true' ) - Attribute att = jpaEntityService.getAttributeFromObjectAndRelyingPartyOverrideProperty(input, overrideProperty) + Attribute att = ModelRepresentationConversions.getAttributeFromObjectAndRelyingPartyOverrideProperty(input, overrideProperty) expect: assert att && att.getAttributeValues()[0] instanceof XSBoolean && ((XSBoolean) att.getAttributeValues()[0]).value.value == output diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy index 5da927e25..982722ebd 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy @@ -305,9 +305,9 @@ class TestObjectGenerator { case ModelRepresentationConversions.AttributeTypes.BOOLEAN: if (override.getPersistType() != null && override.getPersistType() != override.getDisplayType()) { - attributes.add(attributeUtility.createAttributeWithStringValues(override.getAttributeName(), override.getAttributeFriendlyName(), generator.randomString(30))) + attributes.add(attributeUtility.createAttributeWithStringValues(override.getAttributeName(), override.getAttributeFriendlyName(), override.persistValue)) } else { - attributes.add(attributeUtility.createAttributeWithBooleanValue(override.getAttributeName(), override.getAttributeFriendlyName(), true)) + attributes.add(attributeUtility.createAttributeWithBooleanValue(override.getAttributeName(), override.getAttributeFriendlyName(), Boolean.valueOf(override.invert) ^ true)) } break case ModelRepresentationConversions.AttributeTypes.INTEGER: From ab57ae1e9aa0bb14ea046b393abd6dfd403642ef Mon Sep 17 00:00:00 2001 From: Jj! Date: Thu, 7 Mar 2019 13:39:18 -0600 Subject: [PATCH 2/3] [NOISSUE] fix default value --- .../shibboleth/admin/ui/service/JsonSchemaBuilderService.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JsonSchemaBuilderService.groovy b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JsonSchemaBuilderService.groovy index 90e2d12e0..ab3ae6fda 100644 --- a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JsonSchemaBuilderService.groovy +++ b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JsonSchemaBuilderService.groovy @@ -38,7 +38,7 @@ class JsonSchemaBuilderService { description: it['helpText'], type : it['displayType']] if (it['displayType'] == 'boolean') { - property['default'] = (Boolean)(it['defaultValue']) + property['default'] = Boolean.valueOf(it['defaultValue']) } else { property['default'] = it['defaultValue'] } From 77359f87d4fcbfe0ce420c619ed2792341114df2 Mon Sep 17 00:00:00 2001 From: Jj! Date: Thu, 7 Mar 2019 14:20:25 -0600 Subject: [PATCH 3/3] [NOISSUE] get rid of a workaround --- .../ui/service/JPAEntityDescriptorServiceImpl.java | 3 --- .../admin/util/ModelRepresentationConversions.java | 11 ----------- 2 files changed, 14 deletions(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java index 5137773b5..9bbf5ec2a 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java @@ -676,9 +676,6 @@ public EntityDescriptorRepresentation createRepresentationFromDescriptor(org.ope } } - // TODO: fix this; there is a problem with the way that defaults are working and the processing from the front end - ModelRepresentationConversions.completeMe(relyingPartyOverrides); - representation.setRelyingPartyOverrides(relyingPartyOverrides); } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/util/ModelRepresentationConversions.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/util/ModelRepresentationConversions.java index afdae5ce7..b1669d8a9 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/util/ModelRepresentationConversions.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/util/ModelRepresentationConversions.java @@ -99,17 +99,6 @@ public static Map getRelyingPartyOverridesRepresentationFromAttr return relyingPartyOverrides; } - // TODO: fix this; currently there is a problem with not returning a value - public static Map completeMe(Map relyingPartyOverrides) { - customPropertiesConfiguration - .getOverrides() - .stream() - .filter(o -> !relyingPartyOverrides.containsKey(o.getName())) - .filter(o -> o.getDisplayType().equals("boolean")) - .forEach(p -> relyingPartyOverrides.put(p.getName(), getDefaultValueFromProperty(p))); - return relyingPartyOverrides; - } - private static Object getDefaultValueFromProperty(RelyingPartyOverrideProperty property) { switch (property.getDisplayType()) { case "boolean":