package org.jboss.management.j2ee;
import org.jboss.logging.Logger;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import java.net.URL;
import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ResourceAdapterModule
extends J2EEModule
implements ResourceAdapterModuleMBean
{
private static Logger log = Logger.getLogger(ResourceAdapterModule.class);
private List resourceAdapters = new ArrayList();
private static final Map fakeJ2EEApps = new HashMap();
public static ObjectName create(MBeanServer mbeanServer, String earName,
String rarName, URL pURL)
{
String lDD = null;
ObjectName lParent = null;
ObjectName lCreated = null;
ObjectName jsr77Name = null;
ObjectName j2eeServerName = J2EEDomain.getDomainServerName(mbeanServer);
try
{
Hashtable props = j2eeServerName.getKeyPropertyList();
String j2eeServer = props.get(J2EEManagedObject.TYPE) + "=" +
props.get("name");
if (earName == null)
{
lParent = j2eeServerName;
}
else
{
ObjectName parentAppQuery = new ObjectName(J2EEDomain.getDomainName() + ":" +
J2EEManagedObject.TYPE + "=" + J2EETypeConstants.J2EEApplication + "," +
"name=" + earName + "," +
j2eeServer + "," +
"*");
Set parentApps = mbeanServer.queryNames(parentAppQuery, null);
if (parentApps.size() == 0)
{
lCreated = J2EEApplication.create(mbeanServer,
earName,
null);
lParent = lCreated;
} else if (parentApps.size() == 1)
{
lParent = (ObjectName) parentApps.iterator().next();
} }
lDD = J2EEDeployedObject.getDeploymentDescriptor(pURL, J2EEDeployedObject.RAR);
}
catch (Exception e)
{
log.debug("Could not create JSR-77 ResourceAdapterModule: " + rarName, e);
return null;
}
try
{
String[] jvms = (String[]) mbeanServer.getAttribute(j2eeServerName,
"javaVMs");
ResourceAdapterModule rarModule = new ResourceAdapterModule(rarName,
lParent, jvms, lDD);
jsr77Name = rarModule.getObjectName();
mbeanServer.registerMBean(rarModule, jsr77Name);
if (lCreated != null)
{
fakeJ2EEApps.put(jsr77Name, lCreated);
}
log.debug("Created JSR-77 EJBModule: " + jsr77Name);
}
catch (Exception e)
{
log.debug("Could not create JSR-77 ResourceAdapterModule: " + rarName, e);
}
return jsr77Name;
}
public static void destroy(MBeanServer mbeanServer, ObjectName jsr77Name)
{
try
{
log.debug("destroy(), remove RARModule: " + jsr77Name);
mbeanServer.unregisterMBean(jsr77Name);
ObjectName jsr77ParentName = (ObjectName) fakeJ2EEApps.get(jsr77Name);
if (jsr77ParentName != null)
{
log.debug("Remove fake JSR-77 parent Application: " + jsr77ParentName);
J2EEApplication.destroy(mbeanServer, jsr77ParentName);
}
}
catch (Exception e)
{
log.debug("Could not destroy JSR-77 RARModule: " + jsr77Name, e);
}
}
public ResourceAdapterModule(String rarName, ObjectName jsr77ParentName,
String[] pJVMs, String pDeploymentDescriptor)
throws MalformedObjectNameException,
InvalidParentException
{
super(J2EETypeConstants.ResourceAdapterModule, rarName, jsr77ParentName, pJVMs, pDeploymentDescriptor);
}
public String[] getresourceAdapters()
{
return (String[]) resourceAdapters.toArray(new String[resourceAdapters.size()]);
}
public String getresourceAdapter(int pIndex)
{
if (pIndex >= 0 && pIndex < resourceAdapters.size())
{
return (String) resourceAdapters.get(pIndex);
}
else
{
return null;
}
}
public void addChild(ObjectName pChild)
{
String lType = J2EEManagedObject.getType(pChild);
if (J2EETypeConstants.ResourceAdapter.equals(lType))
{
resourceAdapters.add(pChild.getCanonicalName());
}
}
public void removeChild(ObjectName pChild)
{
String lType = J2EEManagedObject.getType(pChild);
if (J2EETypeConstants.ResourceAdapter.equals(lType))
{
resourceAdapters.remove(pChild.getCanonicalName());
}
}
public String toString()
{
return "ResourceAdapterModule[ " + super.toString() +
"ResourceAdapters: " + resourceAdapters +
" ]";
}
protected Hashtable getParentKeys(ObjectName jsr77ParentName)
{
Hashtable parentKeys = new Hashtable();
Hashtable parentProps = jsr77ParentName.getKeyPropertyList();
String parentName = (String) parentProps.get("name");
String j2eeType = (String) parentProps.get(J2EEManagedObject.TYPE);
if (j2eeType.equals(J2EETypeConstants.J2EEApplication) == false)
{
parentKeys.put(J2EETypeConstants.J2EEServer, parentName);
parentKeys.put(J2EETypeConstants.J2EEApplication, "null");
}
else
{
parentKeys.put(J2EETypeConstants.J2EEApplication, parentName);
String j2eeServerName = (String) parentProps.get(J2EETypeConstants.J2EEServer);
parentKeys.put(J2EETypeConstants.J2EEServer, j2eeServerName);
}
return parentKeys;
}
}