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    import java.util.ArrayList;
021    import java.util.Iterator;
022    import java.util.List;
023    import java.util.Map;
024    import java.util.Properties;
025    
026    import org.apache.commons.collections.ExtendedProperties;
027    import org.apache.commons.lang.StringUtils;
028    
029    /**
030     * Configuration converter. Helper class to convert between Configuration,
031     * ExtendedProperties and standard Properties.
032     *
033     * @author <a href="mailto:mpoeschl@marmot.at">Martin Poeschl</a>
034     * @version $Id: ConfigurationConverter.java 1208788 2011-11-30 21:15:37Z oheger $
035     */
036    public final class ConfigurationConverter
037    {
038        /**
039         * Private constructor prevents instances from being created.
040         */
041        private ConfigurationConverter()
042        {
043            // to prevent instanciation...
044        }
045    
046        /**
047         * Convert a ExtendedProperties class into a Configuration class.
048         *
049         * @param eprops ExtendedProperties object to convert
050         * @return Configuration created from the ExtendedProperties
051         */
052        public static Configuration getConfiguration(ExtendedProperties eprops)
053        {
054            return new MapConfiguration(eprops);
055        }
056    
057        /**
058         * Convert a standard Properties class into a configuration class.
059         *
060         * @param props properties object to convert
061         * @return Configuration configuration created from the Properties
062         */
063        public static Configuration getConfiguration(Properties props)
064        {
065            return new MapConfiguration(props);
066        }
067    
068        /**
069         * Convert a Configuration class into a ExtendedProperties class.
070         *
071         * @param config Configuration object to convert
072         * @return ExtendedProperties created from the Configuration
073         */
074        public static ExtendedProperties getExtendedProperties(Configuration config)
075        {
076            ExtendedProperties props = new ExtendedProperties();
077    
078            for (Iterator<String> keys = config.getKeys(); keys.hasNext();)
079            {
080                String key = keys.next();
081                Object property = config.getProperty(key);
082    
083                // turn lists into vectors
084                if (property instanceof List)
085                {
086                    property = new ArrayList<Object>((List<?>) property);
087                }
088    
089                props.setProperty(key, property);
090            }
091    
092            return props;
093        }
094    
095        /**
096         * Convert a Configuration class into a Properties class. List properties
097         * are joined into a string using the delimiter of the configuration if it
098         * extends AbstractConfiguration, and a comma otherwise.
099         *
100         * @param config Configuration object to convert
101         * @return Properties created from the Configuration
102         */
103        public static Properties getProperties(Configuration config)
104        {
105            Properties props = new Properties();
106    
107            char delimiter = (config instanceof AbstractConfiguration)
108                ? ((AbstractConfiguration) config).getListDelimiter() : ',';
109    
110            for (Iterator<String> keys = config.getKeys(); keys.hasNext();)
111            {
112                String key = keys.next();
113                List<Object> list = config.getList(key);
114    
115                // turn the list into a string
116                props.setProperty(key, StringUtils.join(list.iterator(), delimiter));
117            }
118    
119            return props;
120        }
121    
122        /**
123         * Convert a Configuration class into a Map class.
124         *
125         * @param config Configuration object to convert
126         * @return Map created from the Configuration
127         */
128        public static Map<Object, Object> getMap(Configuration config)
129        {
130            return new ConfigurationMap(config);
131        }
132    
133    }