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     
043    package org.jfree.xml.writer;
044    
045    import 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     */
053    public 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    }