001    package org.bukkit.configuration;
002    
003    import java.util.Map;
004    import java.util.Set;
005    import java.util.List;
006    
007    import org.bukkit.Color;
008    import org.bukkit.OfflinePlayer;
009    import org.bukkit.util.Vector;
010    import org.bukkit.inventory.ItemStack;
011    
012    /**
013     * Represents a section of a {@link Configuration}
014     */
015    public interface ConfigurationSection {
016        /**
017         * Gets a set containing all keys in this section.
018         * <p>
019         * If deep is set to true, then this will contain all the keys within any
020         * child {@link ConfigurationSection}s (and their children, etc). These
021         * will be in a valid path notation for you to use.
022         * <p>
023         * If deep is set to false, then this will contain only the keys of any
024         * direct children, and not their own children.
025         *
026         * @param deep Whether or not to get a deep list, as opposed to a shallow
027         *     list.
028         * @return Set of keys contained within this ConfigurationSection.
029         */
030        public Set<String> getKeys(boolean deep);
031    
032        /**
033         * Gets a Map containing all keys and their values for this section.
034         * <p>
035         * If deep is set to true, then this will contain all the keys and values
036         * within any child {@link ConfigurationSection}s (and their children,
037         * etc). These keys will be in a valid path notation for you to use.
038         * <p>
039         * If deep is set to false, then this will contain only the keys and
040         * values of any direct children, and not their own children.
041         *
042         * @param deep Whether or not to get a deep list, as opposed to a shallow
043         *     list.
044         * @return Map of keys and values of this section.
045         */
046        public Map<String, Object> getValues(boolean deep);
047    
048        /**
049         * Checks if this {@link ConfigurationSection} contains the given path.
050         * <p>
051         * If the value for the requested path does not exist but a default value
052         * has been specified, this will return true.
053         *
054         * @param path Path to check for existence.
055         * @return True if this section contains the requested path, either via
056         *     default or being set.
057         * @throws IllegalArgumentException Thrown when path is null.
058         */
059        public boolean contains(String path);
060    
061        /**
062         * Checks if this {@link ConfigurationSection} has a value set for the
063         * given path.
064         * <p>
065         * If the value for the requested path does not exist but a default value
066         * has been specified, this will still return false.
067         *
068         * @param path Path to check for existence.
069         * @return True if this section contains the requested path, regardless of
070         *     having a default.
071         * @throws IllegalArgumentException Thrown when path is null.
072         */
073        public boolean isSet(String path);
074    
075        /**
076         * Gets the path of this {@link ConfigurationSection} from its root {@link
077         * Configuration}
078         * <p>
079         * For any {@link Configuration} themselves, this will return an empty
080         * string.
081         * <p>
082         * If the section is no longer contained within its root for any reason,
083         * such as being replaced with a different value, this may return null.
084         * <p>
085         * To retrieve the single name of this section, that is, the final part of
086         * the path returned by this method, you may use {@link #getName()}.
087         *
088         * @return Path of this section relative to its root
089         */
090        public String getCurrentPath();
091    
092        /**
093         * Gets the name of this individual {@link ConfigurationSection}, in the
094         * path.
095         * <p>
096         * This will always be the final part of {@link #getCurrentPath()}, unless
097         * the section is orphaned.
098         *
099         * @return Name of this section
100         */
101        public String getName();
102    
103        /**
104         * Gets the root {@link Configuration} that contains this {@link
105         * ConfigurationSection}
106         * <p>
107         * For any {@link Configuration} themselves, this will return its own
108         * object.
109         * <p>
110         * If the section is no longer contained within its root for any reason,
111         * such as being replaced with a different value, this may return null.
112         *
113         * @return Root configuration containing this section.
114         */
115        public Configuration getRoot();
116    
117        /**
118         * Gets the parent {@link ConfigurationSection} that directly contains
119         * this {@link ConfigurationSection}.
120         * <p>
121         * For any {@link Configuration} themselves, this will return null.
122         * <p>
123         * If the section is no longer contained within its parent for any reason,
124         * such as being replaced with a different value, this may return null.
125         *
126         * @return Parent section containing this section.
127         */
128        public ConfigurationSection getParent();
129    
130        /**
131         * Gets the requested Object by path.
132         * <p>
133         * If the Object does not exist but a default value has been specified,
134         * this will return the default value. If the Object does not exist and no
135         * default value was specified, this will return null.
136         *
137         * @param path Path of the Object to get.
138         * @return Requested Object.
139         */
140        public Object get(String path);
141    
142        /**
143         * Gets the requested Object by path, returning a default value if not
144         * found.
145         * <p>
146         * If the Object does not exist then the specified default value will
147         * returned regardless of if a default has been identified in the root
148         * {@link Configuration}.
149         *
150         * @param path Path of the Object to get.
151         * @param def The default value to return if the path is not found.
152         * @return Requested Object.
153         */
154        public Object get(String path, Object def);
155    
156        /**
157         * Sets the specified path to the given value.
158         * <p>
159         * If value is null, the entry will be removed. Any existing entry will be
160         * replaced, regardless of what the new value is.
161         * <p>
162         * Some implementations may have limitations on what you may store. See
163         * their individual javadocs for details. No implementations should allow
164         * you to store {@link Configuration}s or {@link ConfigurationSection}s,
165         * please use {@link #createSection(java.lang.String)} for that.
166         *
167         * @param path Path of the object to set.
168         * @param value New value to set the path to.
169         */
170        public void set(String path, Object value);
171    
172        /**
173         * Creates an empty {@link ConfigurationSection} at the specified path.
174         * <p>
175         * Any value that was previously set at this path will be overwritten. If
176         * the previous value was itself a {@link ConfigurationSection}, it will
177         * be orphaned.
178         *
179         * @param path Path to create the section at.
180         * @return Newly created section
181         */
182        public ConfigurationSection createSection(String path);
183    
184        /**
185         * Creates a {@link ConfigurationSection} at the specified path, with
186         * specified values.
187         * <p>
188         * Any value that was previously set at this path will be overwritten. If
189         * the previous value was itself a {@link ConfigurationSection}, it will
190         * be orphaned.
191         *
192         * @param path Path to create the section at.
193         * @param map The values to used.
194         * @return Newly created section
195         */
196        public ConfigurationSection createSection(String path, Map<?, ?> map);
197    
198        // Primitives
199        /**
200         * Gets the requested String by path.
201         * <p>
202         * If the String does not exist but a default value has been specified,
203         * this will return the default value. If the String does not exist and no
204         * default value was specified, this will return null.
205         *
206         * @param path Path of the String to get.
207         * @return Requested String.
208         */
209        public String getString(String path);
210    
211        /**
212         * Gets the requested String by path, returning a default value if not
213         * found.
214         * <p>
215         * If the String does not exist then the specified default value will
216         * returned regardless of if a default has been identified in the root
217         * {@link Configuration}.
218         *
219         * @param path Path of the String to get.
220         * @param def The default value to return if the path is not found or is
221         *     not a String.
222         * @return Requested String.
223         */
224        public String getString(String path, String def);
225    
226        /**
227         * Checks if the specified path is a String.
228         * <p>
229         * If the path exists but is not a String, this will return false. If the
230         * path does not exist, this will return false. If the path does not exist
231         * but a default value has been specified, this will check if that default
232         * value is a String and return appropriately.
233         *
234         * @param path Path of the String to check.
235         * @return Whether or not the specified path is a String.
236         */
237        public boolean isString(String path);
238    
239        /**
240         * Gets the requested int by path.
241         * <p>
242         * If the int does not exist but a default value has been specified, this
243         * will return the default value. If the int does not exist and no default
244         * value was specified, this will return 0.
245         *
246         * @param path Path of the int to get.
247         * @return Requested int.
248         */
249        public int getInt(String path);
250    
251        /**
252         * Gets the requested int by path, returning a default value if not found.
253         * <p>
254         * If the int does not exist then the specified default value will
255         * returned regardless of if a default has been identified in the root
256         * {@link Configuration}.
257         *
258         * @param path Path of the int to get.
259         * @param def The default value to return if the path is not found or is
260         *     not an int.
261         * @return Requested int.
262         */
263        public int getInt(String path, int def);
264    
265        /**
266         * Checks if the specified path is an int.
267         * <p>
268         * If the path exists but is not a int, this will return false. If the
269         * path does not exist, this will return false. If the path does not exist
270         * but a default value has been specified, this will check if that default
271         * value is a int and return appropriately.
272         *
273         * @param path Path of the int to check.
274         * @return Whether or not the specified path is an int.
275         */
276        public boolean isInt(String path);
277    
278        /**
279         * Gets the requested boolean by path.
280         * <p>
281         * If the boolean does not exist but a default value has been specified,
282         * this will return the default value. If the boolean does not exist and
283         * no default value was specified, this will return false.
284         *
285         * @param path Path of the boolean to get.
286         * @return Requested boolean.
287         */
288        public boolean getBoolean(String path);
289    
290        /**
291         * Gets the requested boolean by path, returning a default value if not
292         * found.
293         * <p>
294         * If the boolean does not exist then the specified default value will
295         * returned regardless of if a default has been identified in the root
296         * {@link Configuration}.
297         *
298         * @param path Path of the boolean to get.
299         * @param def The default value to return if the path is not found or is
300         *     not a boolean.
301         * @return Requested boolean.
302         */
303        public boolean getBoolean(String path, boolean def);
304    
305        /**
306         * Checks if the specified path is a boolean.
307         * <p>
308         * If the path exists but is not a boolean, this will return false. If the
309         * path does not exist, this will return false. If the path does not exist
310         * but a default value has been specified, this will check if that default
311         * value is a boolean and return appropriately.
312         *
313         * @param path Path of the boolean to check.
314         * @return Whether or not the specified path is a boolean.
315         */
316        public boolean isBoolean(String path);
317    
318        /**
319         * Gets the requested double by path.
320         * <p>
321         * If the double does not exist but a default value has been specified,
322         * this will return the default value. If the double does not exist and no
323         * default value was specified, this will return 0.
324         *
325         * @param path Path of the double to get.
326         * @return Requested double.
327         */
328        public double getDouble(String path);
329    
330        /**
331         * Gets the requested double by path, returning a default value if not
332         * found.
333         * <p>
334         * If the double does not exist then the specified default value will
335         * returned regardless of if a default has been identified in the root
336         * {@link Configuration}.
337         *
338         * @param path Path of the double to get.
339         * @param def The default value to return if the path is not found or is
340         *     not a double.
341         * @return Requested double.
342         */
343        public double getDouble(String path, double def);
344    
345        /**
346         * Checks if the specified path is a double.
347         * <p>
348         * If the path exists but is not a double, this will return false. If the
349         * path does not exist, this will return false. If the path does not exist
350         * but a default value has been specified, this will check if that default
351         * value is a double and return appropriately.
352         *
353         * @param path Path of the double to check.
354         * @return Whether or not the specified path is a double.
355         */
356        public boolean isDouble(String path);
357    
358        /**
359         * Gets the requested long by path.
360         * <p>
361         * If the long does not exist but a default value has been specified, this
362         * will return the default value. If the long does not exist and no
363         * default value was specified, this will return 0.
364         *
365         * @param path Path of the long to get.
366         * @return Requested long.
367         */
368        public long getLong(String path);
369    
370        /**
371         * Gets the requested long by path, returning a default value if not
372         * found.
373         * <p>
374         * If the long does not exist then the specified default value will
375         * returned regardless of if a default has been identified in the root
376         * {@link Configuration}.
377         *
378         * @param path Path of the long to get.
379         * @param def The default value to return if the path is not found or is
380         *     not a long.
381         * @return Requested long.
382         */
383        public long getLong(String path, long def);
384    
385        /**
386         * Checks if the specified path is a long.
387         * <p>
388         * If the path exists but is not a long, this will return false. If the
389         * path does not exist, this will return false. If the path does not exist
390         * but a default value has been specified, this will check if that default
391         * value is a long and return appropriately.
392         *
393         * @param path Path of the long to check.
394         * @return Whether or not the specified path is a long.
395         */
396        public boolean isLong(String path);
397    
398        // Java
399        /**
400         * Gets the requested List by path.
401         * <p>
402         * If the List does not exist but a default value has been specified, this
403         * will return the default value. If the List does not exist and no
404         * default value was specified, this will return null.
405         *
406         * @param path Path of the List to get.
407         * @return Requested List.
408         */
409        public List<?> getList(String path);
410    
411        /**
412         * Gets the requested List by path, returning a default value if not
413         * found.
414         * <p>
415         * If the List does not exist then the specified default value will
416         * returned regardless of if a default has been identified in the root
417         * {@link Configuration}.
418         *
419         * @param path Path of the List to get.
420         * @param def The default value to return if the path is not found or is
421         *     not a List.
422         * @return Requested List.
423         */
424        public List<?> getList(String path, List<?> def);
425    
426        /**
427         * Checks if the specified path is a List.
428         * <p>
429         * If the path exists but is not a List, this will return false. If the
430         * path does not exist, this will return false. If the path does not exist
431         * but a default value has been specified, this will check if that default
432         * value is a List and return appropriately.
433         *
434         * @param path Path of the List to check.
435         * @return Whether or not the specified path is a List.
436         */
437        public boolean isList(String path);
438    
439        /**
440         * Gets the requested List of String by path.
441         * <p>
442         * If the List does not exist but a default value has been specified, this
443         * will return the default value. If the List does not exist and no
444         * default value was specified, this will return an empty List.
445         * <p>
446         * This method will attempt to cast any values into a String if possible,
447         * but may miss any values out if they are not compatible.
448         *
449         * @param path Path of the List to get.
450         * @return Requested List of String.
451         */
452        public List<String> getStringList(String path);
453    
454        /**
455         * Gets the requested List of Integer by path.
456         * <p>
457         * If the List does not exist but a default value has been specified, this
458         * will return the default value. If the List does not exist and no
459         * default value was specified, this will return an empty List.
460         * <p>
461         * This method will attempt to cast any values into a Integer if possible,
462         * but may miss any values out if they are not compatible.
463         *
464         * @param path Path of the List to get.
465         * @return Requested List of Integer.
466         */
467        public List<Integer> getIntegerList(String path);
468    
469        /**
470         * Gets the requested List of Boolean by path.
471         * <p>
472         * If the List does not exist but a default value has been specified, this
473         * will return the default value. If the List does not exist and no
474         * default value was specified, this will return an empty List.
475         * <p>
476         * This method will attempt to cast any values into a Boolean if possible,
477         * but may miss any values out if they are not compatible.
478         *
479         * @param path Path of the List to get.
480         * @return Requested List of Boolean.
481         */
482        public List<Boolean> getBooleanList(String path);
483    
484        /**
485         * Gets the requested List of Double by path.
486         * <p>
487         * If the List does not exist but a default value has been specified, this
488         * will return the default value. If the List does not exist and no
489         * default value was specified, this will return an empty List.
490         * <p>
491         * This method will attempt to cast any values into a Double if possible,
492         * but may miss any values out if they are not compatible.
493         *
494         * @param path Path of the List to get.
495         * @return Requested List of Double.
496         */
497        public List<Double> getDoubleList(String path);
498    
499        /**
500         * Gets the requested List of Float by path.
501         * <p>
502         * If the List does not exist but a default value has been specified, this
503         * will return the default value. If the List does not exist and no
504         * default value was specified, this will return an empty List.
505         * <p>
506         * This method will attempt to cast any values into a Float if possible,
507         * but may miss any values out if they are not compatible.
508         *
509         * @param path Path of the List to get.
510         * @return Requested List of Float.
511         */
512        public List<Float> getFloatList(String path);
513    
514        /**
515         * Gets the requested List of Long by path.
516         * <p>
517         * If the List does not exist but a default value has been specified, this
518         * will return the default value. If the List does not exist and no
519         * default value was specified, this will return an empty List.
520         * <p>
521         * This method will attempt to cast any values into a Long if possible,
522         * but may miss any values out if they are not compatible.
523         *
524         * @param path Path of the List to get.
525         * @return Requested List of Long.
526         */
527        public List<Long> getLongList(String path);
528    
529        /**
530         * Gets the requested List of Byte by path.
531         * <p>
532         * If the List does not exist but a default value has been specified, this
533         * will return the default value. If the List does not exist and no
534         * default value was specified, this will return an empty List.
535         * <p>
536         * This method will attempt to cast any values into a Byte if possible,
537         * but may miss any values out if they are not compatible.
538         *
539         * @param path Path of the List to get.
540         * @return Requested List of Byte.
541         */
542        public List<Byte> getByteList(String path);
543    
544        /**
545         * Gets the requested List of Character by path.
546         * <p>
547         * If the List does not exist but a default value has been specified, this
548         * will return the default value. If the List does not exist and no
549         * default value was specified, this will return an empty List.
550         * <p>
551         * This method will attempt to cast any values into a Character if
552         * possible, but may miss any values out if they are not compatible.
553         *
554         * @param path Path of the List to get.
555         * @return Requested List of Character.
556         */
557        public List<Character> getCharacterList(String path);
558    
559        /**
560         * Gets the requested List of Short by path.
561         * <p>
562         * If the List does not exist but a default value has been specified, this
563         * will return the default value. If the List does not exist and no
564         * default value was specified, this will return an empty List.
565         * <p>
566         * This method will attempt to cast any values into a Short if possible,
567         * but may miss any values out if they are not compatible.
568         *
569         * @param path Path of the List to get.
570         * @return Requested List of Short.
571         */
572        public List<Short> getShortList(String path);
573    
574        /**
575         * Gets the requested List of Maps by path.
576         * <p>
577         * If the List does not exist but a default value has been specified, this
578         * will return the default value. If the List does not exist and no
579         * default value was specified, this will return an empty List.
580         * <p>
581         * This method will attempt to cast any values into a Map if possible, but
582         * may miss any values out if they are not compatible.
583         *
584         * @param path Path of the List to get.
585         * @return Requested List of Maps.
586         */
587        public List<Map<?, ?>> getMapList(String path);
588    
589        // Bukkit
590        /**
591         * Gets the requested Vector by path.
592         * <p>
593         * If the Vector does not exist but a default value has been specified,
594         * this will return the default value. If the Vector does not exist and no
595         * default value was specified, this will return null.
596         *
597         * @param path Path of the Vector to get.
598         * @return Requested Vector.
599         */
600        public Vector getVector(String path);
601    
602        /**
603         * Gets the requested {@link Vector} by path, returning a default value if
604         * not found.
605         * <p>
606         * If the Vector does not exist then the specified default value will
607         * returned regardless of if a default has been identified in the root
608         * {@link Configuration}.
609         *
610         * @param path Path of the Vector to get.
611         * @param def The default value to return if the path is not found or is
612         *     not a Vector.
613         * @return Requested Vector.
614         */
615        public Vector getVector(String path, Vector def);
616    
617        /**
618         * Checks if the specified path is a Vector.
619         * <p>
620         * If the path exists but is not a Vector, this will return false. If the
621         * path does not exist, this will return false. If the path does not exist
622         * but a default value has been specified, this will check if that default
623         * value is a Vector and return appropriately.
624         *
625         * @param path Path of the Vector to check.
626         * @return Whether or not the specified path is a Vector.
627         */
628        public boolean isVector(String path);
629    
630        /**
631         * Gets the requested OfflinePlayer by path.
632         * <p>
633         * If the OfflinePlayer does not exist but a default value has been
634         * specified, this will return the default value. If the OfflinePlayer
635         * does not exist and no default value was specified, this will return
636         * null.
637         *
638         * @param path Path of the OfflinePlayer to get.
639         * @return Requested OfflinePlayer.
640         */
641        public OfflinePlayer getOfflinePlayer(String path);
642    
643        /**
644         * Gets the requested {@link OfflinePlayer} by path, returning a default
645         * value if not found.
646         * <p>
647         * If the OfflinePlayer does not exist then the specified default value
648         * will returned regardless of if a default has been identified in the
649         * root {@link Configuration}.
650         *
651         * @param path Path of the OfflinePlayer to get.
652         * @param def The default value to return if the path is not found or is
653         *     not an OfflinePlayer.
654         * @return Requested OfflinePlayer.
655         */
656        public OfflinePlayer getOfflinePlayer(String path, OfflinePlayer def);
657    
658        /**
659         * Checks if the specified path is an OfflinePlayer.
660         * <p>
661         * If the path exists but is not a OfflinePlayer, this will return false.
662         * If the path does not exist, this will return false. If the path does
663         * not exist but a default value has been specified, this will check if
664         * that default value is a OfflinePlayer and return appropriately.
665         *
666         * @param path Path of the OfflinePlayer to check.
667         * @return Whether or not the specified path is an OfflinePlayer.
668         */
669        public boolean isOfflinePlayer(String path);
670    
671        /**
672         * Gets the requested ItemStack by path.
673         * <p>
674         * If the ItemStack does not exist but a default value has been specified,
675         * this will return the default value. If the ItemStack does not exist and
676         * no default value was specified, this will return null.
677         *
678         * @param path Path of the ItemStack to get.
679         * @return Requested ItemStack.
680         */
681        public ItemStack getItemStack(String path);
682    
683        /**
684         * Gets the requested {@link ItemStack} by path, returning a default value
685         * if not found.
686         * <p>
687         * If the ItemStack does not exist then the specified default value will
688         * returned regardless of if a default has been identified in the root
689         * {@link Configuration}.
690         *
691         * @param path Path of the ItemStack to get.
692         * @param def The default value to return if the path is not found or is
693         *     not an ItemStack.
694         * @return Requested ItemStack.
695         */
696        public ItemStack getItemStack(String path, ItemStack def);
697    
698        /**
699         * Checks if the specified path is an ItemStack.
700         * <p>
701         * If the path exists but is not a ItemStack, this will return false. If
702         * the path does not exist, this will return false. If the path does not
703         * exist but a default value has been specified, this will check if that
704         * default value is a ItemStack and return appropriately.
705         *
706         * @param path Path of the ItemStack to check.
707         * @return Whether or not the specified path is an ItemStack.
708         */
709        public boolean isItemStack(String path);
710    
711        /**
712         * Gets the requested Color by path.
713         * <p>
714         * If the Color does not exist but a default value has been specified,
715         * this will return the default value. If the Color does not exist and no
716         * default value was specified, this will return null.
717         *
718         * @param path Path of the Color to get.
719         * @return Requested Color.
720         */
721        public Color getColor(String path);
722    
723        /**
724         * Gets the requested {@link Color} by path, returning a default value if
725         * not found.
726         * <p>
727         * If the Color does not exist then the specified default value will
728         * returned regardless of if a default has been identified in the root
729         * {@link Configuration}.
730         *
731         * @param path Path of the Color to get.
732         * @param def The default value to return if the path is not found or is
733         *     not a Color.
734         * @return Requested Color.
735         */
736        public Color getColor(String path, Color def);
737    
738        /**
739         * Checks if the specified path is a Color.
740         * <p>
741         * If the path exists but is not a Color, this will return false. If the
742         * path does not exist, this will return false. If the path does not exist
743         * but a default value has been specified, this will check if that default
744         * value is a Color and return appropriately.
745         *
746         * @param path Path of the Color to check.
747         * @return Whether or not the specified path is a Color.
748         */
749        public boolean isColor(String path);
750    
751        /**
752         * Gets the requested ConfigurationSection by path.
753         * <p>
754         * If the ConfigurationSection does not exist but a default value has been
755         * specified, this will return the default value. If the
756         * ConfigurationSection does not exist and no default value was specified,
757         * this will return null.
758         *
759         * @param path Path of the ConfigurationSection to get.
760         * @return Requested ConfigurationSection.
761         */
762        public ConfigurationSection getConfigurationSection(String path);
763    
764        /**
765         * Checks if the specified path is a ConfigurationSection.
766         * <p>
767         * If the path exists but is not a ConfigurationSection, this will return
768         * false. If the path does not exist, this will return false. If the path
769         * does not exist but a default value has been specified, this will check
770         * if that default value is a ConfigurationSection and return
771         * appropriately.
772         *
773         * @param path Path of the ConfigurationSection to check.
774         * @return Whether or not the specified path is a ConfigurationSection.
775         */
776        public boolean isConfigurationSection(String path);
777    
778        /**
779         * Gets the equivalent {@link ConfigurationSection} from the default
780         * {@link Configuration} defined in {@link #getRoot()}.
781         * <p>
782         * If the root contains no defaults, or the defaults doesn't contain a
783         * value for this path, or the value at this path is not a {@link
784         * ConfigurationSection} then this will return null.
785         *
786         * @return Equivalent section in root configuration
787         */
788        public ConfigurationSection getDefaultSection();
789    
790        /**
791         * Sets the default value in the root at the given path as provided.
792         * <p>
793         * If no source {@link Configuration} was provided as a default
794         * collection, then a new {@link MemoryConfiguration} will be created to
795         * hold the new default value.
796         * <p>
797         * If value is null, the value will be removed from the default
798         * Configuration source.
799         * <p>
800         * If the value as returned by {@link #getDefaultSection()} is null, then
801         * this will create a new section at the path, replacing anything that may
802         * have existed there previously.
803         *
804         * @param path Path of the value to set.
805         * @param value Value to set the default to.
806         * @throws IllegalArgumentException Thrown if path is null.
807         */
808        public void addDefault(String path, Object value);
809    }