package org.jentrata.ebms.as4.internal.routes;
import org.apache.camel.Exchange;
import org.apache.camel.LoggingLevel;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.jentrata.ebms.EbmsConstants;
import org.jentrata.ebms.EbmsError;
import org.jentrata.ebms.MessageStatusType;
import org.jentrata.ebms.MessageType;
import org.jentrata.ebms.cpa.pmode.Security;
import org.jentrata.ebms.messaging.MessageStore;
/**
* Generates error message in accordance with the ebMS 3.0 Core Spec
*
* @author aaronwalker
*/
public class EbmsErrorHandlerRouteBuilder extends RouteBuilder {
private String errorQueue = "activemq:queue:jentrata_internal_ebms_error";
private String outboundEbmsQueue = "activemq:queue:jentrata_internal_ebms_outbound";
private String messgeStoreEndpoint = MessageStore.DEFAULT_MESSAGE_STORE_ENDPOINT;
private String messageInsertEndpoint = MessageStore.DEFAULT_MESSAGE_INSERT_ENDPOINT;
@Override
public void configure() throws Exception {
from(errorQueue)
.setHeader("JentrataRefToMessageInError",header(EbmsConstants.MESSAGE_ID))
.setHeader(EbmsConstants.REF_TO_MESSAGE_ID,header(EbmsConstants.MESSAGE_ID))
.setHeader(EbmsConstants.MESSAGE_ID, simple("${bean:uuidGenerator.generateId}"))
.setHeader(EbmsConstants.MESSAGE_DIRECTION,constant(EbmsConstants.MESSAGE_DIRECTION_OUTBOUND))
.setHeader(EbmsConstants.MESSAGE_TYPE,constant(MessageType.SIGNAL_MESSAGE_ERROR.name()))
.setHeader(EbmsConstants.CONTENT_TYPE,constant(EbmsConstants.SOAP_XML_CONTENT_TYPE))
.setHeader(EbmsConstants.MESSAGE_STATUS,constant(MessageStatusType.DELIVER))
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
String ebmsErrorCode = exchange.getIn().getHeader(EbmsConstants.EBMS_ERROR_CODE, EbmsError.EBMS_0004.getErrorCode(), String.class);
exchange.getIn().setHeader(EbmsConstants.EBMS_ERROR, EbmsError.getEbmsError(ebmsErrorCode));
}
})
.to("freemarker:templates/errorMessage.ftl")
.to(messgeStoreEndpoint)
.to(messageInsertEndpoint)
.to("direct:deliveryErrorReceipt")
.routeId("_jentrataEbmsErrorHandler");
from("direct:deliveryErrorReceipt")
.choice()
.when(header(EbmsConstants.MESSAGE_RECEIPT_PATTERN).isEqualTo(Security.ReplyPatternType.Callback.name()))
.to(outboundEbmsQueue)
.otherwise()
.log(LoggingLevel.DEBUG,"receipt returned on response")
.routeId("_jentrataEbmsDeliveryErrorReceipt");
}
public String getErrorQueue() {
return errorQueue;
}
public void setErrorQueue(String errorQueue) {
this.errorQueue = errorQueue;
}
public String getOutboundEbmsQueue() {
return outboundEbmsQueue;
}
public void setOutboundEbmsQueue(String outboundEbmsQueue) {
this.outboundEbmsQueue = outboundEbmsQueue;
}
public String getMessgeStoreEndpoint() {
return messgeStoreEndpoint;
}
public void setMessgeStoreEndpoint(String messgeStoreEndpoint) {
this.messgeStoreEndpoint = messgeStoreEndpoint;
}
public String getMessageInsertEndpoint() {
return messageInsertEndpoint;
}
public void setMessageInsertEndpoint(String messageInsertEndpoint) {
this.messageInsertEndpoint = messageInsertEndpoint;
}
}