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

Last change on this file since 11296 was 10824, checked in by Don-vip, 8 years ago

see #13309 - Caching and notifying preferences (patch by michael2402) - gsoc-core

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