/* Copyright 2013 predic8 GmbH, www.predic8.com Licensed 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 com.predic8.membrane.core.interceptor.rest; import javax.xml.transform.stream.StreamSource; import com.predic8.membrane.annot.MCAttribute; import com.predic8.membrane.annot.MCElement; import com.predic8.membrane.core.exchange.Exchange; import com.predic8.membrane.core.http.Header; import com.predic8.membrane.core.http.MimeType; import com.predic8.membrane.core.interceptor.DispatchingInterceptor; import com.predic8.membrane.core.interceptor.Outcome; import com.predic8.membrane.core.interceptor.soap.SoapOperationExtractor; /** * @description Converts SOAP messages into REST requests. * @topic 8. SOAP based Web Services */ @MCElement(name="soap2Rest") public class SOAP2RESTInterceptor extends SOAPRESTHelper { private String requestXSLT; private String responseXSLT; private SoapOperationExtractor soe = new SoapOperationExtractor(); private DispatchingInterceptor di = new DispatchingInterceptor(); public SOAP2RESTInterceptor() { name = "SOAP 2 REST Gateway"; } @Override public Outcome handleRequest(Exchange exc) throws Exception { // save SOAP operationName and namespace in exchange properties to generically construct response name soe.handleRequest(exc); // apply request XSLT transformAndReplaceBody(exc.getRequest(), requestXSLT, new StreamSource(exc.getRequest().getBodyAsStreamDecoded()), exc.getStringProperties()); // fill Request object from HTTP-XML Header header = exc.getRequest().getHeader(); header.removeFields(Header.CONTENT_TYPE); header.setContentType(MimeType.TEXT_XML_UTF8); XML2HTTP.unwrapMessageIfNecessary(exc.getRequest()); // reset exchange destination to new request URI exc.getDestinations().clear(); di.handleRequest(exc); return Outcome.CONTINUE; } @Override public Outcome handleResponse(Exchange exc) throws Exception { transformAndReplaceBody(exc.getResponse(), responseXSLT, getExchangeXMLSource(exc), exc.getStringProperties()); return Outcome.CONTINUE; } @Override public String getShortDescription() { return "Transforms SOAP messages into REST requests and vice versa."; } public String getRequestXSLT() { return requestXSLT; } @MCAttribute public void setRequestXSLT(String requestXSLT) { this.requestXSLT = requestXSLT; } public String getResponseXSLT() { return responseXSLT; } @MCAttribute public void setResponseXSLT(String responseXSLT) { this.responseXSLT = responseXSLT; } }