GenericPresentationModel
Ola pessoal
Estou com o seguinte problema para resolver:
Em meu sistema existem várias classes as quais possuem comportamento semelhante e poucas funcionalidades tais como:
Estado, Cidade, Categoria, SubCategoria, se formos observar estas classes possuem comportamentos semelhantes. Então estou tentando criar uma classe de modelo de apresentação (PresentationModel) genérica que servirá para grande parte dos cadastros. O que estou tentando fazer é o seguinte:
Observe que a classe OrderModel é ma classe que estende a classe PresentationModel que por padrão ja declara um tipo genérico em sua assinatura
veja a documentação desta classe no link abaixo: C:\JGoodies\docs\binding\api\com\jgoodies\binding\PresentationModel.html esta é uma classe que realiza o bind das propriedades de um bean com seu editor(formulário onde os dados são apresentados). Da forma como ela esta tudo funciona normalmente exceto o metodo abaixo: private void updateValidationResult() {
Order order = (Order) getBean();
ValidationResult result = new OrderValidator().validate(order);
validationResultModel.setResult(result);
} onde é necessário realizar um cast para o objeto de negócio desejado exemplo: Order order = (Order) getBean(); Categoria categoria (Categoria) getBean(); Cidade cidade (Cidade) getBean(); O problema reside no fato de que o metodo getBean() da classe PresentationModel<B> a qual é superClasse da que estou tentando implementar esta retornando Object e não o objeto passado como parametro quando eu a instancio como abaixo: public ComponentFeedbackExample() { orderModel = new OrderModel(new Order()); }Observer que passei um objeto do tipo Order. Existe uma maneira de resolver este problema do cast para tornar o componente genérico? Observe que este é o primeiro ponto a ser resolvido o proximo é: realizar a instanciação da classe correta de validação de acordo com cada objeto passado. Exemplo: se eu passar um objeto do tipo Order eu tenho que instanciar sua classe de validação correspondente no metodo updateValidationResult() que foi descrito acima. ValidationResult result = new OrderValidator().validate(order);
ValidationResult result = new CategoriaValidator().validate(categoria); ValidationResult result = new SubCategoriaValidator().validate(subCategoria);
Sera que estou no caminho correto? Se você quiser ai esta o link para o codigo fonte completo do exemplo. http://video.devmedia.com.br/discovirtual/200152/GenericPresentationModel/Copy of Validation.zip /**
* Provides all models to bind an order editor to its domain model,
* an instance of {@link Order}.
*
* @author Karsten Lentzsch
* @version $Revision: 1.15 $
*/
public class OrderModel<T> extends PresentationModel<T> { private final ValidationResultModel validationResultModel; // Instance Creation ****************************************************** public OrderModel(T order) {
super(order);
validationResultModel = new DefaultValidationResultModel();
initEventHandling();
updateValidationResult();
}
// Exposing Models ******************************************************** public ValidationResultModel getValidationResultModel() {
return validationResultModel;
}
// Initialization ********************************************************* /**
* Listens to changes in all properties of the current Order
* and to Order changes.
*/
private void initEventHandling() {
PropertyChangeListener handler = new ValidationUpdateHandler();
addBeanPropertyChangeListener(handler);
getBeanChannel().addValueChangeListener(handler);
}
// Event Handling ********************************************************* private void updateValidationResult() {
---------------- Order order = (Order) getBean(); ----------------------
ValidationResult result = new OrderValidator().validate(order);
validationResultModel.setResult(result);
}
/**
* Validates the order using an OrderValidator and
* updates the validation result.
*/
private final class ValidationUpdateHandler implements PropertyChangeListener { public void propertyChange(PropertyChangeEvent evt) {
updateValidationResult();
} } }
veja a documentação desta classe no link abaixo: C:\JGoodies\docs\binding\api\com\jgoodies\binding\PresentationModel.html esta é uma classe que realiza o bind das propriedades de um bean com seu editor(formulário onde os dados são apresentados). Da forma como ela esta tudo funciona normalmente exceto o metodo abaixo: private void updateValidationResult() {
Order order = (Order) getBean();
ValidationResult result = new OrderValidator().validate(order);
validationResultModel.setResult(result);
} onde é necessário realizar um cast para o objeto de negócio desejado exemplo: Order order = (Order) getBean(); Categoria categoria (Categoria) getBean(); Cidade cidade (Cidade) getBean(); O problema reside no fato de que o metodo getBean() da classe PresentationModel<B> a qual é superClasse da que estou tentando implementar esta retornando Object e não o objeto passado como parametro quando eu a instancio como abaixo: public ComponentFeedbackExample() { orderModel = new OrderModel(new Order()); }Observer que passei um objeto do tipo Order. Existe uma maneira de resolver este problema do cast para tornar o componente genérico? Observe que este é o primeiro ponto a ser resolvido o proximo é: realizar a instanciação da classe correta de validação de acordo com cada objeto passado. Exemplo: se eu passar um objeto do tipo Order eu tenho que instanciar sua classe de validação correspondente no metodo updateValidationResult() que foi descrito acima. ValidationResult result = new OrderValidator().validate(order);
ValidationResult result = new CategoriaValidator().validate(categoria); ValidationResult result = new SubCategoriaValidator().validate(subCategoria);
Sera que estou no caminho correto? Se você quiser ai esta o link para o codigo fonte completo do exemplo. http://video.devmedia.com.br/discovirtual/200152/GenericPresentationModel/Copy of Validation.zip /**
* Provides all models to bind an order editor to its domain model,
* an instance of {@link Order}.
*
* @author Karsten Lentzsch
* @version $Revision: 1.15 $
*/
public class OrderModel<T> extends PresentationModel<T> { private final ValidationResultModel validationResultModel; // Instance Creation ****************************************************** public OrderModel(T order) {
super(order);
validationResultModel = new DefaultValidationResultModel();
initEventHandling();
updateValidationResult();
}
// Exposing Models ******************************************************** public ValidationResultModel getValidationResultModel() {
return validationResultModel;
}
// Initialization ********************************************************* /**
* Listens to changes in all properties of the current Order
* and to Order changes.
*/
private void initEventHandling() {
PropertyChangeListener handler = new ValidationUpdateHandler();
addBeanPropertyChangeListener(handler);
getBeanChannel().addValueChangeListener(handler);
}
// Event Handling ********************************************************* private void updateValidationResult() {
---------------- Order order = (Order) getBean(); ----------------------
ValidationResult result = new OrderValidator().validate(order);
validationResultModel.setResult(result);
}
/**
* Validates the order using an OrderValidator and
* updates the validation result.
*/
private final class ValidationUpdateHandler implements PropertyChangeListener { public void propertyChange(PropertyChangeEvent evt) {
updateValidationResult();
} } }
Israel Barbosa
Curtidas 0
Respostas
Henrique Weissmann
20/02/2010
Oi Israel,
o link incluido no seu chamado aponta para o seu HD local. Será que você poderia disponibilizar este texto em algum lugar na Internet para que eu possa avaliá-lo?
o link incluido no seu chamado aponta para o seu HD local. Será que você poderia disponibilizar este texto em algum lugar na Internet para que eu possa avaliá-lo?
GOSTEI 0
Israel Barbosa
20/02/2010
O javadocs da classe PresentationModel esta anexo a um email que te mandei. Fiz isto porque não achei o link na
internet. E tbm porque estou com com uma internet discada que neste momento me disponibiliza velocidade de navegação de 26kbps , impossivel de fazer upload para o disco virtual nesta velocidade.
Qualquer coisa me avise se não encontrar o email.
GOSTEI 0
Henrique Weissmann
20/02/2010
Oi Israel,
vamos ao primeiro problema:
"(...) Existe uma maneira de resolver este problema do cast para tornar o componente genérico?"
Não há muito o que fazer neste caso. Essencialmente, por retornar uma instância de Object o método já é o mais genérico possível visto ser Object a classe base de todas as outras. Nâo sei se é o caso, mas já vi bibliotecas que foram feitas para dar suporte ao Java pré 1.5 apresentar probleams com o uso de genéricos. Pode ser que seja o caso.
Agora com relação ao segundo problema: na realidade, não há problema algum Israel, você está indo no caminho certo. É exatamente assim que se faz.
vamos ao primeiro problema:
"(...) Existe uma maneira de resolver este problema do cast para tornar o componente genérico?"
Não há muito o que fazer neste caso. Essencialmente, por retornar uma instância de Object o método já é o mais genérico possível visto ser Object a classe base de todas as outras. Nâo sei se é o caso, mas já vi bibliotecas que foram feitas para dar suporte ao Java pré 1.5 apresentar probleams com o uso de genéricos. Pode ser que seja o caso.
Agora com relação ao segundo problema: na realidade, não há problema algum Israel, você está indo no caminho certo. É exatamente assim que se faz.
GOSTEI 0
Israel Barbosa
20/02/2010
Bao tarde Henrique
O pacote de validação faz parte do modelo ou no controlador?
Após responder pode fechar este chamado?
GOSTEI 0
Henrique Weissmann
20/02/2010
O pacote de validação faz parte do modelo, visto que o trabalho do controlador é apenas o de intermediar as chamadas da visualização para o modelo e vice-versa.
GOSTEI 0