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 e21be8a29..6bf5ac294 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 @@ -522,7 +522,7 @@ public EntityDescriptorRepresentation createRepresentationFromDescriptor(org.ope if (jpaAttribute.getAttributeValues().size() != 1) { throw new RuntimeException("Multiple/No values detected where one is expected!"); } - attributeValues = getValueFromXSStringOrXSAny(jpaAttribute.getAttributeValues().get(0)); + attributeValues = getValueFromXMLObject(jpaAttribute.getAttributeValues().get(0)); break; case INTEGER: if (jpaAttribute.getAttributeValues().size() != 1) { @@ -536,7 +536,7 @@ public EntityDescriptorRepresentation createRepresentationFromDescriptor(org.ope } if (overrideProperty.getPersistType() != null && !overrideProperty.getPersistType().equals(overrideProperty.getDisplayType())) { - attributeValues = getValueFromXSStringOrXSAny(jpaAttribute.getAttributeValues().get(0)); + attributeValues = getValueFromXMLObject(jpaAttribute.getAttributeValues().get(0)); } else { attributeValues = Boolean.valueOf(((XSBoolean) jpaAttribute.getAttributeValues() .get(0)).getStoredValue()); @@ -545,7 +545,7 @@ public EntityDescriptorRepresentation createRepresentationFromDescriptor(org.ope case SET: case LIST: attributeValues = jpaAttribute.getAttributeValues().stream() - .map(attributeValue -> getValueFromXSStringOrXSAny(attributeValue)) + .map(attributeValue -> getValueFromXMLObject(attributeValue)) .collect(Collectors.toList()); } relyingPartyOverrides.put(((RelyingPartyOverrideProperty) override.get()).getName(), attributeValues); @@ -559,11 +559,17 @@ public EntityDescriptorRepresentation createRepresentationFromDescriptor(org.ope return representation; } - private String getValueFromXSStringOrXSAny(XMLObject xmlObject) { - if (xmlObject instanceof XSAny) { - return ((XSAny)xmlObject).getTextContent(); - } else { - return ((XSString)xmlObject).getValue(); + 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)); } } diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy index 8bec07d33..0c4057678 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImplTests.groovy @@ -6,7 +6,10 @@ import edu.internet2.tier.shibboleth.admin.ui.configuration.CoreShibUiConfigurat import edu.internet2.tier.shibboleth.admin.ui.configuration.CustomPropertiesConfiguration import edu.internet2.tier.shibboleth.admin.ui.domain.EntityDescriptor import edu.internet2.tier.shibboleth.admin.ui.domain.XSAny +import edu.internet2.tier.shibboleth.admin.ui.domain.XSAnyBuilder import edu.internet2.tier.shibboleth.admin.ui.domain.XSBoolean +import edu.internet2.tier.shibboleth.admin.ui.domain.XSBooleanBuilder +import edu.internet2.tier.shibboleth.admin.ui.domain.XSStringBuilder import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.AssertionConsumerServiceRepresentation import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.ContactRepresentation import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.EntityDescriptorRepresentation @@ -786,6 +789,59 @@ class JPAEntityDescriptorServiceImplTests extends Specification { expectedVersion == actualVersion } + def "SHIBUI-1220 getValueFromXMLObject handles XSAny"() { + given: + def builder = new XSAnyBuilder() + def xsAny = builder.buildObject('namespace', 'localname', 'prefix') + def expectedTextContent = 'expectedTextContent' + xsAny.setTextContent(expectedTextContent) + + when: + def result = service.getValueFromXMLObject(xsAny) + + then: + result == expectedTextContent + } + + def "SHIBUI-1220 getValueFromXMLObject handles XSString"() { + given: + def builder = new XSStringBuilder() + def xsString = builder.buildObject('namespace', 'localname', 'prefix') + def expectedValue = 'expectedValue' + xsString.setValue(expectedValue) + + when: + def result = service.getValueFromXMLObject(xsString) + + then: + result == expectedValue + } + + def "SHIBUI-1220 getValueFromXMLObject handles XSBoolean"() { + given: + def builder = new XSBooleanBuilder() + def xsBoolean = builder.buildObject('namespace', 'localname', 'prefix') + def expectedValue = 'true' + xsBoolean.setStoredValue(expectedValue) + + when: + def result = service.getValueFromXMLObject(xsBoolean) + + then: + result == expectedValue + } + + def "SHIBUI-1220 getValueFromXMLObject throws RuntimeException for unhandled object type"() { + given: + def unhandledObject = new Object() + + when: + service.getValueFromXMLObject(unhandledObject) + + then: + thrown RuntimeException + } + EntityDescriptor generateRandomEntityDescriptor() { EntityDescriptor ed = new EntityDescriptor()