package org.mobicents.servlet.sip.example;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;
import org.apache.log4j.Logger;
import org.jdiameter.api.Answer;
import org.jdiameter.api.ApplicationId;
import org.jdiameter.api.Avp;
import org.jdiameter.api.AvpDataException;
import org.jdiameter.api.AvpSet;
import org.jdiameter.api.Message;
import org.jdiameter.api.Request;
import org.mobicents.diameter.api.DiameterMessageFactory;
import org.mobicents.diameter.api.DiameterProvider;
import org.mobicents.diameter.dictionary.AvpDictionary;
import org.mobicents.diameter.stack.DiameterListener;
import org.mobicents.diameter.stack.DiameterStackMultiplexer;
public class DiameterBaseClient implements DiameterProvider, DiameterListener
{
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(DiameterBaseClient.class);
private DiameterStackMultiplexer muxMBean = null;
private DiameterMessageFactory msgFactory = null;
private DiameterProvider provider = null;
public DiameterBaseClient() throws InstanceNotFoundException, MBeanException, ReflectionException, NullPointerException, MalformedObjectNameException
{
ObjectName objectName = new ObjectName("diameter.mobicents:service=DiameterStackMultiplexer");
DiameterListener listener = this;
ApplicationId[] appIds = new ApplicationId[]{ApplicationId.createByAccAppId( 193, 19302L )};
Object[] params = new Object[]{};
String[] signature = new String[]{};
String operation = "getMultiplexerMBean";
MBeanServer server = (MBeanServer) MBeanServerFactory.findMBeanServer(null).get(0);
Object object = server.invoke( objectName, operation, params, signature );
if(object instanceof DiameterStackMultiplexer)
muxMBean = (DiameterStackMultiplexer) object;
logger.info( "muxMBean == " + muxMBean );
muxMBean.registerListener( listener, appIds );
msgFactory = muxMBean.getMessageFactory();
provider = muxMBean.getProvider();
}
public String sendMessage( Message message )
{
return this.provider.sendMessage( message );
}
public Answer processRequest( Request request )
{
// We don't deal with this...
return null;
}
public void receivedSuccessMessage( Request request, Answer answer )
{
logger.info( "Received success message (Result-Code[" + answer.getResultCode() + "]) for Diameter Request with Session-Id [" + request.getSessionId() + "]" );
}
public void timeoutExpired( Request request )
{
logger.info( "Timeout expired for Diameter Request with Session-Id [" + request.getSessionId() + "]" );
}
public Message createAccountingRequest(String sessionId, String uid, Long value, boolean refund)
{
//<command name="ACR">
Request req = (Request) this.msgFactory.createRequest( 271, 19302L );
req.setProxiable( true );
AvpSet avps = req.getAvps();
//<avp name="Origin-Host" code="264" vendor="0" value="localhost" />
avps.addAvp( Avp.ORIGIN_HOST, "aaa://127.0.0.1:1812".getBytes(), true, false );
//<avp name="Origin-Realm" code="296" vendor="0" value="mobicents.org" />
avps.addAvp( Avp.ORIGIN_REALM, "mobicents.org".getBytes(), true, false );
//<avp name="Session-Id" code="263" vendor="0" value="12345" />
avps.addAvp( Avp.SESSION_ID, sessionId.getBytes(), true, false );
//<avp name="Vendor-Specific-Application-Id" code="260" vendor="0">
// <avp name="Vendor-Id" code="266" vendor="0" value="193" />
// <avp name="Acct-Application-Id" code="259" vendor="0" value="19302" />
//</avp>
AvpSet vsai = avps.addGroupedAvp( Avp.VENDOR_SPECIFIC_APPLICATION_ID, true, false );
vsai.addAvp( 266, 193, true, false, true );
vsai.addAvp( 259, 19302, true, false, true );
//<avp name="Destination-Realm" code="283" vendor="0" value="mobicents.org" />
avps.addAvp( Avp.DESTINATION_REALM, "mobicents.org".getBytes(), true, false );
//<avp name="Destination-Host" code="293" vendor="0" value="localhost" />
avps.addAvp( Avp.DESTINATION_HOST, "aaa://127.0.0.1:21812".getBytes(), true, false );
//<avp name="SCAP-Subscription-Id" code="553" vendor="193">
// <avp name="SCAP-Subscription-Id-Type" code="555" vendor="193" value="0" />
// <avp name="SCAP-Subscription-Id-Data" code="554" vendor="193" value="00001000" />
//</avp>
AvpSet ssi = avps.addGroupedAvp( 553, 193, true, false );
ssi.addAvp( 555, 0, 193, true, false );
ssi.addAvp( 554, uid.getBytes(), 193, true, false );
//<avp name="SCAP-Requested-Service-Unit" code="606" vendor="193">
// <avp name="SCAP-Unit-Type" code="611" vendor="193" value="2" />
// <avp name="SCAP-Unit-Value" code="612" vendor="193">
// <avp name="SCAP-Value-Digits" code="617" vendor="193" value="10" />
// </avp>
// <avp name="SCAP-Currency-Code" code="544" vendor="193" value="978" />
//</avp>
AvpSet srsu = avps.addGroupedAvp( 606, 193, true, false );
srsu.addAvp( 611, 3, 193, true, false );
AvpSet suv = srsu.addGroupedAvp( 612, 193, true, false );
suv.addAvp( 617, value, 193, true, false );
srsu.addAvp( 544, 978, 193, true, false );
//<avp name="Accounting-Record-Number" code="485" vendor="0" value="0" />
avps.addAvp( Avp.ACC_RECORD_NUMBER, 0, true, false );
//<avp name="Accounting-Record-Type" code="480" vendor="0" value="1" />
avps.addAvp( Avp.ACC_RECORD_TYPE, 1, true, false );
//<avp name="SCAP-Requested-Action" code="615" vendor="193" value="0" />
avps.addAvp( 615, refund ? 1 : 0, 193, true, false );
//<avp name="SCAP-Service-Parameter-Info" code="607" vendor="193">
// <avp name="SCAP-Service-Parameter-Type" code="608" vendor="193" value="0" />
// <avp name="SCAP-Service-Parameter-Value" code="609" vendor="193" value="510" />
//</avp>
AvpSet sspi1 = avps.addGroupedAvp( 607, 193, true, false );
sspi1.addAvp( 608, 0, 193, true, false );
sspi1.addAvp( 609, "510".getBytes(), 193, true, false );
//<avp name="SCAP-Service-Parameter-Info" code="607" vendor="193">
// <avp name="SCAP-Service-Parameter-Type" code="608" vendor="193" value="14" />
// <avp name="SCAP-Service-Parameter-Value" code="609" vendor="193" value="20" />
//</avp>
AvpSet sspi2 = avps.addGroupedAvp( 607, 193, true, false );
sspi2.addAvp( 608, 14, 193, true, false );
sspi2.addAvp( 609, "20".getBytes(), 193, true, false );
return req;
}
public Message sendMessageSync( Message message )
{
logger.info( printMessage( message ) );
return this.provider.sendMessageSync( message );
}
private String printMessage( Message message )
{
String toString = "\r\n" +
"+----------------------------------- HEADER ----------------------------------+\r\n" +
"| Version................." + message.getVersion() + "\r\n" +
"| Command-Flags..........." + "R[" + message.isRequest() + "] P[" + message.isProxiable() + "] " +
"E[" + message.isError() + "] T[" + message.isReTransmitted() + "]" + "\r\n" +
"| Command-Code............" + message.getCommandCode() + "\r\n" +
"| Application-Id.........." + message.getApplicationId() + "\r\n" +
"| Hop-By-Hop Identifier..." + message.getHopByHopIdentifier() + "\r\n" +
"| End-To-End Identifier..." + message.getEndToEndIdentifier() + "\r\n" +
"+------------------------------------ AVPs -----------------------------------+\r\n";
for( Avp avp : message.getAvps() )
{
toString += printAvp( avp, "" );
}
toString += "+-----------------------------------------------------------------------------+\r\n";
return toString;
}
private String printAvp(Avp avp, String indent)
{
Object avpValue = null;
String avpString = "";
boolean isGrouped = false;
try
{
String avpType = AvpDictionary.INSTANCE.getAvp( avp.getCode(), avp.getVendorId() ).getType();
if("Integer32".equals(avpType) || "AppId".equals(avpType))
{
avpValue = avp.getInteger32();
}
else if("Unsigned32".equals(avpType) || "VendorId".equals(avpType))
{
avpValue = avp.getUnsigned32();
}
else if("Float64".equals(avpType))
{
avpValue = avp.getFloat64();
}
else if("Integer64".equals(avpType))
{
avpValue = avp.getInteger64();
}
else if("Time".equals(avpType))
{
avpValue = avp.getTime();
}
else if("Unsigned64".equals(avpType))
{
avpValue = avp.getUnsigned64();
}
else if("Grouped".equals(avpType))
{
avpValue = "<Grouped>";
isGrouped = true;
}
else
{
avpValue = avp.getOctetString().replaceAll( "\r", "" ).replaceAll( "\n", "" );
}
}
catch (Exception ignore) {
try
{
avpValue = avp.getOctetString().replaceAll( "\r", "" ).replaceAll( "\n", "" );
}
catch ( AvpDataException e ) {
avpValue = avp.toString();
}
}
avpString += "| " + indent + "AVP: Code[" + avp.getCode() + "] VendorID[" + avp.getVendorId() + "] Value[" +
avpValue + "] Flags[M=" + avp.isMandatory() + ";E=" + avp.isEncrypted() + ";V=" + avp.isVendorId() + "]\r\n";
if(isGrouped)
{
try
{
for(Avp subAvp : avp.getGrouped())
{
avpString += printAvp( subAvp, indent + " " );
}
}
catch ( AvpDataException e )
{
// Failed to ungroup... ignore then...
}
}
return avpString;
}
}