package org.mobicents.slee.resource.diameter.rf; import java.io.IOException; import java.util.ArrayList; import javax.slee.resource.SleeEndpoint; import net.java.slee.resource.diameter.base.events.AccountingAnswer; import net.java.slee.resource.diameter.base.events.AccountingRequest; import net.java.slee.resource.diameter.base.events.DiameterMessage; import net.java.slee.resource.diameter.base.events.avp.DiameterIdentity; import net.java.slee.resource.diameter.rf.RfMessageFactory; import net.java.slee.resource.diameter.rf.RfServerSession; import org.jdiameter.api.Stack; import org.jdiameter.api.acc.ServerAccSession; import org.mobicents.slee.resource.diameter.base.AccountingServerSessionActivityImpl; import org.mobicents.slee.resource.diameter.base.DiameterAvpFactoryImpl; import org.mobicents.slee.resource.diameter.base.DiameterMessageFactoryImpl; import org.mobicents.slee.resource.diameter.base.events.DiameterMessageImpl; /** * * RfServerSessionImpl.java * * <br>Project: mobicents * <br>11:23:43 AM Apr 14, 2009 * <br> * * @author <a href="mailto:brainslog@gmail.com"> Alexandre Mendonca </a> */ public class RfServerSessionImpl extends AccountingServerSessionActivityImpl implements RfServerSession { protected RfMessageFactory rfMessageFactory = null; protected DiameterIdentity remoteRealm; /** * Should contina requests, so we can create answer. */ protected ArrayList<DiameterMessageImpl> stateMessages = new ArrayList<DiameterMessageImpl>(); /** * * @param messageFactory * @param avpFactory * @param serverSession * @param timeout * @param destinationHost * @param destinationRealm * @param endpoint * @param stack */ public RfServerSessionImpl( DiameterMessageFactoryImpl messageFactory, DiameterAvpFactoryImpl avpFactory, ServerAccSession serverSession, long timeout, DiameterIdentity destinationHost, DiameterIdentity destinationRealm, SleeEndpoint endpoint, Stack stack ) { super( messageFactory, avpFactory, serverSession, timeout, destinationHost, destinationRealm, endpoint, stack ); this.rfMessageFactory = new RfMessageFactoryImpl(messageFactory, stack); } /* * (non-Javadoc) * @see net.java.slee.resource.diameter.rf.RfServerSession#createRfAccountingAnswer() */ public AccountingAnswer createRfAccountingAnswer() { AccountingAnswer answer = null; for(int index =0 ;index<stateMessages.size();index++) { if(stateMessages.get(index).getCommand().getCode() == AccountingRequest.commandCode) { AccountingRequest msg = (AccountingRequest) stateMessages.get(index); answer = super.createAccountAnswer(msg); if(!answer.hasSessionId() && session!=null) { answer.setSessionId(session.getSessionId()); } answer.setAcctApplicationId( 3L ); //FIXME: add destiantion realm? ((DiameterMessageImpl)answer).setData(msg); break; } } return answer; } /* * (non-Javadoc) * @see net.java.slee.resource.diameter.rf.RfServerSession#createRfAccountingAnswer(net.java.slee.resource.diameter.base.events.AccountingRequest) */ public AccountingAnswer createRfAccountingAnswer( AccountingRequest acr ) { return super.createAccountAnswer(acr); } /* * (non-Javadoc) * @see net.java.slee.resource.diameter.rf.RfServerSession#sendAccountingAnswer(net.java.slee.resource.diameter.base.events.AccountingAnswer) */ public void sendAccountingAnswer( AccountingAnswer accountingAnswer ) throws IOException, IllegalArgumentException { super.sendAccountAnswer( accountingAnswer ); clean((DiameterMessageImpl)accountingAnswer); } /* * (non-Javadoc) * @see net.java.slee.resource.diameter.rf.RfSession#getRfMessageFactory() */ public RfMessageFactory getRfMessageFactory() { return this.rfMessageFactory; } public void fetchSessionData(DiameterMessage msg, boolean incoming) { if(msg.getHeader().isRequest()) { //Well it should always be getting this on request and only once ? if(incoming) { //FIXME: add more ? if(this.remoteRealm == null) { this.remoteRealm = msg.getOriginRealm(); } stateMessages.add((DiameterMessageImpl) msg); } else { //FIXME, do more :) } } } private void clean(DiameterMessageImpl msg) { if(msg.getData()!=null) { this.stateMessages.remove(msg.removeData()); } } }