package org.mobicents.slee.resource.mgcp.ra;
import jain.protocol.ip.mgcp.message.parms.ConnectionIdentifier;
import jain.protocol.ip.mgcp.message.parms.EndpointIdentifier;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import javax.slee.resource.ActivityHandle;
import net.java.slee.resource.mgcp.MgcpConnectionActivity;
import org.apache.log4j.Logger;
/**
*
* @author amit bhayani
*
*/
public class MgcpActivityManager {
private static Logger logger = Logger.getLogger(MgcpActivityManager.class);
private String mgcpRaEntityName = null;
private ConcurrentHashMap<MgcpEndpointActivityHandle, MgcpEndpointActivityImpl> endpointActivities = new ConcurrentHashMap<MgcpEndpointActivityHandle, MgcpEndpointActivityImpl>();
private ConcurrentHashMap<MgcpConnectionActivityHandle, MgcpConnectionActivityImpl> connectionActivities = new ConcurrentHashMap<MgcpConnectionActivityHandle, MgcpConnectionActivityImpl>();
private ConcurrentHashMap<Integer, MgcpConnectionActivityHandle> transactionHandle2ActivityHandleMap = new ConcurrentHashMap<Integer, MgcpConnectionActivityHandle>();
private ConcurrentHashMap<String, MgcpConnectionActivityHandle> connectionIdentifier2ActivityHandleMap = new ConcurrentHashMap<String, MgcpConnectionActivityHandle>();
protected MgcpActivityManager() {
}
// --------- CONNECTION ACTIVITY MANAGEMENT
public MgcpConnectionActivityHandle putMgcpConnectionActivity(MgcpConnectionActivityImpl activity) {
// if (logger.isDebugEnabled()) {
// logger.debug(this.getMgcpRaEntityName()+" :
// putMgcpConnectionActivity(activity=" + activity + ")");
// }
MgcpConnectionActivityHandle handle = activity.getActivityHandle();
if (activity.getConnectionIdentifier() != null) {
connectionIdentifier2ActivityHandleMap.put(activity.getConnectionIdentifier(), handle);
// if (logger.isDebugEnabled()) {
// logger.debug(this.getMgcpRaEntityName()+" : created mapping
// between connection identifier " +
// activity.getConnectionIdentifier()
// + " and activity handle " + handle + ")");
// }
} else if (activity.getTransactionHandle() != null) {
transactionHandle2ActivityHandleMap.put(activity.getTransactionHandle(), handle);
// if (logger.isDebugEnabled()) {
// logger.debug(this.getMgcpRaEntityName()+" : created temp mapping
// between transaction handle " + activity.getTransactionHandle()
// + " and activity handle " + handle + ")");
// }
}
connectionActivities.put(handle, activity);
return handle;
}
public MgcpConnectionActivityImpl getMgcpConnectionActivity(MgcpConnectionActivityHandle handle) {
// if (logger.isDebugEnabled()) {
// logger.debug(this.getMgcpRaEntityName()+" :
// getMgcpConnectionActivity(handle=" + handle + ")");
// }
return connectionActivities.get(handle);
}
public List<MgcpConnectionActivity> getMgcpConnectionActivities(EndpointIdentifier endpointIdentifier) {
List<MgcpConnectionActivity> listOfmgcpConnectionActivities = Collections
.synchronizedList(new ArrayList<MgcpConnectionActivity>());
Collection<MgcpConnectionActivityImpl> connectionActivitiesColl = connectionActivities.values();
for (MgcpConnectionActivityImpl mgcpConnectionActivityImpl : connectionActivitiesColl) {
EndpointIdentifier endpointIdentifierLocal = mgcpConnectionActivityImpl.getEndpointIdentifier();
if (endpointIdentifierLocal != null
&& endpointIdentifierLocal.toString().equals(endpointIdentifier.toString())) {
listOfmgcpConnectionActivities.add(mgcpConnectionActivityImpl);
}
}
return listOfmgcpConnectionActivities;
}
public MgcpConnectionActivityHandle updateMgcpConnectionActivity(int transactionHandle,
ConnectionIdentifier connectionIdentifier, EndpointIdentifier endpointIdentifier) {
// if (logger.isDebugEnabled()) {
// logger.debug(this.getMgcpRaEntityName()+" :
// updateMgcpConnectionActivity(transactionHandle=" + transactionHandle
// + ",connectionIdentifier=" + connectionIdentifier + ")");
// }
if (connectionIdentifier != null) {
ActivityHandle handle = transactionHandle2ActivityHandleMap.remove(Integer.valueOf(transactionHandle));
if (handle != null) {
// confirm activity exists
MgcpConnectionActivityImpl activity = connectionActivities.get(handle);
if (activity == null) {
logger.warn(this.getMgcpRaEntityName()
+ " : update of MgcpConnectionActivity failed, activity for connectionIdentifier "
+ connectionIdentifier + " not found");
} else {
MgcpConnectionActivityHandle connectionHandle = (MgcpConnectionActivityHandle) handle;
// move handler from tx handler map to connection id map
connectionIdentifier2ActivityHandleMap.put(connectionIdentifier.toString(), connectionHandle);
// update activity
activity.setConnectionIdentifier(connectionIdentifier);
if (endpointIdentifier != null) {
activity.setEndpointIdentifier(endpointIdentifier);
}
// if (logger.isDebugEnabled()) {
// logger.debug(this.getMgcpRaEntityName()+" : activity for
// connectionIdentifier " + connectionIdentifier + "
// updated");
// }
return connectionHandle;
}
} else {
if (logger.isDebugEnabled()) {
logger.debug(this.getMgcpRaEntityName()
+ " : update of MgcpConnectionActivity failed, transactionHandle " + transactionHandle
+ " not found");
}
}
} else {
logger.warn(this.getMgcpRaEntityName()
+ " : update of MgcpConnectionActivity failed, connectionIdentifier is null");
}
return null;
}
public MgcpConnectionActivityHandle getMgcpConnectionActivityHandle(ConnectionIdentifier connectionIdentifier,
EndpointIdentifier endpointIdentifier, int transactionHandle) {
// if (logger.isDebugEnabled()) {
// logger.debug(this.getMgcpRaEntityName()+" :
// getMgcpConnectionActivityHandle(transactionHandle=" +
// transactionHandle
// + ",connectionIdentifier=" + connectionIdentifier + ")");
// }
if (connectionIdentifier != null) {
// get handle from connection id map
MgcpConnectionActivityHandle handle = connectionIdentifier2ActivityHandleMap.get(connectionIdentifier
.toString());
// if handle does not exist try update first the activity
return (handle != null ? handle : updateMgcpConnectionActivity(transactionHandle, connectionIdentifier,
endpointIdentifier));
} else {
return transactionHandle2ActivityHandleMap.get(Integer.valueOf(transactionHandle));
}
}
// --------- ENDPOINT ACTIVITY MANAGEMENT
// public void putMgcpEndpointActivity(MgcpEndpointActivityHandle handle,
// MgcpEndpointActivityImpl activity) {
public void putMgcpEndpointActivity(MgcpEndpointActivityImpl activity) {
// if (logger.isDebugEnabled()) {
// logger.debug(this.getMgcpRaEntityName()+" :
// putMgcpEndpointActivity(activity=" + activity + ")");
// }
endpointActivities.put(activity.getActivityHandle(), activity);
}
public MgcpEndpointActivityImpl getMgcpEndpointActivity(MgcpEndpointActivityHandle handle) {
// if (logger.isDebugEnabled()) {
// logger.debug(this.getMgcpRaEntityName()+" :
// getMgcpEndpointActivity(handle=" + handle + ")");
// }
return endpointActivities.get(handle);
}
public boolean containsMgcpEndpointActivityHandle(MgcpEndpointActivityHandle handle) {
// if (logger.isDebugEnabled()) {
// logger.debug(this.getMgcpRaEntityName()+" :
// containsMgcpEndpointActivityHandle(handle=" + handle + ")");
// }
return endpointActivities.containsKey(handle);
}
// --- COMMON
public void removeMgcpActivity(ActivityHandle handle) {
// if (logger.isDebugEnabled()) {
// logger.debug(this.getMgcpRaEntityName()+" :
// removeMgcpActivity(handle=" + handle + ")");
// }
if (handle instanceof MgcpConnectionActivityHandle) {
MgcpConnectionActivityImpl activity = connectionActivities.remove((MgcpConnectionActivityHandle) handle);
if (activity != null) {
// if (logger.isDebugEnabled()) {
// logger.debug(this.getMgcpRaEntityName()+" : removed
// connection activity for handle " + handle);
// }
if (activity.getConnectionIdentifier() != null) {
if (connectionIdentifier2ActivityHandleMap.remove(activity.getConnectionIdentifier()) != null) {
if (logger.isDebugEnabled()) {
logger.debug(this.getMgcpRaEntityName()
+ " : removed connection identifier mapping for handle " + handle);
}
}
} else {
if (transactionHandle2ActivityHandleMap.remove(activity.getTransactionHandle()) != null) {
if (logger.isDebugEnabled()) {
logger.debug(this.getMgcpRaEntityName()
+ " : removed tx handle mapping for activity handle " + handle);
}
}
}
} else {
logger.warn(this.getMgcpRaEntityName() + " : connection activity for handle " + handle + " not found");
}
} else if (handle instanceof MgcpEndpointActivityHandle) {
MgcpEndpointActivityImpl activity = endpointActivities.remove((MgcpEndpointActivityHandle) handle);
if (activity != null) {
if (logger.isDebugEnabled()) {
logger.debug(this.getMgcpRaEntityName() + " : removed endpoint activity for handle " + handle);
}
} else {
logger.warn(this.getMgcpRaEntityName() + " : endpoint activity for handle " + handle + " not found");
}
}
}
public boolean containsActivityHandle(ActivityHandle handle) {
// if (logger.isDebugEnabled()) {
// logger.debug(this.getMgcpRaEntityName()+" :
// containsActivityHandle(handle=" + handle + ")");
// }
if (handle instanceof MgcpConnectionActivityHandle) {
return connectionActivities.containsKey((MgcpConnectionActivityHandle) handle);
} else if (handle instanceof MgcpEndpointActivityHandle) {
return endpointActivities.containsKey((MgcpEndpointActivityHandle) handle);
} else {
return false;
}
}
public Object getActivity(ActivityHandle handle) {
// if (logger.isDebugEnabled()) {
// logger.debug(this.getMgcpRaEntityName()+" : getActivity(handle=" +
// handle + ")");
// }
if (handle instanceof MgcpConnectionActivityHandle) {
return connectionActivities.get((MgcpConnectionActivityHandle) handle);
} else if (handle instanceof MgcpEndpointActivityHandle) {
return endpointActivities.get((MgcpEndpointActivityHandle) handle);
} else {
return null;
}
}
public ActivityHandle getActivityHandle(Object activity) {
// if (logger.isDebugEnabled()) {
// logger.debug(this.getMgcpRaEntityName()+" :
// getActivityHandle(activity=" + activity + ")");
// }
if (activity instanceof MgcpConnectionActivityImpl) {
MgcpConnectionActivityImpl castedActivity = (MgcpConnectionActivityImpl) activity;
return castedActivity.getActivityHandle();
} else if (activity instanceof MgcpEndpointActivityImpl) {
MgcpEndpointActivityHandle handle = ((MgcpEndpointActivityImpl) activity).getActivityHandle();
if (endpointActivities.containsKey(handle)) {
return handle;
} else {
return null;
}
} else {
return null;
}
}
public String getMgcpRaEntityName() {
return mgcpRaEntityName;
}
public void setMgcpRaEntityName(String mgcpRaEntityName) {
this.mgcpRaEntityName = mgcpRaEntityName;
}
}