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 }