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

Last change on this file since 9823 was 9823, checked in by bastiK, 8 years ago

move preference writing to new class; some refactoring

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