/**
*
* Copyright 2005 Protique Ltd
*
* 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 org.servicemix.components.http;
import javax.jbi.JBIException;
import javax.jbi.messaging.InOnly;
import javax.jbi.messaging.InOut;
import javax.jbi.messaging.MessageExchangeFactory;
import javax.jbi.messaging.NormalizedMessage;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.TransformerException;
import java.io.IOException;
/**
* A HTTP Binding Component which performs an {@link InOut} exchange with JBI and returns the response
* by default but is configurable to be an {@link InOnly} exchange.
*
* @version $Revision: 786 $
*/
public class HttpInOutBinding extends HttpBindingSupport {
private boolean defaultInOut = true;
public void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException,
JBIException {
//response.setContentType("application/soap+xml");
if (isInOutRequest(request, response)) {
processInOut(request, response);
}
else {
processInOnly(request, response);
}
}
public void processInOut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException,
JBIException {
MessageExchangeFactory factory = getExchangeFactory();
InOut exchange = factory.createInOutExchange();
NormalizedMessage inMessage = exchange.createMessage();
try {
getMarshaler().toNMS(exchange, inMessage, request);
exchange.setInMessage(inMessage);
boolean result = getDeliveryChannel().sendSync(exchange);
if (result) {
getMarshaler().toResponse(exchange, exchange.getOutMessage(), response);
}
done(exchange);
response.setStatus(HttpServletResponse.SC_OK);
}
catch (IOException e) {
fail(exchange, e);
outputException(response, e);
}
catch (TransformerException e) {
fail(exchange, e);
outputException(response, e);
}
}
public void processInOnly(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException,
JBIException {
MessageExchangeFactory factory = getExchangeFactory();
InOnly exchange = factory.createInOnlyExchange();
NormalizedMessage inMessage = exchange.createMessage();
try {
HttpMarshaler marshaler = getMarshaler();
marshaler.toNMS(exchange, inMessage, request);
exchange.setInMessage(inMessage);
getDeliveryChannel().send(exchange);
response.setStatus(HttpServletResponse.SC_OK);
}
catch (IOException e) {
fail(exchange, e);
outputException(response, e);
}
}
// Properties
//-------------------------------------------------------------------------
public boolean isDefaultInOut() {
return defaultInOut;
}
/**
* Sets whether an InOut (the default) or an InOnly message exchange will be used by default.
*/
public void setDefaultInOut(boolean defaultInOut) {
this.defaultInOut = defaultInOut;
}
// Implementation methods
//-------------------------------------------------------------------------
/**
* Return true if this request is an {@link InOut} request otherwise it will be assumed to be an {@link InOnly}
*/
protected boolean isInOutRequest(HttpServletRequest request, HttpServletResponse response) {
return isDefaultInOut();
}
}