diff --git a/rosetta-tools/src/main/java/com/regnosys/rosetta/tools/modelimport/RosettaModelFactory.java b/rosetta-tools/src/main/java/com/regnosys/rosetta/tools/modelimport/RosettaModelFactory.java index b15bf5a14..42d276b01 100644 --- a/rosetta-tools/src/main/java/com/regnosys/rosetta/tools/modelimport/RosettaModelFactory.java +++ b/rosetta-tools/src/main/java/com/regnosys/rosetta/tools/modelimport/RosettaModelFactory.java @@ -4,12 +4,14 @@ import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; +import org.apache.commons.lang3.StringUtils; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; @@ -295,6 +297,7 @@ private RosettaEnumValue createEnumValue(XsdEnumeration ev) { rosettaEnumValue.setName(value); extractDocs(ev).ifPresent(rosettaEnumValue::setDefinition); extractDocs(ev, DOC_ANNOTATION_SOURCE_NAME) + .filter(x -> StringUtils.isNotEmpty(x)) .filter(x -> !x.equals(ev.getValue())) .ifPresent(rosettaEnumValue::setDisplay); @@ -305,13 +308,14 @@ private Resource createResource(String namespace, String type) { return resourceSet.createResource(URI.createURI(namespace.substring(namespace.indexOf('.') + 1) .replace('.', '-') + "-" + type + ".rosetta")); } - + private Optional extractDocs(XsdAnnotatedElements ev) { return Optional.ofNullable(ev) .map(XsdAnnotatedElements::getAnnotation) .map(XsdAnnotation::getDocumentations) .map(xsdDocs -> xsdDocs.stream() - .filter(x -> documentationSources.contains(x.getSource())) + // default to definition if source not specified + .filter(x -> x.getSource() == null || documentationSources.contains(x.getSource())) .map(XsdAnnotationChildren::getContent) .map(x -> x.replace('\n', ' ')) .map(x -> x.replace('\r', ' ')) @@ -324,6 +328,7 @@ private Optional extractDocs(XsdAnnotatedElements ev, String docAnnotati .map(XsdAnnotatedElements::getAnnotation) .map(XsdAnnotation::getDocumentations) .map(xsdDocs -> xsdDocs.stream() + .filter(x -> x.getSource() != null) .filter(x -> x.getSource().equals(docAnnotationSourceName)) .map(XsdAnnotationChildren::getContent) .map(x -> x.replace('\n', ' ')) diff --git a/rosetta-tools/src/test/java/com/regnosys/rosetta/tools/modelimport/RosettaModelFactoryTest.java b/rosetta-tools/src/test/java/com/regnosys/rosetta/tools/modelimport/RosettaModelFactoryTest.java index 19f8f86e1..07158845f 100644 --- a/rosetta-tools/src/test/java/com/regnosys/rosetta/tools/modelimport/RosettaModelFactoryTest.java +++ b/rosetta-tools/src/test/java/com/regnosys/rosetta/tools/modelimport/RosettaModelFactoryTest.java @@ -41,7 +41,10 @@ @InjectWith(RosettaInjectorProvider.class) public class RosettaModelFactoryTest { + // contains documentation elements with source attributes private static final String DATA_XSD_PATH = "src/test/resources/model-import/data.xsd"; + // contains documentation elements without source attributes + private static final String DATA2_XSD_PATH = "src/test/resources/model-import/data2.xsd"; private static final String NAMESPACE = "test.ns"; private static final String NAMESPACE_DEFINITION = "test.ns definition"; @@ -180,6 +183,50 @@ void shouldGenerateAddAttributesToData() { assertAttribute(attrs.get(7), "fooBarListAttr", "Bar", 1, 2, false, "FooBarListAttr definition."); } + @Test + void shouldGenerateAddAttributesToData2() { + GenerationProperties properties = mock(GenerationProperties.class); + when(properties.getNamespace()).thenReturn(NAMESPACE); + when(properties.getNamespaceDefinition()).thenReturn(NAMESPACE_DEFINITION); + + RosettaModelFactory factory = new RosettaModelFactory(resourceSet, rosettaTypeMappings); + RosettaBody rosettaBody = factory.createBody(BODY_TYPE, BODY_NAME, BODY_DEFINITION); + RosettaCorpus rosettaCorpus = factory.createCorpus(rosettaBody, CORPUS_TYPE, CORPUS_NAME, CORPUS_DISPLAY_NAME, CORPUS_DEFINITION); + RosettaSegment rosettaSegment = factory.createSegment(SEGMENT); + RosettaModel rosettaModel = factory.createRosettaModel("type", properties, List.of()); + + // Load xsd elements, create data elements, and add to rosetta model elements + List xsdElements = getXsdElements(DATA2_XSD_PATH, XsdNamedElements.class); + List dataTypes = xsdElements.stream() + .map(element -> factory.createData(element)) + .collect(Collectors.toList()); + rosettaModel.getElements().addAll(dataTypes); + + // test + XsdComplexType xsdComplexTypeFoo = (XsdComplexType) xsdElements.get(3); + factory.addAttributesToData(xsdComplexTypeFoo, rosettaBody, rosettaCorpus, rosettaSegment); + + // assert + Data foo = dataTypes.get(3); + + assertEquals("Foo", foo.getName()); + assertEquals("Foo definition.", foo.getDefinition()); + + List attrs = foo.getAttributes(); + assertEquals(8, attrs.size()); + + assertAttribute(attrs.get(0), "fooBooleanAttr", "boolean", 1, 1, false, "FooBooleanAttr definition."); + assertAttribute(attrs.get(1), "fooStrAttr", "string", 1, 1, false, "FooStrAttr definition."); + assertAttribute(attrs.get(2), "fooDecimalAttr", "number", 0, 1, false, "FooDecimalAttr definition."); + assertAttribute(attrs.get(3), "fooStringWithRestrictionAttr", "string", 1, 1, false, "FooStringWithRestrictionAttr definition.", + "Specifies a character string with a maximum length of 500 characters.", "Max500Text"); + assertAttribute(attrs.get(4), "fooDecimalWithRestrictionAttr", "number", 0, 1, false, "FooDecimalWithRestrictionAttr definition.", + "Number (max 999) of objects represented as an integer.", "Max3Number"); + assertAttribute(attrs.get(5), "fooBarAttr", "Bar", 1, 1, false, "FooBarAttr definition."); + assertAttribute(attrs.get(6), "fooStrListAttr", "string", 0, 0, true, "FooStrListAttr definition."); + assertAttribute(attrs.get(7), "fooBarListAttr", "Bar", 1, 2, false, "FooBarListAttr definition."); + } + private void assertAttribute(Attribute attr, String name, String type, int inf, int sup, boolean unbounded, String definition) { assertEquals(name, attr.getName()); assertEquals(type, attr.getTypeCall().getType().getName()); diff --git a/rosetta-tools/src/test/resources/model-import/data2.xsd b/rosetta-tools/src/test/resources/model-import/data2.xsd new file mode 100644 index 000000000..4bde69438 --- /dev/null +++ b/rosetta-tools/src/test/resources/model-import/data2.xsd @@ -0,0 +1,80 @@ + + + + + Specifies a character string with a maximum length of 500 characters. + + + + + + + + + Number (max 999) of objects represented as an integer. + + + + + + + + + Bar definition. + + + + + Bar string attribute definition. + + + + + + + Foo definition. + + + + + FooBooleanAttr definition. + + + + + FooStrAttr definition. + + + + + FooDecimalAttr definition. + + + + + FooStringWithRestrictionAttr definition. + + + + + FooDecimalWithRestrictionAttr definition. + + + + + FooBarAttr definition. + + + + + FooStrListAttr definition. + + + + + FooBarListAttr definition. + + + + +