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    
018    package org.apache.commons.configuration;
019    
020    /**
021     * <p>A specialized SAX2 XML parser that processes configuration objects.</p>
022     *
023     * <p>This class mimics to be a SAX compliant XML parser. It is able to iterate
024     * over the keys in a configuration object and to generate corresponding SAX
025     * events. By registering a <code>ContentHandler</code> at an instance
026     * it is possible to perform XML processing on a configuration object.</p>
027     *
028     * @author <a href="mailto:oliver.heger@t-online.de">Oliver Heger</a>
029     * @version $Id: BaseConfigurationXMLReader.java 439648 2006-09-02 20:42:10Z oheger $
030     */
031    public class BaseConfigurationXMLReader extends ConfigurationXMLReader
032    {
033        /** Stores the actual configuration.*/
034        private Configuration config;
035    
036        /**
037         * Creates a new instance of <code>BaseConfigurationXMLReader</code>.
038         */
039        public BaseConfigurationXMLReader()
040        {
041            super();
042        }
043    
044        /**
045         * Creates a new instance of <code>BaseConfigurationXMLReader</code> and
046         * sets the configuration object to be parsed.
047         *
048         * @param conf the configuration to be parsed
049         */
050        public BaseConfigurationXMLReader(Configuration conf)
051        {
052            this();
053            setConfiguration(conf);
054        }
055    
056        /**
057         * Returns the actual configuration to be processed.
058         *
059         * @return the actual configuration
060         */
061        public Configuration getConfiguration()
062        {
063            return config;
064        }
065    
066        /**
067         * Sets the configuration to be processed.
068         *
069         * @param conf the configuration
070         */
071        public void setConfiguration(Configuration conf)
072        {
073            config = conf;
074        }
075    
076        /**
077         * Returns the configuration to be processed.
078         *
079         * @return the actual configuration
080         */
081        public Configuration getParsedConfiguration()
082        {
083            return getConfiguration();
084        }
085    
086        /**
087         * The main SAX event generation method. This element uses an internal
088         * <code>HierarchicalConfigurationConverter</code> object to iterate over
089         * all keys in the actual configuration and to generate corresponding SAX
090         * events.
091         */
092        protected void processKeys()
093        {
094            fireElementStart(getRootName(), null);
095            new SAXConverter().process(getConfiguration());
096            fireElementEnd(getRootName());
097        }
098    
099        /**
100         * An internally used helper class to iterate over all configuration keys
101         * ant to generate corresponding SAX events.
102         *
103         */
104        class SAXConverter extends HierarchicalConfigurationConverter
105        {
106            /**
107             * Callback for the start of an element.
108             *
109             * @param name the element name
110             * @param value the element value
111             */
112            protected void elementStart(String name, Object value)
113            {
114                fireElementStart(name, null);
115                if (value != null)
116                {
117                    fireCharacters(value.toString());
118                }
119            }
120    
121            /**
122             * Callback for the end of an element.
123             *
124             * @param name the element name
125             */
126            protected void elementEnd(String name)
127            {
128                fireElementEnd(name);
129            }
130        }
131    }