package org.mobicents.slee.container.management;
import java.lang.reflect.Constructor;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import javax.management.ObjectName;
import javax.slee.InvalidArgumentException;
import javax.slee.InvalidStateException;
import javax.slee.SLEEException;
import javax.slee.SbbID;
import javax.slee.TransactionRequiredLocalException;
import javax.slee.management.DependencyException;
import javax.slee.management.DeploymentException;
import javax.slee.management.LinkNameAlreadyBoundException;
import javax.slee.management.ResourceAdaptorEntityAlreadyExistsException;
import javax.slee.management.ResourceAdaptorEntityNotification;
import javax.slee.management.ResourceAdaptorEntityState;
import javax.slee.management.ResourceManagementMBean;
import javax.slee.management.ResourceUsageMBean;
import javax.slee.management.UnrecognizedLinkNameException;
import javax.slee.management.UnrecognizedResourceAdaptorEntityException;
import javax.slee.management.UnrecognizedResourceAdaptorException;
import javax.slee.resource.ConfigProperties;
import javax.slee.resource.InvalidConfigurationException;
import javax.slee.resource.ResourceAdaptorID;
import javax.slee.resource.ResourceAdaptorTypeID;
import javax.transaction.NotSupportedException;
import javax.transaction.SystemException;
import org.apache.log4j.Logger;
import org.mobicents.slee.container.SleeContainer;
import org.mobicents.slee.container.component.ComponentRepositoryImpl;
import org.mobicents.slee.container.component.ResourceAdaptorComponent;
import org.mobicents.slee.container.component.ResourceAdaptorTypeComponent;
import org.mobicents.slee.container.component.SbbComponent;
import org.mobicents.slee.container.component.deployment.jaxb.descriptors.sbb.MResourceAdaptorEntityBinding;
import org.mobicents.slee.container.component.deployment.jaxb.descriptors.sbb.MResourceAdaptorTypeBinding;
import org.mobicents.slee.container.deployment.ResourceAdaptorClassCodeGenerator;
import org.mobicents.slee.container.deployment.ResourceAdaptorTypeClassCodeGenerator;
import org.mobicents.slee.container.management.jmx.ResourceUsageMBeanImpl;
import org.mobicents.slee.container.management.jmx.TraceMBeanImpl;
import org.mobicents.slee.resource.ResourceAdaptorEntity;
import org.mobicents.slee.runtime.transaction.TransactionalAction;
/**
*
* Manages deployed resource adaptor components.
*
* @author Eduardo Martins
*
*/
public class ResourceManagement {
private Logger logger = Logger.getLogger(ResourceManagement.class);
/**
* the resource adaptor entities mapped by name
*/
private ConcurrentHashMap<String, ResourceAdaptorEntity> resourceAdaptorEntities;
/**
* the set of resource adaptor entities aggregated per ra type, this is a runtime cache for optimal performance on ra type activity context factories
*/
private ConcurrentHashMap<ResourceAdaptorTypeID, Set<ResourceAdaptorEntity>> entitiesPerType = new ConcurrentHashMap<ResourceAdaptorTypeID, Set<ResourceAdaptorEntity>>();
/**
* the resource adaptor entity name links
*/
private ConcurrentHashMap<String, String> resourceAdaptorEntityLinks;
/**
* the container
*/
private SleeContainer sleeContainer;
public ResourceManagement(SleeContainer sleeContainer) {
resourceAdaptorEntities = new ConcurrentHashMap<String, ResourceAdaptorEntity>();
resourceAdaptorEntityLinks = new ConcurrentHashMap<String, String>();
this.sleeContainer = sleeContainer;
}
// --- MBEAN methods
/**
* @see ResourceManagementMBean#createResourceAdaptorEntity(ResourceAdaptorID,
* String, ConfigProperties)
*/
public void createResourceAdaptorEntity(ResourceAdaptorID id,
String entityName, ConfigProperties properties)
throws NullPointerException, InvalidArgumentException,
UnrecognizedResourceAdaptorException,
ResourceAdaptorEntityAlreadyExistsException,
InvalidConfigurationException {
if (logger.isDebugEnabled()) {
logger.debug("Creating RA Entity. Id: " + id + ", name: "
+ entityName + ", properties: " + properties);
}
synchronized (sleeContainer.getManagementMonitor()) {
if (id == null) {
throw new NullPointerException("null ra id");
}
if (properties == null) {
throw new NullPointerException("null config properties");
}
/*
* javax.slee.InvalidArgumentExceptionThis exception is thrown if
* the resource adaptor entity name argument is not a valid. A
* resource adaptor entity name cannot be null or zero-length, and
* may only contain letter or digit characters as defined by
* java.lang.Character.isLetterOrDigit. Additionally, any other
* character in the Unicode range 0x0020-0x007e may be included in a
* resource adaptor entity name.
*/
if (entityName == null) {
throw new InvalidArgumentException("entityName is null");
}
if (entityName.length() == 0) {
throw new InvalidArgumentException("entityName is zero length");
}
validateNewEntityOrLinkName(entityName);
ResourceAdaptorComponent component = getResourceAdaptorComponent(id);
if (component == null) {
throw new UnrecognizedResourceAdaptorException(
"Failed to create RA Entity. RA ID: " + id
+ " not found.");
}
else {
final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(component.getClassLoader());
try {
if (this.resourceAdaptorEntities.containsKey(entityName)) {
throw new ResourceAdaptorEntityAlreadyExistsException(
"Failed to create RA Entity. Resource Adpator Entity Name: "
+ entityName + " already exists! RA ID: " + id);
}
TraceMBeanImpl traceMBeanImpl = sleeContainer.getTraceMBean();
ResourceAdaptorEntityNotification notificationSource = new ResourceAdaptorEntityNotification(entityName);
traceMBeanImpl.registerNotificationSource(notificationSource);
ResourceAdaptorEntity raEntity =null;
try {
raEntity = new ResourceAdaptorEntity(
entityName, component, properties, sleeContainer,notificationSource);
}
catch (InvalidConfigurationException e) {
traceMBeanImpl.deregisterNotificationSource(notificationSource);
throw e;
}
catch (InvalidArgumentException e) {
traceMBeanImpl.deregisterNotificationSource(notificationSource);
throw e;
}
catch (SLEEException e) {
traceMBeanImpl.deregisterNotificationSource(notificationSource);
throw e;
}
catch (Throwable e) {
traceMBeanImpl.deregisterNotificationSource(notificationSource);
throw new SLEEException(e.getMessage(),e);
}
for (ResourceAdaptorTypeID resourceAdaptorTypeID : component.getSpecsDescriptor().getResourceAdaptorTypes()) {
Set<ResourceAdaptorEntity> set = entitiesPerType.get(resourceAdaptorTypeID);
if (set == null) {
throw new SLEEException("there is no set of ra entities for "+resourceAdaptorTypeID);
}
else {
set.add(raEntity);
}
}
this.resourceAdaptorEntities.put(entityName, raEntity);
if (component.getUsageParametersInterface() != null) {
// create resource usage mbean
ResourceUsageMBeanImpl resourceUsageMBeanImpl = null;
try {
ObjectName objectName = new ObjectName(ResourceUsageMBean.BASE_OBJECT_NAME+','+ResourceUsageMBean.RESOURCE_ADAPTOR_ENTITY_NAME_KEY+'='+ObjectName.quote(entityName));
resourceUsageMBeanImpl = new ResourceUsageMBeanImpl(entityName,component,sleeContainer);
resourceUsageMBeanImpl.setObjectName(objectName);
sleeContainer.getMBeanServer().registerMBean(resourceUsageMBeanImpl, objectName);
raEntity.setResourceUsageMBean(resourceUsageMBeanImpl);
// create default usage param set
resourceUsageMBeanImpl.createUsageParameterSet();
} catch (Throwable e) {
if (resourceUsageMBeanImpl != null) {
resourceUsageMBeanImpl.remove();
}
for (ResourceAdaptorTypeID resourceAdaptorTypeID : component.getSpecsDescriptor().getResourceAdaptorTypes()) {
entitiesPerType.get(resourceAdaptorTypeID).remove(raEntity);
}
this.resourceAdaptorEntities.remove(raEntity);
try {
raEntity.remove();
} catch (InvalidStateException e1) {
logger.error(e.getMessage(),e);
}
throw new SLEEException("failed to create and register entity resource usage mbean",e);
}
}
logger.info("Created Resource Adaptor Entity "+entityName+" for " + id+" Config Properties: " + properties);
}
finally {
Thread.currentThread().setContextClassLoader(classLoader);
}
}
}
}
/**
* @see ResourceManagementMBean#activateResourceAdaptorEntity(String)
*/
public void activateResourceAdaptorEntity(String entityName)
throws NullPointerException,
UnrecognizedResourceAdaptorEntityException, InvalidStateException {
if (logger.isDebugEnabled()) {
logger.debug("Activating RA Entity " + entityName);
}
if (entityName == null) {
throw new NullPointerException("null entity name");
}
synchronized (sleeContainer.getManagementMonitor()) {
final ResourceAdaptorEntity raEntity = this.resourceAdaptorEntities
.get(entityName);
if (raEntity == null) {
throw new UnrecognizedResourceAdaptorEntityException(
"Resource Adaptor Entity " + entityName + " not found.");
} else {
final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(raEntity.getComponent().getClassLoader());
try {
raEntity.activate();
logger.info("Activated RA Entity " + entityName);
}
finally {
Thread.currentThread().setContextClassLoader(classLoader);
}
}
}
}
/**
* @see ResourceManagementMBean#deactivateResourceAdaptorEntity(String)
*/
public void deactivateResourceAdaptorEntity(String entityName)
throws NullPointerException,
UnrecognizedResourceAdaptorEntityException, InvalidStateException {
if (logger.isDebugEnabled()) {
logger.debug("Deactivating RA Entity " + entityName);
}
if (entityName == null) {
throw new NullPointerException("null entity name");
}
synchronized (sleeContainer.getManagementMonitor()) {
final ResourceAdaptorEntity raEntity = this.resourceAdaptorEntities
.get(entityName);
if (raEntity == null) {
throw new UnrecognizedResourceAdaptorEntityException(
"Resource Adaptor Entity " + entityName + " not found.");
} else {
final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(raEntity.getComponent().getClassLoader());
boolean rollback = true;
try {
sleeContainer.getTransactionManager().begin();
raEntity.deactivate();
rollback = false;
} catch (NotSupportedException e) {
throw new SLEEException(e.getMessage(),e);
} catch (SystemException e) {
throw new SLEEException(e.getMessage(),e);
} catch (TransactionRequiredLocalException e) {
throw new SLEEException(e.getMessage(),e);
}
finally {
try {
if (rollback) {
sleeContainer.getTransactionManager().rollback();
}
else {
sleeContainer.getTransactionManager().commit();
}
}
catch (Throwable e) {
throw new SLEEException(e.getMessage(),e);
}
finally {
Thread.currentThread().setContextClassLoader(classLoader);
}
}
logger.info("Deactivated RA Entity " + entityName);
}
}
}
/**
* @see ResourceManagementMBean#removeResourceAdaptorEntity(String)
*/
public void removeResourceAdaptorEntity(String entityName)
throws java.lang.NullPointerException,
UnrecognizedResourceAdaptorEntityException, InvalidStateException,
DependencyException {
if (logger.isDebugEnabled()) {
logger.debug("Removing RA Entity " + entityName);
}
if (entityName == null) {
throw new NullPointerException("null entity name");
}
synchronized (sleeContainer.getManagementMonitor()) {
final ResourceAdaptorEntity raEntity = this.resourceAdaptorEntities
.get(entityName);
if (raEntity == null) {
throw new UnrecognizedResourceAdaptorEntityException(
"Resource Adaptor Entity " + entityName + " not found.");
}
else {
final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(raEntity.getComponent().getClassLoader());
try {
if (this.resourceAdaptorEntityLinks.containsValue(entityName)) {
throw new DependencyException("entity name has link(s)");
}
raEntity.remove();
this.resourceAdaptorEntities.remove(entityName);
for (ResourceAdaptorTypeID resourceAdaptorTypeID : raEntity.getComponent().getSpecsDescriptor().getResourceAdaptorTypes()) {
Set<ResourceAdaptorEntity> set = entitiesPerType.get(resourceAdaptorTypeID);
if (set == null) {
throw new SLEEException("there is no set of ra entities for "+resourceAdaptorTypeID);
}
else {
set.remove(raEntity);
}
}
ResourceUsageMBeanImpl resourceUsageMBeanImpl = raEntity.getResourceUsageMBean();
if (resourceUsageMBeanImpl != null) {
resourceUsageMBeanImpl.remove();
}
logger.info("Removed RA Entity " + entityName);
}
finally {
Thread.currentThread().setContextClassLoader(classLoader);
}
}
}
}
/**
*
* @see ResourceManagementMBean#updateConfigurationProperties(String,
* ConfigProperties)
*/
public void updateConfigurationProperties(String entityName,
ConfigProperties properties) throws NullPointerException,
UnrecognizedResourceAdaptorEntityException, InvalidStateException,
InvalidConfigurationException {
if (logger.isDebugEnabled()) {
logger.debug("Updating RA Entity with properties: " + properties);
}
if (entityName == null) {
throw new NullPointerException("null entity name");
}
if (properties == null) {
throw new NullPointerException("null config properties");
}
final ResourceAdaptorEntity raEntity = this.resourceAdaptorEntities
.get(entityName);
if (raEntity == null) {
throw new UnrecognizedResourceAdaptorEntityException(
"Resource Adaptor Entity " + entityName + " not found.");
} else {
final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(raEntity.getComponent().getClassLoader());
try {
raEntity.updateConfigurationProperties(properties);
logger.info("Updated RA Entity with properties: " + properties);
}
finally {
Thread.currentThread().setContextClassLoader(classLoader);
}
}
}
/**
* @see ResourceManagementMBean#bindLinkName(String, String)
*/
public void bindLinkName(String linkName, String entityName)
throws NullPointerException, InvalidArgumentException,
UnrecognizedResourceAdaptorEntityException,
LinkNameAlreadyBoundException {
if (logger.isDebugEnabled()) {
logger.debug("Binding link between RA Entity " + entityName
+ " and Name " + linkName);
}
if (linkName == null) {
throw new NullPointerException("null link name");
}
if (entityName == null) {
throw new NullPointerException("null entity name");
}
synchronized (sleeContainer.getManagementMonitor()) {
if (this.resourceAdaptorEntityLinks.containsKey(linkName)) {
throw new LinkNameAlreadyBoundException(linkName);
}
if (!this.resourceAdaptorEntities.containsKey(entityName)) {
throw new UnrecognizedResourceAdaptorEntityException(entityName);
}
validateNewEntityOrLinkName(linkName);
this.resourceAdaptorEntityLinks.put(linkName, entityName);
logger.info("Bound link between RA Entity " + entityName
+ " and Name " + linkName);
}
}
/**
* @see ResourceManagementMBean#unbindLinkName(String)
*/
public void unbindLinkName(String linkName) throws NullPointerException,
UnrecognizedLinkNameException, DependencyException {
if (logger.isDebugEnabled()) {
logger.debug("Unbinding RA Entity Link " + linkName);
}
synchronized (sleeContainer.getManagementMonitor()) {
if (sleeContainer.getServiceManagement().isRAEntityLinkNameReferenced(linkName)) {
throw new DependencyException(linkName + " link name is still used by sbbs");
} else {
this.resourceAdaptorEntityLinks.remove(linkName);
logger.info("Unbound RA Entity Link " + linkName);
}
}
}
/**
*
* @see ResourceManagementMBean#getResourceAdaptorEntities(ResourceAdaptorEntityState)
*/
public String[] getResourceAdaptorEntities(ResourceAdaptorEntityState state)
throws NullPointerException {
if (logger.isDebugEnabled()) {
logger.debug("Getting RA Entities with state " + state);
}
if (state == null) {
throw new NullPointerException("null entity state");
}
HashSet<String> resultEntityNames = new HashSet<String>();
for (ResourceAdaptorEntity resourceAdaptorEntity : resourceAdaptorEntities
.values()) {
if (resourceAdaptorEntity.getState() == state) {
resultEntityNames.add(resourceAdaptorEntity.getName());
}
}
String[] resultEntityNamesArray = new String[resultEntityNames.size()];
resultEntityNamesArray = resultEntityNames
.toArray(resultEntityNamesArray);
if (logger.isDebugEnabled()) {
logger.debug("Got RA Entities with state " + state + " : "
+ resultEntityNames);
}
return resultEntityNamesArray;
}
/**
* @see ResourceManagementMBean#getLinkNames()
*/
public String[] getLinkNames() {
if (logger.isDebugEnabled()) {
logger.debug("Getting RA link names");
}
String[] linkNames = getLinkNamesSet().toArray(
new String[0]);
if (logger.isDebugEnabled()) {
logger.debug("Got RA link names : " + Arrays.asList(linkNames));
}
return linkNames;
}
/**
* Retrieves a copy of the current set of ra entity links
* @return
*/
public Set<String> getLinkNamesSet() {
return Collections.unmodifiableSet(resourceAdaptorEntityLinks.keySet());
}
/**
* @see ResourceManagementMBean#getLinkNames(String)
*/
public String[] getLinkNames(String entityName)
throws NullPointerException,
UnrecognizedResourceAdaptorEntityException {
if (logger.isDebugEnabled()) {
logger.debug("Getting RA link names for entity name " + entityName);
}
if (entityName == null)
throw new NullPointerException("null entity name");
if (!this.resourceAdaptorEntities.containsKey(entityName)) {
throw new UnrecognizedResourceAdaptorEntityException(entityName);
}
HashSet<String> linkNames = new HashSet<String>();
for (String linkName : resourceAdaptorEntityLinks.keySet()) {
if (resourceAdaptorEntityLinks.get(linkName).equals(entityName)) {
linkNames.add(linkName);
}
}
String[] linkNamesArray = new String[linkNames.size()];
linkNamesArray = linkNames.toArray(linkNamesArray);
if (logger.isDebugEnabled()) {
logger.debug("Got RA link names for entity " + entityName + " : "
+ linkNames);
}
return linkNamesArray;
}
/**
* @see ResourceManagementMBean#getBoundSbbs(String)
*/
public SbbID[] getBoundSbbs(String linkName) throws NullPointerException,
UnrecognizedLinkNameException {
if (logger.isDebugEnabled()) {
logger.debug("Getting sbbs bound to link name " + linkName);
}
if (linkName == null) {
throw new NullPointerException("null link name");
}
synchronized (sleeContainer.getManagementMonitor()) {
if (!this.resourceAdaptorEntityLinks.containsKey(linkName)) {
throw new UnrecognizedLinkNameException(linkName);
}
final Set<SbbID> boundSbbsSet = new HashSet<SbbID>();
final ComponentRepositoryImpl componentRepository = sleeContainer
.getComponentRepositoryImpl();
for (SbbID sbbID : componentRepository.getSbbIDs()) {
SbbComponent sbbComponent = componentRepository
.getComponentByID(sbbID);
for (MResourceAdaptorTypeBinding raTypeBinding : sbbComponent
.getDescriptor().getResourceAdaptorTypeBindings()) {
for (MResourceAdaptorEntityBinding raEntityBinding : raTypeBinding
.getResourceAdaptorEntityBinding()) {
if (raEntityBinding.getResourceAdaptorEntityLink()
.equals(linkName)) {
boundSbbsSet.add(sbbID);
}
}
}
}
SbbID[] result = boundSbbsSet
.toArray(new SbbID[boundSbbsSet.size()]);
if (logger.isDebugEnabled()) {
logger.debug("Got sbbs bound to link name " + linkName + " : "
+ boundSbbsSet);
}
return result;
}
}
/**
* @see ResourceManagementMBean#getConfigurationProperties(ResourceAdaptorID)
*/
public ConfigProperties getConfigurationProperties(ResourceAdaptorID id)
throws NullPointerException, UnrecognizedResourceAdaptorException {
if (logger.isDebugEnabled()) {
logger.debug("Getting configuration properties for RA with id "
+ id);
}
if (id == null)
throw new NullPointerException("null resource adaptor id");
ResourceAdaptorComponent component = getResourceAdaptorComponent(id);
if (component == null) {
throw new UnrecognizedResourceAdaptorException(
"unrecognized resource adaptor " + id.toString());
} else {
return component.getDefaultConfigPropertiesInstance();
}
}
/**
* @see ResourceManagementMBean#getConfigurationProperties(String)
*/
public ConfigProperties getConfigurationProperties(String entityName)
throws NullPointerException,
UnrecognizedResourceAdaptorEntityException {
if (logger.isDebugEnabled()) {
logger
.debug("Getting configuration properties for RA entity with name "
+ entityName);
}
if (entityName == null)
throw new NullPointerException("null entity name");
final ResourceAdaptorEntity resourceAdaptorEntity = this.resourceAdaptorEntities
.get(entityName);
if (resourceAdaptorEntity == null) {
throw new UnrecognizedResourceAdaptorEntityException(entityName);
} else {
return resourceAdaptorEntity.getConfigurationProperties();
}
}
/**
* @see ResourceManagementMBean#getResourceAdaptor(String)
*/
public ResourceAdaptorID getResourceAdaptor(String entityName)
throws NullPointerException,
UnrecognizedResourceAdaptorEntityException {
if (logger.isDebugEnabled()) {
logger.debug("Getting RA ID for RA entity with name " + entityName);
}
if (entityName == null)
throw new NullPointerException("null entity name");
ResourceAdaptorEntity resourceAdaptorEntity = (ResourceAdaptorEntity) resourceAdaptorEntities
.get(entityName);
if (resourceAdaptorEntity == null) {
throw new UnrecognizedResourceAdaptorEntityException("Entity "
+ entityName + " not found");
} else {
return resourceAdaptorEntity.getResourceAdaptorID();
}
}
/**
* @see ResourceManagementMBean#getResourceAdaptorEntities()
*/
public String[] getResourceAdaptorEntities() {
if (logger.isDebugEnabled()) {
logger.debug("Getting RA entity names");
}
synchronized (sleeContainer.getManagementMonitor()) {
return resourceAdaptorEntities.keySet().toArray(new String[0]);
}
}
/**
* @see ResourceManagementMBean#getResourceAdaptorEntities(ResourceAdaptorID)
*/
public String[] getResourceAdaptorEntities(
ResourceAdaptorID resourceAdaptorID) throws NullPointerException,
UnrecognizedResourceAdaptorException {
if (logger.isDebugEnabled()) {
logger.debug("Getting RA entity names for ra with ID "
+ resourceAdaptorID);
}
if (resourceAdaptorID == null) {
throw new NullPointerException("null resource adaptor");
}
synchronized (sleeContainer.getManagementMonitor()) {
ResourceAdaptorComponent component = getResourceAdaptorComponent(resourceAdaptorID);
if (component == null) {
throw new UnrecognizedResourceAdaptorException(
resourceAdaptorID.toString());
} else {
Set<String> entityNameSet = new HashSet<String>();
for (ResourceAdaptorEntity raEntity : resourceAdaptorEntities.values()) {
if (raEntity.getResourceAdaptorID().equals(resourceAdaptorID)) {
entityNameSet.add(raEntity.getName());
}
}
String[] entityNames = entityNameSet
.toArray(new String[entityNameSet.size()]);
if (logger.isDebugEnabled()) {
logger.debug("Got RA entity names : "
+ Arrays.asList(entityNames));
}
return entityNames;
}
}
}
/**
* @see ResourceManagementMBean#getResourceAdaptorEntities(String[])
*/
public String[] getResourceAdaptorEntities(String[] linkNames)
throws NullPointerException {
if (logger.isDebugEnabled()) {
logger.debug("Getting RA entity name for link names : "
+ Arrays.asList(linkNames));
}
if (linkNames == null)
throw new NullPointerException("null link names");
synchronized (sleeContainer.getManagementMonitor()) {
String[] resultEntityNames = new String[linkNames.length];
for (int i = 0; i < linkNames.length; i++) {
String entityName = resourceAdaptorEntityLinks
.get(linkNames[i]);
resultEntityNames[i] = entityName;
}
if (logger.isDebugEnabled()) {
logger.debug("Got RA entity names : "
+ Arrays.asList(resultEntityNames));
}
return resultEntityNames;
}
}
/**
* @see ResourceManagementMBean#getResourceAdaptorEntity(String linkName)
*/
public String getResourceAdaptorEntityName(String linkName)
throws NullPointerException, UnrecognizedLinkNameException {
if (logger.isDebugEnabled()) {
logger.debug("Getting RA entity name for link name " + linkName);
}
if (linkName == null)
throw new NullPointerException("null link name");
final String entityName = resourceAdaptorEntityLinks.get(linkName);
if (entityName == null)
throw new UnrecognizedLinkNameException(linkName);
if (logger.isDebugEnabled()) {
logger.debug("Got RA entity name " + entityName + " for link name "
+ linkName);
}
return entityName;
}
/**
* @see ResourceManagementMBean#getState(String)
*/
public ResourceAdaptorEntityState getState(String entityName)
throws NullPointerException,
UnrecognizedResourceAdaptorEntityException {
if (logger.isDebugEnabled()) {
logger.debug("Getting state for RA entity with name " + entityName);
}
if (entityName == null)
throw new NullPointerException("null entity name");
final ResourceAdaptorEntity resourceAdaptorEntity = this.resourceAdaptorEntities
.get(entityName);
if (resourceAdaptorEntity == null) {
throw new UnrecognizedResourceAdaptorEntityException(entityName);
} else {
return resourceAdaptorEntity.getState();
}
}
/**
* @see ResourceManagementMBean#getResourceUsageMBean(String)
*/
public ObjectName getResourceUsageMBean(String entityName)
throws NullPointerException,
UnrecognizedResourceAdaptorEntityException,
InvalidArgumentException {
if (entityName == null)
throw new NullPointerException("null entity name");
final ResourceAdaptorEntity resourceAdaptorEntity = this.resourceAdaptorEntities
.get(entityName);
if (resourceAdaptorEntity == null) {
throw new UnrecognizedResourceAdaptorEntityException(entityName);
} else {
ResourceUsageMBeanImpl mbean = resourceAdaptorEntity.getResourceUsageMBean();
if (mbean == null) {
throw new InvalidArgumentException(" Resource Adaptor entity "+entityName+" related resource adaptor does not defines a usage paramters interface. See section 14.2 in SLEE 1.1 specs for more info");
}
else {
// ensure it is open
mbean.open();
// return its object name
return mbean.getObjectName();
}
}
}
// --- additonal operations
/**
* Retrieves the {@link ResourceAdaptorEntity} with the specified entity
* name.
*
*/
public ResourceAdaptorEntity getResourceAdaptorEntity(String entityName) {
return this.resourceAdaptorEntities
.get(entityName);
}
/**
* Retrieves the set of resource adaptor entities aggregated per ra type, this is a runtime cache for optimal performance on ra type activity context factories
* @return
*/
public ConcurrentHashMap<ResourceAdaptorTypeID, Set<ResourceAdaptorEntity>> getResourceAdaptorEntitiesPerType() {
return entitiesPerType;
}
private ResourceAdaptorComponent getResourceAdaptorComponent(
ResourceAdaptorID id) {
return sleeContainer.getComponentRepositoryImpl().getComponentByID(id);
}
private void validateNewEntityOrLinkName(String name)
throws InvalidArgumentException {
for (int i = 0; i < name.length(); i++) {
char c = name.charAt(i);
if (!Character.isLetterOrDigit(c)) {
if (c < '\u0020' || c > '\u007e') {
throw new InvalidArgumentException(
name
+ " includes char "
+ c
+ " ,which is not a letter or digit or in unicode range 0x0020-0x007e");
}
}
}
}
@Override
public String toString() {
return "Resource Management: "
+ "\n+-- Resource Adaptor Entities: " + resourceAdaptorEntities.keySet()
+ "\n+-- Resource Adaptor Entity Links: " + resourceAdaptorEntityLinks.keySet()
+ "\n+-- Resource Adaptor Entities per RA Type size: " + entitiesPerType.size();
}
/**
* Installs the specified {@link ResourceAdaptorTypeComponent} in the container
* @param component
* @throws DeploymentException
*/
public void installResourceAdaptorType(
ResourceAdaptorTypeComponent component) throws DeploymentException {
if (logger.isDebugEnabled()) {
logger.debug("Installing " + component);
}
// generate code for aci factory
new ResourceAdaptorTypeClassCodeGenerator().process(component);
// create instance of aci factory and store it in the
// component
if (component.getActivityContextInterfaceFactoryConcreteClass() != null) {
try {
Constructor<?> constructor = component
.getActivityContextInterfaceFactoryConcreteClass()
.getConstructor(
new Class[] { SleeContainer.class,
ResourceAdaptorTypeID.class });
Object aciFactory = constructor.newInstance(new Object[] {
sleeContainer, component.getResourceAdaptorTypeID() });
component.setActivityContextInterfaceFactory(aciFactory);
} catch (Throwable e) {
throw new SLEEException(
"unable to create ra type aci factory instance", e);
}
}
final ResourceAdaptorTypeID resourceAdaptorTypeID = component.getResourceAdaptorTypeID();
getResourceAdaptorEntitiesPerType().put(
resourceAdaptorTypeID,
new HashSet<ResourceAdaptorEntity>());
TransactionalAction action = new TransactionalAction() {
public void execute() {
getResourceAdaptorEntitiesPerType().remove(resourceAdaptorTypeID);
}
};
try {
sleeContainer.getTransactionManager().addAfterRollbackAction(action);
} catch (SystemException e) {
throw new SLEEException(e.getMessage(),e);
}
}
/**
* Installs the specified {@link ResourceAdaptorComponent} in the container
* @param component
* @throws DeploymentException
*/
public void installResourceAdaptor(ResourceAdaptorComponent component) throws DeploymentException {
if (logger.isDebugEnabled()) {
logger.debug("Installing " + component);
}
new ResourceAdaptorClassCodeGenerator().process(component);
}
/**
* Uninstalls the specified {@link ResourceAdaptorTypeComponent} from the container
* @param component
*/
public void uninstallResourceAdaptorType(
ResourceAdaptorTypeComponent component) {
if (logger.isDebugEnabled()) {
logger.debug("Uninstalling " + component);
}
final ResourceAdaptorTypeID resourceAdaptorTypeID = component.getResourceAdaptorTypeID();
final Set<ResourceAdaptorEntity> raEntities = getResourceAdaptorEntitiesPerType().remove(resourceAdaptorTypeID);
TransactionalAction action = new TransactionalAction() {
public void execute() {
getResourceAdaptorEntitiesPerType().put(
resourceAdaptorTypeID,
raEntities);
}
};
try {
sleeContainer.getTransactionManager().addAfterRollbackAction(action);
} catch (SystemException e) {
throw new SLEEException(e.getMessage(),e);
}
}
/**
* Uninstalls the specified {@link ResourceAdaptorComponent} from the container
* @param component
* @throws DependencyException
*/
public void uninstallResourceAdaptor(ResourceAdaptorComponent component) throws DependencyException {
if (logger.isDebugEnabled()) {
logger.debug("Uninstalling " + component);
}
for (ResourceAdaptorEntity raEntity : resourceAdaptorEntities.values()) {
if (raEntity.getResourceAdaptorID().equals(component.getResourceAdaptorID())) {
throw new DependencyException("can't uninstall "+component.getResourceAdaptorID()+" since ra entity "+raEntity.getName()+" refers it");
}
}
}
}