001    package org.bukkit.configuration;
002    
003    import java.util.Map;
004    
005    import org.apache.commons.lang.Validate;
006    
007    /**
008     * This is a {@link Configuration} implementation that does not save or load
009     * from any source, and stores all values in memory only.
010     * This is useful for temporary Configurations for providing defaults.
011     */
012    public class MemoryConfiguration extends MemorySection implements Configuration {
013        protected Configuration defaults;
014        protected MemoryConfigurationOptions options;
015    
016        /**
017         * Creates an empty {@link MemoryConfiguration} with no default values.
018         */
019        public MemoryConfiguration() {}
020    
021        /**
022         * Creates an empty {@link MemoryConfiguration} using the specified {@link
023         * Configuration} as a source for all default values.
024         *
025         * @param defaults Default value provider
026         * @throws IllegalArgumentException Thrown if defaults is null
027         */
028        public MemoryConfiguration(Configuration defaults) {
029            this.defaults = defaults;
030        }
031    
032        @Override
033        public void addDefault(String path, Object value) {
034            Validate.notNull(path, "Path may not be null");
035    
036            if (defaults == null) {
037                defaults = new MemoryConfiguration();
038            }
039    
040            defaults.set(path, value);
041        }
042    
043        public void addDefaults(Map<String, Object> defaults) {
044            Validate.notNull(defaults, "Defaults may not be null");
045    
046            for (Map.Entry<String, Object> entry : defaults.entrySet()) {
047                addDefault(entry.getKey(), entry.getValue());
048            }
049        }
050    
051        public void addDefaults(Configuration defaults) {
052            Validate.notNull(defaults, "Defaults may not be null");
053    
054            addDefaults(defaults.getValues(true));
055        }
056    
057        public void setDefaults(Configuration defaults) {
058            Validate.notNull(defaults, "Defaults may not be null");
059    
060            this.defaults = defaults;
061        }
062    
063        public Configuration getDefaults() {
064            return defaults;
065        }
066    
067        @Override
068        public ConfigurationSection getParent() {
069            return null;
070        }
071    
072        public MemoryConfigurationOptions options() {
073            if (options == null) {
074                options = new MemoryConfigurationOptions(this);
075            }
076    
077            return options;
078        }
079    }