1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.commons.betwixt.io;
18
19 import org.apache.commons.logging.Log;
20 import org.apache.commons.logging.LogFactory;
21 import org.xml.sax.Attributes;
22 import org.xml.sax.ContentHandler;
23 import org.xml.sax.SAXException;
24
25 // FIX ME
26 // At the moment, namespaces are NOT supported!
27
28 /**
29 * The SAXBeanwriter will send events to a ContentHandler
30 *
31 * @author <a href="mailto:rdonkin@apache.org">Robert Burrell Donkin</a>
32 * @author <a href="mailto:martin@mvdb.net">Martin van den Bemt</a>
33 */
34 public class SAXBeanWriter extends AbstractBeanWriter {
35
36 /** Where the output goes */
37 private ContentHandler contentHandler;
38 /** Log used for logging (Doh!) */
39 private Log log = LogFactory.getLog( SAXBeanWriter.class );
40 /** Should document events (ie. start and end) be called? */
41 private boolean callDocumentEvents = true;
42
43 /**
44 * <p> Constructor sets writer used for output.</p>
45 *
46 * @param contentHandler feed events to this content handler
47 */
48 public SAXBeanWriter(ContentHandler contentHandler) {
49 this.contentHandler = contentHandler;
50 }
51
52 /**
53 * Should document events (ie start and end) be called?
54 *
55 * @return true if this SAXWriter should call start
56 * and end of the content handler
57 * @since 0.5
58 */
59 public boolean getCallDocumentEvents() {
60 return callDocumentEvents;
61 }
62
63 /**
64 * Sets whether the document events (ie start and end) should be called.
65 *
66 * @param callDocumentEvents should document events be called
67 * @since 0.5
68 */
69 public void setCallDocumentEvents(boolean callDocumentEvents) {
70 this.callDocumentEvents = callDocumentEvents;
71 }
72
73 /**
74 * <p> Set the log implementation used. </p>
75 *
76 * @return <code>Log</code> implementation that this class logs to
77 */
78 public Log getLog() {
79 return log;
80 }
81
82 /**
83 * <p> Set the log implementation used. </p>
84 *
85 * @param log <code>Log</code> implementation to use
86 */
87 public void setLog(Log log) {
88 this.log = log;
89 }
90
91
92 // Expression methods
93 //-------------------------------------------------------------------------
94
95 // Replaced by new API
96
97 // New API
98 // -------------------------------------------------------------------------
99
100
101 /**
102 * Writes the start tag for an element.
103 *
104 * @param uri the element's namespace uri
105 * @param localName the element's local name
106 * @param qName the element's qualified name
107 * @param attributes the element's attributes
108 * @throws SAXException if an SAX problem occurs during writing
109 * @since 0.5
110 */
111 protected void startElement(
112 WriteContext context,
113 String uri,
114 String localName,
115 String qName,
116 Attributes attributes)
117 throws
118 SAXException {
119 contentHandler.startElement(
120 uri,
121 localName,
122 qName,
123 attributes);
124 }
125
126 /**
127 * Writes the end tag for an element
128 *
129 * @param uri the element's namespace uri
130 * @param localName the element's local name
131 * @param qName the element's qualified name
132 * @throws SAXException if an SAX problem occurs during writing
133 * @since 0.5
134 */
135 protected void endElement(
136 WriteContext context,
137 String uri,
138 String localName,
139 String qName)
140 throws
141 SAXException {
142 contentHandler.endElement(
143 uri,
144 localName,
145 qName);
146 }
147
148 /**
149 * Express body text
150 * @param text the element body text
151 * @throws SAXException if the <code>ContentHandler</code> has a problem
152 * @since 0.5
153 */
154 protected void bodyText(WriteContext context, String text) throws SAXException {
155 //TODO:
156 // FIX ME
157 // CHECK UNICODE->CHAR CONVERSION!
158 // THIS WILL QUITE POSSIBLY BREAK FOR NON-ROMAN
159 char[] body = text.toCharArray();
160 contentHandler.characters(body, 0, body.length);
161 }
162
163 /**
164 * This will announce the start of the document
165 * to the contenthandler.
166 *
167 * @see org.apache.commons.betwixt.io.AbstractBeanWriter#end()
168 */
169 public void start() throws SAXException {
170 if ( callDocumentEvents ) {
171 contentHandler.startDocument();
172 }
173 }
174
175 /**
176 * This method will announce the end of the document to
177 * the contenthandler.
178 *
179 * @see org.apache.commons.betwixt.io.AbstractBeanWriter#start()
180 */
181 public void end() throws SAXException {
182 if ( callDocumentEvents ) {
183 contentHandler.endDocument();
184 }
185 }
186 }