/* * 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.rest.support; import com.eviware.soapui.impl.rest.actions.support.NewRestResourceActionBase; import com.eviware.soapui.model.ModelItem; import com.eviware.soapui.model.propertyexpansion.PropertyExpansion; import com.eviware.soapui.model.testsuite.TestProperty; import com.eviware.soapui.model.testsuite.TestPropertyListener; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; public class OverlayRestParamsPropertyHolder implements RestParamsPropertyHolder { private RestParamsPropertyHolder parent; private RestParamsPropertyHolder overlay; private Set<TestPropertyListener> listeners = new HashSet<TestPropertyListener>(); public OverlayRestParamsPropertyHolder(RestParamsPropertyHolder parent, RestParamsPropertyHolder overlay) { this.parent = parent; this.overlay = overlay; parent.addTestPropertyListener(new ParentListener()); overlay.addTestPropertyListener(new OverlayListener()); } public void addParameter(RestParamProperty prop) { overlay.addParameter(prop); } @Override public void setParameterLocation(RestParamProperty parameter, NewRestResourceActionBase.ParamLocation newLocation) { overlay.setParameterLocation(parameter, newLocation); } public RestParamProperty addProperty(String name) { return overlay.addProperty(name); } public void clear() { overlay.clear(); } public boolean containsKey(Object key) { return overlay.containsKey(key) || parent.containsKey(key); } public boolean containsValue(Object value) { return overlay.containsValue(value) || parent.containsValue(value); } public Set<java.util.Map.Entry<String, TestProperty>> entrySet() { return getProperties().entrySet(); } public RestParamProperty get(Object key) { return overlay.containsKey(key) ? overlay.get(key) : parent.get(key); } public ModelItem getModelItem() { return overlay.getModelItem(); } public Map<String, TestProperty> getProperties() { HashMap<String, TestProperty> result = new HashMap<String, TestProperty>(); for (TestProperty p : values()) { result.put(p.getName(), p); } return result; } public String getPropertiesLabel() { return overlay.getPropertiesLabel(); } public RestParamProperty getProperty(String name) { return get(name); } public RestParamProperty getPropertyAt(int index) { return values().toArray(new RestParamProperty[]{})[index]; } public int getPropertyCount() { return values().size(); } public PropertyExpansion[] getPropertyExpansions() { return overlay.getPropertyExpansions(); } public int getPropertyIndex(String name) { int index = 0; for (TestProperty prop : values()) { if (prop.getName().equals(name)) { return index; } index++; } return -1; } public String[] getPropertyNames() { return keySet().toArray(new String[]{}); } public String getPropertyValue(String name) { return overlay.hasProperty(name) ? overlay.getPropertyValue(name) : parent.getPropertyValue(name); } public boolean hasProperty(String name) { return containsKey(name); } public boolean isEmpty() { return overlay.isEmpty() && parent.isEmpty(); } public Set<String> keySet() { Set<String> names = new LinkedHashSet<String>(); for (TestProperty prop : values()) { names.add(prop.getName()); } return names; } public void moveProperty(String propertyName, int targetIndex) { if (overlay.containsKey(propertyName)) { overlay.moveProperty(propertyName, targetIndex); } else if (parent.containsKey(propertyName)) { parent.moveProperty(propertyName, targetIndex); } } public TestProperty put(String key, TestProperty value) { return overlay.put(key, value); } public void putAll(Map<? extends String, ? extends TestProperty> m) { overlay.putAll(m); } public TestProperty remove(Object key) { return overlay.remove(key); } public RestParamProperty removeProperty(String propertyName) { return overlay.containsKey(propertyName) ? overlay.removeProperty(propertyName) : parent.removeProperty(propertyName); } public boolean renameProperty(String name, String newName) { RestParamProperty restParamProperty = this.get(name); if (restParamProperty != null) { restParamProperty.setName(newName); this.put(newName, restParamProperty); this.remove(name); return true; } return overlay.renameProperty(name, newName); } public void resetValues() { overlay.resetValues(); } public void saveTo(Properties props) { for (TestProperty prop : values()) { props.setProperty(prop.getName(), prop.getValue() != null ? prop.getValue() : ""); } } public void setPropertiesLabel(String propertiesLabel) { overlay.setPropertiesLabel(propertiesLabel); } public void setPropertyValue(String name, String value) { overlay.setPropertyValue(name, value); } public int size() { return getPropertyCount(); } public Collection<TestProperty> values() { // List<TestProperty> values = new // ArrayList<TestProperty>(overlay.values()); List<TestProperty> values = new ArrayList<TestProperty>(); for (TestProperty prop : parent.values()) { if (overlay.hasProperty(prop.getName())) { values.add(overlay.getProperty(prop.getName())); } else { values.add(prop); } } for (TestProperty prop : overlay.values()) { if (!parent.hasProperty(prop.getName())) { values.add(prop); } } return values; } private void firePropertyAdded(String name) { TestPropertyListener[] listenersArray = listeners.toArray(new TestPropertyListener[listeners.size()]); for (TestPropertyListener listener : listenersArray) { listener.propertyAdded(name); } } private void firePropertyRemoved(String name) { TestPropertyListener[] listenersArray = listeners.toArray(new TestPropertyListener[listeners.size()]); for (TestPropertyListener listener : listenersArray) { listener.propertyRemoved(name); } } private void firePropertyMoved(String name, int oldIndex, int newIndex) { TestPropertyListener[] listenersArray = listeners.toArray(new TestPropertyListener[listeners.size()]); for (TestPropertyListener listener : listenersArray) { listener.propertyMoved(name, oldIndex, newIndex); } } private void firePropertyRenamed(String oldName, String newName) { TestPropertyListener[] listenersArray = listeners.toArray(new TestPropertyListener[listeners.size()]); for (TestPropertyListener listener : listenersArray) { listener.propertyRenamed(oldName, newName); } } private void firePropertyValueChanged(String name, String oldValue, String newValue) { TestPropertyListener[] listenersArray = listeners.toArray(new TestPropertyListener[listeners.size()]); for (TestPropertyListener listener : listenersArray) { listener.propertyValueChanged(name, oldValue, newValue); } } public void addTestPropertyListener(TestPropertyListener listener) { listeners.add(listener); } public void removeTestPropertyListener(TestPropertyListener listener) { listeners.remove(listener); } private class ParentListener implements TestPropertyListener { public void propertyAdded(String name) { if (!overlay.hasProperty(name)) { firePropertyAdded(name); } } public void propertyMoved(String name, int oldIndex, int newIndex) { } public void propertyRemoved(String name) { if (!overlay.hasProperty(name)) { firePropertyRemoved(name); } } public void propertyRenamed(String oldName, String newName) { if (overlay.hasProperty(oldName)) { if (!overlay.hasProperty(newName)) { firePropertyAdded(newName); } } else if (overlay.hasProperty(newName)) { firePropertyRemoved(oldName); } else { firePropertyRenamed(oldName, newName); } } public void propertyValueChanged(String name, String oldValue, String newValue) { if (!overlay.hasProperty(name)) { firePropertyValueChanged(name, oldValue, newValue); } } } private class OverlayListener implements TestPropertyListener { public void propertyAdded(String name) { if (parent.hasProperty(name)) { if (!parent.getPropertyValue(name).equals(overlay.getPropertyValue(name))) { firePropertyValueChanged(name, parent.getPropertyValue(name), overlay.getPropertyValue(name)); } } else { firePropertyAdded(name); } } public void propertyMoved(String name, int oldIndex, int newIndex) { if (parent.hasProperty(name)) { firePropertyValueChanged(name, null, parent.getPropertyValue(name)); } else { firePropertyMoved(name, oldIndex, newIndex); } } public void propertyRemoved(String name) { if (parent.hasProperty(name)) { firePropertyValueChanged(name, null, parent.getPropertyValue(name)); } else { firePropertyRemoved(name); } } public void propertyRenamed(String oldName, String newName) { if (!parent.hasProperty(oldName) && !parent.hasProperty(newName)) { firePropertyRenamed(oldName, newName); } else if (parent.hasProperty(oldName) && parent.hasProperty(newName)) { firePropertyValueChanged(oldName, overlay.getPropertyValue(newName), parent.getPropertyValue(oldName)); firePropertyValueChanged(newName, parent.getPropertyValue(newName), overlay.getPropertyValue(newName)); } else if (parent.hasProperty(oldName)) { firePropertyAdded(newName); } else { firePropertyRemoved(oldName); } } public void propertyValueChanged(String name, String oldValue, String newValue) { firePropertyValueChanged(name, oldValue, newValue); } } public List<TestProperty> getPropertyList() { return overlay.getPropertyList(); } }