001 /** 002 * ======================================== 003 * JFreeReport : a free Java report library 004 * ======================================== 005 * 006 * Project Info: http://reporting.pentaho.org/ 007 * 008 * (C) Copyright 2000-2007, by Object Refinery Limited, Pentaho Corporation and Contributors. 009 * 010 * This library is free software; you can redistribute it and/or modify it under the terms 011 * of the GNU Lesser General Public License as published by the Free Software Foundation; 012 * either version 2.1 of the License, or (at your option) any later version. 013 * 014 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 015 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 016 * See the GNU Lesser General Public License for more details. 017 * 018 * You should have received a copy of the GNU Lesser General Public License along with this 019 * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, 020 * Boston, MA 02111-1307, USA. 021 * 022 * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 023 * in the United States and other countries.] 024 * 025 * ------------ 026 * $Id: SectionReadHandler.java 3525 2007-10-16 11:43:48Z tmorgner $ 027 * ------------ 028 * (C) Copyright 2000-2005, by Object Refinery Limited. 029 * (C) Copyright 2005-2007, by Pentaho Corporation. 030 */ 031 package org.jfree.report.modules.factories.report.flow; 032 033 import java.util.ArrayList; 034 035 import org.jfree.report.modules.factories.report.base.NodeReadHandler; 036 import org.jfree.report.modules.factories.report.base.NodeReadHandlerFactory; 037 import org.jfree.report.structure.Element; 038 import org.jfree.report.structure.Section; 039 import org.jfree.report.structure.StaticText; 040 import org.jfree.xmlns.parser.XmlReadHandler; 041 import org.xml.sax.Attributes; 042 import org.xml.sax.SAXException; 043 044 /** 045 * Creation-Date: 09.04.2006, 14:45:57 046 * 047 * @author Thomas Morgner 048 */ 049 public class SectionReadHandler extends AbstractElementReadHandler 050 { 051 private Section section; 052 private StringBuffer textBuffer; 053 private ArrayList nodes; 054 private ArrayList operationsAfter; 055 private ArrayList operationsBefore; 056 private String repeat; 057 058 public SectionReadHandler() 059 { 060 nodes = new ArrayList(); 061 operationsAfter = new ArrayList(); 062 operationsBefore = new ArrayList(); 063 } 064 065 066 public SectionReadHandler(final Section section) 067 { 068 this(); 069 this.section = section; 070 } 071 072 protected Element getElement() 073 { 074 if (section == null) 075 { 076 section = new Section(); 077 } 078 return section; 079 } 080 081 /** 082 * Starts parsing. 083 * 084 * @param attrs the attributes. 085 * @throws SAXException if there is a parsing error. 086 */ 087 protected void startParsing(final Attributes attrs) throws SAXException 088 { 089 super.startParsing(attrs); 090 091 final String repeatValue = attrs.getValue(getUri(), "repeat"); 092 if (repeatValue != null) 093 { 094 repeat = repeatValue; 095 } 096 097 if (FlowReportFactoryModule.NAMESPACE.equals(getUri()) == false) 098 { 099 final Element element = getElement(); 100 final int attrLength = attrs.getLength(); 101 for (int i = 0; i < attrLength; i++) 102 { 103 final String uri = attrs.getURI(i); 104 final String local = attrs.getLocalName(i); 105 if (FlowReportFactoryModule.NAMESPACE.equals(uri) == false) 106 { 107 element.setAttribute(uri, local, attrs.getValue(i)); 108 } 109 } 110 } 111 } 112 113 protected void configureElement(final Element e) 114 { 115 super.configureElement(e); 116 117 final Section section = (Section) e; 118 if (repeat != null) 119 { 120 section.setRepeat("true".equals(repeat)); 121 } 122 } 123 124 /** 125 * Returns the handler for a child element. 126 * 127 * @param tagName the tag name. 128 * @param atts the attributes. 129 * @return the handler or null, if the tagname is invalid. 130 * @throws SAXException if there is a parsing error. 131 */ 132 protected XmlReadHandler getHandlerForChild(final String uri, 133 final String tagName, 134 final Attributes atts) 135 throws SAXException 136 { 137 if (textBuffer != null) 138 { 139 nodes.add(new StaticText(textBuffer.toString())); 140 textBuffer = null; 141 } 142 143 final XmlReadHandler elementTypeHanders = 144 super.getHandlerForChild(uri, tagName, atts); 145 if (elementTypeHanders != null) 146 { 147 return elementTypeHanders; 148 } 149 150 if (FlowReportFactoryModule.NAMESPACE.equals(uri)) 151 { 152 if ("operation-after".equals(tagName)) 153 { 154 final FlowOperationReadHandler frh = new FlowOperationReadHandler(); 155 operationsAfter.add(frh); 156 return frh; 157 } 158 else if ("operation-before".equals(tagName)) 159 { 160 final FlowOperationReadHandler frh = new FlowOperationReadHandler(); 161 operationsBefore.add(frh); 162 return frh; 163 } 164 } 165 166 final NodeReadHandlerFactory factory = NodeReadHandlerFactory.getInstance(); 167 final NodeReadHandler handler = (NodeReadHandler) factory.getHandler(uri, tagName); 168 if (handler != null) 169 { 170 nodes.add(handler); 171 return handler; 172 } 173 return null; 174 } 175 176 /** 177 * Done parsing. 178 * 179 * @throws SAXException if there is a parsing error. 180 */ 181 protected void doneParsing() throws SAXException 182 { 183 if (textBuffer != null) 184 { 185 nodes.add(new StaticText(textBuffer.toString())); 186 textBuffer = null; 187 } 188 189 final Section section = (Section) getElement(); 190 configureElement(section); 191 192 for (int i = 0; i < nodes.size(); i++) 193 { 194 final Object wrapper = nodes.get(i); 195 if (wrapper instanceof StaticText) 196 { 197 section.addNode((StaticText) wrapper); 198 } 199 else if (wrapper instanceof NodeReadHandler) 200 { 201 final NodeReadHandler nr = (NodeReadHandler) wrapper; 202 section.addNode(nr.getNode()); 203 } 204 } 205 for (int i = 0; i < operationsAfter.size(); i++) 206 { 207 final FlowOperationReadHandler handler = 208 (FlowOperationReadHandler) operationsAfter.get(i); 209 section.addOperationAfter(handler.getOperation()); 210 } 211 for (int i = 0; i < operationsBefore.size(); i++) 212 { 213 final FlowOperationReadHandler handler = 214 (FlowOperationReadHandler) operationsBefore.get(i); 215 section.addOperationBefore(handler.getOperation()); 216 } 217 } 218 219 220 221 /** 222 * This method is called to process the character data between element tags. 223 * 224 * @param ch the character buffer. 225 * @param start the start index. 226 * @param length the length. 227 * @throws SAXException if there is a parsing error. 228 */ 229 public void characters(final char[] ch, final int start, final int length) 230 throws SAXException 231 { 232 if (textBuffer == null) 233 { 234 textBuffer = new StringBuffer(); 235 } 236 textBuffer.append(ch, start, length); 237 } 238 239 }