001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package org.netbeans.modules.schema2beansdev.gen;
043:
044: import java.io.*;
045: import java.util.*;
046:
047: public class XMLWriter extends IndentingWriter {
048: protected String xmlVersion = "1.0";
049: protected String encoding = "UTF-8";
050: protected boolean header = true;
051: protected Stack tags;
052:
053: public int HEADER_SECTION = 0;
054: public int BODY_SECTION = 1;
055: static final protected int defaultSectionCount = 2;
056:
057: public XMLWriter() {
058: super (defaultSectionCount);
059: privateInit();
060: }
061:
062: public XMLWriter(boolean header) {
063: super (defaultSectionCount);
064: this .header = header;
065: privateInit();
066: }
067:
068: public XMLWriter(String encoding) {
069: super (defaultSectionCount);
070: this .encoding = encoding;
071: privateInit();
072: }
073:
074: public XMLWriter(String encoding, String xmlVersion) {
075: super (defaultSectionCount);
076: this .encoding = encoding;
077: this .xmlVersion = xmlVersion;
078: privateInit();
079: }
080:
081: /**
082: * Insert a custom section after another section.
083: * eg:
084: * JavaWriter jw = new JavaWriter();
085: * int SPECIAL_SECTION = jw.insertSectionAfter(jw.CONSTRUCTOR_SECTION);
086: */
087: public int insertSectionAfter(int sectionNum) {
088: insertAdditionalBuffers(sectionNum, 1);
089: if (sectionNum < HEADER_SECTION)
090: ++HEADER_SECTION;
091: if (sectionNum < BODY_SECTION)
092: ++BODY_SECTION;
093: return sectionNum + 1;
094: }
095:
096: public void reset() {
097: super .reset();
098: privateInit();
099: }
100:
101: private void privateInit() {
102: tags = new Stack();
103: try {
104: if (header) {
105: select(HEADER_SECTION);
106: write("<?xml version='");
107: write(xmlVersion);
108: write("' encoding='");
109: write(encoding);
110: write("' ?>\n");
111: }
112: select(BODY_SECTION);
113: } catch (IOException e) {
114: // This exception should not occur.
115: throw new RuntimeException(e);
116: }
117: }
118:
119: public void startTag(String tag) throws IOException {
120: startTag(null, tag, null, true);
121: }
122:
123: public void startTag(String tag, boolean finish) throws IOException {
124: startTag(null, tag, null, finish);
125: }
126:
127: public void startTag(String namespace, String tag)
128: throws IOException {
129: startTag(namespace, tag, null, true);
130: }
131:
132: public void startTag(String namespace, String tag, boolean finish)
133: throws IOException {
134: startTag(namespace, tag, null, finish);
135: }
136:
137: public void startTag(String namespace, String tag,
138: String attributeString) throws IOException {
139: startTag(namespace, tag, attributeString, true);
140: }
141:
142: /**
143: * @param finish Whether or not to add the finishing ">", if not then
144: * setFirst(" ") is called anticipating the addition of
145: * attributes.
146: * @param attributeString The attributes. Make sure to XML escape.
147: */
148: public void startTag(String namespace, String tag,
149: String attributeString, boolean finish) throws IOException {
150: String fullTag;
151: if (namespace != null)
152: fullTag = namespace + ":" + tag;
153: else
154: fullTag = tag;
155: tags.push(fullTag);
156: write("<");
157: write(fullTag);
158: if (attributeString != null) {
159: if (!attributeString.startsWith(" "))
160: write(" ");
161: write(attributeString);
162: }
163: if (finish)
164: finishStartTag();
165: else
166: setFirst(" ");
167: indentRight();
168: }
169:
170: /**
171: * Finish the start tag, and we expect to have children
172: * (ie, that means the client will call endTag).
173: */
174: public void finishStartTag() throws IOException {
175: write(">");
176: }
177:
178: /**
179: * @param children if false, then there are no children, and
180: * endTag is called automatically.
181: */
182: public void finishStartTag(boolean children, boolean useCr)
183: throws IOException {
184: if (!children) {
185: write("/");
186: indentLeft();
187: tags.pop();
188: }
189: finishStartTag();
190: if (useCr)
191: cr();
192: }
193:
194: public void endTag() throws IOException {
195: endTag(true);
196: }
197:
198: public void endTag(boolean useCr) throws IOException {
199: indentLeft();
200: String fullTag = (String) tags.pop();
201: write("</");
202: write(fullTag);
203: write(">");
204: if (useCr)
205: cr();
206: }
207: }
|