All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.mobicents.slee.resource.diameter.rx.RxSessionActivityImpl Maven / Gradle / Ivy

The newest version!
/*
 * JBoss, Home of Professional Open Source
 * Copyright 2011, Red Hat, Inc. and individual contributors
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */

package org.mobicents.slee.resource.diameter.rx;

import java.util.concurrent.Future;

import javax.naming.OperationNotSupportedException;

import net.java.slee.resource.diameter.base.DiameterAvpFactory;
import net.java.slee.resource.diameter.base.DiameterMessageFactory;
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.rx.RxAvpFactory;
import net.java.slee.resource.diameter.rx.RxMessageFactory;
import net.java.slee.resource.diameter.rx.RxSessionActivity;
import net.java.slee.resource.diameter.rx.events.AARequest;

import org.jdiameter.api.Answer;
import org.jdiameter.api.EventListener;
import org.jdiameter.api.Message;
import org.jdiameter.api.Request;
import org.jdiameter.api.Session;
import org.jdiameter.api.validation.AvpNotAllowedException;
import org.mobicents.slee.resource.diameter.base.DiameterActivityImpl;
import org.mobicents.slee.resource.diameter.base.events.DiameterMessageImpl;
import org.mobicents.slee.resource.diameter.base.events.ErrorAnswerImpl;
import org.mobicents.slee.resource.diameter.rx.events.*;

/**
 * @author  Alexandre Mendonca 
 * @author  Bartosz Baranowski 
 * @author  Richard Good 
 */
public abstract class RxSessionActivityImpl extends DiameterActivityImpl implements RxSessionActivity {

  private static final long serialVersionUID = 5037967180962414549L;

  protected transient RxMessageFactory rxMessageFactory;

  /**
   * @param messageFactory
   * @param avpFactory
   * @param session
   * @param raEventListener
   * @param destinationHost
   * @param destinationRealm
   */
  public RxSessionActivityImpl(RxMessageFactory rxMessageFactory, RxAvpFactory rxAvpFactory, Session session,
      EventListener raEventListener,
      DiameterIdentity destinationHost, DiameterIdentity destinationRealm) {
    super(rxMessageFactory.getBaseMessageFactory(), rxAvpFactory.getBaseFactory(), session, raEventListener, destinationHost, destinationRealm);
    this.rxMessageFactory = rxMessageFactory;
  }

  @Override
  public RxMessageFactory getRxMessageFactory() {
    return this.rxMessageFactory;
  }

  public void setRxMessageFactory(RxMessageFactory rxMessageFactory) {
    this.rxMessageFactory = rxMessageFactory;
  }

  public void setDestinationHost(DiameterIdentity destinationHost) {
    super.destinationHost = destinationHost;
  }

  public void setDestinationRealm(DiameterIdentity destinationRealm) {
    super.destinationRealm = destinationRealm;
  }
  //some override from base

  protected Message doSendMessage(DiameterMessage message) {
    Message receivedMessage = null;
    try {
      if(message instanceof DiameterMessageImpl) {
        Future future = session.send(((DiameterMessageImpl)message).getGenericData());
        receivedMessage = future.get();
      }
      else {
        throw new OperationNotSupportedException((new StringBuilder()).append("Trying to send wrong type of message? [").append(message.getClass()).append("] \n").append(message).toString());
      }
    }
    catch(AvpNotAllowedException e) {
      throw new net.java.slee.resource.diameter.base.events.avp.AvpNotAllowedException("Message validation failed.", e, e.getAvpCode(), e.getVendorId());
    }
    catch(Exception e) {
      logger.error("Failure sending sync request.", e);
    }

    return receivedMessage;
  }

  public DiameterMessage sendSyncMessage(DiameterMessage message) {
    DiameterMessage answer = null;
    Message receivedMessage = doSendMessage(message);
    if(receivedMessage != null) {
      if(!receivedMessage.isRequest()) {
        if(receivedMessage.isError()) {
          answer = new ErrorAnswerImpl(receivedMessage);
        }
        else {
          switch(receivedMessage.getCommandCode())
          {
            case 274: 
              answer = new AbortSessionAnswerImpl(receivedMessage);
              break;

            case 258: 
              answer = new ReAuthAnswerImpl(receivedMessage);
              break;

            case 275: 
              answer = new SessionTerminationAnswerImpl(receivedMessage);
              break;
            case AARequest.commandCode:
              answer = new AAAnswerImpl(receivedMessage);
            default:
              logger.error((new StringBuilder()).append("Received an unknown type of Message for Base Activity: ").append(receivedMessage).toString());
              break;
          }
        }
      }
      else {
        logger.error("Received a REQUEST message when expecting an ANSWER.");
      }
    }
    else {
      logger.debug("No answer received. Returning null.");
    }
    return answer;
  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy