source: josm/trunk/src/org/openstreetmap/josm/data/preferences/PreferencesWriter.java@ 11710

Last change on this file since 11710 was 11553, checked in by Don-vip, 7 years ago

refactor handling of null values - use Java 8 Optional where possible

  • Property svn:eol-style set to native
File size: 5.1 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.data.preferences;
3
4import java.io.PrintWriter;
5import java.util.Collection;
6import java.util.List;
7import java.util.Map;
8import java.util.Optional;
9import java.util.stream.Stream;
10
11import org.openstreetmap.josm.Main;
12import org.openstreetmap.josm.data.Version;
13import org.openstreetmap.josm.io.XmlWriter;
14
15/**
16 * Write preferences to XML.
17 * @since 9823
18 */
19public class PreferencesWriter extends XmlWriter implements SettingVisitor {
20 private final boolean noPassword;
21 private final boolean defaults;
22 private String key;
23
24 /**
25 * Construct new {@code PreferencesWriter}.
26 * @param out the {@link PrintWriter}
27 * @param noPassword if password must be excluded
28 * @param defaults true, if default values are converted to XML, false for regular preferences
29 */
30 public PreferencesWriter(PrintWriter out, boolean noPassword, boolean defaults) {
31 super(out);
32 this.noPassword = noPassword;
33 this.defaults = defaults;
34 }
35
36 /**
37 * Write preferences.
38 *
39 * @param settings preferences settings to write
40 */
41 public void write(Collection<Map.Entry<String, Setting<?>>> settings) {
42 write(settings.stream());
43 }
44
45 /**
46 * Write preferences.
47 *
48 * @param settings preferences settings to write as stream.
49 */
50 public void write(Stream<Map.Entry<String, Setting<?>>> settings) {
51 out.write(String.format("<?xml version=\"1.0\" encoding=\"UTF-8\"?>%n"));
52 String rootElement = defaults ? "preferences-defaults" : "preferences";
53 out.write(String.format("<%s xmlns='%s/preferences-1.0'", rootElement, Main.getXMLBase()));
54 if (defaults) {
55 out.write(" xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'");
56 }
57 out.write(String.format(" version='%d'>%n", Version.getInstance().getVersion()));
58 settings.forEachOrdered(e -> {
59 setKey(e.getKey());
60 e.getValue().visit(this);
61 });
62 out.write(String.format("</%s>%n", rootElement));
63 }
64
65 private void setKey(String key) {
66 this.key = key;
67 }
68
69 private void addTime(Setting<?> setting) {
70 if (defaults) {
71 out.write("' time='" + Optional.ofNullable(setting.getTime()).orElseThrow(IllegalStateException::new));
72 }
73 }
74
75 private void addDefaults() {
76 out.write(String.format("' xsi:nil='true'/>%n"));
77 }
78
79 @Override
80 public void visit(StringSetting setting) {
81 if (noPassword && "osm-server.password".equals(key))
82 return; // do not store plain password.
83 out.write(" <tag key='" + XmlWriter.encode(key));
84 addTime(setting);
85 if (setting.getValue() != null) {
86 out.write(String.format("' value='%s'/>%n", XmlWriter.encode(setting.getValue())));
87 } else if (defaults) {
88 addDefaults();
89 } else {
90 throw new NullPointerException();
91 }
92 }
93
94 @Override
95 public void visit(ListSetting setting) {
96 out.write(" <list key='" + XmlWriter.encode(key));
97 addTime(setting);
98 if (setting.getValue() != null) {
99 out.write(String.format("'>%n"));
100 for (String s : setting.getValue()) {
101 out.write(String.format(" <entry value='%s'/>%n", XmlWriter.encode(s)));
102 }
103 out.write(String.format(" </list>%n"));
104 } else if (defaults) {
105 addDefaults();
106 } else {
107 throw new NullPointerException();
108 }
109 }
110
111 @Override
112 public void visit(ListListSetting setting) {
113 out.write(" <lists key='" + XmlWriter.encode(key));
114 addTime(setting);
115 if (setting.getValue() != null) {
116 out.write(String.format("'>%n"));
117 for (List<String> list : setting.getValue()) {
118 out.write(String.format(" <list>%n"));
119 for (String s : list) {
120 out.write(String.format(" <entry value='%s'/>%n", encode(s)));
121 }
122 out.write(String.format(" </list>%n"));
123 }
124 out.write(String.format(" </lists>%n"));
125 } else if (defaults) {
126 addDefaults();
127 } else {
128 throw new NullPointerException();
129 }
130 }
131
132 @Override
133 public void visit(MapListSetting setting) {
134 out.write(" <maps key='" + encode(key));
135 addTime(setting);
136 if (setting.getValue() != null) {
137 out.write(String.format("'>%n"));
138 for (Map<String, String> struct : setting.getValue()) {
139 out.write(String.format(" <map>%n"));
140 for (Map.Entry<String, String> e : struct.entrySet()) {
141 out.write(String.format(" <tag key='%s' value='%s'/>%n", encode(e.getKey()), encode(e.getValue())));
142 }
143 out.write(String.format(" </map>%n"));
144 }
145 out.write(String.format(" </maps>%n"));
146 } else if (defaults) {
147 addDefaults();
148 } else {
149 throw new NullPointerException();
150 }
151 }
152}
Note: See TracBrowser for help on using the repository browser.