Example: Use the JMS API to create a JDBC driver and data source for CMP
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()"); } } }
See Also
Resource adapter
Connection factory
JDBC providers
Data sources