Esfinge AOM Role Mapper - Framework para Adaptive Object Models (AOMs)
Introdução a Adaptive Object Models
Type Object
Type Square
Relacionamentos
- Usar o padrão Property duas vezes – uma vez para atributos e outra para associações;
- Criar duas subclasses para a classe Property – Attribute e Association;
- Checar o tipo do valor do objeto Property: uma Property cujo valor é uma Entity representa uma associação, enquanto uma Property cujo valor é um tipo primitivo corresponde a um atributo;
- Utilizar o padrão Accountability para representar a associação.
Estrutura básica do Esfinge AOM Role Mapper
Exemplo do Tutorial
Particularidades do AOM Role Mapper
Modificando a Aplicação AOM a Ser Adaptada
- @EntityType: (Classe) Identifica classes que desempenham o papel Entity Type na arquitetura AOM; (Atributo em classes do tipo Entity) Identifica o atributo que referencia o Entity Type correspondente a uma Entity;
- @Entity: (Classe) Identifica classes que desempenham o papel Entity na arquitetura AOM;
- @PropertyType: (Classe) Identifica classes que desempenham o papel Property Type na arquitetura AOM; (Atributo em classes do tipo Property) Identifica o atributo que referencia o Property Type correspondente a uma Property;
- @EntityProperties: (Classe) Identifica classes que desempenham o papel Property na arquitetura AOM; (Atributo em classes do tipo Entity) Identifica o atributo que referencia as Properties de uma Entity;
- @EntityProperty: (Atributo em classes do tipo Entity) (Opcional) Identifica atributos que correspondem a propriedades fixas em uma classe Entity;
- @Name: (Atributo em classes do tipo Entity Type ou Property Type) Identifica o atributo que contém o nome de um Entity Type ou um Property Type;
- @PropertyTypeType: (Atributo em classes do tipo Property Type) Identifica o atributo que contém o tipo de um Property Type;
- @PropertyValue: (Atributo em classes do tipo Property) Identifica o atributo que contém o valor de uma Property;
- @CreateEntityMethod: (Método em classes do tipo Entity Type) Identifica o método de uma classe Entity Type que lida com a criação de um Entity com esse tipo. Se nenhum método é marcado com essa anotação, o método createNewEntity da interface IEntityType irá lançar uma exceção quando for invocada no objeto.
Exemplo
@Entity public class Account { @EntityType private AccountType accountType; @EntityProperty private int accountNumber; ... public int getAccountNumber() { return accountNumber; } public void setAccountNumber(int accountNumber) { this.accountNumber = accountNumber; } }
Utilizando a Estrutura Central do Framework AOM Role Mapper
A Estrutura Central Comum
Carregando e Salvando Elementos
private ModelManager manager = ModelManager.getInstance();
List model = manager.loadModel();
Configuração
Um exemplo de arquivo de configuração é dado abaixo:
<Model> <Data> <EntityType name="entityTypeName" package="entityTypePackage" adaptedClass="adapted.class.MyEntityType"> <PropertyType name="propertyTypeName" type="java.lang.Double" adaptedClass="adapted.class.MyPropertyType" /> <!—Other Property Types --> </EntityType> <Relationship> <EntityType name="entityTypeName" package="entityTypePackage"> <PropertyType name="relationPropType" type="relationEntityType" package="relationEntityTypePackage" adaptedClass="adapted.class.MyEntityType"/> </EntityType> </Relationship> </Data> </Model>
Os conteúdos dos nós desse arquivo são descritos abaixo:
Model/Data/EntityType: Nó que contém informação de um Entity Type. Os atributos válidos são:
- name: nome do Entity Type
- package: (opcional) pacote do Entity Type
- adaptedClass: (opcional) classe específica de domínio a ser adaptada que desempenha o papel de Entity Type
Model/Data/EntityType/PropertyType: Nó que contém informação de um Property Type ou de um Entity Type. Apenas Property Types primitivos podem ser configurados neste nó. Os atributos válidos são:
- name: nome do Property Type
- type: tipo do Property Type
- adaptedClass: (opcional) classe específica de domínio a ser adaptada que desempenha o papel de Property Type
Model/Data/Relationship/EntityType: Nó que contém informação de um Entity Type que contém um Property Type que corresponde a um relacionamento. Os atributos válidos são:
- name: nome do Entity Type
- package: (opcional) pacote do Entity Type
Model/Data/Relationship/EntityType/PropertyType: Nó que contém informação de um Property Type de um Entity Type. Apenas Property Types que correspondem a um relacionamento devem ser configurados neste nó. Os atributos válidos são:
- name: nome do Property Type
- type: nome do Entity Type que corresponde ao tipo do Property Type
- package: (opcional) pacote do Entity Type que
corresponde ao tipo do Property Type
adaptedClass: (opcional) classe específica de domínio a ser adaptada que desempenha o papel de Property Type
ModelConfiguration configuration = new ModelConfiguration("C:\AOM\ModelConfiguration.xml"); List model = configuration.getModel(); for (IEntityType entityType : model) { try { manager.save(entityType); } catch (EsfingeAOMException e1) { ... } }
Criando Elementos da Estrutura Central
IEntityType entityType = EntityTypeFactory.createEntityType("my.package", "myType");
IEntity entity = entityType.createNewEntity();
Modificando Entity Types e Entities
O exemplo abaixo mostra como adicionar um Property Type a um Entity Type:
IPropertyType propertyType = PropertyTypeFactory.createPropertyType("myPropertyType", String.class); entityType.addPropertyType(propertyType);
O exemplo abaixo mostra como remover um Property Type de um Entity Type:
entityType.removePropertyType("myPropertyType");
O exemplo abaixo mostra como atribuir um valor a uma Property de uma Entity:
entity.setProperty("myPropertyType", "myStringValue");
IDs de Entity Types e Entities
- O ID de um IEntityType é determinado pelo pacote e nome do IEntityType. Isso quer dizer que nunca haverá duas instâncias de IEntityType que contenham o mesmo nome e pacote.
- O ID de uma IEntity é determinado por uma IProperty identificada pelo nome id. Toda instância de IEntityType contém um IPropertyType cujo tipo é um Object e o nome é id. O valor da IProperty que corresponde a esse IPropertyType é considerado como o ID de uma Entity.
Toda vez que o ModelManager for requisitado para salvar uma IEntity, ele irá verificar o valor da Property id da Entity. Caso esse valor seja nulo, o ModelManager irá gerar automaticamente um ID para a Entity e atribuí-lo antes de persistir a Entity. Caso contrário, o ModelManager irá considerar o valor presente na propriedade como o ID da Entity.
Dessa forma, existem duas possibilidades para o gerenciamento de IDs de Entities:
- Deixar o AOM Role Mapper responsável pelo gerenciamento dos IDs das Entities; ou
- Deixar a aplicação cliente ou framework cliente responsável pelo gerenciamento dos IDs (atribuindo os valores corretos para a Property id das Entities)
Lidando com Persistência
<Configuration> <Host>localhost</Host> <Database>mongoaomtest</Database> <EntityTypeCollectionName>EntityTypeCollection</EntityTypeCollectionName> <EntityTypeToCollectionMap entityType=".*Account.*" package="banking" collection="AccountType" /> <EntityTypeToCollectionMap entityType="department.Patient" package="medical" collection="PartyType" /> <EntityTypeToCollectionMap entityType=".*" collection="GenericType" /> </Configuration>
Os nós do arquivo são descritos abaixo:
Configuration/Host: contém o host que contém o banco de dados
Configuration/Database: contém o nome do database onde as informações da aplicação serão armazenadas
- entityType: contém uma expressão regular a ser verificada contra o nome do Entity Type que corresponde à Entity a ser persistida
- package: (opcional) contém uma expressão regular a ser verificada contra o pacote do Entity Type que corresponde à Entity a ser persistida. Se o atributo não estiver presente, qualquer pacote será considerado como válido para a regra.
- collection: nome da collection onde a Entity será armazenada no caso de a regra servir para o nome e pacote do Entity Type correspondente à Entity.
Apoio