1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.settings;
14
15 import java.util.HashMap;
16 import java.util.HashSet;
17 import java.util.List;
18 import java.util.Map;
19 import java.util.Set;
20
21 import com.eviware.soapui.config.SettingConfig;
22 import com.eviware.soapui.config.SettingsConfig;
23 import com.eviware.soapui.model.ModelItem;
24 import com.eviware.soapui.model.settings.Settings;
25 import com.eviware.soapui.model.settings.SettingsListener;
26
27 /***
28 * Settings implementation for XmlBeans generated SettingsConfig
29 *
30 * @author Ole.Matzura
31 */
32
33 public class XmlBeansSettingsImpl implements Settings
34 {
35 private final Settings parent;
36 private final SettingsConfig config;
37 private final Map<String,SettingConfig> values = new HashMap<String,SettingConfig>();
38 private final Set<SettingsListener> listeners = new HashSet<SettingsListener>();
39 private final ModelItem item;
40 private final SettingsListener settingsListener = new WeakSettingsListener( new InternalSettingsListener() );
41
42 public XmlBeansSettingsImpl( ModelItem item, Settings parent, SettingsConfig config )
43 {
44 this.item = item;
45 this.config = config;
46 this.parent = parent;
47
48 List<SettingConfig> settingList = config.getSettingList();
49 for( SettingConfig setting : settingList )
50 {
51 values.put( setting.getId(), setting );
52 }
53
54 if( parent != null )
55 {
56 parent.addSettingsListener( settingsListener );
57 }
58 }
59
60 public boolean isSet( String id )
61 {
62 return values.containsKey( id );
63 }
64
65 public String getString(String id,String defaultValue)
66 {
67 if( values.containsKey( id )) return values.get( id ).getStringValue() ;
68 return parent == null ? defaultValue : parent.getString( id, defaultValue );
69 }
70
71 public void setString(String id, String value)
72 {
73 String oldValue = getString( id, null );
74
75 if( oldValue == null && value == null )
76 return;
77
78 if( value != null && value.equals( oldValue ))
79 return;
80
81 if( value == null )
82 {
83 clearSetting( id );
84 }
85 else
86 {
87 if( !values.containsKey( id ))
88 {
89 SettingConfig setting = config.addNewSetting();
90 setting.setId( id );
91 values.put( id, setting );
92 }
93
94 values.get( id ).setStringValue( value );
95 }
96
97 notifySettingChanged(id, value, oldValue);
98 }
99
100 private void notifySettingChanged(String id, String value, String oldValue)
101 {
102 SettingsListener [] l = listeners.toArray( new SettingsListener[ listeners.size() ]);
103 for( SettingsListener listener : l )
104 {
105 listener.settingChanged( id, value, oldValue );
106 }
107 }
108
109 public boolean getBoolean(String id)
110 {
111 if( values.containsKey( id ))
112 return Boolean.parseBoolean( values.get( id ).getStringValue() );
113
114 return parent == null ? false : parent.getBoolean( id );
115 }
116
117 public long getLong(String id, long defaultValue)
118 {
119 if( values.containsKey( id ))
120 {
121 try
122 {
123 return Long.parseLong(values.get(id).getStringValue());
124 }
125 catch (NumberFormatException e)
126 {
127 }
128 }
129
130 return parent == null ? defaultValue : parent.getLong( id, defaultValue );
131 }
132
133 public void setBoolean(String id, boolean value)
134 {
135 setString( id, Boolean.toString( value ));
136 }
137
138 public void addSettingsListener(SettingsListener listener)
139 {
140 listeners.add( listener );
141 }
142
143 public void removeSettingsListener(SettingsListener listener)
144 {
145 listeners.remove( listener );
146 }
147
148 public void clearSetting(String id)
149 {
150 if( values.containsKey( id ))
151 {
152 int ix = config.getSettingList().indexOf( values.get( id ));
153 config.removeSetting( ix );
154 values.remove( id );
155 }
156 }
157
158 public ModelItem getModelItem()
159 {
160 return item;
161 }
162
163 public void release()
164 {
165 if( listeners != null )
166 listeners.clear();
167
168 if( parent != null )
169 parent.removeSettingsListener( settingsListener );
170 }
171
172 private final class InternalSettingsListener implements SettingsListener
173 {
174 public void settingChanged(String name, String newValue, String oldValue)
175 {
176 if( !values.containsKey( name ))
177 {
178 notifySettingChanged(name, newValue, oldValue);
179 }
180 }
181 }
182
183 public void setLong( String id, long value )
184 {
185 setString( id, Long.toString( value ) );
186 }
187 }