package org.wso2.carbon.rest.api;
import org.apache.axiom.om.*;
import org.apache.axiom.om.util.AXIOMUtil;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.synapse.SynapseConstants;
import org.apache.synapse.config.SynapseConfiguration;
import org.apache.synapse.config.xml.SequenceMediatorSerializer;
import org.apache.synapse.core.SynapseEnvironment;
import org.apache.synapse.mediators.base.SequenceMediator;
import org.apache.synapse.rest.API;
import org.apache.synapse.rest.RESTConstants;
import org.apache.synapse.rest.Resource;
import org.apache.synapse.rest.dispatch.DispatcherHelper;
import org.apache.synapse.rest.dispatch.URITemplateHelper;
import org.apache.synapse.rest.dispatch.URLMappingHelper;
import org.wso2.carbon.mediation.initializer.ServiceBusConstants;
import org.wso2.carbon.mediation.initializer.ServiceBusUtils;
import org.wso2.carbon.mediation.initializer.persistence.MediationPersistenceManager;
import javax.xml.stream.XMLStreamException;
import java.util.Iterator;
public class RestApiAdminUtils {
private static String PROTOCOL_HTTP = "http";
private static String PROTOCOL_HTTPS = "https";
public static OMElement retrieveAPIOMElement(APIData apiData) {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace syn = SynapseConstants.SYNAPSE_OMNAMESPACE;
OMNamespace nullNS = fac.createOMNamespace("","");
OMElement api = fac.createOMElement("api", syn);
api.addAttribute("name", apiData.getName(), nullNS);
if(apiData.getContext() != null){
api.addAttribute("context", apiData.getContext(), nullNS);
}
if(apiData.getHost() != null){
api.addAttribute("hostname", apiData.getHost(), nullNS);
}
if(apiData.getPort() != -1){
api.addAttribute("port", String.valueOf(apiData.getPort()), nullNS);
}
if(apiData.getResources() != null && apiData.getResources().length != 0){
for(ResourceData resourceData : apiData.getResources()){
api.addChild(retrieveResourceOMElement(resourceData));
}
}
return api;
}
public static OMElement retrieveResourceOMElement(ResourceData resourceData) {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace syn = SynapseConstants.SYNAPSE_OMNAMESPACE;
OMNamespace nullNS = fac.createOMNamespace("","");
OMElement resource = fac.createOMElement("resource", syn);
if(resourceData.getMethods() != null && resourceData.getMethods().length != 0){
String methodsString = createSSString(resourceData.getMethods());
resource.addAttribute("methods", methodsString, nullNS);
}
if(resourceData.getUriTemplate() != null){
resource.addAttribute("uri-template", resourceData.getUriTemplate(), nullNS);
}
else if(resourceData.getUrlMapping() != null){
resource.addAttribute("url-mapping", resourceData.getUrlMapping(), nullNS);
}
if(resourceData.getContentType() != null){
resource.addAttribute("contentType", resourceData.getContentType(), nullNS);
}
if(resourceData.getUserAgent() != null){
resource.addAttribute("userAgent", resourceData.getUserAgent(), nullNS);
}
if(resourceData.getProtocol() != RESTConstants.PROTOCOL_HTTP_AND_HTTPS){
if (resourceData.getProtocol() == RESTConstants.PROTOCOL_HTTP_ONLY) {
resource.addAttribute("protocol", PROTOCOL_HTTP, nullNS);
} else if (resourceData.getProtocol() == RESTConstants.PROTOCOL_HTTPS_ONLY) {
resource.addAttribute("protocol", PROTOCOL_HTTPS, nullNS);
} else {
resource.addAttribute("protocol", String.valueOf(resourceData.getProtocol()), nullNS);
}
}
try {
if(resourceData.getInSequenceKey() != null){
resource.addAttribute("inSequence", resourceData.getInSequenceKey(), nullNS);
} else if (resourceData.getInSeqXml() != null && !"".equals(resourceData.getInSeqXml())) {
resource.addChild(AXIOMUtil.stringToOM(resourceData.getInSeqXml()));
}
if(resourceData.getOutSequenceKey() != null){
resource.addAttribute("outSequence", resourceData.getOutSequenceKey(), nullNS);
} else if (resourceData.getOutSeqXml() != null && !"".equals(resourceData.getOutSeqXml())) {
resource.addChild(AXIOMUtil.stringToOM(resourceData.getOutSeqXml()));
}
if(resourceData.getFaultSequenceKey() != null){
resource.addAttribute("faultSequence", resourceData.getFaultSequenceKey(), nullNS);
} else if (resourceData.getFaultSeqXml() != null && !"".equals(resourceData.getFaultSeqXml())) {
resource.addChild(AXIOMUtil.stringToOM(resourceData.getFaultSeqXml()));
}
} catch (XMLStreamException e) {
e.printStackTrace();
return null;
}
return resource;
}
/**
* Creates a space separated string from the given list
* @param lst the array of strings
* @return a space separated string
*/
private static String createSSString (String [] lst) {
String str = "";
for (Object item : lst) {
str += item + " ";
}
return str.substring(0, str.length() - 1);
}
public static OMElement createAnonymousSequenceElement(SequenceMediator sequenceMediator, String seqElemName) {
SequenceMediatorSerializer serializer = new SequenceMediatorSerializer();
OMElement sequenceElem = serializer.serializeAnonymousSequence(null, sequenceMediator);
if (!"inSequence".equals(seqElemName)
&& !"outSequence".equals(seqElemName)
&& !"faultSequence".equals(seqElemName)) {
return null;
}
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace syn = SynapseConstants.SYNAPSE_OMNAMESPACE;
OMNamespace nullNS = fac.createOMNamespace("","");
OMElement seq = fac.createOMElement(seqElemName, syn);
Iterator<OMAttribute> attributes = sequenceElem.getAllAttributes();
for (; attributes.hasNext(); ) {
OMAttribute attrb = attributes.next();
seq.addAttribute(attrb.getLocalName(), attrb.getAttributeValue(), nullNS);
}
Iterator<OMElement> children = sequenceElem.getChildElements();
for (; children.hasNext(); ) {
OMElement child = children.next();
seq.addChild(child);
}
return seq;
}
/**
* Override the parent's getSynapseconfig() method to retrieve the Synapse
* configuration from the relevant axis configuration
*
* @return extracted SynapseConfiguration from the relevant
* AxisConfiguration
*/
public static SynapseConfiguration getSynapseConfiguration() throws APIException {
return (SynapseConfiguration) ConfigHolder.getInstance().getAxisConfiguration().getParameter(
SynapseConstants.SYNAPSE_CONFIG).getValue() ;
}
/**
* Helper method to get the persistence manger
* @return persistence manager for this configuration context
*/
public static MediationPersistenceManager getMediationPersistenceManager() throws APIException {
return ServiceBusUtils.getMediationPersistenceManager(ConfigHolder.getInstance().getAxisConfiguration());
}
/**
* Helper method to retrieve the Synapse environment from the relevant axis configuration
*
* @return extracted SynapseEnvironment from the relevant AxisConfiguration
*/
public static SynapseEnvironment getSynapseEnvironment() throws APIException {
return getSynapseEnvironment(ConfigHolder.getInstance().getAxisConfiguration());
}
public static SynapseEnvironment getSynapseEnvironment(AxisConfiguration axisCfg) {
return (SynapseEnvironment) axisCfg.getParameter(
SynapseConstants.SYNAPSE_ENV).getValue();
}
public static APIData convertApiToAPIData(API api){
if(api == null){
return null;
}
APIData apiData = new APIData();
apiData.setName(api.getName());
apiData.setContext(api.getContext());
apiData.setHost(api.getHost());
apiData.setPort(api.getPort());
apiData.setFileName(api.getFileName());
Resource[] resources = api.getResources();
ResourceData[] resourceDatas = new ResourceData[resources.length];
for(int i=0; i<resources.length; i++){
Resource resource = resources[i];
ResourceData data = new ResourceData();
String[] methods = resource.getMethods();
data.setMethods(methods);
data.setContentType(resource.getContentType());
data.setProtocol(resource.getProtocol());
DispatcherHelper dispatcherHelper = resource.getDispatcherHelper();
if(dispatcherHelper instanceof URITemplateHelper){
data.setUriTemplate(dispatcherHelper.getString());
}
else if(dispatcherHelper instanceof URLMappingHelper){
data.setUrlMapping(dispatcherHelper.getString());
}
if (resource.getInSequenceKey() != null) {
data.setInSequenceKey(resource.getInSequenceKey());
} else if (resource.getInSequence() != null) {
data.setInSeqXml(RestApiAdminUtils.createAnonymousSequenceElement(
resource.getInSequence(),
"inSequence"
).toString());
}
if (resource.getOutSequenceKey() != null) {
data.setOutSequenceKey(resource.getOutSequenceKey());
} else if (resource.getOutSequence() != null) {
data.setOutSeqXml(RestApiAdminUtils.createAnonymousSequenceElement(
resource.getOutSequence(),
"outSequence"
).toString());
}
if (resource.getFaultSequenceKey() != null) {
data.setFaultSequenceKey(resource.getFaultSequenceKey());
} else if (resource.getFaultSequence() != null) {
data.setFaultSeqXml(RestApiAdminUtils.createAnonymousSequenceElement(
resource.getFaultSequence(),
"faultSequence"
).toString());
}
data.setUserAgent(resource.getUserAgent());
resourceDatas[i] = data;
}
apiData.setResources(resourceDatas);
return apiData;
}
public static void persistApi(API api) throws APIException {
MediationPersistenceManager pm = RestApiAdminUtils.getMediationPersistenceManager();
if (pm != null) {
pm.saveItem(api.getName(), ServiceBusConstants.ITEM_TYPE_REST_API);
}
}
}