package org.mobicents.slee.resource.diameter.cca;
import java.io.IOException;
import java.util.ArrayList;
import javax.slee.resource.SleeEndpoint;
import net.java.slee.resource.diameter.base.events.ReAuthRequest;
import net.java.slee.resource.diameter.base.events.avp.AvpNotAllowedException;
import net.java.slee.resource.diameter.base.events.avp.DiameterAvp;
import net.java.slee.resource.diameter.base.events.avp.DiameterIdentity;
import net.java.slee.resource.diameter.base.events.avp.ReAuthRequestType;
import net.java.slee.resource.diameter.cca.CreditControlAVPFactory;
import net.java.slee.resource.diameter.cca.CreditControlMessageFactory;
import net.java.slee.resource.diameter.cca.CreditControlServerSession;
import net.java.slee.resource.diameter.cca.CreditControlSessionState;
import net.java.slee.resource.diameter.cca.events.CreditControlAnswer;
import net.java.slee.resource.diameter.cca.events.CreditControlRequest;
import org.apache.log4j.Logger;
import org.jdiameter.api.Answer;
import org.jdiameter.api.EventListener;
import org.jdiameter.api.Request;
import org.jdiameter.api.cca.ServerCCASession;
import org.jdiameter.common.api.app.cca.ServerCCASessionState;
import org.jdiameter.common.impl.app.auth.ReAuthRequestImpl;
import org.jdiameter.common.impl.app.cca.JCreditControlAnswerImpl;
import org.jdiameter.common.impl.validation.JAvpNotAllowedException;
import org.mobicents.slee.resource.diameter.base.events.DiameterMessageImpl;
import org.mobicents.slee.resource.diameter.cca.handlers.CCASessionCreationListener;
/**
* Start time:15:26:12 2008-12-08<br>
* Project: mobicents-diameter-parent<br>
*
* @author <a href="mailto:baranowb@gmail.com"> Bartosz Baranowski </a>
* @author <a href="mailto:brainslog@gmail.com"> Alexandre Mendonca </a>
*/
public class CreditControlServerSessionImpl extends CreditControlSessionImpl implements CreditControlServerSession {
private static Logger logger = Logger.getLogger(CreditControlServerSessionImpl.class);
protected ServerCCASession session = null;
protected ArrayList<DiameterAvp> sessionAvps = new ArrayList<DiameterAvp>();
protected CreditControlRequest lastRequest = null;
/**
*
* @param messageFactory
* @param avpFactory
* @param session
* @param timeout
* @param destinationHost
* @param destinationRealm
* @param endpoint
*/
public CreditControlServerSessionImpl(CreditControlMessageFactory messageFactory, CreditControlAVPFactory avpFactory, ServerCCASession session,
long timeout, DiameterIdentity destinationHost, DiameterIdentity destinationRealm, SleeEndpoint endpoint)
{
super(messageFactory, avpFactory, null, (EventListener<Request, Answer>) session, timeout, destinationHost, destinationRealm, endpoint);
this.session = session;
this.session.addStateChangeNotification(this);
super.setCurrentWorkingSession(this.session.getSessions().get(0));
}
public void endActivity()
{
// this.listener.sessionDestroyed(this.sessionId, this);
this.session.release();
}
public Object getDiameterAvpFactory()
{
return this.ccaAvpFactory;
}
public Object getDiameterMessageFactory()
{
return this.ccaMessageFactory;
}
/*
* (non-Javadoc)
*
* @see net.java.slee.resource.diameter.cca.CreditControlServerSession#createCreditControlAnswer()
*/
public CreditControlAnswer createCreditControlAnswer()
{
CreditControlAnswer answer = super.ccaMessageFactory.createCreditControlAnswer(lastRequest);
// Fill extension avps if present
// if (sessionAvps.size() > 0)
// {
// try
// {
// System.err.println("MSG: "+answer+"\nADFDITIONAL: "+Arrays.toString(sessionAvps.toArray(new DiameterAvp[sessionAvps.size()])));
// answer.setExtensionAvps(sessionAvps.toArray(new DiameterAvp[sessionAvps.size()]));
// }
// catch (AvpNotAllowedException e) {
// logger.error( "Failed to add Session AVPs to answer.", e );
// }
// }
return answer;
}
/*
* (non-Javadoc)
*
* @see net.java.slee.resource.diameter.cca.CreditControlServerSession#sendCreditControlAnswer
* (net.java.slee.resource.diameter.cca.events.CreditControlAnswer)
*/
public void sendCreditControlAnswer(CreditControlAnswer cca) throws IOException
{
fetchCurrentState(cca);
DiameterMessageImpl msg = (DiameterMessageImpl)cca;
try
{
session.sendCreditControlAnswer(new JCreditControlAnswerImpl((Answer) msg.getGenericData()));
} catch (JAvpNotAllowedException e) {
AvpNotAllowedException anae = new AvpNotAllowedException("Message validation failed.", e, e.getAvpCode(), e.getVendorId());
throw anae;
} catch (Exception e) {
e.printStackTrace();
IOException ioe = new IOException("Failed to send message, due to: " + e);
throw ioe;
}
}
/*
* (non-Javadoc)
*
* @see net.java.slee.resource.diameter.cca.CreditControlServerSession#sendReAuthRequest
* (net.java.slee.resource.diameter.base.events.ReAuthRequest)
*/
public void sendReAuthRequest(ReAuthRequest rar) throws IOException
{
//RFC 4006 5.5
rar.setReAuthRequestType(ReAuthRequestType.AUTHORIZE_ONLY);
rar.setAuthApplicationId(CreditControlMessageFactory._CCA_AUTH_APP_ID);
DiameterMessageImpl msg = (DiameterMessageImpl) rar;
try
{
session.sendReAuthRequest(new ReAuthRequestImpl((Request) msg.getGenericData()));
} catch (JAvpNotAllowedException e) {
AvpNotAllowedException anae = new AvpNotAllowedException("Message validation failed.", e, e.getAvpCode(), e.getVendorId());
throw anae;
} catch (Exception e) {
e.printStackTrace();
IOException ioe = new IOException("Failed to send message, due to: " + e);
throw ioe;
}
}
/*
* (non-Javadoc)
*
* @see org.jdiameter.api.app.StateChangeListener#stateChanged(java.lang.Enum, java.lang.Enum)
*/
public void stateChanged(Enum oldState, Enum newState)
{
if (logger.isInfoEnabled())
logger.info( "Credit-Control Server FSM State Changed: " + oldState + " => " + newState );
ServerCCASessionState s = (ServerCCASessionState) newState;
// IDLE(0), OPEN(1);
switch (s)
{
case OPEN:
// FIXME: this should not happen?
this.state = CreditControlSessionState.OPEN;
break;
case IDLE:
this.state = CreditControlSessionState.IDLE;
// Destroy and release session
((CCASessionCreationListener) this.getSessionListener()).sessionDestroyed(sessionId, this);
this.session.release();
break;
default:
logger.error("Unexpected state in Credit-Control Server FSM: " + s);
}
}
public void fetchCurrentState(CreditControlRequest ccr)
{
this.lastRequest = ccr;
// TODO: Complete this method.
}
public void fetchCurrentState(CreditControlAnswer cca)
{
// TODO: Complete this method.
}
public ServerCCASession getSession()
{
return this.session;
}
}