package org.mobicents.slee.enabler.userprofile.jpa.jmx;
import java.util.ArrayList;
import java.util.Arrays;
import javax.management.InstanceAlreadyExistsException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.naming.InitialContext;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.slee.management.ManagementException;
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
import org.apache.log4j.Logger;
import org.mobicents.slee.container.SleeContainer;
import org.mobicents.slee.enabler.userprofile.jpa.UserProfile;
/**
* Management interface for user profiles stored on JPA.
*
* @author martins
*
*/
public class UserProfileControlManagement implements
UserProfileControlManagementMBean {
private static final Logger logger = Logger
.getLogger(UserProfileControlManagement.class);
private TransactionManager txMgr;
/**
* the jpa entity manager factory to manage user profiles
*/
private EntityManagerFactory entityManagerFactory;
/**
*
* @throws Exception
*/
public void startService() throws Exception {
txMgr = (TransactionManager) new InitialContext().lookup("java:/TransactionManager");
Transaction tx = txMgr.suspend();
entityManagerFactory = Persistence
.createEntityManagerFactory("mobicents-slee-enabler-userprofile-pu");
txMgr.resume(tx);
MBeanServer mbs = SleeContainer.lookupFromJndi().getMBeanServer();
ObjectName on = null;
try {
on = new ObjectName(MBEAN_NAME);
} catch (MalformedObjectNameException e) {
logger.error(e);
}
try {
if (mbs.getObjectInstance(on) != null) {
mbs.unregisterMBean(on);
}
} catch (InstanceNotFoundException e) {
// ignore
} catch (Exception e) {
logger.error(e);
}
try {
mbs.registerMBean(this, on);
} catch (InstanceAlreadyExistsException e) {
logger.error(e);
}
logger.info("Management MBean started.");
}
/**
*
*/
public void stopService() {
try {
SleeContainer.lookupFromJndi().getMBeanServer().unregisterMBean(
new ObjectName(MBEAN_NAME));
logger.info("Management MBean stopped.");
Transaction tx = txMgr.suspend();
entityManagerFactory.close();
txMgr.resume(tx);
entityManagerFactory = null;
} catch (Exception e) {
logger.error("Failed to stop Management MBean.", e);
}
}
/*
* (non-Javadoc)
*
* @seeorg.mobicents.slee.xdm.server.userprofile.jmx.
* UserProfileControlManagementMBean#addUser(java.lang.String,
* java.lang.String)
*/
public void addUser(String username, String password)
throws NullPointerException, IllegalStateException, ManagementException {
if (logger.isDebugEnabled()) {
logger.debug("addUser( username = "+username+")");
}
if (username == null)
throw new NullPointerException("null username");
if (getUser(username) != null) {
throw new IllegalStateException("user "+username+" already exists");
}
EntityManager entityManager = null;
try {
txMgr.begin();
entityManager = entityManagerFactory.createEntityManager();
UserProfile userProfile = new UserProfile(username);
userProfile.setPassword(password);
entityManager.persist(userProfile);
txMgr.commit();
if (logger.isInfoEnabled()) {
logger.info("Added user "+username);
}
} catch (Throwable e) {
try {
txMgr.rollback();
} catch (Throwable f) {
logger.error(e.getMessage(),e);
}
throw new ManagementException(e.getMessage(), e);
} finally {
if (entityManager != null) {
entityManager.close();
}
}
}
/*
* (non-Javadoc)
*
* @seeorg.mobicents.slee.xdm.server.userprofile.jmx.
* UserProfileControlManagementMBean#getUsers()
*/
public String[] listUsers() throws ManagementException {
if (logger.isDebugEnabled()) {
logger.debug("listUsers()");
}
EntityManager entityManager = null;
try {
entityManager = entityManagerFactory.createEntityManager();
ArrayList<String> resultList = new ArrayList<String>();
for (Object result : entityManager.createNamedQuery(
UserProfile.JPA_NAMED_QUERY_SELECT_ALL_USERPROFILES)
.getResultList()) {
UserProfile userProfile = (UserProfile) result;
resultList.add(userProfile.getUsername());
}
String[] resultArray = new String[resultList.size()];
return resultList.toArray(resultArray);
} catch (Throwable e) {
throw new ManagementException(e.getMessage(), e);
} finally {
if (entityManager != null) {
entityManager.close();
}
}
}
/*
* (non-Javadoc)
* @see org.mobicents.slee.enabler.userprofile.jpa.jmx.UserProfileControlManagementMBean#listUsersAsString()
*/
public String listUsersAsString() throws ManagementException {
return Arrays.asList(listUsers()).toString();
}
/*
* (non-Javadoc)
*
* @seeorg.mobicents.slee.xdm.server.userprofile.jmx.
* UserProfileControlManagementMBean#removeUser(java.lang.String)
*/
public boolean removeUser(String username)
throws NullPointerException, ManagementException {
if (logger.isDebugEnabled()) {
logger.debug("removeUser( username = "+username+" )");
}
if (username == null)
throw new NullPointerException("null username");
EntityManager entityManager = null;
try {
txMgr.begin();
entityManager = entityManagerFactory.createEntityManager();
UserProfile userProfile = entityManager.find(UserProfile.class,username);
boolean exists = userProfile != null;
if (exists) {
entityManager.remove(userProfile);
if (logger.isInfoEnabled()) {
logger.info("Removed user "+username);
}
}
txMgr.commit();
return exists;
} catch (Throwable e) {
try {
txMgr.rollback();
} catch (Throwable f) {
logger.error(e.getMessage(),e);
}
throw new ManagementException(e.getMessage(), e);
} finally {
if (entityManager != null) {
entityManager.close();
}
}
}
/**
* Retrieves the user profile for the specified username.
*
* @param username
* @return
* @throws NullPointerException
*/
public UserProfile getUser(String username)
throws NullPointerException {
if (logger.isDebugEnabled()) {
logger.debug("getUser( username = "+username+" )");
}
if (username == null)
throw new NullPointerException("null username");
EntityManager entityManager = entityManagerFactory
.createEntityManager();
UserProfile userProfile = entityManager.find(UserProfile.class,username);
entityManager.close();
return userProfile;
}
}