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.IFlagContainer;
30 import gov.nist.secauto.metaschema.core.model.IFlagDefinition;
31 import gov.nist.secauto.metaschema.core.model.IFlagInstance;
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.DocumentationGenerator;
35 import gov.nist.secauto.metaschema.schemagen.xml.impl.XmlGenerationState;
36
37 import javax.xml.namespace.QName;
38 import javax.xml.stream.XMLStreamException;
39
40 import edu.umd.cs.findbugs.annotations.NonNull;
41
42 public abstract class AbstractXmlComplexType<D extends IFlagContainer>
43 extends AbstractXmlType
44 implements IXmlComplexType {
45 @NonNull
46 private final D definition;
47
48 public AbstractXmlComplexType(
49 @NonNull QName qname,
50 @NonNull D definition) {
51 super(qname);
52 this.definition = definition;
53 }
54
55 @Override
56 @NonNull
57 public D getDefinition() {
58 return definition;
59 }
60
61 @Override
62 public void generateType(@NonNull XmlGenerationState state, boolean anonymous) {
63 try {
64 state.writeStartElement(XmlSchemaGenerator.PREFIX_XML_SCHEMA, "complexType", XmlSchemaGenerator.NS_XML_SCHEMA);
65
66 if (!anonymous) {
67 state.writeAttribute("name", getTypeName());
68 }
69
70 DocumentationGenerator.generateDocumentation(getDefinition(), state);
71
72 generateTypeBody(state);
73
74 state.writeEndElement();
75 } catch (XMLStreamException ex) {
76 throw new SchemaGenerationException(ex);
77 }
78 }
79
80 protected abstract void generateTypeBody(@NonNull XmlGenerationState state) throws XMLStreamException;
81
82 protected static void generateFlagInstance(@NonNull IFlagInstance instance, @NonNull XmlGenerationState state)
83 throws XMLStreamException {
84 state.writeStartElement(XmlSchemaGenerator.PREFIX_XML_SCHEMA, "attribute", XmlSchemaGenerator.NS_XML_SCHEMA);
85
86 state.writeAttribute("name", instance.getEffectiveName());
87
88 if (instance.isRequired()) {
89 state.writeAttribute("use", "required");
90 }
91
92 IFlagDefinition definition = instance.getDefinition();
93
94 IXmlType type = state.getTypeForDefinition(definition);
95
96 if (state.isInline(definition) && type.isGeneratedType(state)) {
97 DocumentationGenerator.generateDocumentation(instance, state);
98
99 type.generateType(state, true);
100 } else {
101 state.writeAttribute("type", type.getTypeReference());
102
103 DocumentationGenerator.generateDocumentation(instance, state);
104 }
105
106 state.writeEndElement();
107 }
108
109 @Override
110 public boolean isInline(XmlGenerationState state) {
111 return state.isInline(getDefinition());
112 }
113 }