Use o código de amostra de ponta a ponta e os gráficos de dados para estender o esquema incluindo uma nova propriedade em um tipo de entidade existente no repositório de arquivo.
As etapas a seguir são cobertas neste cenário 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.
Inclua o seguinte código de amostra de ponta a ponta no código do aplicativo e substitua as variáveis pelos valores reais que você deseja usar.
/**
* Esta classe é usada para demonstrar o uso da API do VMM para estender o esquema.
* Este exemplo inclui uma nova propriedade em um tipo de entidade existente, no repositório de arquivo.
*/
public class ExtendSchemaSample extends BaseApp
{
/**
* Uma constante de sequência para o novo nome de propriedade a ser incluído
*/
private static final String newPropName = "postOfficeBox";
/**
* Ponto de entrada do aplicativo
* @param args
* @throws WIMException
*/
public static void main(String[] args) throws WIMException
{
System.out.println("Iniciando .. ");
// localizar serviço
service = locateService(null);
System.out.println("Located service. Iniciando extensão de esquema ... ");
// Incluir uma nova propriedade (tempo de execução)
runTimeAddNewProperty();
}
/**
* Este método mostra o uso da API de extensão de esquema
* Este exemplo faz o seguinte:
* Inclui uma nova propriedade, postOfficeBox, em um tipo de entidade existente
* Cria uma entidade com o valor 4-23, para a propriedade estendida postOfficeBox
* Procura uma entidade com o valor da propriedade estendida
*/
private static void runTimeAddNewProperty()
{
// Incluir a propriedade "postOfficeBox" em "PersonAccount"
addNewProperty();
System.out.println("A propriedade 'postOfficeBox' é incluída em 'PersonAccount'.");
// Criar uma pessoa com uma propriedade "postOfficeBox"
System.out.println("\nCLIENT: Criando Pessoa B com uma propriedade definida chamada 'postOfficeBox'.");
createPerson();
// Procurar na propriedade "postOfficeBox = 4-23"
searchPerson();
}
/**
* Este método cria uma pessoa com os seguintes atributos
* uid: personb
* cn: Pessoa B
* sn: PersonBLastName
* postOfficeBox: 4-23
*/
private static void createPerson()
{
//Criar Pessoa B ...
try
{
// Obter um objeto de dados raiz. O restante da árvore de objetos seria integrado nele
DataObject root = SDOHelper.createRootDataObject();
// Criar um objeto de dados do tipo de entidade "PersonAccount" sob a raiz
// O objeto está no namespace WIM padrão
DataObject person = root.createDataObject(SchemaConstants.DO_ENTITIES, Service.WIM_NS_URI,
SchemaConstants.DO_PERSON_ACCOUNT);
// Configurar os valores dos atributos obrigatórios, uid, cn, sn
// Configurar também o valor para o atributo "postOfficeBox" recém-incluído
person.set("uid", "personb");
person.set("cn", "Pessoa B");
person.set("sn", "PersonBLastName");
person.set(newPropName, "4-23");
System.out.println("Gráfico de dados de entrada para criar pessoa -> " + printDO(root));
// Chamar a API de criação de esquema para criar a entidade de conta da pessoa definida anteriormente
root = service.create(root);
System.out.println("Gráfico de dados de saída para criar pessoa -> " + printDO(root);
System.out.println("CLIENT: Pessoa B foi criada\n\n");
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
* Este método inclui a propriedade "postOfficeBox" no tipo de entidade "PersonAccount".
*/
@SuppressWarnings("unchecked")
private static void addNewProperty()
{
try
{
System.out.println("\nCLIENT: Criando novo tipo de propriedade postOfficeBox
e incluindo-o no tipo de entidade existente PersonAccount");
// Obter um objeto de dados raiz. O restante da árvore de objetos seria integrado nele
DataObject root = SDOHelper.createRootDataObject();
// Criar um novo objeto "esquema" sob a raiz.
// Este objeto conterá os detalhes das modificações de esquema que precisam ser feitas
DataObject dynaSchemaDO = root.createDataObject(SchemaConstants.DO_SCHEMA);
/***************************************/
/** Código para definir a nova propriedade **/
/***************************************/
// Criar um objeto de dados de esquema de propriedade sob o objeto de esquema criado anteriormente
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, "http://www.yourco.com/wim/yourext");
propSchemaDO.set(SchemaConstants.PROP_NS_PREFIX, "yourprefix");
propSchemaDO.set(SchemaConstants.PROP_PROPERTY_NAME, newPropName);
// Especificar se a propriedade tem diversos valores
// Se ela tiver diversos valores, seu tipo deverá ser Lista
propSchemaDO.setBoolean(SchemaConstants.PROP_MULTI_VALUED, false);
// Especificar o tipo de dado da propriedade
// Tipos de dados podem ser simples, como booleano, inteiro, flutuante, duplo, Sequência
// ou especiais, como Endereço, Pessoa, Grupo etc.
propSchemaDO.set(SchemaConstants.PROP_DATA_TYPE, SchemaConstants.DATA_TYPE_STRING);
// Obter a lista de tipos de entidade nos quais essa propriedade precisa ser incluída
List applicableEntityTypes = propSchemaDO.getList(SchemaConstants.PROP_APPLICABLE_ENTITY_TYPE_NAMES);
// Incluir os nomes de tipo de entidade aplicáveis na lista buscada anteriormente
applicableEntityTypes.add(Service.DO_PERSON_ACCOUNT);
/***************************************************/
/** A nova definição de propriedade é executada **/
/** Agora a API createSchema precisa ser chamada **/
/***************************************************/
System.out.println("Gráfico de dados de entrada para criar propriedade -> " + printDO(root));
// Chamar a API de criação de esquema para incluir de fato a definição de propriedade no modelo de esquema
root = service.createSchema(root);
System.out.println("Gráfico de dados de saída para criar propriedade -> " + printDO(root));
System.out.println("\nCLIENT: Novo tipo de propriedade é criado.");
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
* Procurar pessoa com postOfficeBox = 4-23.
*/
@SuppressWarnings("unchecked")
private static void searchPerson()
{
try
{
//Procurar Pessoa B
// Criar um objeto de dados de controle de procura
DataObject root = SDOHelper.createRootDataObject();
DataObject searchCtrl = SDOHelper.createControlDataObject(root, null,
SchemaConstants.DO_SEARCH_CONTROL);
// Especificar as propriedades que precisam ser buscadas para todas as entradas correspondentes
searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn");
searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("cn");
// Especificar os critérios de correspondência como a expressão de procura
// A expressão aqui especifica o tipo de entidade como "PersonAccount"
// e o valor de "postOfficeBox" como '4-23'
// Executar a procura com essa expressão retornará todos os objetos "PersonAccount"
que tenham um valor de "postOfficeBox" como '4-23'
// As propriedades 'uid', 'sn' e 'cn' seriam buscadas para todos os objetos
searchCtrl.setString(SchemaConstants.PROP_SEARCH_EXPRESSION, "@xsi:type='"
+ Service.DO_PERSON_ACCOUNT + "' and " + newPropName + "='4-23'");
System.out.println("Pesquisando " + searchCtrl.getString(SchemaConstants.PROP_SEARCH_EXPRESSION));
System.out.println("Gráfico de dados de entrada para procura -> " + printDO(root));
// Chamar a API de procura com o controle de procura
root = service.search(root);
System.out.println("Gráfico de dados de saída para procura -> " + printDO(root));
// Iterar sobre os resultados da procura
// Os resultados estão contidos como uma Lista na propriedade "entities"
// do objeto de dados retornado pela API de Procura
// Uma constante de conveniência "DO_ENTITIES" é definida em SchemaConstants para referir-se a essa propriedade
printIdentifiers(root);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
Os gráficos de dados de entrada e os gráficos de dados de saída resultantes para cada etapa deste exemplo são fornecidos a seguir.
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:sdo="commonj.sdo"
xmlns:wim="http://www.ibm.com/websphere/wim">
<wim:Root>
<wim:schema>
<wim:propertySchema nsPrefix="yourprefix" nsURI="http://www.yourco.com/wim/yourext"
dataType="String" multiValued="false" propertyName="postOfficeBox">
<wim:applicableEntityTypeNames>PersonAccount</wim:applicableEntityTypeNames>
</wim:propertySchema>
</wim:schema>
</wim:Root>
</sdo:datagraph>
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:sdo="commonj.sdo"
xmlns:wim="http://www.ibm.com/websphere/wim">
<wim:Root>
<wim:schema>
<wim:propertySchema nsPrefix="yourprefix" nsURI="http://www.yourco.com/wim/yourext"
dataType="String" multiValued="false" propertyName="postOfficeBox">
<wim:applicableEntityTypeNames>PersonAccount</wim:applicableEntityTypeNames>
</wim:propertySchema>
</wim:schema>
</wim:Root>
</sdo:datagraph>
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim"
xmlns:yourprefix="http://www.yourco.com/wim/yourext">
<wim:Root>
<wim:entities xsi:type="wim:PersonAccount">
<wim:uid>personb</wim:uid>
<wim:cn>Pessoa B</wim:cn>
<wim:sn>PersonBLastName</wim:sn>
<yourprefix:postOfficeBox>4-23</yourprefix:postOfficeBox>
</wim:entities>
</wim:Root>
</sdo:datagraph>
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim">
<wim:Root>
<wim:entities xsi:type="wim:PersonAccount">
<wim:identifier externalName="uid=personb,o=defaultWIMFileBasedRealm"
repositoryId="InternalFileRepository"
uniqueId="fc050249-d245-498f-a3f3-1a3d7566f971"
uniqueName="uid=personb,o=defaultWIMFileBasedRealm"/>
</wim:entities>
</wim:Root>
</sdo:datagraph>
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim">
<wim:Root>
<wim:controls xsi:type="wim:SearchControl"
expression="@xsi:type='PersonAccount' and postOfficeBox='4-23'">
<wim:properties>uid</wim:properties>
<wim:properties>sn</wim:properties>
<wim:properties>cn</wim:properties>
</wim:controls>
</wim:Root>
</sdo:datagraph>
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim">
<wim:Root>
<wim:entities xsi:type="wim:PersonAccount">
<wim:identifier externalName="uid=personb,o=defaultWIMFileBasedRealm"
repositoryId="InternalFileRepository"
uniqueId="fc050249-d245-498f-a3f3-1a3d7566f971"
uniqueName="uid=personb,o=defaultWIMFileBasedRealm"/>
<wim:uid>personb</wim:uid>
<wim:cn>Pessoa B</wim:cn>
<wim:sn>PersonBLastName</wim:sn>
</wim:entities>
</wim:Root>
</sdo:datagraph>