Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
MapConfiguration |
|
| 1.7777777777777777;1,778 |
1 | /* | |
2 | * Licensed to the Apache Software Foundation (ASF) under one or more | |
3 | * contributor license agreements. See the NOTICE file distributed with | |
4 | * this work for additional information regarding copyright ownership. | |
5 | * The ASF licenses this file to You under the Apache License, Version 2.0 | |
6 | * (the "License"); you may not use this file except in compliance with | |
7 | * the License. You may obtain a copy of the License at | |
8 | * | |
9 | * http://www.apache.org/licenses/LICENSE-2.0 | |
10 | * | |
11 | * Unless required by applicable law or agreed to in writing, software | |
12 | * distributed under the License is distributed on an "AS IS" BASIS, | |
13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 | * See the License for the specific language governing permissions and | |
15 | * limitations under the License. | |
16 | */ | |
17 | ||
18 | package org.apache.commons.configuration; | |
19 | ||
20 | import java.util.ArrayList; | |
21 | import java.util.Iterator; | |
22 | import java.util.List; | |
23 | import java.util.Map; | |
24 | ||
25 | /** | |
26 | * <p>A Map based Configuration.</p> | |
27 | * <p><em>Note:</em>Configuration objects of this type can be read concurrently | |
28 | * by multiple threads. However if one of these threads modifies the object, | |
29 | * synchronization has to be performed manually.</p> | |
30 | * | |
31 | * @author Emmanuel Bourg | |
32 | * @version $Revision: 548098 $, $Date: 2007-06-17 21:34:03 +0200 (So, 17 Jun 2007) $ | |
33 | * @since 1.1 | |
34 | */ | |
35 | public class MapConfiguration extends AbstractConfiguration implements Cloneable | |
36 | { | |
37 | /** The Map decorated by this configuration. */ | |
38 | protected Map map; | |
39 | ||
40 | /** | |
41 | * Create a Configuration decorator around the specified Map. The map is | |
42 | * used to store the configuration properties, any change will also affect | |
43 | * the Map. | |
44 | * | |
45 | * @param map the map | |
46 | */ | |
47 | public MapConfiguration(Map map) | |
48 | 39 | { |
49 | 39 | this.map = map; |
50 | 39 | } |
51 | ||
52 | /** | |
53 | * Return the Map decorated by this configuration. | |
54 | * | |
55 | * @return the map this configuration is based onto | |
56 | */ | |
57 | public Map getMap() | |
58 | { | |
59 | 3 | return map; |
60 | } | |
61 | ||
62 | public Object getProperty(String key) | |
63 | { | |
64 | 901 | Object value = map.get(key); |
65 | 901 | if ((value instanceof String) && (!isDelimiterParsingDisabled())) |
66 | { | |
67 | 879 | List list = PropertyConverter.split((String) value, getListDelimiter()); |
68 | 879 | return list.size() > 1 ? list : list.get(0); |
69 | } | |
70 | else | |
71 | { | |
72 | 22 | return value; |
73 | } | |
74 | } | |
75 | ||
76 | protected void addPropertyDirect(String key, Object value) | |
77 | { | |
78 | 16 | Object previousValue = getProperty(key); |
79 | ||
80 | 16 | if (previousValue == null) |
81 | { | |
82 | 14 | map.put(key, value); |
83 | } | |
84 | 2 | else if (previousValue instanceof List) |
85 | { | |
86 | // the value is added to the existing list | |
87 | 1 | ((List) previousValue).add(value); |
88 | } | |
89 | else | |
90 | { | |
91 | // the previous value is replaced by a list containing the previous value and the new value | |
92 | 1 | List list = new ArrayList(); |
93 | 1 | list.add(previousValue); |
94 | 1 | list.add(value); |
95 | ||
96 | 1 | map.put(key, list); |
97 | } | |
98 | 16 | } |
99 | ||
100 | public boolean isEmpty() | |
101 | { | |
102 | 2 | return map.isEmpty(); |
103 | } | |
104 | ||
105 | public boolean containsKey(String key) | |
106 | { | |
107 | 8 | return map.containsKey(key); |
108 | } | |
109 | ||
110 | protected void clearPropertyDirect(String key) | |
111 | { | |
112 | 6 | map.remove(key); |
113 | 6 | } |
114 | ||
115 | public Iterator getKeys() | |
116 | { | |
117 | 20 | return map.keySet().iterator(); |
118 | } | |
119 | ||
120 | /** | |
121 | * Returns a copy of this object. The returned configuration will contain | |
122 | * the same properties as the original. Event listeners are not cloned. | |
123 | * | |
124 | * @return the copy | |
125 | * @since 1.3 | |
126 | */ | |
127 | public Object clone() | |
128 | { | |
129 | try | |
130 | { | |
131 | 2 | MapConfiguration copy = (MapConfiguration) super.clone(); |
132 | 2 | copy.clearConfigurationListeners(); |
133 | 2 | copy.map = (Map) ConfigurationUtils.clone(map); |
134 | 2 | return copy; |
135 | } | |
136 | 0 | catch (CloneNotSupportedException cex) |
137 | { | |
138 | // cannot happen | |
139 | 0 | throw new ConfigurationRuntimeException(cex); |
140 | } | |
141 | } | |
142 | } |