/*
* 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 com.ejie.x38.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 StringBuffer _buffer = new StringBuffer();
/**
* 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
/**
* Constructor.
*/
public XMLWriter(Map<String, String> namespaces) {
_namespaces = namespaces;
}
/**
* Constructor.
*/
public XMLWriter(Writer writer, Map<String, String> namespaces) {
_writer = writer;
_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) {
StringBuffer nsdecl = new StringBuffer();
if (_isRootElement) {
for (Iterator<String> iter = _namespaces.keySet().iterator(); iter
.hasNext();) {
String fullName = (String) iter.next();
String abbrev = (String) _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 = (String) _namespaces.get(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);
}
} else {
throw new IllegalArgumentException(
"All XML elements must have a namespace");
}
switch (type) {
case OPENING:
_buffer.append("<");
_buffer.append(name);
_buffer.append( nsdecl);
_buffer.append( ">");
break;
case CLOSING:
_buffer.append("</");
_buffer.append( name);
_buffer.append( ">\n");
break;
case NO_CONTENT:
default:
_buffer.append("<");
_buffer.append( name);
_buffer.append( nsdecl);
_buffer.append( "/>");
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[");
_buffer.append( data);
_buffer.append( "]]>");
}
/**
* Write XML Header.
*/
public void writeXMLHeader() {
_buffer.append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
}
/**
* Send data and reinitializes buffer.
*/
public void sendData() throws IOException {
if (_writer != null) {
_writer.write(_buffer.toString());
_writer.flush();
_buffer = new StringBuffer();
}
}
}