1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package gov.nist.secauto.metaschema.schemagen.xml.schematype;
28
29 import gov.nist.secauto.metaschema.core.model.IValuedDefinition;
30 import gov.nist.secauto.metaschema.core.util.CollectionUtil;
31 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
32 import gov.nist.secauto.metaschema.schemagen.SchemaGenerationException;
33 import gov.nist.secauto.metaschema.schemagen.xml.XmlSchemaGenerator;
34 import gov.nist.secauto.metaschema.schemagen.xml.impl.XmlGenerationState;
35
36 import java.util.LinkedList;
37 import java.util.List;
38 import java.util.stream.Collectors;
39
40 import javax.xml.namespace.QName;
41 import javax.xml.stream.XMLStreamException;
42
43 import edu.umd.cs.findbugs.annotations.NonNull;
44
45 public class XmlSimpleTypeUnion
46 extends AbstractXmlSimpleType {
47 @NonNull
48 private final List<IXmlSimpleType> simpleTypes;
49
50 public XmlSimpleTypeUnion(
51 @NonNull QName qname,
52 @NonNull IValuedDefinition definition,
53 @NonNull IXmlSimpleType... simpleTypes) {
54 super(qname, definition);
55 this.simpleTypes = CollectionUtil.requireNonEmpty(CollectionUtil.listOrEmpty(simpleTypes));
56 }
57
58 @NonNull
59 public List<IXmlSimpleType> getSimpleTypes() {
60 return simpleTypes;
61 }
62
63 @Override
64 public void generateType(XmlGenerationState state, boolean anonymous) {
65 try {
66 state.writeStartElement(XmlSchemaGenerator.PREFIX_XML_SCHEMA, "simpleType", XmlSchemaGenerator.NS_XML_SCHEMA);
67
68 if (!anonymous) {
69 state.writeAttribute("name", ObjectUtils.notNull(getQName().getLocalPart()));
70 }
71
72 state.writeStartElement(XmlSchemaGenerator.PREFIX_XML_SCHEMA, "union", XmlSchemaGenerator.NS_XML_SCHEMA);
73
74 List<IXmlSimpleType> memberTypes = new LinkedList<>();
75 List<IXmlSimpleType> inlineTypes = new LinkedList<>();
76 for (IXmlSimpleType unionType : simpleTypes) {
77 if (unionType.isGeneratedType(state) && unionType.isInline(state)) {
78 inlineTypes.add(unionType);
79 } else {
80 memberTypes.add(unionType);
81 }
82 }
83
84 if (!memberTypes.isEmpty()) {
85 state.writeAttribute(
86 "memberTypes",
87 ObjectUtils.notNull(memberTypes.stream()
88 .map(type -> type.getTypeReference())
89 .collect(Collectors.joining(" "))));
90 }
91
92 for (IXmlSimpleType inlineType : inlineTypes) {
93 inlineType.generateType(state, true);
94 }
95
96 state.writeEndElement();
97 state.writeEndElement();
98
99 for (IXmlSimpleType memberType : memberTypes) {
100 memberType.generateType(state, false);
101 }
102 } catch (XMLStreamException ex) {
103 throw new SchemaGenerationException(ex);
104 }
105 }
106 }