package org.wso2.carbon.rest.api.ui.util;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.util.AXIOMUtil;
import org.wso2.carbon.rest.api.stub.types.carbon.APIData;
import org.wso2.carbon.rest.api.stub.types.carbon.ResourceData;
import org.wso2.carbon.utils.xml.XMLPrettyPrinter;
import org.apache.synapse.rest.RESTConstants;
public class ApiEditorHelper {
private static String PROTOCOL_HTTP = "http";
private static String PROTOCOL_HTTPS = "https";
public static String parseStringToPrettyfiedString(String ugly){
ByteArrayInputStream byteArrayInputStream
= new ByteArrayInputStream(ugly.getBytes());
XMLPrettyPrinter printer = new XMLPrettyPrinter(byteArrayInputStream);
return printer.xmlFormat();
}
public static APIData convertStringToAPIData(String xml) throws XMLStreamException{
APIData apiData = new APIData();
OMElement apiOM = AXIOMUtil.stringToOM(xml);
OMAttribute name = apiOM.getAttribute(new QName("name"));
if(name != null){
apiData.setName(name.getAttributeValue());
}
OMAttribute context = apiOM.getAttribute(new QName("context"));
if(context != null){
apiData.setContext(context.getAttributeValue());
}
OMAttribute host = apiOM.getAttribute(new QName("hostname"));
if(host != null){
apiData.setHost(host.getAttributeValue());
}
OMAttribute port = apiOM.getAttribute(new QName("port"));
if(port != null){
apiData.setPort(Integer.parseInt(port.getAttributeValue()));
}
else{
apiData.setPort(-1);
}
Iterator childIterator = apiOM.getChildElements();
if(childIterator == null){
return apiData;
}
List<ResourceData> resources = new ArrayList<ResourceData>();
while(childIterator.hasNext()){
OMElement resourceOM = (OMElement)childIterator.next();
ResourceData resource = new ResourceData();
convertResource(resourceOM, resource);
resources.add(resource);
}
ResourceData[] resourceArray = new ResourceData[resources.size()];
apiData.setResources(resources.toArray(resourceArray));
return apiData;
}
public static ResourceData convertStringToResourceData(String xml) throws XMLStreamException {
ResourceData resourceData = new ResourceData();
OMElement resourceOM = AXIOMUtil.stringToOM(xml);
convertResource(resourceOM, resourceData);
return resourceData;
}
private static void convertResource(OMElement resourceOM, ResourceData resourceData)
throws XMLStreamException {
OMAttribute methods = resourceOM.getAttribute(new QName("methods"));
if (methods != null) {
resourceData.setMethods(methods.getAttributeValue().split(" "));
}
OMAttribute uriTemplate = resourceOM.getAttribute(new QName("uri-template"));
if (uriTemplate != null) {
resourceData.setUriTemplate(uriTemplate.getAttributeValue());
}
OMAttribute urlMapping = resourceOM.getAttribute(new QName("url-mapping"));
if (urlMapping != null) {
resourceData.setUrlMapping(urlMapping.getAttributeValue());
}
OMAttribute contentType = resourceOM.getAttribute(new QName("contentType"));
if (contentType != null) {
resourceData.setContentType(contentType.getAttributeValue());
}
OMAttribute protocol = resourceOM.getAttribute(new QName("protocol"));
if (protocol != null) {
if(protocol.getAttributeValue().equals(PROTOCOL_HTTP)) {
resourceData.setProtocol(RESTConstants.PROTOCOL_HTTP_ONLY);
} else if(protocol.getAttributeValue().equals(PROTOCOL_HTTPS)) {
resourceData.setProtocol(RESTConstants.PROTOCOL_HTTPS_ONLY);
} else {
resourceData.setProtocol(Integer.parseInt(protocol.getAttributeValue()));
}
}
OMAttribute userAgent = resourceOM.getAttribute(new QName("userAgent"));
if (userAgent != null) {
resourceData.setUserAgent(userAgent.getAttributeValue());
}
OMAttribute inSequence = resourceOM.getAttribute(new QName("inSequence"));
if (inSequence != null) {
resourceData.setInSequenceKey(inSequence.getAttributeValue());
}
OMAttribute outSequence = resourceOM.getAttribute(new QName("outSequence"));
if (outSequence != null) {
resourceData.setOutSequenceKey(outSequence.getAttributeValue());
}
OMAttribute faultSequence = resourceOM.getAttribute(new QName("faultSequence"));
if (faultSequence != null) {
resourceData.setFaultSequenceKey(faultSequence.getAttributeValue());
}
if (resourceOM.getChildElements() != null) {
Iterator<OMElement> iterator = resourceOM.getChildElements();
for (; iterator.hasNext(); ) {
OMElement elem = iterator.next();
if ("inSequence".equals(elem.getLocalName())
&& inSequence == null) {
resourceData.setInSeqXml(elem.toString());
} else if ("outSequence".equals(elem.getLocalName())
&& outSequence == null) {
resourceData.setOutSeqXml(elem.toString());
} else if ("faultSequence".equals(elem.getLocalName())
&& faultSequence == null) {
resourceData.setFaultSeqXml(elem.toString());
}
}
}
}
}