package org.mobicents.slee.services.sip.location.jpa;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.naming.InitialContext;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.transaction.TransactionManager;
import org.apache.log4j.Logger;
import org.mobicents.slee.services.sip.location.LocationService;
import org.mobicents.slee.services.sip.location.LocationServiceException;
import org.mobicents.slee.services.sip.location.RegistrationBinding;
import org.mobicents.slee.services.sip.location.jmx.LocationServiceManagement;
/**
*
* Location Service implemented using JPA, which can be a HA data source.
*
* @author martins
*/
public class JPALocationService implements LocationService {
private static EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("mobicents-slee-examples-sipservices-location-pu");
private static final Logger logger = Logger.getLogger(LocationService.class);
public void init() {
// init JPA EM factory
if (entityManagerFactory == null || !entityManagerFactory.isOpen()) {
entityManagerFactory = Persistence.createEntityManagerFactory("mobicents-slee-examples-sipservices-location-pu");
}
// start MBean
LocationServiceManagement.create(this);
logger.info("JPA Location Service started.");
}
public void shutdown() {
// stop MBean
LocationServiceManagement.destroy();
// close JPA EM factory
entityManagerFactory.close();
entityManagerFactory = null;
logger.info("JPA Location Service shutdown.");
}
public RegistrationBinding addBinding(String sipAddress, String contactAddress, String comment, long expires, long registrationDate, float qValue, String callId, long cSeq)
throws LocationServiceException {
EntityManager entityManager = entityManagerFactory.createEntityManager();
JPARegistrationBinding registrationBinding = new JPARegistrationBinding(sipAddress,contactAddress,comment,expires,registrationDate,qValue,callId,cSeq);
try {
entityManager.persist(registrationBinding);
return registrationBinding;
} catch (Exception e) {
throw new LocationServiceException(e.getLocalizedMessage());
} finally {
entityManager.close();
}
}
public Map<String,RegistrationBinding> getBindings(String sipAddress) throws LocationServiceException {
EntityManager entityManager = entityManagerFactory
.createEntityManager();
Map<String, RegistrationBinding> resultMap = new HashMap<String,RegistrationBinding>();
try {
List resultList = entityManager.createNamedQuery(
"selectBindingsForSipAddress").setParameter("sipAddress",
sipAddress).getResultList();
for (Object object : resultList) {
RegistrationBinding registrationBinding = (RegistrationBinding) object;
resultMap.put(registrationBinding.getContactAddress(),
registrationBinding);
}
} catch (Exception e) {
throw new LocationServiceException(e.getLocalizedMessage());
} finally {
entityManager.close();
}
return resultMap;
}
public void updateBinding(RegistrationBinding registrationBinding)
throws LocationServiceException {
EntityManager entityManager = entityManagerFactory
.createEntityManager();
JPARegistrationBinding jPARegistrationBinding = (JPARegistrationBinding) registrationBinding;
try {
entityManager.createNamedQuery(
"updateBindingByKey")
.setParameter("sipAddress",jPARegistrationBinding.getKey().getSipAddress())
.setParameter("contactAddress", jPARegistrationBinding.getKey().getContactAddress())
.setParameter("callId", jPARegistrationBinding.getCallId())
.setParameter("comment", jPARegistrationBinding.getComment())
.setParameter("cSeq", jPARegistrationBinding.getCSeq())
.setParameter("expires", jPARegistrationBinding.getExpires())
.setParameter("registrationDate", jPARegistrationBinding.getRegistrationDate())
.setParameter("qValue", jPARegistrationBinding.getQValue())
.executeUpdate();
} catch (Exception e) {
throw new LocationServiceException(e.getLocalizedMessage());
} finally {
entityManager.close();
}
}
public void removeBinding(String sipAddress, String sipContact)
throws LocationServiceException {
EntityManager entityManager = entityManagerFactory
.createEntityManager();
try {
entityManager.createNamedQuery(
"deleteBindingsByKey")
.setParameter("sipAddress",sipAddress)
.setParameter("contactAddress", sipContact)
.executeUpdate();
} catch (Exception e) {
throw new LocationServiceException(e.getLocalizedMessage());
} finally {
entityManager.close();
}
}
public Set<String> getRegisteredUsers() throws LocationServiceException {
TransactionManager transactionManager = null;
EntityManager entityManager = null;
boolean startedTx = false;
try {
transactionManager = (TransactionManager) new InitialContext().lookup("java:/TransactionManager");
if (transactionManager.getTransaction() == null) {
transactionManager.begin();
startedTx = true;
}
entityManager = entityManagerFactory
.createEntityManager();
HashSet<String> resultSet = new HashSet<String>();
List resultList = entityManager.createNamedQuery(
"selectAllBindings").getResultList();
for (Object object:resultList) {
JPARegistrationBinding registrationBinding = (JPARegistrationBinding) object;
resultSet.add(registrationBinding.getKey().getSipAddress());
}
return resultSet;
} catch (Exception e) {
throw new LocationServiceException(e.getLocalizedMessage());
}
finally {
if (entityManager != null) {
try {
entityManager.close();
}
catch (Exception f) {
throw new LocationServiceException(f.getLocalizedMessage());
}
}
if (startedTx && transactionManager != null) {
try {
transactionManager.commit();
}
catch (Exception f) {
throw new LocationServiceException(f.getLocalizedMessage());
}
}
}
}
// MBEAN RELATED METHODS
public Set<String> getContacts(String sipAddress) throws LocationServiceException {
TransactionManager transactionManager = null;
try {
transactionManager = (TransactionManager) new InitialContext().lookup("java:/TransactionManager");
transactionManager.begin();
return getBindings(sipAddress).keySet();
} catch (Exception e) {
throw new LocationServiceException(e.getLocalizedMessage());
}
finally {
if (transactionManager != null) {
try {
transactionManager.commit();
}
catch (Exception f) {
throw new LocationServiceException(f.getLocalizedMessage());
}
}
}
}
public long getExpirationTime(String sipAddress, String contactAddress) throws LocationServiceException {
TransactionManager transactionManager = null;
EntityManager entityManager = null;
try {
transactionManager = (TransactionManager) new InitialContext().lookup("java:/TransactionManager");
transactionManager.begin();
entityManager = entityManagerFactory.createEntityManager();
Map<String,RegistrationBinding> bindings = getBindings(sipAddress);
for (String address : bindings.keySet()) {
if (address.equals(contactAddress)) {
return bindings.get(address).getExpiresDelta();
}
}
return -1;
} catch (Exception e) {
throw new LocationServiceException(e.getLocalizedMessage());
}
finally {
if (entityManager != null) {
try {
entityManager.close();
}
catch (Exception f) {
throw new LocationServiceException(f.getLocalizedMessage());
}
}
if (transactionManager != null) {
try {
transactionManager.commit();
}
catch (Exception f) {
throw new LocationServiceException(f.getLocalizedMessage());
}
}
}
}
public int getRegisteredUserCount() throws LocationServiceException {
return getRegisteredUsers().size();
}
}