Example: Using the Java Management Extensions API to create a JDBC
driver and data source for container-managed persistence
//
// "This program may be used, executed, copied, modified and distributed without royalty for the
// purpose of developing, using, marketing, or distributing."
//
// Product 5630-A36, (C) COPYRIGHT International Business Machines Corp., 2001, 2002
// All Rights Reserved * Licensed Materials - Property of IBM
//
import java.util.*;
import javax.sql.*;
import javax.transaction.*;
import javax.management.*;
import com.ibm.websphere.management.*;
import com.ibm.websphere.management.configservice.*;
import com.ibm.ws.exception.WsException;
/**
* Creates a node scoped resource.xml entry for a DB2 XA datasource.
* The datasource created is for CMP use.
*
* We need following to run
* set classpath=%classpath%;D:\WebSphere\AppServer\lib\wsexception.jar;D:\WebSphere\AppServer\lib\wasjmx.jar;D:\$WAS_HOME\lib\wasx.jar
*/
public class CreateDataSourceCMP {
String dsName = "markSection"; // ds display name , also jndi name and CF name
String dbName = "SECTION"; // database name
String authDataAlias = "db2admin"; // an authentication data alias
String uid = "db2admin"; // userid
String pw = "db2admin"; // password
String dbclasspath = "D:/SQLLIB/java/db2java.zip"; // path to the db driver
/**
* Main method.
*/
public static void main(String[] args) {
CreateDataSourceCMP cds = new CreateDataSourceCMP();
try {
cds.run(args);
} catch (com.ibm.ws.exception.WsException ex) {
System.out.println("Caught this " + ex );
ex.printStackTrace();
//ex.getCause().printStackTrace();
} catch (Exception ex) {
System.out.println("Caught this " + ex );
ex.printStackTrace();
}
}
/**
* This method creates the datasource using JMX.
* The datasource created here is only written into resources.xml.
* It is not bound into namespace until the server is restarted, or an application started
*/
public void run(String[] args) throws Exception {
try {
// Initialize the AdminClient.
Properties adminProps = new Properties();
adminProps.setProperty(AdminClient.CONNECTOR_TYPE, AdminClient.CONNECTOR_TYPE_SOAP);
adminProps.setProperty(AdminClient.CONNECTOR_HOST, "localhost");
adminProps.setProperty(AdminClient.CONNECTOR_PORT, "8880");
AdminClient adminClient = AdminClientFactory.createAdminClient(adminProps);
// Get the ConfigService implementation.
com.ibm.websphere.management.configservice.ConfigServiceProxy configService =
new com.ibm.websphere.management.configservice.ConfigServiceProxy(adminClient);
Session session = new Session();
// Use this group to add to the node scoped resource.xml.
ObjectName node1 = ConfigServiceHelper.createObjectName(null, "Node", null);
ObjectName[] matches = configService.queryConfigObjects(session, null, node1, null);
node1 = matches[0]; // use the first node found
// Use this group to add to the server1 scoped resource.xml.
ObjectName server1 = ConfigServiceHelper.createObjectName(null, "Server", "server1");
matches = configService.queryConfigObjects(session, null, server1, null);
server1 = matches[0]; // use the first server found
// Create the JDBCProvider
String providerName = "DB2 JDBC Provider (XA)";
System.out.println("Creating JDBCProvider " + providerName );
// Prepare the attribute list
AttributeList provAttrs = new AttributeList();
provAttrs.add(new Attribute("name", providerName));
provAttrs.add(new Attribute("implementationClassName", "COM.ibm.db2.jdbc.DB2XADataSource"));
provAttrs.add(new Attribute("description","DB2 JDBC2-compliant XA Driver"));
//create it
ObjectName jdbcProv = configService.createConfigData(session,node1,"JDBCProvider", "resources.jdbc:JDBCProvider",provAttrs);
// now plug in the classpath
configService.addElement(session,jdbcProv,"classpath",dbclasspath,-1);
// Search for RRA so we can link it to the datasource
ObjectName rra = ConfigServiceHelper.createObjectName(null, "J2CResourceAdapter", null);
matches = configService.queryConfigObjects(session, node1, rra, null);
rra = matches[0]; // use the first J2CResourceAdapter segment for builtin_rra
// Prepare the attribute list
AttributeList dsAttrs = new AttributeList();
dsAttrs.add(new Attribute("name", dsName));
dsAttrs.add(new Attribute("jndiName", "jdbc/" + dsName));
dsAttrs.add(new Attribute("datasourceHelperClassname","com.ibm.websphere.rsadapter.DB2DataStoreHelper"));
dsAttrs.add(new Attribute("statementCacheSize", new Integer(10)));
dsAttrs.add(new Attribute("relationalResourceAdapter", rra)); // this is where we make the link to "builtin_rra"
dsAttrs.add(new Attribute("description", "JDBC Datasource for mark section CMP 2.0 test"));
dsAttrs.add(new Attribute("authDataAlias",authDataAlias));
// Create the datasource
System.out.println(" ** Creating datasource");
ObjectName dataSource = configService.createConfigData(session,jdbcProv,"DataSource", "resources.jdbc:DataSource",dsAttrs);
// Add a propertySet.
AttributeList propSetAttrs = new AttributeList();
ObjectName resourcePropertySet =configService.createConfigData(session,dataSource,"propertySet","",propSetAttrs);
// Add resourceProperty databaseName
AttributeList propAttrs1 = new AttributeList();
propAttrs1.add(new Attribute("name", "databaseName"));
propAttrs1.add(new Attribute("type", "java.lang.String"));
propAttrs1.add(new Attribute("value", dbName));
configService.addElement(session,resourcePropertySet,"resourceProperties",propAttrs1,-1);
// Now Create the corresponding J2CResourceAdapter Connection Factory object.
ObjectName jra = ConfigServiceHelper.createObjectName(null,"J2CResourceAdapter",null);
// Get all the J2CResourceAdapter, and I want to add my datasource
System.out.println(" ** Get all J2CResourceAdapter's");
ObjectName[] jras = configService.queryConfigObjects(session, node1, jra, null);
int i=0;
for (;i< jras.length;i++) {
System.out.println(ConfigServiceHelper.getConfigDataType(jras[i])+ " " + i + " = "
+ jras[i].getKeyProperty(SystemAttributes._WEBSPHERE_CONFIG_DATA_DISPLAY_NAME)
+ "\nFrom scope ="
+ jras[i].getKeyProperty(SystemAttributes._WEBSPHERE_CONFIG_DATA_ID));
// quit on the first builtin_rra
if (jras[i].getKeyProperty(SystemAttributes._WEBSPHERE_CONFIG_DATA_DISPLAY_NAME)
.equals("WebSphere Relational Resource Adapter")) {
break;
}
}
if (i >= jras.length) {
System.out.println("Did not find builtin_rra J2CResourceAdapter object creating CF anyways" );
} else {
System.out.println("Found builtin_rra J2CResourceAdapter object at index " + i + " creating CF" );
}
// Prepare the attribute list
AttributeList cfAttrs = new AttributeList();
cfAttrs.add(new Attribute("name", dsName + "_CF"));
cfAttrs.add(new Attribute("authMechanismPreference","BASIC_PASSWORD"));
cfAttrs.add(new Attribute("authDataAlias",authDataAlias));
cfAttrs.add(new Attribute("cmpDatasource", dataSource )); // this is where we make the link to DataSource's xmi:id
ObjectName cf = configService.createConfigData(session,jras[i],"CMPConnectorFactory", "resources.jdbc:CMPConnectorFactory",cfAttrs);
// ===== start Security section
System.out.println("Creating an authorization data alias " + authDataAlias);
// Find the parent security object
ObjectName security = ConfigServiceHelper.createObjectName(null, "Security", null);
ObjectName[] securityName = configService.queryConfigObjects(session, null, security, null);
security=securityName[0];
// Prepare the attribute list
AttributeList authDataAttrs = new AttributeList();
authDataAttrs.add(new Attribute("alias", authDataAlias));
authDataAttrs.add(new Attribute("userId", uid));
authDataAttrs.add(new Attribute("password", pw));
authDataAttrs.add(new Attribute("description","Auto created alias for datasource"));
//create it
ObjectName authDataEntry = configService.createConfigData(session,security,"authDataEntries", "JAASAuthData",authDataAttrs);
// ===== end Security section
// Save the session
System.out.println("Saving session" );
configService.save(session, false);
// reload resources.xml to bind the new datasource into the name space
reload(adminClient,true);
} catch (Exception ex) {
ex.printStackTrace(System.out);
throw ex;
}
}
/**
* Get the DataSourceConfigHelperMbean and call reload() on it
*
* @param adminClient
* @param verbose true - print messages to stdout
*/
public void reload(AdminClient adminClient,boolean verbose) {
if (verbose) {
System.out.println("Finding the Mbean to call reload()");
}
// First get the Mbean
ObjectName handle = null;
try {
ObjectName queryName = new ObjectName("WebSphere:type=DataSourceCfgHelper,*");
Set s = adminClient.queryNames(queryName, null);
Iterator iter = s.iterator();
if (iter.hasNext()) handle = (ObjectName)iter.next();
} catch (MalformedObjectNameException mone) {
System.out.println("Check the program variable queryName" + mone);
} catch (com.ibm.websphere.management.exception.ConnectorException ce) {
System.out.println("Cannot connect to the application server" + ce);
}
if (verbose) {
System.out.println("Calling reload()");
}
Object result = null;
try {
result = adminClient.invoke(handle, "reload", new Object[] {}, new String[] {});
} catch (MBeanException mbe) {
if (verbose) {
System.out.println("\tMbean Exception calling reload" + mbe);
}
} catch (InstanceNotFoundException infe) {
System.out.println("Cannot find reload ");
} catch (Exception ex) {
System.out.println("Exception occurred calling reload()" + ex);
}
if (result==null && verbose) {
System.out.println("OK reload()");
}
}
}

Resource adapter
Connection factory
JDBC providers
Data sources
Searchable topic ID:
crtdscmp
Last updated: Jun 21, 2007 8:07:48 PM CDT
WebSphere Business Integration Server Foundation, Version 5.0.2
http://publib.boulder.ibm.com/infocenter/wasinfo/index.jsp?topic=/com.ibm.wasee.doc/info/ee/ae/rdat_crtdscmp.html