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

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

sonar - pmd:ImmutableField - Immutable Field

  • Property svn:eol-style set to native
File size: 4.9 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.data.preferences;
3
4import org.openstreetmap.josm.Main;
5import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
6import org.openstreetmap.josm.tools.CheckParameterUtil;
7import org.openstreetmap.josm.tools.bugreport.BugReport;
8
9/**
10 * This class represents a property that can be represented as String.
11 *
12 * @author Michael Zangl
13 *
14 * @param <T> The property content type.
15 * @since 10824
16 */
17public abstract class AbstractToStringProperty<T> extends AbstractProperty<T> {
18
19 /**
20 * This is a version of this property that attempts to get the property with a more specialized key and - if that fails - uses the property
21 * value as default.
22 *
23 * @author Michael Zangl
24 * @param <T> The content type
25 */
26 public static class ChildProperty<T> extends AbstractToStringProperty<T> {
27 private final AbstractToStringProperty<T> parent;
28
29 ChildProperty(AbstractToStringProperty<T> parent, String key) {
30 super(key, null);
31 CheckParameterUtil.ensureParameterNotNull(parent, "parent");
32 this.parent = parent;
33 }
34
35 @Override
36 protected void storeDefaultValue() {
37 // Default value hidden in preferences.
38 }
39
40 @Override
41 public T getDefaultValue() {
42 return parent.get();
43 }
44
45 @Override
46 protected T fromString(String string) {
47 return parent.fromString(string);
48 }
49
50 @Override
51 protected String toString(T t) {
52 return parent.toString(t);
53 }
54
55 @Override
56 protected void addListenerImpl(PreferenceChangedListener adapter) {
57 super.addListenerImpl(adapter);
58 parent.addListenerImpl(adapter);
59 }
60
61 @Override
62 protected void addWeakListenerImpl(PreferenceChangedListener adapter) {
63 super.addWeakListenerImpl(adapter);
64 parent.addWeakListenerImpl(adapter);
65 }
66
67 @Override
68 protected void removeListenerImpl(PreferenceChangedListener adapter) {
69 super.removeListenerImpl(adapter);
70 parent.removeListenerImpl(adapter);
71 }
72
73 @Override
74 public CachingProperty<T> cached() {
75 throw new UnsupportedOperationException("Not implemented yet.");
76 }
77 }
78
79 /**
80 * Create a new property and store the default value.
81 * @param key The key
82 * @param defaultValue The default value.
83 * @see AbstractProperty#AbstractProperty(String, Object)
84 */
85 public AbstractToStringProperty(String key, T defaultValue) {
86 super(key, defaultValue);
87 storeDefaultValue();
88 }
89
90 @Override
91 public T get() {
92 String string = getAsString();
93 if (!string.isEmpty()) {
94 try {
95 return fromString(string);
96 } catch (InvalidPreferenceValueException e) {
97 Main.warn(BugReport.intercept(e).put("key", key).put("value", string));
98 }
99 }
100 return getDefaultValue();
101 }
102
103 /**
104 * Converts the string to an object of the given type.
105 * @param string The string
106 * @return The object.
107 * @throws InvalidPreferenceValueException If the value could not be converted.
108 */
109 protected abstract T fromString(String string);
110
111 @Override
112 public boolean put(T value) {
113 String string = value == null ? null : toString(value);
114 return getPreferences().put(getKey(), string);
115 }
116
117 /**
118 * Converts the string to an object of the given type.
119 * @param t The object.
120 * @return The string representing the object
121 * @throws InvalidPreferenceValueException If the value could not be converted.
122 */
123 protected abstract String toString(T t);
124
125 /**
126 * Gets the preference value as String.
127 * @return The string preference value.
128 */
129 protected String getAsString() {
130 T def = getDefaultValue();
131 return getPreferences().get(key, def == null ? "" : toString(def));
132 }
133
134 /**
135 * Gets a specialized setting value that has the current value as default
136 * <p>
137 * The key will be getKey().spec
138 * @param spec The key specialization
139 * @return The property
140 */
141 public AbstractToStringProperty<T> getSpecialized(String spec) {
142 return getChildProperty(getKey() + "." + spec);
143 }
144
145 /**
146 * Gets a setting that defaults to this setting if the key is not set.
147 * @param key The more specialized key.
148 * @return The new setting.
149 */
150 protected AbstractToStringProperty<T> getChildProperty(String key) {
151 return new ChildProperty<>(this, key);
152 }
153
154 /**
155 * Creates a new {@link CachingProperty} instance for this property.
156 * @return The new caching property instance.
157 */
158 public CachingProperty<T> cached() {
159 return new CachingProperty<>(this);
160 }
161}
Note: See TracBrowser for help on using the repository browser.