/*
* 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.support.assertions;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.config.TestAssertionConfig;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlMessageAssertion;
import com.eviware.soapui.impl.wsdl.teststeps.assertions.TestAssertionRegistry;
import com.eviware.soapui.model.testsuite.Assertable;
import com.eviware.soapui.model.testsuite.AssertionsListener;
import com.eviware.soapui.model.testsuite.TestAssertion;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.resolver.ResolveContext;
import org.apache.xmlbeans.XmlObject;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* Utility for implementing the Assertable interface
*
* @author ole.matzura
*/
public class AssertionsSupport implements PropertyChangeListener {
private List<AssertionsListener> assertionsListeners = new ArrayList<AssertionsListener>();
private List<WsdlMessageAssertion> assertions = new ArrayList<WsdlMessageAssertion>();
private final Assertable assertable;
private AssertableConfig assertableConfig;
public AssertionsSupport(Assertable assertable, AssertableConfig assertableConfig) {
this.assertable = assertable;
this.assertableConfig = assertableConfig;
for (TestAssertionConfig rac : assertableConfig.getAssertionList()) {
addWsdlAssertion(rac);
}
}
public WsdlMessageAssertion addWsdlAssertion(TestAssertionConfig config) {
try {
WsdlMessageAssertion assertion = TestAssertionRegistry.getInstance().buildAssertion(config, assertable);
if (assertion == null) {
return null;
} else {
assertions.add(assertion);
assertion.addPropertyChangeListener(this);
return assertion;
}
} catch (Exception e) {
SoapUI.logError(e);
return null;
}
}
public void propertyChange(PropertyChangeEvent arg0) {
if (assertable instanceof PropertyChangeListener) {
((PropertyChangeListener) assertable).propertyChange(arg0);
}
}
public int getAssertionCount() {
return assertions.size();
}
public WsdlMessageAssertion getAssertionAt(int c) {
return assertions.get(c);
}
public void addAssertionsListener(AssertionsListener listener) {
assertionsListeners.add(listener);
}
public void removeAssertionsListener(AssertionsListener listener) {
assertionsListeners.remove(listener);
}
public void removeAssertion(WsdlMessageAssertion assertion) {
int ix = assertions.indexOf(assertion);
if (ix == -1) {
throw new RuntimeException("assertion [" + assertion.getName() + "] not available ");
}
assertion.removePropertyChangeListener(this);
assertions.remove(ix);
fireAssertionRemoved(assertion);
assertion.release();
assertableConfig.removeAssertion(ix);
}
public WsdlMessageAssertion moveAssertion(int ix, int offset) {
// int ix = assertions.indexOf( assertion );
WsdlMessageAssertion assertion = getAssertionAt(ix);
if (ix == -1) {
throw new RuntimeException("assertion [" + assertion.getName() + "] not available ");
}
// if first selected can't move up and if last selected can't move down
if ((ix == 0 && offset == -1) || (ix == assertions.size() - 1 && offset == 1)) {
return assertion;
}
TestAssertionConfig conf = assertion.getConfig();
XmlObject newXmlObject = conf.copy();
TestAssertionConfig newConf = TestAssertionConfig.Factory.newInstance();
newConf.set(newXmlObject);
WsdlMessageAssertion newAssertion = TestAssertionRegistry.getInstance().buildAssertion(newConf, assertable);
assertion.removePropertyChangeListener(this);
assertions.remove(ix);
assertion.release();
assertableConfig.removeAssertion(ix);
newAssertion.addPropertyChangeListener(this);
assertions.add(ix + offset, newAssertion);
assertableConfig.insertAssertion(newConf, ix + offset);
fireAssertionMoved(newAssertion, ix, offset);
return newAssertion;
}
public void release() {
for (WsdlMessageAssertion assertion : assertions) {
assertion.release();
}
assertionsListeners.clear();
}
public Iterator<WsdlMessageAssertion> iterator() {
return assertions.iterator();
}
public void fireAssertionAdded(WsdlMessageAssertion assertion) {
AssertionsListener[] listeners = assertionsListeners.toArray(new AssertionsListener[assertionsListeners.size()]);
for (int c = 0; c < listeners.length; c++) {
listeners[c].assertionAdded(assertion);
}
}
public void fireAssertionRemoved(WsdlMessageAssertion assertion) {
AssertionsListener[] listeners = assertionsListeners.toArray(new AssertionsListener[assertionsListeners.size()]);
for (int c = 0; c < listeners.length; c++) {
listeners[c].assertionRemoved(assertion);
}
}
public void fireAssertionMoved(WsdlMessageAssertion assertion, int ix, int offset) {
AssertionsListener[] listeners = assertionsListeners.toArray(new AssertionsListener[assertionsListeners.size()]);
for (int c = 0; c < listeners.length; c++) {
listeners[c].assertionMoved(assertion, ix, offset);
}
}
public void refresh() {
int mod = 0;
List<TestAssertionConfig> assertionList = assertableConfig.getAssertionList();
for (int i = 0; i < assertionList.size(); i++) {
TestAssertionConfig config = assertionList.get(i);
if (TestAssertionRegistry.getInstance().canBuildAssertion(config)) {
assertions.get(i - mod).updateConfig(config);
} else {
mod++;
}
}
}
public List<WsdlMessageAssertion> getAssertionList() {
return assertions;
}
public List<WsdlMessageAssertion> getAssertionsOfType(Class<? extends WsdlMessageAssertion> class1) {
List<WsdlMessageAssertion> result = new ArrayList<WsdlMessageAssertion>();
for (WsdlMessageAssertion assertion : assertions) {
if (assertion.getClass().equals(class1)) {
result.add(assertion);
}
}
return result;
}
public WsdlMessageAssertion getAssertionByName(String name) {
for (WsdlMessageAssertion assertion : assertions) {
if (assertion.getName().equals(name)) {
return assertion;
}
}
return null;
}
public Map<String, TestAssertion> getAssertions() {
Map<String, TestAssertion> result = new HashMap<String, TestAssertion>();
for (TestAssertion assertion : assertions) {
result.put(assertion.getName(), assertion);
}
return result;
}
public WsdlMessageAssertion importAssertion(WsdlMessageAssertion source, boolean overwrite, boolean createCopy,
String newName) {
TestAssertionConfig conf = assertableConfig.addNewAssertion();
conf.set(source.getConfig());
conf.setName(newName);
if (createCopy && conf.isSetId()) {
conf.unsetId();
}
if (!source.isAllowMultiple()) {
List<WsdlMessageAssertion> existing = getAssertionsOfType(source.getClass());
if (!existing.isEmpty() && !overwrite) {
return null;
}
while (!existing.isEmpty()) {
removeAssertion(existing.remove(0));
}
}
WsdlMessageAssertion result = addWsdlAssertion(conf);
fireAssertionAdded(result);
return result;
}
public TestAssertion cloneAssertion(TestAssertion source, String name) {
TestAssertionConfig conf = assertableConfig.addNewAssertion();
conf.set(((WsdlMessageAssertion) source).getConfig());
conf.setName(name);
WsdlMessageAssertion result = addWsdlAssertion(conf);
fireAssertionAdded(result);
return result;
}
public WsdlMessageAssertion addWsdlAssertion(String assertionLabel) {
try {
TestAssertionConfig assertionConfig = assertableConfig.addNewAssertion();
assertionConfig.setType(TestAssertionRegistry.getInstance().getAssertionTypeForName(assertionLabel));
String name = assertionLabel;
while (getAssertionByName(name.trim()) != null) {
name = UISupport.prompt(
"Specify unique name of Assertion",
"Rename Assertion",
assertionLabel
+ " "
+ (getAssertionsOfType(TestAssertionRegistry.getInstance().getAssertionClassType(
assertionConfig)).size()));
if (name == null) {
return null;
}
}
WsdlMessageAssertion assertion = addWsdlAssertion(assertionConfig);
if (assertion == null) {
return null;
}
assertionConfig.setName(name);
assertion.updateConfig(assertionConfig);
if (assertion != null) {
fireAssertionAdded(assertion);
}
return assertion;
} catch (Exception e) {
SoapUI.logError(e);
return null;
}
}
public void resolve(ResolveContext<?> context) {
for (WsdlMessageAssertion assertion : assertions) {
assertion.resolve(context);
}
}
}