/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.impl.settings; import com.eviware.soapui.config.SettingConfig; import com.eviware.soapui.config.SettingsConfig; import com.eviware.soapui.model.ModelItem; import com.eviware.soapui.model.settings.Settings; import com.eviware.soapui.model.settings.SettingsListener; import com.eviware.soapui.support.types.StringToStringMap; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * Settings implementation for XmlBeans generated SettingsConfig * * @author Ole.Matzura */ public class XmlBeansSettingsImpl implements Settings { private final Settings parent; private final SettingsConfig config; private final Map<String, SettingConfig> values = Collections.synchronizedMap(new HashMap<String, SettingConfig>()); private final Map<String, String> valueCache = Collections.synchronizedMap(new StringToStringMap()); private final Set<SettingsListener> listeners = new HashSet<SettingsListener>(); private final ModelItem item; private final SettingsListener settingsListener = new WeakSettingsListener(new InternalSettingsListener()); public XmlBeansSettingsImpl(ModelItem item, Settings parent, SettingsConfig config) { this.item = item; this.config = config; this.parent = parent; List<SettingConfig> settingList = config.getSettingList(); for (SettingConfig setting : settingList) { values.put(setting.getId(), setting); } if (parent != null) { parent.addSettingsListener(settingsListener); } } public boolean isSet(String id) { return values.containsKey(id); } public String getString(String id, String defaultValue) { String cachedValue = valueCache.get(id); if (cachedValue != null) { return cachedValue; } else { SettingConfig setting = values.get(id); if (setting != null) { String value = setting.getStringValue(); valueCache.put(id, value); return value; } } return parent == null ? defaultValue : parent.getString(id, defaultValue); } public void setString(String id, String value) { String oldValue = getString(id, null); if (oldValue == null && value == null) { return; } if (value != null && value.equals(oldValue)) { return; } if (value == null) { clearSetting(id); } else { if (!values.containsKey(id)) { SettingConfig setting = config.addNewSetting(); setting.setId(id); values.put(id, setting); } values.get(id).setStringValue(value); valueCache.put(id, value); } notifySettingChanged(id, value, oldValue); } private void notifySettingChanged(String id, String value, String oldValue) { SettingsListener[] l = listeners.toArray(new SettingsListener[listeners.size()]); for (SettingsListener listener : l) { listener.settingChanged(id, value, oldValue); } } @Override public void reloadSettings() { notifySettingsReloaded(); } private void notifySettingsReloaded() { SettingsListener[] l = listeners.toArray(new SettingsListener[listeners.size()]); for (SettingsListener listener : l) { listener.settingsReloaded(); } } public boolean getBoolean(String id) { return getBoolean(id, false); } @Override public boolean getBoolean(String id, boolean defaultValue) { String value = getString(id, null); if (value != null) { return Boolean.parseBoolean(value); } return parent == null ? defaultValue : parent.getBoolean(id); } public long getLong(String id, long defaultValue) { String value = getString(id, null); if (value != null) { try { return Long.parseLong(value); } catch (NumberFormatException e) { } } return parent == null ? defaultValue : parent.getLong(id, defaultValue); } public void setBoolean(String id, boolean value) { if (!value) { setString(id, "false"); } else { setString(id, "true"); } } public void addSettingsListener(SettingsListener listener) { listeners.add(listener); } public void removeSettingsListener(SettingsListener listener) { listeners.remove(listener); } public void clearSetting(String id) { if (values.containsKey(id)) { int ix = config.getSettingList().indexOf(values.get(id)); config.removeSetting(ix); values.remove(id); valueCache.remove(id); } } public ModelItem getModelItem() { return item; } public void release() { if (listeners != null) { listeners.clear(); } if (parent != null) { parent.removeSettingsListener(settingsListener); } } private final class InternalSettingsListener implements SettingsListener { public void settingChanged(String name, String newValue, String oldValue) { if (!values.containsKey(name)) { notifySettingChanged(name, newValue, oldValue); } } @Override public void settingsReloaded() { notifySettingsReloaded(); } } public void setLong(String id, long value) { setString(id, Long.toString(value)); } public void setConfig(SettingsConfig soapuiSettings) { StringToStringMap changed = new StringToStringMap(); for (SettingConfig config : soapuiSettings.getSettingList()) { if (!config.getStringValue().equals(getString(config.getId(), null))) { changed.put(config.getId(), getString(config.getId(), null)); } } values.clear(); config.set(soapuiSettings); List<SettingConfig> settingList = config.getSettingList(); for (SettingConfig setting : settingList) { values.put(setting.getId(), setting); } for (Map.Entry<String, String> entry : changed.entrySet()) { notifySettingChanged(entry.getKey(), getString(entry.getKey(), null), entry.getValue()); } notifySettingsReloaded(); } }