View Javadoc
1   /*
2    * Portions of this software was developed by employees of the National Institute
3    * of Standards and Technology (NIST), an agency of the Federal Government and is
4    * being made available as a public service. Pursuant to title 17 United States
5    * Code Section 105, works of NIST employees are not subject to copyright
6    * protection in the United States. This software may be subject to foreign
7    * copyright. Permission in the United States and in foreign countries, to the
8    * extent that NIST may hold copyright, to use, copy, modify, create derivative
9    * works, and distribute this software and its documentation without fee is hereby
10   * granted on a non-exclusive basis, provided that this notice and disclaimer
11   * of warranty appears in all copies.
12   *
13   * THE SOFTWARE IS PROVIDED 'AS IS' WITHOUT ANY WARRANTY OF ANY KIND, EITHER
14   * EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY
15   * THAT THE SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF
16   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND FREEDOM FROM
17   * INFRINGEMENT, AND ANY WARRANTY THAT THE DOCUMENTATION WILL CONFORM TO THE
18   * SOFTWARE, OR ANY WARRANTY THAT THE SOFTWARE WILL BE ERROR FREE.  IN NO EVENT
19   * SHALL NIST BE LIABLE FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO, DIRECT,
20   * INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF, RESULTING FROM,
21   * OR IN ANY WAY CONNECTED WITH THIS SOFTWARE, WHETHER OR NOT BASED UPON WARRANTY,
22   * CONTRACT, TORT, OR OTHERWISE, WHETHER OR NOT INJURY WAS SUSTAINED BY PERSONS OR
23   * PROPERTY OR OTHERWISE, AND WHETHER OR NOT LOSS WAS SUSTAINED FROM, OR AROSE OUT
24   * OF THE RESULTS OF, OR USE OF, THE SOFTWARE OR SERVICES PROVIDED HEREUNDER.
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          // LOGGER.info(String.format("Field:%s:%s: %s",
84          // definition.getContainingMetaschema().getLocation(),
85          // definition.getName(), allowedValue.getValue()));
86          state.writeEndElement(); // xs:enumeration
87        }
88  
89        state.writeEndElement(); // xs:restriction
90        state.writeEndElement(); // xs:simpleType
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     // write description
105     writer.writeStartElement(xmlNS, "p");
106 
107     description.writeXHtml(xmlNS, writer);
108 
109     writer.writeEndElement(); // p
110 
111     writer.writeEndElement(); // xs:documentation
112     writer.writeEndElement(); // xs:annotation
113   }
114 }