Desde las primeras versiones de ADF 11g les había hablado acerca de uno de los componentes de los ViewObjects llamado ViewCriteria a través de los cuales podemos definir sentencias “FindBy” o en otras palabras sentencias para filtrar los datos de una colección con base en uno o más criterios.
En este articulo vamos a ver como trabajar con ViewCriterias utilizando programación para manualmente filtrar los resultados de una colección de datos, producto de una pregunta que se dio en el foro de OTN.
Nuestro punto de partida es una aplicación que tiene sus servicios de negocio basados en Business Components en donde tenemos un VO de Empleados el cual tiene 2 ViewCriterias definidas EmployeeViewCriteria1 y EmployeeViewCriteria2 –la primera filtra los salarios superiores a 10000 y la segunda filtra los empleados que tengan comisión por Ventas asignada (no null). Cabe aclarar que el comportamiento por defecto de las ViewCriterias es que al ser aplicadas van a sobre escribir cualquier otra ViewCriteria que se haya ejecutado previamente, sin embargo también se pueden configurar de tal forma que la ejecución de las mismas sea acumulable.
Lo primero que vamos a hacer es crear algunos métodos propios sobre nuestro VOImpl a través de los cuales vamos a invocar el API de los ViewObjects y de esta forma poder aplicar y remover VCs
//En la clase EmployeesVOImpl.java
public void applyVC(String name){
setApplyViewCriteriaName(name,true);
executeQuery();
}
public void removeVC(String name){
removeApplyViewCriteriaName(name);
executeQuery();
}
Exponemos estos métodos para que hagan parte de las operaciones que se pueden invocar desde la interfaz. Luego necesitamos crear la lógica en la vista para invocar estos métodos y pasar los parámetros adecuados.
Para este ejemplo hemos creado una página sencilla que contiene 4 links – 2 para aplicar las VCs y otros 2 para removerlas.
Dentro de cada uno de los links hago uso de la operación setPropertyListener la cual me sirve para asignar el valor de la VC que quiero invocar a una variable dentro de un managed bean. El código de mi página queda entonces de la siguiente forma:
<af:commandLink text="applyVC1" id="cl1"
actionListener="#{HRTestBean.applyVC_action}">
<af:setPropertyListener from="EmployeesViewCriteria1"
to="#{HRTestBean.criteriaName}"
type="action"/>
</af:commandLink>
<af:commandLink text="applyVC2" id="cl1"
actionListener="#{HRTestBean.applyVC_action}">
<af:setPropertyListener from="EmployeesViewCriteria2"
to="#{HRTestBean.criteriaName}"
type="action"/>
</af:commandLink>
Dentro de mi managed bean todo lo que tengo que hacer es invocar el método respectivo por medio del OperationBindingContainer.
public class HRTestBean {
public String criteriaName;
public HRTestBean() {
}
public void setCriteriaName(String criteriaName) {
this.criteriaName = criteriaName;
}
public String getCriteriaName() {
return criteriaName;
}
public void applyVC_action(ActionEvent actionEvent) {
executeCriteria("applyVC");
}
public void removeVC_action(ActionEvent actionEvent) {
executeCriteria("removeVC");
}
public void executeCriteria(String name){
String cName = getCriteriaName();
BindingContext bctx = BindingContext.getCurrent();
DCBindingContainer bc = (DCBindingContainer)bctx.getCurrentBindingsEntry();
OperationBinding opb = (OperationBinding)bc.getOperationBinding(name);
opb.getParamsMap().put("name",cName);
opb.execute();
}
}
Y finalmente asigno un partialTrigger a mi tabla para que se refresque cada vez que doy click a uno de los links.