77import java .nio .file .Files ;
88import java .nio .file .Path ;
99import 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 ;
1116import 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+ };
2354 }
2455
25- public String setProperty (String key , String value ) {
56+ @ Override
57+ public String put (String key , String value ) {
58+ // TODO handle adds and replaces
2659 return values .put (key , value );
2760 }
2861
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
4665 return values .remove (key );
4766 }
4867
@@ -51,10 +70,22 @@ public void load(Path file) throws IOException {
5170 }
5271
5372 public void load (Reader reader ) throws IOException {
73+ tokens .clear ();
5474 BufferedReader br =
5575 reader instanceof BufferedReader
5676 ? (BufferedReader ) reader
5777 : 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+ }
5889 }
5990
6091 public static Properties loadProperties (Path file ) throws IOException {
0 commit comments