/* * 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.wsdl.teststeps; import com.eviware.soapui.config.TestStepConfig; import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase; import com.eviware.soapui.model.testsuite.TestProperty; import com.eviware.soapui.model.testsuite.TestPropertyListener; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * Base class for WSDL TestCase test steps. * * @author Ole.Matzura */ abstract public class WsdlTestStepWithProperties extends WsdlTestStep { public static String RESPONSE = "Response"; public static String RESPONSE_AS_XML = "ResponseAsXml"; public static String RAW_RESPONSE = "RawResponse"; private Map<String, TestProperty> properties; private List<TestProperty> propertyList = new ArrayList<TestProperty>(); private Map<String, Set<String>> normalizedPropertyNames = new HashMap<String, Set<String>>(); private Set<TestPropertyListener> listeners = new HashSet<TestPropertyListener>(); protected WsdlTestStepWithProperties(WsdlTestCase testCase, TestStepConfig config, boolean hasEditor, boolean forLoadTest) { super(testCase, config, hasEditor, forLoadTest); } @Override public String[] getPropertyNames() { if (properties == null) { return new String[0]; } String[] result = new String[properties.size()]; int ix = 0; for (TestProperty property : properties.values()) { result[ix++] = property.getName(); } return result; } @Override public TestProperty getProperty(String name) { return properties == null || name == null ? null : properties.get(getPropertyKeyName(name)); } @Override public String getPropertyValue(String name) { if (properties == null) { return null; } TestProperty testStepProperty = properties.get(getPropertyKeyName(name)); return testStepProperty == null ? null : testStepProperty.getValue(); } @Override public void setPropertyValue(String name, String value) { if (properties == null) { return; } TestProperty testStepProperty = properties.get(getPropertyKeyName(name)); if (testStepProperty != null) { testStepProperty.setValue(value); } } protected void addProperty(TestProperty property) { addProperty(property, false); } protected void addProperty(TestProperty property, boolean notify) { if (properties == null) { properties = new HashMap<String, TestProperty>(); } String name = property.getName(); String upper = name.toUpperCase(); if (!normalizedPropertyNames.containsKey(upper)) { normalizedPropertyNames.put(upper, new HashSet<String>()); } normalizedPropertyNames.get(upper).add(name); properties.put(name, property); propertyList.add(property); if (notify) { firePropertyAdded(name); } } private String getPropertyKeyName(String name) { if (properties.containsKey(name)) { return name; } Set<String> props = normalizedPropertyNames.get(name.toUpperCase()); if (props != null && !props.isEmpty()) { return props.iterator().next(); } return name; } protected TestProperty deleteProperty(String name, boolean notify) { if (properties != null) { name = getPropertyKeyName(name); TestProperty result = properties.remove(name); if (result != null) { normalizedPropertyNames.get(name.toUpperCase()).remove(name); propertyList.remove(result); if (notify) { firePropertyRemoved(name); } return result; } } return null; } public void propertyRenamed(String oldName) { if (properties == null) { return; } oldName = getPropertyKeyName(oldName); String upper = oldName.toUpperCase(); TestProperty testStepProperty = properties.get(oldName); if (testStepProperty == null) { return; } Set<String> props = normalizedPropertyNames.get(upper); properties.remove(oldName); props.remove(oldName); String newName = testStepProperty.getName(); properties.put(newName, testStepProperty); upper = newName.toUpperCase(); if (!normalizedPropertyNames.containsKey(upper)) { normalizedPropertyNames.put(upper, new HashSet<String>()); } normalizedPropertyNames.get(upper).add(newName); firePropertyRenamed(oldName, newName); } @Override public void addTestPropertyListener(TestPropertyListener listener) { listeners.add(listener); } @Override public void removeTestPropertyListener(TestPropertyListener listener) { listeners.remove(listener); } protected void firePropertyAdded(String name) { TestPropertyListener[] array = listeners.toArray(new TestPropertyListener[listeners.size()]); for (TestPropertyListener listener : array) { listener.propertyAdded(name); } } protected void firePropertyRemoved(String name) { TestPropertyListener[] array = listeners.toArray(new TestPropertyListener[listeners.size()]); for (TestPropertyListener listener : array) { listener.propertyRemoved(name); } } protected void firePropertyRenamed(String oldName, String newName) { TestPropertyListener[] array = listeners.toArray(new TestPropertyListener[listeners.size()]); for (TestPropertyListener listener : array) { listener.propertyRenamed(oldName, newName); } } public void firePropertyValueChanged(String name, String oldValue, String newValue) { if (oldValue == null && newValue == null) { return; } if (oldValue != null && oldValue.equals(newValue)) { return; } if (newValue != null && newValue.equals(oldValue)) { return; } TestPropertyListener[] array = listeners.toArray(new TestPropertyListener[listeners.size()]); for (TestPropertyListener listener : array) { listener.propertyValueChanged(name, oldValue, newValue); } } @Override public Map<String, TestProperty> getProperties() { Map<String, TestProperty> result = new HashMap<String, TestProperty>(); if (properties != null) { for (String name : properties.keySet()) { result.put(properties.get(name).getName(), properties.get(name)); } } return result; } @Override public boolean hasProperty(String name) { return properties != null && properties.containsKey(getPropertyKeyName(name)); } public boolean hasProperties() { return true; } @Override public TestProperty getPropertyAt(int index) { return propertyList.get(index); } @Override public int getPropertyCount() { return propertyList.size(); } @Override public List<TestProperty> getPropertyList() { return Collections.unmodifiableList(propertyList); } protected 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); } } public void moveProperty(String propertyName, int targetIndex) { TestProperty property = getProperty(propertyName); int ix = propertyList.indexOf(property); if (ix == targetIndex) { return; } if (targetIndex < 0) { targetIndex = 0; } if (targetIndex < properties.size()) { propertyList.add(targetIndex, propertyList.remove(ix)); } else { propertyList.add(propertyList.remove(ix)); } if (targetIndex > properties.size()) { targetIndex = properties.size(); } firePropertyMoved(propertyName, ix, targetIndex); } }