All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.caucho.vfs.XmlWriter Maven / Gradle / Ivy

/*
 * Copyright (c) 1998-2012 Caucho Technology -- all rights reserved
 *
 * This file is part of Resin(R) Open Source
 *
 * Each copy or derived work must preserve the copyright notice and this
 * notice unmodified.
 *
 * Resin Open Source 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.
 *
 * Resin Open Source 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, or any warranty
 * of NON-INFRINGEMENT.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Resin Open Source; if not, write to the
 *   Free SoftwareFoundation, Inc.
 *   59 Temple Place, Suite 330
 *   Boston, MA 02111-1307  USA
 *
 * @author Sam
 */

package com.caucho.vfs;

import java.io.PrintWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Locale;

// TODO: get rid of set/getContentType, use getStrategyForContentType(...) and setStrategy(...)
// TODO: trap all print(...) for xml escaping, indenting
// TODO: capture all \n and \r\n and make them do println()
// TODO: clean up flags now that patterns are known
// TODO: CDATA
// TODO: startDocument, endDocument (');
    }

    void endElement(XmlWriter writer, String name)
    {
      writer.writeIndentIfNewLine();

      writer.write("');
    }

    void writeAttribute(XmlWriter writer, String name, Object value)
    {
      writer.write(" ");
      writer.write(name);
      writer.write('=');
      writer.write("'");
      writeAttributeValue(writer, name, value);
      writer.write("'");
    }

    void writeAttribute(XmlWriter writer, String name, Object ... values)
    {
      writer.write(" ");
      writer.write(name);
      writer.write('=');
      writer.write("'");

      int len = values.length;

      for (int i = 0; i < len; i++) {
        Object value = values[i];

        if (value == null)
          continue;

        if (i > 0)
          writer.write(' ');

        writeAttributeValue(writer, name, value);
      }

      writer.write("'");
    }

    protected void writeAttributeValue(XmlWriter writer, String name, Object value)
    {
      writeXmlEscaped(writer, value);
    }

    public void writeText(XmlWriter writer, char ch)
    {
      writeXmlEscapedChar(writer, ch);
    }

    public void writeText(XmlWriter writer, char[] buf)
    {
      int endIndex = buf.length;

      for (int i = 0; i < endIndex; i++) {
        writeXmlEscapedChar(writer, buf[i]);
      }
    }

    public void writeText(XmlWriter writer, char[] buf, int offset, int length)
    {
      int endIndex = offset + length;

      for (int i = offset; i < endIndex; i++) {
        writeXmlEscapedChar(writer, buf[i]);
      }
    }

    public void writeTextObject(XmlWriter writer, Object obj)
    {
      String string = String.valueOf(obj);
      int len = string.length();

      for (int i = 0; i < len; i++) {
        writeXmlEscapedChar(writer, string.charAt(i));
      }
    }

    public void writeComment(XmlWriter writer, String comment)
    {
      writer.write("");
    }

    private void writeXmlEscapedChar(XmlWriter writer, char ch)
    {
      switch (ch) {
        case '<':
          writer.write("<"); break;
        case '>':
          writer.write(">"); break;
        case '&':
          writer.write("&"); break;
        case '\"':
          writer.write("""); break;
        case '\'':
          writer.write("'"); break;
        default:
          writer.write(ch);
      }
    }

    private void writeXmlEscaped(XmlWriter writer, Object object)
    {
      String string = object.toString();

      int len = string.length();

      for (int i = 0; i < len; i++) {
        writeXmlEscapedChar(writer, string.charAt(i));
      }
    }

  }

  private void writeIndentIfNewLine()
  {
    if (isNewLine()) {
      for (int i = _indent * 2; i > 0; i--) {
        write(' ');
      }
    }
  }

  /**
   * If content model is empty, 
*/ static public class Xhtml extends Xml { private int EMPTY = 1; private int BREAK_BEFORE = 2; private int BREAK_AFTER = 4; private int BREAK_AFTER_CONTENT = 8; private int EAT_BREAK_BEFORE = 16; // ignore a BREAK_AFTER in the next element private int BOOLEAN_ATTRIBUTE = 1024; private HashMap _flags = new HashMap(); public Xhtml() { addFlags("html", BREAK_BEFORE | BREAK_AFTER); addFlags("head", BREAK_BEFORE | BREAK_AFTER); addFlags("body", BREAK_BEFORE | BREAK_AFTER); addFlags("style", BREAK_BEFORE | BREAK_AFTER); addFlags("meta", BREAK_BEFORE | BREAK_AFTER | EMPTY); addFlags("link", BREAK_BEFORE | BREAK_AFTER | EMPTY); addFlags("title", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("base", BREAK_BEFORE | BREAK_AFTER | EMPTY); addFlags("h1", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("h2", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("h3", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("h4", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("h5", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("h6", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("p", BREAK_BEFORE | BREAK_AFTER); addFlags("div", BREAK_BEFORE | BREAK_AFTER); addFlags("ul", BREAK_BEFORE | BREAK_AFTER); addFlags("ol", BREAK_BEFORE | BREAK_AFTER); addFlags("li", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("dl", BREAK_BEFORE | BREAK_AFTER); addFlags("dt", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("dd", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("hr", BREAK_BEFORE | BREAK_AFTER | EMPTY); addFlags("br", BREAK_AFTER | EMPTY); addFlags("option", EMPTY); addFlags("img", EMPTY); addFlags("area", EMPTY); addFlags("pre", BREAK_BEFORE | BREAK_AFTER); addFlags("blockquote", BREAK_BEFORE | BREAK_AFTER); addFlags("address", BREAK_BEFORE | BREAK_AFTER); addFlags("fieldset", BREAK_BEFORE | BREAK_AFTER); addFlags("form", BREAK_BEFORE | BREAK_AFTER); addFlags("ins", BREAK_BEFORE | BREAK_AFTER); addFlags("del", BREAK_BEFORE | BREAK_AFTER); addFlags("script", BREAK_BEFORE | BREAK_AFTER); addFlags("noscript", BREAK_BEFORE | BREAK_AFTER); addFlags("input", EMPTY); // addFlag("select", BREAK_BEFORE | BREAK_AFTER); // addFlag("optgroup", BREAK_BEFORE | BREAK_AFTER); // addFlag("option", BREAK_BEFORE | BREAK_AFTER); // addFlag("textarea", BREAK_BEFORE | BREAK_AFTER); // addFlag("fieldset", BREAK_BEFORE | BREAK_AFTER); // addFlag("legend", BREAK_BEFORE | BREAK_AFTER); addFlags("table", BREAK_BEFORE | BREAK_AFTER); addFlags("thead", BREAK_BEFORE | BREAK_AFTER); addFlags("tfoot", BREAK_BEFORE | BREAK_AFTER); addFlags("tr", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("col", EMPTY); addFlags("object", BREAK_BEFORE | BREAK_AFTER); addFlags("param", BREAK_BEFORE | BREAK_AFTER | EMPTY); addFlags("compact", BOOLEAN_ATTRIBUTE); addFlags("nowrap", BOOLEAN_ATTRIBUTE); addFlags("ismap", BOOLEAN_ATTRIBUTE); addFlags("declare", BOOLEAN_ATTRIBUTE); addFlags("noshade", BOOLEAN_ATTRIBUTE); addFlags("checked", BOOLEAN_ATTRIBUTE); addFlags("disabled", BOOLEAN_ATTRIBUTE); addFlags("readonly", BOOLEAN_ATTRIBUTE); addFlags("multiple", BOOLEAN_ATTRIBUTE); addFlags("selected", BOOLEAN_ATTRIBUTE); addFlags("noresize", BOOLEAN_ATTRIBUTE); addFlags("defer", BOOLEAN_ATTRIBUTE); } protected void addFlags(String name, int flag) { int intValue = getFlags(name); intValue |= flag; _flags.put(name, intValue); } protected int getFlags(String name) { int intValue; Integer integer = _flags.get(name); if (integer == null) intValue = 0; else intValue = integer; return intValue; } void openElement(XmlWriter writer, String name) { int flags = getFlags(name); if ((flags & BREAK_BEFORE) > 0) writer.softPrintln(); writer.writeIndentIfNewLine(); writer.write('<'); writer.write(name); } protected void writeAttributeValue(XmlWriter writer, String name, Object value) { int flags = getFlags(name); if ( (flags & BOOLEAN_ATTRIBUTE) > 0) value = name.toUpperCase(Locale.ENGLISH); super.writeAttributeValue(writer, name, value); } void closeElement(XmlWriter writer, String name, boolean isEnd) { int flags = getFlags(name); boolean isEmpty = (flags & EMPTY) > 0; if (isEnd && isEmpty) writer.write(" />"); else writer.write('>'); if ((flags & BREAK_AFTER) > 0) writer.softPrintln(); if (isEnd && !isEmpty) endElement(writer, name); } void endElement(XmlWriter writer, String name) { int flags = getFlags(name); boolean isFullBreak = (flags & (BREAK_BEFORE | BREAK_AFTER)) == (BREAK_BEFORE | BREAK_AFTER); if (isFullBreak) writer.softPrintln(); writer.writeIndentIfNewLine(); if ((flags & EMPTY) == 0) { writer.write("'); } if (isFullBreak || ( (flags & BREAK_AFTER_CONTENT) > 0)) writer.softPrintln(); } protected void writeDoctype(XmlWriter writer) { // TODO: review this, should perhaps use strict here, transitional in something else writer.println(""); /** **/ } protected void writeXmlDeclaration(XmlWriter writer) { String encoding = writer.getCharacterEncoding(); writer.println(""); } } static public class Html extends Xhtml { public Html() { } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy