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
018package org.apache.commons.configuration2;
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} at an instance
026 * it is possible to perform XML processing on a configuration object.</p>
027 *
028 */
029public class BaseConfigurationXMLReader extends ConfigurationXMLReader
030{
031    /** Stores the actual configuration.*/
032    private Configuration config;
033
034    /**
035     * Creates a new instance of {@code BaseConfigurationXMLReader}.
036     */
037    public BaseConfigurationXMLReader()
038    {
039        super();
040    }
041
042    /**
043     * Creates a new instance of {@code BaseConfigurationXMLReader} and
044     * sets the configuration object to be parsed.
045     *
046     * @param conf the configuration to be parsed
047     */
048    public BaseConfigurationXMLReader(final Configuration conf)
049    {
050        this();
051        setConfiguration(conf);
052    }
053
054    /**
055     * Returns the actual configuration to be processed.
056     *
057     * @return the actual configuration
058     */
059    public Configuration getConfiguration()
060    {
061        return config;
062    }
063
064    /**
065     * Sets the configuration to be processed.
066     *
067     * @param conf the configuration
068     */
069    public void setConfiguration(final Configuration conf)
070    {
071        config = conf;
072    }
073
074    /**
075     * Returns the configuration to be processed.
076     *
077     * @return the actual configuration
078     */
079    @Override
080    public Configuration getParsedConfiguration()
081    {
082        return getConfiguration();
083    }
084
085    /**
086     * The main SAX event generation method. This element uses an internal
087     * {@code HierarchicalConfigurationConverter} object to iterate over
088     * all keys in the actual configuration and to generate corresponding SAX
089     * events.
090     */
091    @Override
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        @Override
113        protected void elementStart(final String name, final Object value)
114        {
115            fireElementStart(name, null);
116            if (value != null)
117            {
118                fireCharacters(value.toString());
119            }
120        }
121
122        /**
123         * Callback for the end of an element.
124         *
125         * @param name the element name
126         */
127        @Override
128        protected void elementEnd(final String name)
129        {
130            fireElementEnd(name);
131        }
132    }
133}