/*
* 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.wadl.support;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.impl.rest.RestRepresentation;
import com.eviware.soapui.impl.rest.RestRequestInterface;
import com.eviware.soapui.impl.wadl.WadlDefinitionContext;
import com.eviware.soapui.impl.wsdl.submit.RestMessageExchange;
import com.eviware.soapui.model.testsuite.AssertionError;
import com.eviware.soapui.support.xml.XmlUtils;
import org.apache.xmlbeans.SchemaType;
import org.apache.xmlbeans.XmlError;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.List;
public class WadlValidator {
public WadlValidator(WadlDefinitionContext context) {
}
public AssertionError[] assertResponse(RestMessageExchange messageExchange) {
RestRequestInterface restRequest = messageExchange.getRestRequest();
if (restRequest != null) {
if (messageExchange.getResponseStatusCode() >= 400) {
return assertResponse(messageExchange, RestRepresentation.Type.FAULT);
} else {
return assertResponse(messageExchange, RestRepresentation.Type.RESPONSE);
}
}
return new AssertionError[0];
}
private AssertionError[] assertResponse(RestMessageExchange messageExchange, RestRepresentation.Type type) {
List<AssertionError> result = new ArrayList<AssertionError>();
QName responseBodyElementName = getResponseBodyElementName(messageExchange);
RestRequestInterface restRequest = messageExchange.getRestRequest();
boolean asserted = false;
for (RestRepresentation representation : restRequest.getRepresentations(type,
messageExchange.getResponseContentType())) {
if (representation.getStatus().isEmpty()
|| representation.getStatus().contains(messageExchange.getResponseStatusCode())) {
SchemaType schemaType = representation.getSchemaType();
if (schemaType != null && representation.getElement().equals(responseBodyElementName)) {
try {
XmlObject xmlObject = schemaType.getTypeSystem().parse(messageExchange.getResponseContentAsXml(),
schemaType, new XmlOptions());
// create internal error list
List<?> list = new ArrayList<Object>();
XmlOptions xmlOptions = new XmlOptions();
xmlOptions.setErrorListener(list);
xmlOptions.setValidateTreatLaxAsSkip();
xmlObject.validate(xmlOptions);
for (Object o : list) {
if (o instanceof XmlError) {
result.add(new AssertionError((XmlError) o));
} else {
result.add(new AssertionError(o.toString()));
}
}
asserted = true;
} catch (XmlException e) {
SoapUI.logError(e);
}
} else {
asserted = true;
}
}
}
if (!asserted && result.isEmpty()) {
result.add(new AssertionError("Missing matching representation for request with contentType ["
+ messageExchange.getResponseContentType() + "]"));
}
return result.toArray(new AssertionError[result.size()]);
}
private QName getResponseBodyElementName(RestMessageExchange messageExchange) {
try {
// XmlObject xmlObject = XmlObject.Factory.parse(
// messageExchange.getResponseContentAsXml() );
XmlObject xmlObject = XmlUtils.createXmlObject(messageExchange.getResponseContentAsXml());
Element docElement = ((Document) xmlObject.getDomNode()).getDocumentElement();
return new QName(docElement.getNamespaceURI(), docElement.getLocalName());
} catch (XmlException e) {
SoapUI.logError(e);
}
return null;
}
}