/* * Copyright 1999,2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.modeshape.webdav.fromcatalina; import java.io.IOException; import java.io.Writer; import java.util.Iterator; import java.util.Map; /** * XMLWriter helper class. * * @author <a href="mailto:remm@apache.org">Remy Maucherat</a> */ public class XMLWriter { // -------------------------------------------------------------- Constants /** * Opening tag. */ public static final int OPENING = 0; /** * Closing tag. */ public static final int CLOSING = 1; /** * Element with no content. */ public static final int NO_CONTENT = 2; // ----------------------------------------------------- Instance Variables /** * Buffer. */ protected StringBuilder buffer = new StringBuilder(); /** * Writer. */ protected Writer writer = null; /** * Namespaces to be declared in the root element */ protected Map<String, String> namespaces; /** * Is true until the root element is written */ protected boolean isRootElement = true; // ----------------------------------------------------------- Constructors public XMLWriter( Map<String, String> namespaces ) { this.namespaces = namespaces; } public XMLWriter( Writer writer, Map<String, String> namespaces ) { this.writer = writer; this.namespaces = namespaces; } // --------------------------------------------------------- Public Methods /** * Retrieve generated XML. * * @return String containing the generated XML */ @Override public String toString() { return buffer.toString(); } /** * Write property to the XML. * * @param name Property name * @param value Property value */ public void writeProperty( String name, String value ) { writeElement(name, OPENING); buffer.append(value); writeElement(name, CLOSING); } /** * Write property to the XML. * * @param name Property name */ public void writeProperty( String name ) { writeElement(name, NO_CONTENT); } /** * Write an element. * * @param name Element name * @param type Element type */ public void writeElement( String name, int type ) { StringBuilder nsdecl = new StringBuilder(); if (isRootElement) { for (Iterator<String> iter = namespaces.keySet().iterator(); iter.hasNext();) { String fullName = iter.next(); String abbrev = namespaces.get(fullName); nsdecl.append(" xmlns:").append(abbrev).append("=\"").append(fullName).append("\""); } isRootElement = false; } int pos = name.lastIndexOf(':'); if (pos >= 0) { // lookup prefix for namespace String fullns = name.substring(0, pos); String prefix = namespaces.get(fullns); // check if instead of a full URI, the prefix is used if (prefix == null && namespaces.containsValue(fullns)) { prefix = fullns; } if (prefix == null) { // there is no prefix for this namespace name = name.substring(pos + 1); nsdecl.append(" xmlns=\"").append(fullns).append("\""); } else { // there is a prefix name = prefix + ":" + name.substring(pos + 1); } } switch (type) { case OPENING: buffer.append("<" + name + nsdecl + ">"); break; case CLOSING: buffer.append("</" + name + ">\n"); break; case NO_CONTENT: default: buffer.append("<" + name + nsdecl + "/>"); break; } } /** * Write text. * * @param text Text to append */ public void writeText( String text ) { buffer.append(text); } /** * Write data. * * @param data Data to append */ public void writeData( String data ) { buffer.append("<![CDATA[" + data + "]]>"); } /** * Write XML Header. */ public void writeXMLHeader() { buffer.append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"); } /** * Send data and reinitializes buffer. * * @throws IOException */ public void sendData() throws IOException { if (writer != null) { writer.write(buffer.toString()); writer.flush(); buffer = new StringBuilder(); } } }