/**
* Start time:09:18:14 2009-07-18<br>
* Project: mobicents-isup-stack<br>
*
* @author <a href="mailto:baranowb@gmail.com">Bartosz Baranowski </a>
*
*/
package org.mobicents.ss7.isup.impl;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.mobicents.ss7.SS7PayloadListener;
import org.mobicents.ss7.SS7Provider;
import org.mobicents.ss7.isup.ISUPClientTransaction;
import org.mobicents.ss7.isup.ISUPListener;
import org.mobicents.ss7.isup.ISUPMessageFactory;
import org.mobicents.ss7.isup.ISUPProvider;
import org.mobicents.ss7.isup.ISUPServerTransaction;
import org.mobicents.ss7.isup.ISUPTransaction;
import org.mobicents.ss7.isup.ParameterRangeInvalidException;
import org.mobicents.ss7.isup.TransactionAlredyExistsException;
import org.mobicents.ss7.isup.TransactionKey;
import org.mobicents.ss7.isup.message.AddressCompleteMessage;
import org.mobicents.ss7.isup.message.AnswerMessage;
import org.mobicents.ss7.isup.message.ApplicationTransportMessage;
import org.mobicents.ss7.isup.message.BlockingAckMessage;
import org.mobicents.ss7.isup.message.BlockingMessage;
import org.mobicents.ss7.isup.message.CallProgressMessage;
import org.mobicents.ss7.isup.message.ChargeInformationMessage;
import org.mobicents.ss7.isup.message.CircuitGroupBlockingAckMessage;
import org.mobicents.ss7.isup.message.CircuitGroupBlockingMessage;
import org.mobicents.ss7.isup.message.CircuitGroupQueryMessage;
import org.mobicents.ss7.isup.message.CircuitGroupQueryResponseMessage;
import org.mobicents.ss7.isup.message.CircuitGroupResetAckMessage;
import org.mobicents.ss7.isup.message.CircuitGroupResetMessage;
import org.mobicents.ss7.isup.message.CircuitGroupUnblockingAckMessage;
import org.mobicents.ss7.isup.message.CircuitGroupUnblockingMessage;
import org.mobicents.ss7.isup.message.ConfusionMessage;
import org.mobicents.ss7.isup.message.ConnectMessage;
import org.mobicents.ss7.isup.message.ContinuityCheckRequestMessage;
import org.mobicents.ss7.isup.message.ContinuityMessage;
import org.mobicents.ss7.isup.message.FacilityAcceptedMessage;
import org.mobicents.ss7.isup.message.FacilityMessage;
import org.mobicents.ss7.isup.message.FacilityRejectedMessage;
import org.mobicents.ss7.isup.message.FacilityRequestMessage;
import org.mobicents.ss7.isup.message.ForwardTransferMessage;
import org.mobicents.ss7.isup.message.ISUPMessage;
import org.mobicents.ss7.isup.message.IdentificationRequestMessage;
import org.mobicents.ss7.isup.message.IdentificationResponseMessage;
import org.mobicents.ss7.isup.message.InformationMessage;
import org.mobicents.ss7.isup.message.InformationRequestMessage;
import org.mobicents.ss7.isup.message.InitialAddressMessage;
import org.mobicents.ss7.isup.message.LoopPreventionMessage;
import org.mobicents.ss7.isup.message.LoopbackAckMessage;
import org.mobicents.ss7.isup.message.NetworkResourceManagementMessage;
import org.mobicents.ss7.isup.message.OverloadMessage;
import org.mobicents.ss7.isup.message.PassAlongMessage;
import org.mobicents.ss7.isup.message.PreReleaseInformationMessage;
import org.mobicents.ss7.isup.message.ReleaseCompleteMessage;
import org.mobicents.ss7.isup.message.ReleaseMessage;
import org.mobicents.ss7.isup.message.ResetCircuitMessage;
import org.mobicents.ss7.isup.message.ResumeMessage;
import org.mobicents.ss7.isup.message.SegmentationMessage;
import org.mobicents.ss7.isup.message.SubsequentAddressMessage;
import org.mobicents.ss7.isup.message.SubsequentDirectoryNumberMessage;
import org.mobicents.ss7.isup.message.SuspendMessage;
import org.mobicents.ss7.isup.message.UnblockingAckMessage;
import org.mobicents.ss7.isup.message.UnblockingMessage;
import org.mobicents.ss7.isup.message.UnequippedCICMessage;
import org.mobicents.ss7.isup.message.User2UserInformationMessage;
import org.mobicents.ss7.isup.message.UserPartAvailableMessage;
import org.mobicents.ss7.isup.message.UserPartTestMessage;
import EDU.oswego.cs.dl.util.concurrent.ConcurrentHashMap;
/**
* Start time:09:18:14 2009-07-18<br>
* Project: mobicents-isup-stack<br>
*
* @author <a href="mailto:baranowb@gmail.com"> Bartosz Baranowski </a>
*/
class ISUPProviderImpl implements ISUPProvider, SS7PayloadListener {
private SS7Provider transportProvider;
private final List<ISUPListener> listeners = new ArrayList<ISUPListener>();
private ISUPStackImpl stack;
private ISUPMessageFactory messageFactory;
private ConcurrentHashMap transactionMap = new ConcurrentHashMap();
/**
* @param provider
* @param stackImpl
* @param messageFactoryImpl
*
*/
public ISUPProviderImpl(SS7Provider provider, ISUPStackImpl stackImpl) {
this.transportProvider = provider;
this.stack = stackImpl;
this.messageFactory = new ISUPMessageFactoryImpl(this);
}
/*
* (non-Javadoc)
*
* @see org.mobicents.isup.ISUPProvider#getTransportProvider()
*/
public SS7Provider getTransportProvider() {
return transportProvider;
}
/*
* (non-Javadoc)
*
* @see
* org.mobicents.isup.ISUPProvider#addListener(org.mobicents.isup.ISUPListener
* )
*/
public void addListener(ISUPListener listener) {
listeners.add(listener);
}
/*
* (non-Javadoc)
*
* @seeorg.mobicents.isup.ISUPProvider#removeListener(org.mobicents.isup.
* ISUPListener)
*/
public void removeListener(ISUPListener listener) {
listeners.remove(listener);
}
/**
* @param mtp
*/
void setTransportProvider(SS7Provider mtp) {
this.transportProvider = mtp;
}
/*
* (non-Javadoc)
*
* @see
* org.mobicents.ss7.isup.ISUPProvider#createClientTransaction(org.mobicents
* .ss7.isup.message.ISUPMessage)
*/
public ISUPClientTransaction createClientTransaction(ISUPMessage msg) throws TransactionAlredyExistsException, IllegalArgumentException {
TransactionKey key = msg.generateTransactionKey();
if (this.transactionMap.containsKey(key)) {
throw new TransactionAlredyExistsException("Transaction already exists for key: " + key);
}
ISUPClientTransactionImpl ctx = new ISUPClientTransactionImpl(msg, this, this.stack);
this.transactionMap.put(msg.generateTransactionKey(), ctx);
return ctx;
}
/*
* (non-Javadoc)
*
* @see
* org.mobicents.ss7.isup.ISUPProvider#createServerTransaction(org.mobicents
* .ss7.isup.message.ISUPMessage)
*/
public ISUPServerTransaction createServerTransaction(ISUPMessage msg) throws TransactionAlredyExistsException, IllegalArgumentException {
TransactionKey key = msg.generateTransactionKey();
if (this.transactionMap.containsKey(key)) {
throw new TransactionAlredyExistsException("Transaction already exists for key: " + key);
}
ISUPServerTransactionImpl stx = new ISUPServerTransactionImpl(msg, this, this.stack);
this.transactionMap.put(msg.generateTransactionKey(), stx);
return stx;
}
/*
* (non-Javadoc)
*
* @see org.mobicents.ss7.isup.ISUPProvider#getMessageFactory()
*/
public ISUPMessageFactory getMessageFactory() {
return this.messageFactory;
}
/*
* (non-Javadoc)
*
* @see
* org.mobicents.ss7.isup.ISUPProvider#sendMessage(org.mobicents.ss7.isup
* .ISUPTransaction)
*/
public void sendMessage(ISUPTransaction msg) throws ParameterRangeInvalidException, IOException {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see
* org.mobicents.isup.ISUPProvider#sendMessage(org.mobicents.isup.messages
* .ISUPMessage)
*/
public void sendMessage(ISUPMessage msg) throws ParameterRangeInvalidException, IOException {
if (msg.hasAllMandatoryParameters()) {
byte[] encoded = msg.encodeElement();
transportProvider.sendData(encoded);
} else {
throw new ParameterRangeInvalidException("Message does not have all madnatory parameters");
}
}
/*
* (non-Javadoc)
*
* @see org.mobicents.ss7.SS7PayloadListener#receivedMessage(byte[])
*/
public void receivedMessage(byte[] message) {
DeliveryHandler dh = new DeliveryHandler(message);
// possibly we should do here check on timer
this.stack.getExecutors().schedule(dh, 0, TimeUnit.MICROSECONDS);
}
private final class DeliveryHandler implements Runnable {
private byte[] payload;
public DeliveryHandler(byte[] payload) {
super();
this.payload = payload;
}
/*
* (non-Javadoc)
*
* @see java.lang.Runnable#run()
*/
public void run() {
// byte[] should be only isup message, first byte is command code
// Yeah its an overkill a bit, but its more user friendly to provide
// methods for all, if we support more, we can add more/or generic
// one?
// FIXME: we should use
try {
int commandCode = payload[0];
// ISUPMessage msg = messageFactory.createCommand(commandCode);
// for (int li = 0; li < listeners.size(); li++) {
// ISUPListener listener = listeners.get(li);
// if (listener != null) {
// try {
// listener.onCommand(msg);
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
// }
switch (commandCode) {
case ISUPMessage._MESSAGE_CODE_IAM:
InitialAddressMessage IAM = messageFactory.createIAM();
IAM.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onIAM(IAM);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_ACM:
AddressCompleteMessage ACM = messageFactory.createACM();
ACM.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onACM(ACM);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_REL:
ReleaseMessage REL = messageFactory.createREL();
REL.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onREL(REL);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_RLC:
ReleaseCompleteMessage RLC = messageFactory.createRLC();
RLC.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onRLC(RLC);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_APT:
ApplicationTransportMessage APT = messageFactory.createAPT();
APT.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onAPT(APT);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_ANM:
AnswerMessage ANM = messageFactory.createANM();
ANM.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onANM(ANM);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_CPG:
CallProgressMessage CPG = messageFactory.createCPG();
CPG.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onCPG(CPG);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_GRA:
CircuitGroupResetAckMessage GRA = messageFactory.createGRA();
GRA.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onGRA(GRA);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_CFN:
ConfusionMessage CFN = messageFactory.createCNF();
CFN.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onCFN(CFN);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_CON:
ConnectMessage CON = messageFactory.createCON();
CON.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onCON(CON);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_COT:
ContinuityMessage COT = messageFactory.createCOT();
COT.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onCOT(COT);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_FRJ:
FacilityRejectedMessage FRJ = messageFactory.createFRJ();
FRJ.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onFRJ(FRJ);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_INF:
InformationMessage INF = messageFactory.createINF();
INF.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onINF(INF);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_INR:
InformationRequestMessage INR = messageFactory.createINR();
INR.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onINR(INR);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_SAM:
SubsequentAddressMessage SAM = messageFactory.createSAM();
SAM.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onSAM(SAM);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_SDN:
SubsequentDirectoryNumberMessage SDN = messageFactory.createSDN();
SDN.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onSDN(SDN);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_FOT:
ForwardTransferMessage FOT = messageFactory.createFOT();
FOT.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onFOT(FOT);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_RES:
ResumeMessage RES = messageFactory.createRES();
RES.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onRES(RES);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_BLO:
BlockingMessage BLO = messageFactory.createBLO();
BLO.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onBLO(BLO);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_BLA:
BlockingAckMessage BLA = messageFactory.createBLA();
BLA.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onBLA(BLA);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_CCR:
ContinuityCheckRequestMessage CCR = messageFactory.createCCR();
CCR.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onCCR(CCR);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_LPA:
LoopbackAckMessage LPA = messageFactory.createLPA();
LPA.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onLPA(LPA);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_LPP:
LoopPreventionMessage LPP = messageFactory.createLPP();
LPP.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onLPP(LPP);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_OLM:
OverloadMessage OLM = messageFactory.createOLM();
OLM.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onOLM(OLM);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_SUS:
SuspendMessage SUS = messageFactory.createSUS();
SUS.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onSUS(SUS);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_RSC:
ResetCircuitMessage RSC = messageFactory.createRSC();
RSC.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onRSC(RSC);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_UBL:
UnblockingMessage UBL = messageFactory.createUBL();
UBL.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onUBL(UBL);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_UBA:
UnblockingAckMessage UBA = messageFactory.createUBA();
UBA.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onUBA(UBA);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_UCIC:
UnequippedCICMessage UCIC = messageFactory.createUCIC();
UCIC.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onUCIC(UCIC);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_CGB:
CircuitGroupBlockingMessage CGB = messageFactory.createCGB();
CGB.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onCGB(CGB);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_CGBA:
CircuitGroupBlockingAckMessage CGBA = messageFactory.createCGBA();
CGBA.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onCGBA(CGBA);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_CGU:
CircuitGroupUnblockingMessage CGU = messageFactory.createCGU();
CGU.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onCGU(CGU);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_CGUA:
CircuitGroupUnblockingAckMessage CGUA = messageFactory.createCGUA();
CGUA.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onCGUA(CGUA);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_GRS:
CircuitGroupResetMessage GRS = messageFactory.createGRS();
GRS.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onGRS(GRS);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_CQR:
CircuitGroupQueryResponseMessage CQR = messageFactory.createCQR();
CQR.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onCQR(CQR);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_CQM:
CircuitGroupQueryMessage CQM = messageFactory.createCQM();
CQM.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onCQM(CQM);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_FAA:
FacilityAcceptedMessage FAA = messageFactory.createFAA();
FAA.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onFAA(FAA);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_FAR:
FacilityRequestMessage FAR = messageFactory.createFAR();
FAR.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onFAR(FAR);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_PAM:
PassAlongMessage PAM = messageFactory.createPAM();
PAM.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onPAM(PAM);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_PRI:
PreReleaseInformationMessage PRI = messageFactory.createPRI();
PRI.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onPRI(PRI);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_FAC:
FacilityMessage FAC = messageFactory.createFAC();
FAC.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onFAC(FAC);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_NRM:
NetworkResourceManagementMessage NRM = messageFactory.createNRM();
NRM.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onNRM(NRM);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_IDR:
IdentificationRequestMessage IDR = messageFactory.createIDR();
IDR.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onIDR(IDR);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_IRS:
IdentificationResponseMessage IRS = messageFactory.createIRS();
IRS.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onIRS(IRS);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_SGM:
SegmentationMessage SGM = messageFactory.createSGM();
SGM.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onSGM(SGM);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_CIM:
ChargeInformationMessage CIM = messageFactory.createCIM();
CIM.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onCIM(CIM);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_UPA:
UserPartAvailableMessage UPA = messageFactory.createUPA();
UPA.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onUPA(UPA);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_UPT:
UserPartTestMessage UPT = messageFactory.createUPT();
UPT.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onUPT(UPT);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
case ISUPMessage._MESSAGE_CODE_USR:
User2UserInformationMessage USR = messageFactory.createUSR();
USR.decodeElement(payload);
for (int li = 0; li < listeners.size(); li++) {
ISUPListener listener = listeners.get(li);
if (listener != null) {
try {
listener.onUSR(USR);
} catch (Exception e) {
e.printStackTrace();
}
}
}
break;
default:
throw new IllegalArgumentException("Not supported comamnd code: " + commandCode);
}
} catch (Exception e) {
// FIXME: what should we do here? send back?
e.printStackTrace();
}
}
}
// FIXME: should we wait here to get all messages?
void onTransactionTimeout(ISUPClientTransaction tx) {
for (ISUPListener l : this.listeners) {
try {
l.onTransactionTimeout(tx);
} catch (Exception e) {
e.printStackTrace();
}
}
this.transactionMap.remove(tx.getOriginalMessage().generateTransactionKey());
}
void onTransactionTimeout(ISUPServerTransaction tx) {
for (ISUPListener l : this.listeners) {
try {
l.onTransactionTimeout(tx);
} catch (Exception e) {
e.printStackTrace();
}
}
this.transactionMap.remove(tx.getOriginalMessage().generateTransactionKey());
}
void onTransactionEnded(ISUPClientTransaction tx) {
for (ISUPListener l : this.listeners) {
try {
l.onTransactionEnded(tx);
} catch (Exception e) {
e.printStackTrace();
}
}
this.transactionMap.remove(tx.getOriginalMessage().generateTransactionKey());
}
void onTransactionEnded(ISUPServerTransaction tx) {
for (ISUPListener l : this.listeners) {
try {
l.onTransactionEnded(tx);
} catch (Exception e) {
e.printStackTrace();
}
}
this.transactionMap.remove(tx.getOriginalMessage().generateTransactionKey());
}
}