    001/* ========================================================================
    002 * JCommon : a free general purpose class library for the Java(tm) platform
    003 * ========================================================================
    004 *
    005 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
    006 *
    007 * Project Info:  http://www.jfree.org/jcommon/index.html
    008 *
    009 * This library is free software; you can redistribute it and/or modify it
    010 * under the terms of the GNU Lesser General Public License as published by
    011 * the Free Software Foundation; either version 2.1 of the License, or
    012 * (at your option) any later version.
    013 *
    014 * This library is distributed in the hope that it will be useful, but
    015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
    016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
    017 * License for more details.
    018 *
    019 * You should have received a copy of the GNU Lesser General Public
    020 * License along with this library; if not, write to the Free Software
    021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
    022 * USA.
    023 *
    024 * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
    025 * in the United States and other countries.]
    026 *
    027 * ----------------
    028 * SafeTagList.java
    029 * ----------------
    030 * (C)opyright 2003-2005, by Thomas Morgner and Contributors.
    031 *
    032 * Original Author:  Thomas Morgner;
    033 * Contributor(s):   David Gilbert (for Object Refinery Limited);
    034 *
    035 * $Id: SafeTagList.java,v 1.3 2005/10/18 13:35:06 mungady Exp $
    036 *
    037 * Changes
    038 * -------
    039 * 21-Feb-2003 : Added standard header and Javadocs (DG);
    040 *
    041 */
    042
    043package org.jfree.xml.writer;
    044
    045import java.util.HashMap;
    046
    047/**
    048 * A container for information relating to the tags in the JFreeReport XML report files.  Some tags
    049 * cannot be spread across multiple lines, because it causes problems for the parser.
    050 *
    051 * @author Thomas Morgner.
    052 */
    053public class SafeTagList {
    054
    055    /** Storage for the tag information. */
    056    private HashMap safeTags;
    057
    058    /**
    059     * A tag description.
    060     */
    061    private static class SafeDescription {
    062
    063        /** A flag indicating whether or not it is safe to put a new line after the open tag. */
    064        private boolean open;
    065
    066        /** A flag indicating whether or not it is safe to put a new line before the close tag. */
    067        private boolean close;
    068
    069        /**
    070         * Creates a new tag description.
    071         *
    072         * @param open  the 'open' flag.
    073         * @param close  the 'close' flag.
    074         */
    075        public SafeDescription(final boolean open, final boolean close) {
    076            this.open = open;
    077            this.close = close;
    078        }
    079
    080        /**
    081         * Returns the 'open' flag.
    082         *
    083         * @return <code>true</code> or <code>false</code>.
    084         */
    085        public boolean isOpen() {
    086            return this.open;
    087        }
    088
    089        /**
    090         * Returns the 'close' flag.
    091         *
    092         * @return <code>true</code> or <code>false</code>.
    093         */
    094        public boolean isClose() {
    095            return this.close;
    096        }
    097    }
    098
    099    /**
    100     * Creates a new list.
    101     */
    102    public SafeTagList() {
    103        this.safeTags = new HashMap();
    104    }
    105
    106    /**
    107     * Adds a tag with both the 'open' and 'close' flags set to <code>true</code>.
    108     *
    109     * @param tag  the tag name.
    110     */
    111    public void add (final String tag) {
    112        this.safeTags.put(tag, new SafeDescription(true, true));
    113    }
    114
    115    /**
    116     * Adds a tag.
    117     *
    118     * @param tag  the tag name.
    119     * @param open  the 'open' flag.
    120     * @param closed  the 'close' flag.
    121     */
    122    public void add (final String tag, final boolean open, final boolean closed) {
    123        this.safeTags.put(tag, new SafeDescription(open, closed));
    124    }
    125
    126    /**
    127     * Returns <code>true</code> if it is safe to start a new line
    128     * immediately after an open tag.
    129     *
    130     * @param tag  the tag name.
    131     *
    132     * @return A boolean.
    133     */
    134    public boolean isSafeForOpen (final String tag) {
    135        final SafeDescription sd = (SafeDescription) this.safeTags.get(tag);
    136        if (sd == null) {
    137            return false;
    138        }
    139        return sd.isOpen();
    140    }
    141
    142    /**
    143     * Returns <code>true</code> if it is safe to start a new
    144     * line immediately after a close tag.
    145     *
    146     * @param tag  the tag name.
    147     *
    148     * @return A boolean.
    149     */
    150    public boolean isSafeForClose (final String tag) {
    151        final SafeDescription sd = (SafeDescription) this.safeTags.get(tag);
    152        if (sd == null) {
    153            return false;
    154        }
    155        return sd.isClose();
    156    }
    157
    158}