Les étapes de configuration, les commandes, les exemples de code et les graphiques de données permettant d'étendre le schéma des propriétés sur plusieurs domaines de sécurité sont fournis ici.
Les étapes suivantes sont décrites dans les commandes de configuration et les exemples de fragment de code :
Assurez-vous d'avoir bien lu les informations et effectué les étapes décrites dans la rubrique Prérequis pour la programmation et notamment dans la section Schéma de propriété étendu, qui contient des informations sur les objets de données propertySchema et extensionPropertySchema et indique la syntaxe valide pour les types de données de propriété.
Vous devez effectuer les étapes de configuration ci-après avant d'utiliser l'exemple de code dans votre application. Démarrez l'outil wsadmin et exécutez les commandes ci-après. Remplacez les variables par les valeurs actuelles à utiliser.
$AdminTask createApplicationServer nodeName {-name server2}
$AdminTask copySecurityDomainFromGlobalSecurity {-securityDomainName domain1}
$AdminTask mapResourceToSecurityDomain { -securityDomainName domain1 -resourceName Cell=:Node=nodeName:Server=server2}
Si vous souhaitez utiliser le schéma global, effectuez cette étape. Si vous voulez utiliser le schéma spécifique au domaine, ignorez cette étape.
$AdminTask setIdMgrUseGlobalSchemaForModel { -useGlobalSchema true -securityDomainName domain1 }
$AdminApp install racine_serveur_app/systemApps/wim.ear { -appname wim -server server1 -systemApp}
$AdminApp install racine_serveur_appt/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
Ajoutez l'exemple de code ci-après à votre code d'application, comme indiqué dans les étapes ci-après. Remplacez les variables par les valeurs actuelles à utiliser.
//Objet de service qui contient la référence de service ejb de virtual member manager pour server1.
private static Service service1 = null;
//Objet de service qui contient la référence de service ejb de virtual member manager pour server2.
private static Service service2 = null;
//Constante de type chaîne pour le nouveau nom de propriété à ajouter pour server1.
private static final String server1PropName = "postOfficeBox";
//Constante de type chaîne pour le nouveau nom de propriété à ajouter pour server2.
private static final String server2PropName = "age";
/**
* Cette méthode localise les services virtual member manager exécutés dans
* WebSphere Application Sever sur le système hôte local
*/
private static void locateServices()
{
// Accès à distance à l'EJB de service WIM
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();
}
}
/**
* Cette méthode ajoute la propriété "postOfficeBox" au type d'entité "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);
// Création d'un objet de données de schéma de propriété
DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
// Définition des valeurs de la propriété (par exemple, URI d'espace de nom, préfixe d'espace de nom, nom de la propriété)
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));
// Appel de l'API de création de schéma
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();
}
}
/**
* Cette méthode ajoute la propriété "age" au type d'entité "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);
// Création d'un objet de données de schéma de propriété
DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
// Définition des valeurs de la propriété (par exemple, URI d'espace de nom, préfixe d'espace de nom, nom de la propriété)
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));
// Appel de l'API de création de schéma
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éthode qui exécute des recherches différentes sur des serveurs différents.
*/
private static void testSearchProperties()
{
// Recherche à l'aide de la propriété server1 mais en utilisant service1
System.out.println("Searching property '" + server1PropName + "' on server1");
searchserver1PropName(service1);
// Arrêt de l'utilitaire pour synchroniser la sortie
pause();
// Recherche à l'aide de la propriété server1 mais en utilisant service2
System.out.println("Searching property '" + server1PropName + "' on server2");
searchserver1PropName(service2);
// Arrêt de l'utilitaire pour synchroniser la sortie
pause();
// Recherche à l'aide de la propriété server2 mais en utilisant service2
System.out.println("Searching property '" + server2PropName + "' on server2");
searchserver2PropName(service2);
// Arrêt de l'utilitaire pour synchroniser la sortie
pause();
// Recherche à l'aide de la propriété server2 mais en utilisant service1
System.out.println("Searching property '" + server2PropName + "' on server1");
searchserver2PropName(service1);
}
/**
* Méthode d'utilitaire ajoutée pour que l'exception soit vidée dans la console
* avant le début de l'opération suivante.
*/
private static void pause()
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
}
}
/**
* Méthode de recherche sur 'age'
* @param service
*/
@SuppressWarnings("unchecked")
private static void searchserver2PropName(Service service)
{
try
{
//Search
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éthode de recherche sur 'postOfficeBox'
* @param service
*/
@SuppressWarnings("unchecked")
private static void searchserver1PropName(Service service)
{
try
{
//Search
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 vous définissez la propriété useGlobalSchema de sorte qu'elle utilise le schéma global comme décrit à l'étape 5 de la section Configuration requise, toutes les propriétés étendues sur toutes les instances peuvent être utilisées lors d'opérations de recherche entre les domaines. Si vous ne définissez pas la propriété useGlobalSchema, seul le schéma spécifique au domaine est étendu et les opérations de recherche ne sont basées que sur les propriétés étendues dans l'instance actuelle.