com.jswiff.xml.XMLWriter.java Source code

Java tutorial

Introduction

Here is the source code for com.jswiff.xml.XMLWriter.java

Source

/*
 * JSwiff is an open source Java API for Macromedia Flash file generation
 * and manipulation
 *
 * Copyright (C) 2004-2006 Ralf Terdic (contact@jswiff.com)
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package com.jswiff.xml;

import com.jswiff.SWFDocument;
import com.jswiff.swfrecords.Color;
import com.jswiff.swfrecords.Rect;
import com.jswiff.swfrecords.tags.Tag;
import com.jswiff.util.Base64;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;

import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;

import java.util.Iterator;
import java.util.List;

/**
 * This class converts an SWF document to XML.
 */
public class XMLWriter {
    private Document xmlDocument;
    private Element rootElement;
    private SWFDocument swfDocument;

    /**
     * Creates a new XMLWriter instance and generates an in-memory XML document
     * from the SWF document used as argument.
     *
     * @param swfDocument the SWF doc to be converted to XML
     */
    public XMLWriter(SWFDocument swfDocument) {
        this.swfDocument = swfDocument;
        xmlDocument = DocumentHelper.createDocument();
        rootElement = xmlDocument.addElement("swfdocument");
        writeHeader();
        writeTags();
    }

    /**
     * Writes the XML document generated from the SWF to a stream. If the
     * <code>format</code> flag is set, the output XML is formatted to make it
     * more readable.
     *
     * @param stream the target stream
     * @param format specifies whether to format the output XML
     *
     * @throws IOException if an I/O error occured
     */
    public void write(OutputStream stream, boolean format) throws IOException {
        if (format) {
            OutputFormat formatter = OutputFormat.createPrettyPrint();
            formatter.setNewLineAfterDeclaration(false);
            formatter.setTrimText(false);
            org.dom4j.io.XMLWriter writer = new org.dom4j.io.XMLWriter(stream, formatter);
            writer.write(xmlDocument);
        } else {
            org.dom4j.io.XMLWriter writer = new org.dom4j.io.XMLWriter(stream);
            writer.write(xmlDocument);
        }
    }

    /**
     * Writes the XML document generated from the SWF to a writer. If the
     * <code>format</code> flag is set, the output XML is formatted to make it
     * more readable.
     *
     * @param writer the target writer
     * @param format specifies whether to format the output XML
     *
     * @throws IOException if an I/O error occured
     */
    public void write(Writer writer, boolean format) throws IOException {
        if (format) {
            OutputFormat formatter = OutputFormat.createPrettyPrint();
            formatter.setNewLineAfterDeclaration(false);
            formatter.setTrimText(false);
            org.dom4j.io.XMLWriter xmlWriter = new org.dom4j.io.XMLWriter(writer, formatter);
            xmlWriter.write(xmlDocument);
        } else {
            org.dom4j.io.XMLWriter xmlWriter = new org.dom4j.io.XMLWriter(writer);
            xmlWriter.write(xmlDocument);
        }
    }

    private void writeHeader() {
        Element headerElement = rootElement.addElement("header");
        headerElement.addAttribute("swfversion", Integer.toString(swfDocument.getVersion()));
        if (swfDocument.isCompressed()) {
            headerElement.addAttribute("compressed", "true");
        }
        Element frames = headerElement.addElement("frames");
        frames.addAttribute("count", Integer.toString(swfDocument.getFrameCount()));
        frames.addAttribute("rate", Integer.toString(swfDocument.getFrameRate()));
        Rect size = swfDocument.getFrameSize();
        RecordXMLWriter.writeRect(frames, "size", size);
        Color bgColor = swfDocument.getBackgroundColor();
        if (bgColor != null) {
            RecordXMLWriter.writeColor(headerElement, "bgcolor", bgColor);
        }
        if (swfDocument.getVersion() >= 8) {
            switch (swfDocument.getAccessMode()) {
            case SWFDocument.ACCESS_MODE_LOCAL:
                headerElement.addAttribute("access", "local");
                break;
            case SWFDocument.ACCESS_MODE_NETWORK:
                headerElement.addAttribute("access", "network");
                break;
            }
            String metadata = swfDocument.getMetadata();
            if (metadata != null) {
                headerElement.addElement("metadata").addText(Base64.encodeString(metadata));
            }
        }
    }

    private void writeTags() {
        List tags = swfDocument.getTags();
        for (Iterator it = tags.iterator(); it.hasNext();) {
            Tag tag = (Tag) it.next();
            TagXMLWriter.writeTag(rootElement, tag);
        }
    }
}