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.datatype.markup.MarkupLine;
30 import gov.nist.secauto.metaschema.core.model.IValuedDefinition;
31 import gov.nist.secauto.metaschema.core.model.constraint.IAllowedValue;
32 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
33 import gov.nist.secauto.metaschema.schemagen.AbstractGenerationState.AllowedValueCollection;
34 import gov.nist.secauto.metaschema.schemagen.SchemaGenerationException;
35 import gov.nist.secauto.metaschema.schemagen.xml.XmlSchemaGenerator;
36 import gov.nist.secauto.metaschema.schemagen.xml.impl.XmlGenerationState;
37
38 import org.codehaus.stax2.XMLStreamWriter2;
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 XmlSimpleTypeDataTypeRestriction
46 extends AbstractXmlSimpleType {
47 @NonNull
48 private final AllowedValueCollection allowedValuesCollection;
49
50 public XmlSimpleTypeDataTypeRestriction(
51 @NonNull QName qname,
52 @NonNull IValuedDefinition definition,
53 @NonNull AllowedValueCollection allowedValuesCollection) {
54 super(qname, definition);
55 this.allowedValuesCollection = allowedValuesCollection;
56 }
57
58 protected AllowedValueCollection getAllowedValuesCollection() {
59 return allowedValuesCollection;
60 }
61
62 @Override
63 public void generateType(XmlGenerationState state, boolean anonymous) {
64 try {
65 state.writeStartElement(XmlSchemaGenerator.PREFIX_XML_SCHEMA, "simpleType", XmlSchemaGenerator.NS_XML_SCHEMA);
66
67 if (!anonymous) {
68 state.writeAttribute("name", ObjectUtils.notNull(getQName().getLocalPart()));
69 }
70
71 state.writeStartElement(XmlSchemaGenerator.PREFIX_XML_SCHEMA, "restriction", XmlSchemaGenerator.NS_XML_SCHEMA);
72 state.writeAttribute("base", state.getSimpleType(getDataTypeAdapter()).getTypeReference());
73
74 for (IAllowedValue allowedValue : getAllowedValuesCollection().getValues()) {
75 state.writeStartElement(XmlSchemaGenerator.PREFIX_XML_SCHEMA, "enumeration", XmlSchemaGenerator.NS_XML_SCHEMA);
76 state.writeAttribute("value", allowedValue.getValue());
77
78 MarkupLine description = allowedValue.getDescription();
79 generateDescriptionAnnotation(
80 description,
81 ObjectUtils.notNull(getQName().getNamespaceURI()),
82 state);
83
84
85
86 state.writeEndElement();
87 }
88
89 state.writeEndElement();
90 state.writeEndElement();
91 } catch (XMLStreamException ex) {
92 throw new SchemaGenerationException(ex);
93 }
94 }
95
96 public static void generateDescriptionAnnotation(
97 @NonNull MarkupLine description,
98 @NonNull String xmlNS,
99 @NonNull XmlGenerationState state) throws XMLStreamException {
100 XMLStreamWriter2 writer = state.getXMLStreamWriter();
101 writer.writeStartElement(XmlSchemaGenerator.PREFIX_XML_SCHEMA, "annotation", XmlSchemaGenerator.NS_XML_SCHEMA);
102 writer.writeStartElement(XmlSchemaGenerator.PREFIX_XML_SCHEMA, "documentation", XmlSchemaGenerator.NS_XML_SCHEMA);
103
104
105 writer.writeStartElement(xmlNS, "p");
106
107 description.writeXHtml(xmlNS, writer);
108
109 writer.writeEndElement();
110
111 writer.writeEndElement();
112 writer.writeEndElement();
113 }
114 }