Utilice el componente CommandBar del Explorador de
Business Process Choreographer para visualizar una barra con botones.
Estos botones representan mandatos que operan en la vista de detalles de un
objeto o los objetos seleccionados en una lista.
Cuando el usuario pulsa un botón en la interfaz de usuario, se ejecuta
el mandato correspondiente en los objetos seleccionados.
Puede añadir y ampliar el componente CommandBar en la aplicación JSF.
- Añada el componente CommandBar al archivo JSP (JavaServer Pages).
Añada el código bpe:commandbar al código <h:form>.
El código bpe:commandbar debe contener un atributo model.
En el ejemplo siguiente se muestra cómo añadir un componente
CommandBar para visualizar algunas de las propiedades de una instancia de tarea.
<h:form>
<bpe:commandbar model="#{TaskInstanceList}">
<bpe:command commandID="Refresh" >
action="#{TaskInstanceList.refreshList}"
label="Refresh"/>
<bpe:command commandID="MyClaimCommand" >
label="Claim" >
commandClass="<customcode>"/>
</bpe:commandbar>
</h:form>
El atributo model hace referencia a un bean
gestionado. Este bean debe implementar la interfaz ItemProvider y proporcionar los objetos
Java
seleccionados.
El componente CommandBar suele utilizarse con el componente de lista
o el componente de detalles en el mismo archivo JSP.
Generalmente, el modelo especificado en el código es el mismo que el
especificado en el componente de lista o en el componente de detalles en la
misma página.
Así pues, para un componente de lista, por ejemplo, el mandato actúa sobre los elementos
seleccionados de la lista.
En este ejemplo, el atributo model hace referencia al bean gestionado
TaskInstanceList. Este bean proporciona las propiedades de los objetos
Java y debe implementar la interfaz
ItemProvider.
Las clases BPCListHandler y BPCDetailsHandler implementan esta interfaz.
También incluye un mandato de reclamar personalizado.
- Opcional: Configure el bean gestionado al que se hace
referencia en el código bpe:commandbar.
Si
el atributo model de CommandBar hace referencia a un bean gestionado
que ya está configurado, por ejemplo, para un manejador de lista o de detalles,
no se necesita ninguna configuración adicional.
Si ha cambiado la configuración de uno de estos manejadores o ha utilizado un
bean gestionado distinto, añada un bean gestionado que implemente la interfaz
ItemProvider al archivo de configuración JSF.
- Añada el código que implementa los mandatos personalizados en la
aplicación JSF.
El siguiente fragmento de código muestra cómo escribir una clase de
mandato que amplíe la barra de mandatos.
Se hace referencia a esta clase de mandato (MyClaimCommand) mediante el código
bpe:command en el archivo JSP.
El mandato
comprueba las condiciones previas y otros prerrequisitos como, por ejemplo, el
número correcto de elementos seleccionados.
A continuación, recupera una referencia a la API de tareas de usuario,
HumanTaskManagerService. El mandato reitera los objetos seleccionados e intenta
procesarlos.
La tarea se reclama con un ID mediante la API HumanTaskManagerService.
Si no se produce ninguna excepción, se actualiza el estado del objeto
TaskInstanceBean correspondiente. Esta acción evita que se vuelva a recuperar
el valor del objeto del servidor.
public class MyClaimCommand implements Command {
public String execute(List selectedObjects) throws ClientException {
if( selectedObjects != null && selectedObjects.size() > 0 ) {
try {
// Determine HumanTaskManagerService from an HTMConnection bean.
// Configure the bean in the faces-config.xml for easy access
// in the JSF application.
FacesContext ctx = FacesContext.getCurrentInstance();
ValueBinding vb =
ctx.getApplication().createValueBinding("{htmConnection}");
HTMConnection htmConnection = (HTMConnection) htmVB.getValue(ctx);
HumanTaskManagerService htm =
htmConnection.getHumanTaskManagerService();
Iterator iter = selectedObjects.iterator() ;
while( iter.hasNext() ) {
try {
TaskInstanceBean task = (TaskInstanceBean) iter.next() ;
TKIID tiid = task.getID() ;
htm.claim( tiid ) ;
task.setState( new Integer(TaskInstanceBean.STATE_CLAIMED ) ) ;
}
catch( Exception e ) {
; // Error while iterating or claiming task instance.
// Ignore for better understanding of the sample.
}
}
}
catch( Exception e ) {
; // Configuration or communication error.
// Ignore for better understanding of the sample
}
}
return null;
}
// Default implementations
public boolean isMultiSelectEnabled() { return false; }
public boolean[] isApplicable(List itemsOnList) {return null; }
public void setContext(Object targetModel) {; // Not used here }
}
El mandato se procesa de la manera siguiente:
- Se invoca un mandato cuando un usuario pulsa el botón correspondiente de la
barra de mandatos.
El componente CommandBar recupera los elementos seleccionados del
proveedor de elementos especificado en el atributo model y pasa la lista de
objetos seleccionados al método execute de la instancia commandClass.
- El atributo commandClass hace referencia a una
implementación de mandatos personalizada que implementa la interfaz de mandatos.
El mandato debe implementar el método
public String execute(List selectedObjects)throws ClientException.
El mandato devuelve un resultado que se utiliza para determinar la siguiente
norma de navegación para la aplicación JSF.
- Después de completar el mandato, el componente CommandBar
evalúa el atributo action.
El atributo action puede ser una serie estática o un enlace de método a un
método de acción JSF con la signatura public String Method().
Utilice el atributo action para alterar temporalmente el resultado de una clase
de mandato o para especificar explícitamente un resultado para las normas de navegación.
No se procesará el atributo action si el mandato emite una excepción distinta de ErrorsInCommandException.
La aplicación JSF contiene ahora una página JavaServer que implementa
una barra de mandatos personalizada.