1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19 package org.apache.rat.tools.xsd;
20
21 import java.io.IOException;
22 import java.io.Writer;
23
24 import org.apache.rat.report.xml.writer.XmlWriter;
25
26 /**
27 * A writer that writes XSD nodes.
28 */
29 public class XsdWriter {
30 /** The XML Writer that this writer uses */
31 private final XmlWriter writer;
32
33 /** Types of elements in the XSD */
34 public enum Type {
35 /** An element */
36 ELEMENT("xs:element"),
37 /** An attribute */
38 ATTRIBUTE("xs:attribute"),
39 /** A complex type */
40 COMPLEX("xs:complexType"),
41 /** A sequence */
42 SEQUENCE("xs:sequence"),
43 /** A simple type */
44 SIMPLE("xs:simpleContent"),
45 /** An extension */
46 EXTENSION("xs:extension"),
47 /** A choice */
48 CHOICE("xs:choice"),
49 /** A complex type */
50 COMPLEX_CONTENT("xs:complexContent");
51 /** The element name associated with the type */
52 private final String elementName;
53
54 /**
55 * Type constructor.
56 *
57 * @param name The element name associated with the type.
58 */
59 Type(final String name) {
60 elementName = name;
61 }
62 }
63
64 /**
65 * Creates an XSD writer that wraps a standard Writer.
66 * @param writer the writer to wrap.
67 */
68 public XsdWriter(final Writer writer) {
69 this.writer = new XmlWriter(writer);
70 }
71
72 /**
73 * Initializes the writer. Writes the initial "xs:schema tag" .
74 * @return the Writer.
75 * @throws IOException on error.
76 */
77 public XsdWriter init() throws IOException {
78 writer.startDocument()
79 .openElement("xs:schema")
80 .attribute("attributeFormDefault", "unqualified")
81 .attribute("xmlns:xs", "http://www.w3.org/2001/XMLSchema");
82 return this;
83 }
84
85 /**
86 * Finishes the process. Closes the document.
87 * @throws IOException on error.
88 */
89 public void finish() throws IOException {
90 writer.closeDocument();
91 }
92
93 /**
94 * Writes an attribute map, each pair of items in the string list are considered attribute name and value.
95 * @param attributeMap the array of attribute names and values.
96 * @throws IOException on error.
97 */
98 private void writeAttributes(final String[] attributeMap) throws IOException {
99 if (attributeMap != null) {
100 for (int i = 0; i < attributeMap.length; i += 2) {
101 writer.attribute(attributeMap[i], attributeMap[i + 1]);
102 }
103 }
104 }
105
106 /**
107 * Opens (Starts) an element of the specified type along with its attributes.
108 * @param type the Type to start.
109 * @param attributeMap the attributes for the element.
110 * @return this.
111 * @throws IOException on error.
112 */
113 public XsdWriter open(final Type type, final String... attributeMap) throws IOException {
114 writer.openElement(type.elementName);
115 writeAttributes(attributeMap);
116 return this;
117 }
118
119 /**
120 * Writes the attributes
121 * @param name The name of the attribute.
122 * @param attributeMap the attributes of the attribute.
123 * @return this.
124 * @throws IOException on error.
125 */
126 public XsdWriter attribute(final String name, final String... attributeMap) throws IOException {
127 writer.openElement("xs:attribute").attribute("name", name);
128 writeAttributes(attributeMap);
129 writer.closeElement();
130 return this;
131 }
132
133 /**
134 * Closes (Ends) the element for the type.
135 * @param type The type to close.
136 * @return this.
137 * @throws IOException on error
138 */
139 public XsdWriter close(final Type type) throws IOException {
140 writer.closeElement(type.elementName);
141 return this;
142 }
143 }