Aquí se proporcionan los pasos de configuración, los mandatos, el código de ejemplo y gráficos de datos para extender un esquema de propiedad a través de dominios de seguridad múltiple.
En los mandatos de configuración y los fragmentos de código de ejemplo se incluyen los pasos siguientes:
Asegúrese de leer la información y completar los pasos que se describen en el tema Requisitos previos de programación, incluida la sección Ampliación del esquema de propiedad, que contiene información sobre los objetos de datos propertySchema y extensionPropertySchema e indica la sintaxis válida para los tipos de datos de propiedad.
Debe realizar los siguientes pasos de configuración para poder utilizar el código de ejemplo en la aplicación. Inicie la herramienta wsadmin y ejecute los mandatos siguientes. Sustituya las variables por los valores reales que desea utilizar.
$AdminTask createApplicationServer nodeName {-name server2}
$AdminTask copySecurityDomainFromGlobalSecurity {-securityDomainName domain1}
$AdminTask mapResourceToSecurityDomain { -securityDomainName domain1 -resourceName Cell=:Node=nodeName:Server=server2}
Si desea utilizar el esquema global, realice este paso. Si desea utilizar el esquema específico del dominio, omita este paso.
$AdminTask setIdMgrUseGlobalSchemaForModel { -useGlobalSchema true -securityDomainName domain1 }
$AdminApp install app_server_root/systemApps/wim.ear { -appname wim -server server1 -systemApp}
$AdminApp install app_server_root/installableApps/wimperdomain.ear {
-appname wimperdomain1
-BindJndiForEJBNonMessageBinding {{ wim.ejb WIMService wimejb.jar,
META-INF/ejb-jar.xml ejbd1/com/ibm/websphere/wim/ejb/WIMServiceHome}}
-MapModulesToServers {{ wim.ejb wimejb.jar,META-INF/ejb-jar.xml
WebSphere:cell=cellName,node=nodeName,server=server2 }}}
$AdminConfig save
Añada el código de ejemplo siguiente al código de aplicación como se describe en los pasos siguientes. Sustituya las variables por los valores reales que desea utilizar.
//El objeto de servicio que contiene la referencia de servicio ejb de virtual member manager para server1.
private static Service service1 = null;
//El objeto de servicio que contiene la referencia de servicio ejb de virtual member manager para server2.
private static Service service2 = null;
//Una constante de tipo serie para el nuevo nombre de propiedad que debe añadirse para server1.
private static final String server1PropName = "postOfficeBox";
//Una constante de tipo serie para el nuevo nombre de propiedad que debe añadirse para server2.
private static final String server2PropName = "age";
/**
* Este método localiza los servicios de virtual member manager que se ejecutan en
* WebSphere Application Sever en el host local
*/
private static void locateServices()
{
// EJB de servicio de WIM de acceso remoto
try
{
Hashtable<String, String> environment = new Hashtable<String, String>();
environment.put(LocalServiceProvider.PROVIDER_URL, "corbaloc:iiop:localhost:2814");
service1 = new LocalServiceProvider(environment);
}
catch(Exception e)
{
e.printStackTrace();
}
try
{
Hashtable<String, String> environment = new Hashtable<String, String>();
environment.put(LocalServiceProvider.EJB_JNDI_NAME,
"ejbd1/com/ibm/websphere/wim/ejb/WIMServiceHome");
environment.put(LocalServiceProvider.PROVIDER_URL, "corbaloc:iiop:localhost:2815");
service2 = new LocalServiceProvider(environment);
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
* Este método añade la propiedad "postOfficeBox" al tipo de entidad "PersonAccount".
*/
private static void createPropertyOnServer1()
{
try
{
System.out.println("\nCreating new property type postOfficeBox
and add it to existing entity type PersonAccount");
DataObject root = service1.createRootDataObject();
DataObject dynaSchemaDO = root.createDataObject(SchemaConstants.DO_SCHEMA);
// Crear un objeto de datos de esquema de propiedad nuevo
DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
// Establecer valores para la propiedad, por ej., URI espacio_nombres, prefijo espacio_nombres, nombre_propiedad
propSchemaDO.set(SchemaConstants.PROP_NS_URI, SchemaConstants.WIM_NS_URI);
propSchemaDO.set(SchemaConstants.PROP_PROPERTY_NAME, server1PropName);
propSchemaDO.setBoolean(SchemaConstants.PROP_MULTI_VALUED, false);
propSchemaDO.set(SchemaConstants.PROP_DATA_TYPE, SchemaConstants.DATA_TYPE_STRING);
List applicableEntityTypes = propSchemaDO.getList(SchemaConstants.PROP_APPLICABLE_ENTITY_TYPE_NAMES);
applicableEntityTypes.add(Service.DO_PERSON_ACCOUNT);
System.out.println("Input datagraph -> " + printDO(root));
// Invocar la API de creación de esquema
root = service1.createSchema(root);
System.out.println("Output datagraph -> " + printDO(root));
System.out.println("\nCLIENT: new property type is created.");
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
* Este método añade la propiedad "age" al tipo de entidad "PersonAccount".
*/
private static void createPropertyOnServer2()
{
try
{
System.out.println("\nCreating new property type age and
add it to existing entity type Person");
DataObject root = service2.createRootDataObject();
DataObject dynaSchemaDO = root.createDataObject(SchemaConstants.DO_SCHEMA);
// Crear un objeto de datos de esquema de propiedad nuevo
DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
// Establecer valores para la propiedad, por ej., URI espacio_nombres, prefijo espacio_nombres, nombre_propiedad
propSchemaDO.set(SchemaConstants.PROP_NS_URI, SchemaConstants.WIM_NS_URI);
propSchemaDO.set(SchemaConstants.PROP_PROPERTY_NAME, server2PropName);
propSchemaDO.setBoolean(SchemaConstants.PROP_MULTI_VALUED, false);
propSchemaDO.set(SchemaConstants.PROP_DATA_TYPE, SchemaConstants.DATA_TYPE_INT);
List applicableEntityTypes = propSchemaDO.getList(SchemaConstants.PROP_APPLICABLE_ENTITY_TYPE_NAMES);
applicableEntityTypes.add(Service.DO_PERSON_ACCOUNT);
SDOUtils.printDataGraph("Input datagraph", root);
System.out.println("Input datagraph -> " + printDO(root));
// Invocar la API de creación de esquema
root = service2.createSchema(root);
System.out.println("Output datagraph -> " + printDO(root));
System.out.println("New property type is created.");
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
* Método que ejecuta búsquedas diferentes en servidores diferentes.
*/
private static void testSearchProperties()
{
// Buscar usando la propiedad server1 y usando service1
System.out.println("Searching property '" + server1PropName + "' on server1");
searchserver1PropName(service1);
// Detención de programa de utilidad para sincronizar la salida
pause();
// Buscar usando la propiedad server1 y usando service2
System.out.println("Searching property '" + server1PropName + "' on server2");
searchserver1PropName(service2);
// Detención de programa de utilidad para sincronizar la salida
pause();
// Buscar usando la propiedad server2 y usando service2
System.out.println("Searching property '" + server2PropName + "' on server2");
searchserver2PropName(service2);
// Detención de programa de utilidad para sincronizar la salida
pause();
// Buscar usando la propiedad server2 y usando service1
System.out.println("Searching property '" + server2PropName + "' on server1");
searchserver2PropName(service1);
}
/**
* Método de programa de utilidad para asegurar que la excepción se desecha en la consola
* antes de iniciar la operación siguiente.
*/
private static void pause()
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
}
}
/**
* Método para buscar en 'age'
* @param service
*/
@SuppressWarnings("unchecked")
private static void searchserver2PropName(Service service)
{
try
{
//Buscar
DataObject root = SDOHelper.createRootDataObject();
DataObject searchCtrl = SDOHelper.createControlDataObject(root, null,
SchemaConstants.DO_SEARCH_CONTROL);
searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn");
searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("cn");
searchCtrl.setString(SchemaConstants.PROP_SEARCH_EXPRESSION,
"@xsi:type='PersonAccount' and " + server2PropName + " > 4");
root = service.search(root); System.out.println("Output datagraph -> " + printDO(root));
List searchResults = root.getList(SchemaConstants.DO_ENTITIES);
for (int i = 0; i < searchResults.size(); i++) {
DataObject ent = (DataObject) searchResults.get(i);
DataObject id = ent.getDataObject(SchemaConstants.DO_IDENTIFIER);
if (id != null) {
String uniqueName = id.getString(SchemaConstants.PROP_UNIQUE_NAME);
if (uniqueName != null) {
System.out.println("Found -> " + ent.getString("cn") + "(" + uniqueName + ")");
}
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
* Método para buscar en 'postOfficeBox'
* @param service
*/
@SuppressWarnings("unchecked")
private static void searchserver1PropName(Service service)
{
try
{
//Buscar
DataObject root = SDOHelper.createRootDataObject();
DataObject searchCtrl = SDOHelper.createControlDataObject(root, null,
SchemaConstants.DO_SEARCH_CONTROL);
searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn");
searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("cn");
searchCtrl.setString(SchemaConstants.PROP_SEARCH_EXPRESSION,
"@xsi:type='PersonAccount' and " + server1PropName + "='4-23'");
root = service.search(root); System.out.println("Output datagraph -> " + printDO(root));
List searchResults = root.getList(SchemaConstants.DO_ENTITIES);
for (int i = 0; i < searchResults.size(); i++) {
DataObject ent = (DataObject) searchResults.get(i);
DataObject id = ent.getDataObject(SchemaConstants.DO_IDENTIFIER);
if (id != null) {
String uniqueName = id.getString(SchemaConstants.PROP_UNIQUE_NAME);
if (uniqueName != null) {
System.out.println("Found -> " + ent.getString("cn") + "(" + uniqueName + ")");
}
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
Si ha establecido la propiedad useGlobalSchema para utilizar el esquema global como se describe en el paso 5 de la sección de requisitos previos, se pueden utilizar todas las propiedades extendidas en todas las instancias al realizar operaciones de búsqueda en varios dominios. Si no establece useGlobalSchema, sólo se extiende el esquema específico del dominio y las operaciones de búsqueda sólo se basan en las propiedades extendidas en la instancia actual.