package demo.flight.event;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.sap.aii.adapter.xi.ms.XIMessage;
import com.sap.engine.interfaces.messaging.api.*;
import com.sap.engine.interfaces.messaging.api.event.*;
import com.sap.tc.logging.Location;
public class FlightEventHandler implements RetriesExceededEvent, FatalMessageErrorEvent {
protected static final Location LOG = Location.getLocation(FlightEventHandler.class);
public static final String AF_CONNECTION_FACTORY = "MessagingConnectionFactory";
public static final String AF_CONNECTION_NAME = "AFW";
public static final String XI_MESSAGE_FACTORY_NAME = "XI";
private static final String SERVICE = "Airline";
private static final String ACTION = "BookingOrderRequest_Out";
private static final String ACTION_NS = "http://sap.com/xi/XI/Demo/Agency";
private static final String ACTION_CONFIRM = "FlightBookingOrderConfirmation_Out";
private static final String ACTION_CONFIRM_NS = "http://sap.com/xi/XI/Demo/Airline";
private class FlightBookingOrderRequestHandler extends DefaultHandler {
private String agencyID;
private String orderNumber;
private StringBuilder text;
@Override
public void startDocument() throws SAXException {
text = new StringBuilder();
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
text.append(ch, start, length);
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if(localName.equals("AgencyID")){
agencyID = text.toString().trim();
text.setLength(0);
}
if(localName.equals("OrderNumber")){
orderNumber = text.toString().trim();
text.setLength(0);
}
}
public String getAgencyID() {
return agencyID;
}
public String getOrderNumber() {
return orderNumber;
}
}
@Override
public void onFatalMessageError(MessageKey messageKey, MessageErrorData errorData) {
String SIGNATURE = "onFatalMessageError(MessageKey,MessageErrorData)";
LOG.entering(SIGNATURE);
if(SERVICE.equals(errorData.getToService())
&& ACTION.equals(errorData.getAction())
&& ACTION_NS.equals(errorData.getActionNamespace())
&& "SOAP_ADAPTER_PROCESSING_ERROR".equals(errorData.getErrorCode())){
triggerErrorCallback(messageKey, errorData);
}
LOG.exiting(SIGNATURE);
}
@Override
public void onRetriesExceeded(MessageKey messageKey, MessageErrorData errorData) {
String SIGNATURE = "onRetriesExceeded(MessageKey,MessageErrorData)";
LOG.entering(SIGNATURE);
if(SERVICE.equals(errorData.getToService())
&& ACTION.equals(errorData.getAction())
&& ACTION_NS.equals(errorData.getActionNamespace())
&& "SOAP_ADAPTER_PROCESSING_ERROR".equals(errorData.getErrorCode())){
triggerErrorCallback(messageKey, errorData);
}
LOG.exiting(SIGNATURE);
}
private void triggerErrorCallback(MessageKey messageKey, MessageErrorData errorData){
String SIGNATURE = "triggerErrorCallback(MessageKey,MessageErrorData)";
LOG.entering(SIGNATURE, new Object[] {messageKey, errorData});
try {
Context ctx = new InitialContext();
ConnectionFactory connectionFactory = (ConnectionFactory) ctx.lookup(AF_CONNECTION_FACTORY);
Connection afConnection = connectionFactory.createConnection(AF_CONNECTION_NAME);
afConnection.start();
MessageFactory afMessageFactory = afConnection.createMessageFactory(XI_MESSAGE_FACTORY_NAME);
Party senderParty = new Party(errorData.getToParty());
Service senderService = new Service(errorData.getToService());
Action action = new Action(ACTION_CONFIRM, ACTION_CONFIRM_NS);
XIMessage xiMessage = (XIMessage) afMessageFactory.createMessage(senderParty, null, senderService, null, action);
xiMessage.setInterface(ACTION_CONFIRM, ACTION_CONFIRM_NS);
xiMessage.setMessageClass(MessageClass.APPLICATION_MESSAGE);
XMLPayload xmlPayload = xiMessage.createXMLPayload();
xmlPayload.setName("TechnicalError");
xiMessage.setDeliverySemantics(DeliverySemantics.ExactlyOnce);
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
SAXParser saxParser = factory.newSAXParser();
Message sourceMessage = APIAccessFactory.getAPIAccess().getMessageAccess().getMessage(messageKey);
FlightBookingOrderRequestHandler handler = new FlightBookingOrderRequestHandler();
saxParser.parse(sourceMessage.getMainPayload().getInputStream(), handler);
StringBuilder buf = new StringBuilder();
buf.append("<ns0:FlightBookingOrderConfirmation xmlns:ns0=\"http://sap.com/xi/XI/Demo/Airline\">");
buf.append("<AgencyData>");
buf.append("<AgencyID>").append(handler.getAgencyID()).append("</AgencyID>");
buf.append("<OrderNumber>").append(handler.getOrderNumber()).append("</OrderNumber>");
buf.append("<ItemNumber/><OrderType/></AgencyData>");
buf.append("<BookingStatus>F</BookingStatus>");
buf.append("</ns0:FlightBookingOrderConfirmation>");
xmlPayload.setContent(buf.toString().getBytes());
xiMessage.setMainPayload(xmlPayload);
afConnection.send(xiMessage);
} catch (Exception e) {
LOG.throwing(e);
throw new RuntimeException("Failed send confirmation", e);
}
LOG.exiting(SIGNATURE);
}
}
package demo.flight.web;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.sap.engine.interfaces.messaging.api.APIAccessFactory;
import com.sap.engine.interfaces.messaging.api.event.*;
import com.sap.tc.logging.Location;
import demo.flight.event.FlightEventHandler;
public class InitServletContainer implements ServletContextListener{
private static final Location LOG = Location.getLocation(InitServletContainer.class);
private static HashSet<EventCallback> events = new HashSet<EventCallback>();
public static final String ATTRIBUTE_EVENT_LEVEL = "applicationLevel";
public static final String ATTRIBUTE_EVENT_SYNC = "synchronous";
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
String SIGNATURE = "contextDestroyed(ServletContextEvent)";
LOG.entering(SIGNATURE, new Object[] {servletContextEvent});
try {
EventAccess eventAccess = APIAccessFactory.getAPIAccess().getEventAccess();
Iterator<EventCallback> iterator = events.iterator();
while(iterator.hasNext()){
EventCallback event = iterator.next();
eventAccess.unregisterEventCallback(event);
LOG.debugT("Unregistered {0} event", new Object[] {event.getClass().getName()});
}
} catch (Exception e) {
LOG.throwing(SIGNATURE, e);
throw new RuntimeException(e);
}
LOG.exiting();
}
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
String SIGNATURE = "contextInitialized(ServletContextEvent)";
LOG.entering(SIGNATURE, new Object[] {servletContextEvent});
try {
EventAccess eventAccess = APIAccessFactory.getAPIAccess().getEventAccess();
EventCallback event = new FlightEventHandler();
HashMap<String, Boolean> map = new HashMap<String, Boolean>();
map.put(ATTRIBUTE_EVENT_LEVEL, false);
map.put(ATTRIBUTE_EVENT_SYNC, true);
events.add(event);
eventAccess.registerEventCallback(event, map);
LOG.debugT("Registered {0} event", new Object[] {event.getClass().getName()});
} catch (Exception e) {
LOG.throwing(SIGNATURE, e);
throw new RuntimeException(e);
}
LOG.exiting();
}
}
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
8 | |
5 | |
5 | |
4 | |
4 | |
4 | |
4 | |
4 | |
3 | |
3 |