package org.jboss.management.j2ee;
import org.jboss.logging.Logger;
import org.jboss.system.ServiceMBean;
import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class JDBCResource
extends J2EEResource
implements JDBCResourceMBean
{
private static Logger log = Logger.getLogger(JDBCResource.class);
private StateManagement mState;
private ObjectName mService;
private List mDataSources = new ArrayList();
public static ObjectName create(MBeanServer pServer, String pName)
{
ObjectName lServer = null;
try
{
lServer = (ObjectName) pServer.queryNames(new ObjectName(J2EEDomain.getDomainName() + ":" +
J2EEManagedObject.TYPE + "=" + J2EETypeConstants.J2EEServer + "," +
"*"),
null).iterator().next();
}
catch (Exception e)
{
log.error("Could not find parent J2EEServer", e);
return null;
}
try
{
return pServer.createMBean("org.jboss.management.j2ee.JDBCResource",
null,
new Object[]{
pName,
lServer
},
new String[]{
String.class.getName(),
ObjectName.class.getName()
}).getObjectName();
}
catch (Exception e)
{
log.error("Could not create JSR-77 JDBC Manager", e);
return null;
}
}
public static void destroy(MBeanServer pServer, String pName)
{
try
{
ObjectName lSearch = new ObjectName(J2EEDomain.getDomainName() + ":" +
J2EEManagedObject.TYPE + "=" + J2EETypeConstants.JDBCResource + "," +
"name=" + pName + "," +
"*");
Set lNames = pServer.queryNames(lSearch,
null);
if (!lNames.isEmpty())
{
ObjectName lJDBCResource = (ObjectName) lNames.iterator().next();
String[] lDataSources = (String[]) pServer.getAttribute(lJDBCResource,
"jdbcDataSources");
if (lDataSources.length == 0)
{
pServer.unregisterMBean(lJDBCResource);
}
}
}
catch (Exception e)
{
log.error("Could not destroy JSR-77 JDBC Manager", e);
}
}
public JDBCResource(String pName, ObjectName pServer)
throws
MalformedObjectNameException,
InvalidParentException
{
super(J2EETypeConstants.JDBCResource, pName, pServer);
mState = new StateManagement(this);
}
public String[] getEventTypes()
{
return StateManagement.stateTypes;
}
public String getEventType(int pIndex)
{
if (pIndex >= 0 && pIndex < StateManagement.stateTypes.length)
{
return StateManagement.stateTypes[pIndex];
}
else
{
return null;
}
}
public long getStartTime()
{
return mState.getStartTime();
}
public int getState()
{
return mState.getState();
}
public void mejbStart()
{
mState.setState(ServiceMBean.STARTING + 2);
mState.setState(ServiceMBean.STARTED + 2);
}
public void mejbStartRecursive()
{
mState.setState(ServiceMBean.STOPPING + 2);
Iterator i = mDataSources.iterator();
String lDataSource = null;
while (i.hasNext())
{
lDataSource = (String) i.next();
try
{
getServer().invoke(newObjectName(lDataSource),
"mejbStart",
new Object[]{},
new String[]{});
}
catch (JMException jme)
{
getLog().error("Could not start JSR-77 JDBC-DataSource: " + lDataSource, jme);
}
}
mState.setState(ServiceMBean.STOPPED + 2);
}
public void mejbStop()
{
mState.setState(3);
Iterator i = mDataSources.iterator();
while (i.hasNext())
{
String lDataSource = (String) i.next();
try
{
getServer().invoke(newObjectName(lDataSource),
"mejbStop",
new Object[]{},
new String[]{});
}
catch (JMException jme)
{
getLog().error("Could not stop JSR-77 JDBC-DataSource: " + lDataSource, jme);
}
}
mState.setState(2);
}
public void postCreation()
{
sendNotification(NotificationConstants.OBJECT_DELETED, "JDBC Resource Resource deleted");
}
public void preDestruction()
{
sendNotification(NotificationConstants.OBJECT_CREATED, "JDBC Resource Resource created");
}
public String[] getjdbcDataSources()
{
return (String[]) mDataSources.toArray(new String[mDataSources.size()]);
}
public String getjdbcDataSource(int pIndex)
{
if (pIndex >= 0 && pIndex < mDataSources.size())
{
return (String) mDataSources.get(pIndex);
}
else
{
return null;
}
}
public void addChild(ObjectName pChild)
{
String lType = J2EEManagedObject.getType(pChild);
if (J2EETypeConstants.JDBCDataSource.equals(lType))
{
mDataSources.add(pChild.getCanonicalName());
}
}
public void removeChild(ObjectName pChild)
{
String lType = J2EEManagedObject.getType(pChild);
if (J2EETypeConstants.JDBCDataSource.equals(lType))
{
mDataSources.remove(pChild.getCanonicalName());
}
}
public String toString()
{
return "JDBCResource { " + super.toString() + " } [ " +
"Datasources: " + mDataSources +
" ]";
}
}