/*
* Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.synapse.config.xml.rest;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.Constants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.SequenceType;
import org.apache.synapse.SynapseException;
import org.apache.synapse.config.xml.SequenceMediatorFactory;
import org.apache.synapse.config.xml.XMLConfigConstants;
import org.apache.synapse.mediators.base.SequenceMediator;
import org.apache.synapse.rest.RESTConstants;
import org.apache.synapse.rest.Resource;
import org.apache.synapse.rest.dispatch.URITemplateHelper;
import org.apache.synapse.rest.dispatch.URLMappingHelper;
import javax.xml.namespace.QName;
import java.util.Properties;
public class ResourceFactory {
private static final Log log = LogFactory.getLog(ResourceFactory.class);
public static Resource createResource(OMElement resourceElt) {
return createResource(resourceElt, new Properties());
}
public static Resource createResource(OMElement resourceElt, Properties properties) {
Resource resource = new Resource();
configureURLMappings(resource, resourceElt);
configureSequences(resource, resourceElt, properties);
configureFilters(resource, resourceElt);
return resource;
}
private static void configureFilters(Resource resource, OMElement resourceElt) {
OMAttribute protocolAtt = resourceElt.getAttribute(new QName("protocol"));
if (protocolAtt != null && !"".equals(protocolAtt.getAttributeValue())) {
if (Constants.TRANSPORT_HTTP.equals(protocolAtt.getAttributeValue())) {
resource.setProtocol(RESTConstants.PROTOCOL_HTTP_ONLY);
} else if (Constants.TRANSPORT_HTTPS.equals(protocolAtt.getAttributeValue())) {
resource.setProtocol(RESTConstants.PROTOCOL_HTTPS_ONLY);
} else {
handleException("Invalid protocol name: " + protocolAtt.getAttributeValue());
}
}
OMAttribute contentTypeAtt = resourceElt.getAttribute(new QName("content-type"));
if (contentTypeAtt != null && !"".equals(contentTypeAtt.getAttributeValue())) {
resource.setContentType(contentTypeAtt.getAttributeValue());
}
OMAttribute userAgentAtt = resourceElt.getAttribute(new QName("user-agent"));
if (userAgentAtt != null && !"".equals(userAgentAtt.getAttributeValue())) {
resource.setUserAgent(userAgentAtt.getAttributeValue());
}
OMAttribute methodsAtt = resourceElt.getAttribute(new QName("methods"));
if (methodsAtt != null && !"".equals(methodsAtt.getAttributeValue())) {
String[] methods = methodsAtt.getAttributeValue().trim().split(" ");
for (String method : methods) {
boolean added = resource.addMethod(method);
if (!added) {
handleException("Invalid or duplicate method definition for resource");
}
}
}
}
private static void configureURLMappings(Resource resource, OMElement resourceElt) {
OMAttribute urlMappingAtt = resourceElt.getAttribute(new QName("url-mapping"));
OMAttribute uriTemplateAtt = resourceElt.getAttribute(new QName("uri-template"));
if (urlMappingAtt != null && !"".equals(urlMappingAtt.getAttributeValue())) {
resource.setDispatcherHelper(new URLMappingHelper(urlMappingAtt.getAttributeValue()));
} else if (uriTemplateAtt != null && !"".equals(uriTemplateAtt.getAttributeValue())) {
resource.setDispatcherHelper(new URITemplateHelper(uriTemplateAtt.getAttributeValue()));
}
}
private static void configureSequences(Resource resource, OMElement resourceElt, Properties properties) {
OMAttribute inSequenceKeyAtt = resourceElt.getAttribute(new QName("inSequence"));
OMElement inSequenceElt = resourceElt.getFirstChildWithName(new QName(
XMLConfigConstants.SYNAPSE_NAMESPACE, "inSequence"));
if (inSequenceKeyAtt != null && !"".equals(inSequenceKeyAtt.getAttributeValue())) {
resource.setInSequenceKey(inSequenceKeyAtt.getAttributeValue());
} else if (inSequenceElt != null) {
SequenceMediatorFactory fac = new SequenceMediatorFactory();
SequenceMediator sequence = fac.createAnonymousSequence(inSequenceElt, properties);
sequence.setSequenceType(SequenceType.API_INSEQ);
resource.setInSequence(sequence);
}
OMAttribute outSequenceKeyAtt = resourceElt.getAttribute(new QName("outSequence"));
OMElement outSequenceElt = resourceElt.getFirstChildWithName(new QName(
XMLConfigConstants.SYNAPSE_NAMESPACE, "outSequence"));
if (outSequenceKeyAtt != null && !"".equals(outSequenceKeyAtt.getAttributeValue())) {
resource.setOutSequenceKey(outSequenceKeyAtt.getAttributeValue());
} else if (outSequenceElt != null) {
SequenceMediatorFactory fac = new SequenceMediatorFactory();
SequenceMediator sequence = fac.createAnonymousSequence(outSequenceElt, properties);
sequence.setSequenceType(SequenceType.API_OUTSEQ);
resource.setOutSequence(sequence);
}
OMAttribute faultSequenceKeyAtt = resourceElt.getAttribute(new QName("faultSequence"));
OMElement faultSequenceElt = resourceElt.getFirstChildWithName(new QName(
XMLConfigConstants.SYNAPSE_NAMESPACE, "faultSequence"));
if (faultSequenceKeyAtt != null && !"".equals(faultSequenceKeyAtt.getAttributeValue())) {
resource.setFaultSequenceKey(faultSequenceKeyAtt.getAttributeValue());
} else if (faultSequenceElt != null) {
SequenceMediatorFactory fac = new SequenceMediatorFactory();
SequenceMediator sequence = fac.createAnonymousSequence(faultSequenceElt, properties);
sequence.setSequenceType(SequenceType.API_FAULTSEQ);
resource.setFaultSequence(sequence);
}
}
private static void handleException(String msg) {
log.error(msg);
throw new SynapseException(msg);
}
}