blob: fd992b0cb6fedd68af883aec8bce7b430778dddb [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.flex.swc.catalog;
import java.util.Stack;
import javax.xml.namespace.NamespaceContext;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
/**
* Add indentation to XML.
*/
public class XMLFormatter implements XMLStreamWriter
{
private static final Integer STATE_START = 0;
private static final Integer STATE_IN_ELEMENT = 1;
private static final Integer STATE_IN_DATA = 2;
private static final String INDENT_STRING = " ";
// We use platform-independent line endings so that files
// such as a SWC's catalog.xml in don't depend on whether
// the SWC was compiled on Mac or Win.
private static final String LINE_ENDING_STRING = "\n";
public XMLFormatter(XMLStreamWriter writer)
{
this.writer = writer;
this.states = new Stack<Integer>();
}
private final XMLStreamWriter writer;
private int depth = 0;
private final Stack<Integer> states;
private Integer currentState = STATE_START;
@Override
public void close() throws XMLStreamException
{
writer.close();
}
@Override
public void flush() throws XMLStreamException
{
writer.flush();
}
@Override
public NamespaceContext getNamespaceContext()
{
return writer.getNamespaceContext();
}
@Override
public String getPrefix(String uri) throws XMLStreamException
{
return writer.getPrefix(uri);
}
@Override
public Object getProperty(String name) throws IllegalArgumentException
{
return writer.getProperty(name);
}
private void onEmptyElement() throws XMLStreamException
{
currentState = STATE_IN_ELEMENT;
if (depth > 0)
{
writeLineEnding();
}
writeIndentString();
}
private void onEndElement() throws XMLStreamException
{
depth--;
if (currentState == STATE_IN_ELEMENT)
{
writeLineEnding();
writeIndentString();
}
currentState = states.pop();
}
private void onStartElement() throws XMLStreamException
{
states.push(STATE_IN_ELEMENT);
currentState = STATE_START;
if (depth > 0)
{
writeLineEnding();
}
writeIndentString();
depth++;
}
@Override
public void setDefaultNamespace(String uri) throws XMLStreamException
{
writer.setDefaultNamespace(uri);
}
@Override
public void setNamespaceContext(NamespaceContext context) throws XMLStreamException
{
writer.setNamespaceContext(context);
}
@Override
public void setPrefix(String prefix, String uri) throws XMLStreamException
{
writer.setPrefix(prefix, uri);
}
@Override
public void writeAttribute(String localName, String value) throws XMLStreamException
{
writer.writeAttribute(localName, value);
}
@Override
public void writeAttribute(String namespaceURI, String localName, String value) throws XMLStreamException
{
writer.writeAttribute(namespaceURI, localName, value);
}
@Override
public void writeAttribute(String prefix, String namespaceURI, String localName, String value) throws XMLStreamException
{
writer.writeAttribute(prefix, namespaceURI, localName, value);
}
@Override
public void writeCData(String data) throws XMLStreamException
{
currentState = STATE_IN_DATA;
writer.writeCData(data);
}
@Override
public void writeCharacters(char[] text, int start, int len) throws XMLStreamException
{
currentState = STATE_IN_DATA;
writer.writeCharacters(text, start, len);
}
@Override
public void writeCharacters(String text) throws XMLStreamException
{
currentState = STATE_IN_DATA;
writer.writeCharacters(text);
}
@Override
public void writeComment(String data) throws XMLStreamException
{
writer.writeComment(data);
}
@Override
public void writeDefaultNamespace(String namespaceURI) throws XMLStreamException
{
writer.writeDefaultNamespace(namespaceURI);
}
@Override
public void writeDTD(String dtd) throws XMLStreamException
{
writer.writeDTD(dtd);
}
@Override
public void writeEmptyElement(String localName) throws XMLStreamException
{
onEmptyElement();
writer.writeEmptyElement(localName);
}
@Override
public void writeEmptyElement(String namespaceURI, String localName) throws XMLStreamException
{
onEmptyElement();
writer.writeEmptyElement(namespaceURI, localName);
}
@Override
public void writeEmptyElement(String prefix, String localName, String namespaceURI) throws XMLStreamException
{
onEmptyElement();
writer.writeEmptyElement(prefix, localName, namespaceURI);
}
@Override
public void writeEndDocument() throws XMLStreamException
{
writer.writeEndDocument();
}
@Override
public void writeEndElement() throws XMLStreamException
{
onEndElement();
writer.writeEndElement();
}
@Override
public void writeEntityRef(String name) throws XMLStreamException
{
writer.writeEntityRef(name);
}
private void writeIndentString() throws XMLStreamException
{
if (depth > 0)
{
for (int i = 0; i < depth; i++)
writer.writeCharacters(INDENT_STRING);
}
}
private void writeLineEnding() throws XMLStreamException
{
writer.writeCharacters(LINE_ENDING_STRING);
}
@Override
public void writeNamespace(String prefix, String namespaceURI) throws XMLStreamException
{
writer.writeNamespace(prefix, namespaceURI);
}
@Override
public void writeProcessingInstruction(String target) throws XMLStreamException
{
writer.writeProcessingInstruction(target);
}
@Override
public void writeProcessingInstruction(String target, String data) throws XMLStreamException
{
writer.writeProcessingInstruction(target, data);
}
@Override
public void writeStartDocument() throws XMLStreamException
{
writer.writeStartDocument();
writeLineEnding();
}
@Override
public void writeStartDocument(String version) throws XMLStreamException
{
writer.writeStartDocument(version);
writeLineEnding();
}
@Override
public void writeStartDocument(String encoding, String version) throws XMLStreamException
{
writer.writeStartDocument(encoding, version);
writeLineEnding();;
}
@Override
public void writeStartElement(String localName) throws XMLStreamException
{
onStartElement();
writer.writeStartElement(localName);
}
@Override
public void writeStartElement(String namespaceURI, String localName) throws XMLStreamException
{
onStartElement();
writer.writeStartElement(namespaceURI, localName);
}
@Override
public void writeStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException
{
onStartElement();
writer.writeStartElement(prefix, localName, namespaceURI);
}
}