001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     * 
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     * 
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */ 
017    package org.apache.commons.betwixt.io;
018    
019    import org.apache.commons.logging.Log;
020    import org.apache.commons.logging.LogFactory;
021    import org.xml.sax.Attributes;
022    import org.xml.sax.ContentHandler;
023    import org.xml.sax.SAXException;
024    
025    // FIX ME
026    // At the moment, namespaces are NOT supported!
027    
028    /**
029     * The SAXBeanwriter will send events to a ContentHandler
030     * 
031     * @author <a href="mailto:rdonkin@apache.org">Robert Burrell Donkin</a>
032     * @author <a href="mailto:martin@mvdb.net">Martin van den Bemt</a>
033     */
034    public class SAXBeanWriter extends AbstractBeanWriter {
035    
036        /** Where the output goes */
037        private ContentHandler contentHandler;    
038        /** Log used for logging (Doh!) */
039        private Log log = LogFactory.getLog( SAXBeanWriter.class );
040        /** Should document events (ie. start and end) be called? */
041        private boolean callDocumentEvents = true;
042        
043        /**
044         * <p> Constructor sets writer used for output.</p>
045         *
046         * @param contentHandler feed events to this content handler
047         */
048        public SAXBeanWriter(ContentHandler contentHandler) {
049            this.contentHandler = contentHandler;
050        }
051    
052        /** 
053         * Should document events (ie start and end) be called?
054         *
055         * @return true if this SAXWriter should call start 
056         * and end of the content handler
057         * @since 0.5
058         */
059        public boolean getCallDocumentEvents() {
060            return callDocumentEvents;
061        }
062        
063        /**
064         * Sets whether the document events (ie start and end) should be called.
065         *
066         * @param callDocumentEvents should document events be called
067         * @since 0.5
068         */
069        public void setCallDocumentEvents(boolean callDocumentEvents) {
070            this.callDocumentEvents = callDocumentEvents;
071        }
072    
073        /**
074         * <p> Set the log implementation used. </p>
075         *
076         * @return <code>Log</code> implementation that this class logs to
077         */ 
078        public Log getLog() {
079            return log;
080        }
081    
082        /**
083         * <p> Set the log implementation used. </p>
084         *
085         * @param log <code>Log</code> implementation to use
086         */ 
087        public void setLog(Log log) {
088            this.log = log;
089        }
090        
091            
092        // Expression methods
093        //-------------------------------------------------------------------------     
094        
095        // Replaced by new API
096    
097        // New API
098        // -------------------------------------------------------------------------
099    
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    }