7
7
import java .nio .file .Files ;
8
8
import java .nio .file .Path ;
9
9
import java .nio .file .StandardOpenOption ;
10
- import java .util .Map ;
10
+ import java .util .AbstractMap ;
11
+ import java .util .AbstractSet ;
12
+ import java .util .ArrayList ;
13
+ import java .util .Iterator ;
14
+ import java .util .LinkedHashMap ;
15
+ import java .util .List ;
11
16
import java .util .Set ;
12
- import java .util .TreeMap ;
13
-
14
- public class Properties {
15
- private final Map <String , String > values = new TreeMap <>();
16
-
17
- public String getProperty (String key ) {
18
- return getProperty (key , null );
19
- }
20
-
21
- public String getProperty (String key , String defaultValue ) {
22
- return values .getOrDefault (key , defaultValue );
17
+ import java .util .stream .Collectors ;
18
+
19
+ public class Properties extends AbstractMap <String , String > {
20
+ private final LinkedHashMap <String , String > values = new LinkedHashMap <>();
21
+ private final List <PropertiesParser .Token > tokens = new ArrayList <>();
22
+
23
+ @ Override
24
+ public Set <Entry <String , String >> entrySet () {
25
+ return new AbstractSet <Entry <String , String >>() {
26
+ @ Override
27
+ public Iterator <Entry <String , String >> iterator () {
28
+ return new Iterator <Entry <String , String >>() {
29
+ Iterator <Entry <String , String >> iter = values .entrySet ().iterator ();
30
+
31
+ @ Override
32
+ public boolean hasNext () {
33
+ return iter .hasNext ();
34
+ }
35
+
36
+ @ Override
37
+ public Entry <String , String > next () {
38
+ return iter .next ();
39
+ }
40
+
41
+ @ Override
42
+ public void remove () {
43
+ // TODO handle remove
44
+ iter .remove ();
45
+ }
46
+ };
47
+ }
48
+
49
+ @ Override
50
+ public int size () {
51
+ return values .entrySet ().size ();
52
+ }
53
+ };
23
54
}
24
55
25
- public String setProperty (String key , String value ) {
56
+ @ Override
57
+ public String put (String key , String value ) {
58
+ // TODO handle adds and replaces
26
59
return values .put (key , value );
27
60
}
28
61
29
- public void setProperties (Properties props ) {
30
- setProperties (props .values );
31
- }
32
-
33
- public void setProperties (Map <String , String > props ) {
34
- values .putAll (props );
35
- }
36
-
37
- public boolean containsKey (String key ) {
38
- return values .containsKey (key );
39
- }
40
-
41
- public Set <String > keySet () {
42
- return values .keySet ();
43
- }
44
-
45
- public String remove (String key ) {
62
+ @ Override
63
+ public String remove (Object key ) {
64
+ // TODO handle remove
46
65
return values .remove (key );
47
66
}
48
67
@@ -51,10 +70,22 @@ public void load(Path file) throws IOException {
51
70
}
52
71
53
72
public void load (Reader reader ) throws IOException {
73
+ tokens .clear ();
54
74
BufferedReader br =
55
75
reader instanceof BufferedReader
56
76
? (BufferedReader ) reader
57
77
: new BufferedReader (reader );
78
+ List <PropertiesParser .Token > ts = PropertiesParser .tokens (br )
79
+ .collect (Collectors .toList ());
80
+ tokens .addAll (ts );
81
+ String key = null ;
82
+ for (PropertiesParser .Token token : tokens ) {
83
+ if (token .type == PropertiesParser .Type .KEY ) {
84
+ key = token .getText ();
85
+ } else if (token .type == PropertiesParser .Type .VALUE ) {
86
+ values .put (key , token .getText ());
87
+ }
88
+ }
58
89
}
59
90
60
91
public static Properties loadProperties (Path file ) throws IOException {
0 commit comments