/*
* 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.security.boundary;
import com.eviware.soapui.impl.wsdl.WsdlRequest;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestRequest;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestRequestStep;
import com.eviware.soapui.model.testsuite.TestStep;
import com.eviware.soapui.support.xml.XmlObjectTreeModel;
import com.eviware.soapui.support.xml.XmlObjectTreeModel.XmlTreeNode;
import com.eviware.soapui.support.xml.XmlUtils;
import org.apache.xmlbeans.XmlException;
import javax.swing.tree.TreePath;
import javax.wsdl.Definition;
import java.util.TreeMap;
public class SchemeTypeExtractor {
private WsdlRequest request;
private TreeMap<String, NodeInfo> nodes;
public SchemeTypeExtractor(WsdlTestRequest request) {
this.request = request;
}
public SchemeTypeExtractor(TestStep testStep) {
if (testStep instanceof WsdlTestRequestStep) {
request = ((WsdlTestRequestStep) testStep).getHttpRequest();
}
}
public String getTypeFor(String name) throws Exception {
NodeInfo node = nodes.get(name);
if (node == null) {
return null;
}
return node.getType();
}
public TreeMap<String, NodeInfo> getParams() {
return nodes;
}
public TreeMap<String, NodeInfo> extract() throws XmlException, Exception {
// XmlObjectTreeModel model = new XmlObjectTreeModel(
// request.getOperation().getInterface().getDefinitionContext()
// .getSchemaTypeSystem(), XmlObject.Factory.parse(
// request.getRequestContent() ) );
XmlObjectTreeModel model = new XmlObjectTreeModel(request.getOperation().getInterface().getDefinitionContext()
.getSchemaTypeSystem(), XmlUtils.createXmlObject(request.getRequestContent()));
nodes = getElements(model.getRootNode());
// these two lines used for testing
for (NodeInfo node : nodes.values()) {
printNode(node);
}
return nodes;
}
/*
* used for testing
*/
private void printNode(NodeInfo node) {
XmlTreeNode mynode = node.node;
System.out.println(mynode.getNodeName());
System.out.println(node.getType());
System.out.println(node.xpath);
}
public TreeMap<String, NodeInfo> getVariableSet() {
return nodes;
}
/**
* Recursive look for leafs which types are primitive type. Those elements
* actualy carry values.
*/
TreeMap<String, NodeInfo> getElements(XmlTreeNode rootXmlTreeNode) {
TreeMap<String, NodeInfo> result = new TreeMap<String, NodeInfo>();
for (int cnt = 0; cnt < rootXmlTreeNode.getChildCount(); cnt++) {
XmlTreeNode xmlTreeNodeChild = (XmlTreeNode) rootXmlTreeNode.getChild(cnt);
if (xmlTreeNodeChild.getChildCount() > 0) {
result.putAll(getElements(rootXmlTreeNode.getChild(cnt)));
} else {
if (xmlTreeNodeChild.getSchemaType() != null && xmlTreeNodeChild.getSchemaType().isPrimitiveType()) {
result.put(xmlTreeNodeChild.getDomNode().getLocalName(), new NodeInfo(rootXmlTreeNode.getChild(cnt)));
}
}
}
return result;
}
private String declareXPathNamespaces(Definition definition) {
StringBuilder result = new StringBuilder();
for (Object shortName : definition.getNamespaces().keySet()) {
result.append("declare namespace ").append(shortName.toString()).append("=\'")
.append(definition.getNamespaces().get(shortName).toString()).append("\';");
}
return result.toString();
}
public class NodeInfo {
private String name;
private String text;
private TreePath treePath;
private XmlTreeNode node;
private String xpath;
private String type;
private boolean selected = false;
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
public String getName() {
return name;
}
public String getText() {
return text;
}
public TreePath getTreePath() {
return treePath;
}
public String getXPath() {
return xpath;
}
public NodeInfo(String name, String text, TreePath treePath, XmlTreeNode node, String xpath) {
this.name = name;
this.text = text;
this.treePath = treePath;
this.node = node;
this.xpath = xpath;
}
public NodeInfo(XmlTreeNode child) {
this.name = child.getNodeName();
this.text = child.getNodeText();
this.treePath = child.getTreePath();
this.type = child.getSchemaType().toString();
this.node = child;
this.xpath = XmlUtils.createXPath(child.getDomNode(), true, false, false, null);
}
public String getType() {
return type;
}
public String getSimpleName() {
return node.getDomNode().getLocalName();
}
}
}