As etapas de configuração, comandos, código de amostra e gráficos de dados para estender o esquema de propriedade entre diversos domínios de segurança são fornecidos aqui.
As etapas a seguir são cobertas nos comandos de configuração e nos fragmentos de código de amostra:
Assegure-se de ter lido as informações e concluído as etapas descritas no tópico, Pré-requisitos de Programação, incluindo a seção, Estendendo o Esquema de Propriedade, que tem informações sobre os objetos de dados propertySchema e extensionPropertySchema e lista a sintaxe válida para os tipos de dados de propriedade.
Você deve concluir as seguintes etapas de configuração antes de usar o código de amostra em seu aplicativo. Inicie a ferramenta wsadmin e execute os seguintes comandos. Substitua as variáveis pelos valores reais que você deseja usar.
$AdminTask createApplicationServer nodeName {-name server2}
$AdminTask copySecurityDomainFromGlobalSecurity {-securityDomainName domain1}
$AdminTask mapResourceToSecurityDomain { -securityDomainName domain1 -resourceName Cell=:Node=nodeName:Server=server2}
Se você quiser usar o esquema global, execute esta etapa. Para usar o esquema de domínio específico, ignore esta etapa.
$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
Inclua o seguinte código de amostra no código do aplicativo conforme descrito nas etapas a seguir. Substitua as variáveis pelos valores reais que você deseja usar.
//O objeto de serviço que contém a referência de serviço ejb do gerenciador de membro virtual para server1.
private static Service service1 = null;
//O objeto de serviço que contém a referência de serviço ejb do gerenciador de membro virtual para server2.
private static Service service2 = null;
//Uma constante de sequência para o novo nome da propriedade a ser incluído para server1.
private static final String server1PropName = "postOfficeBox";
//Uma constante de sequência para o novo nome da propriedade a ser incluído para server2.
private static final String server2PropName = "age";
/**
* Este método localiza os serviços do gerenciador de membro virtual em execução no
* WebSphere Application Sever no host local
*/
private static void locateServices()
{
// EJB do Serviço WIM de acesso 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 inclui a propriedade "postOfficeBox" no tipo de entidade "PersonAccount".
*/
private static void createPropertyOnServer1()
{
try
{
System.out.println("\nCriando novo tipo de propriedade postOfficeBox
e incluindo-o no tipo de entidade existente PersonAccount");
DataObject root = service1.createRootDataObject();
DataObject dynaSchemaDO = root.createDataObject(SchemaConstants.DO_SCHEMA);
// Criar novo objeto de dados de esquema de propriedade
DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
// Configurar os valores para a propriedade, por exemplo, URI do namespace, prefixo de namespace, nome da propriedade
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("Gráfico de dados de entrada -> " + printDO(root));
// Chamar a API de criação de esquema
root = service1.createSchema(root);
System.out.println("Output datagraph -> " + printDO(root));
System.out.println("\nCLIENT: novo tipo de propriedade é criado.");
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
* Este método inclui a propriedade "age" no tipo de entidade "PersonAccount".
*/
private static void createPropertyOnServer2()
{
try
{
System.out.println("\nCriando novo tipo de propriedade age e
incluindo-o no tipo de entidade existente Person");
DataObject root = service2.createRootDataObject();
DataObject dynaSchemaDO = root.createDataObject(SchemaConstants.DO_SCHEMA);
// Criar novo objeto de dados de esquema de propriedade
DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
// Configurar os valores para a propriedade, por exemplo, URI do namespace, prefixo de namespace, nome da propriedade
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("Gráfico de dados de entrada", root);
System.out.println("Gráfico de dados de entrada -> " + printDO(root));
// Chamar a API de criação de esquema
root = service2.createSchema(root);
System.out.println("Gráfico de dados de saída -> " + printDO(root));
System.out.println("Novo tipo de propriedade é criado.");
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
* Método que executa diferentes procuras em diferentes servidores.
*/
private static void testSearchProperties()
{
// Procurar usando a propriedade server1, mas usando service1
System.out.println("Searching property '" + server1PropName + "' on server1");
searchserver1PropName(service1);
// Parada do utilitário para sincronizar saída
pause();
// Procurar usando a propriedade server1, mas usando service2
System.out.println("Searching property '" + server1PropName + "' on server2");
searchserver1PropName(service2);
// Parada do utilitário para sincronizar saída
pause();
// Procurar usando a propriedade server2, mas usando service2
System.out.println("Searching property '" + server2PropName + "' on server2");
searchserver2PropName(service2);
// Parada do utilitário para sincronizar saída
pause();
// Procurar usando a propriedade server2, mas usando service1
System.out.println("Searching property '" + server2PropName + "' on server1");
searchserver2PropName(service1);
}
/**
* Um método utilitário incluído para assegurar-se de que a exceção seja liberada para o console
* antes de iniciar com a próxima operação.
*/
private static void pause()
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
}
}
/**
* Método para procurar em 'age'
* @param service
*/
@SuppressWarnings("unchecked")
private static void searchserver2PropName(Service service)
{
try
{
//Procurar
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 procurar em 'postOfficeBox'
* @param service
*/
@SuppressWarnings("unchecked")
private static void searchserver1PropName(Service service)
{
try
{
//Procurar
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();
}
}
Se a propriedade useGlobalSchema for configurada para usar o esquema global conforme descrito na etapa 5 da seção Pré-requisitos, todas as propriedades estendidas em todas as instâncias podem ser usadas ao executar operações de procura nos domínios. Se você não configurar useGlobalSchema, somente o esquema de domínio específico será estendido e as operações de procura serão baseadas apenas nas propriedades estendidas na instância atual.