1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.collections4.properties;
19
20 import java.util.AbstractMap;
21 import java.util.Collections;
22 import java.util.Enumeration;
23 import java.util.LinkedHashSet;
24 import java.util.Map;
25 import java.util.Properties;
26 import java.util.Set;
27 import java.util.TreeSet;
28 import java.util.function.BiConsumer;
29 import java.util.stream.Collectors;
30 import java.util.stream.Stream;
31
32
33
34
35
36
37
38
39
40
41 public class SortedProperties extends Properties {
42
43 private static final long serialVersionUID = 1L;
44
45
46
47
48 public SortedProperties() {
49
50 }
51
52 @Override
53 public Set<Map.Entry<Object, Object>> entrySet() {
54 return keyStream().map(k -> new AbstractMap.SimpleEntry<>(k, get(k))).collect(Collectors.toCollection(LinkedHashSet::new));
55 }
56
57
58
59
60
61
62
63 private synchronized TreeSet<String> enumerateStringProperties(final TreeSet<String> result) {
64 if (defaults != null) {
65 result.addAll(defaults.stringPropertyNames());
66 }
67 for (final Enumeration<?> e = keys(); e.hasMoreElements();) {
68 final Object k = e.nextElement();
69 final Object v = get(k);
70 if (k instanceof String && v instanceof String) {
71 result.add((String) k);
72 }
73 }
74 return result;
75 }
76
77 @Override
78 public synchronized void forEach(final BiConsumer<? super Object, ? super Object> action) {
79 keyStream().forEach(k -> action.accept(k, get(k)));
80 }
81
82 @Override
83 public synchronized Enumeration<Object> keys() {
84 return Collections.enumeration(keySet());
85 }
86
87 @Override
88 public Set<Object> keySet() {
89 return new TreeSet<>(super.keySet());
90 }
91
92 private Stream<Object> keyStream() {
93 return keySet().stream();
94 }
95
96 @Override
97 public Enumeration<?> propertyNames() {
98 return Collections.enumeration(stringPropertyNames());
99 }
100
101 @Override
102 public Set<String> stringPropertyNames() {
103 return enumerateStringProperties(new TreeSet<>());
104 }
105 }