Código

Como se ha indicado anteriormente, un método de objeto de proceso negocio especificado como una función de asignación deberá devolver una estructura de tipo curam.util.workflow.struct.AllocationTargetList.

Como ocurre con los métodos de negocio asociados a actividades automáticas, un error en la función de asignación cuando se ejecuta una actividad manual provocará que se invoque la estrategia de manejo de errores de flujo de trabajo. Esto puede provocar, por ejemplo, que la actividad asociada al método fallido se reintente una serie de veces. Por este motivo, las funciones de asignación asociadas a las estrategias de asignación de actividades manuales o de decisión no deberán, en general, lanzar excepciones a menos que se produzca una situación irrecuperable.

La aplicación debe implementar la interfaz de devolución de llamada curam.util.workflow.impl.WorkResolver para determinar qué tareas se asignan en la aplicación. La propiedad de aplicación curam.custom.workflow.workresolver debe hacer referencia a la implementación de la clase curam.util.workflow.impl.WorkResolver de la aplicación, ya que el motor de flujo de trabajo utilizará esta propiedad para determinar la función correcta para asignar la tarea.

La clase curam.util.workflow.impl.WorkResolver tiene sobrecargado el método resolveWork porque los diversos tipos de estrategia de asignación devuelven los destinos de asignación en distintos formatos. No obstante, esto es un detalle de implementación del que no tienen que preocuparse los desarrolladores de clases personalizadas de resolución de trabajo, sobre todo porque el procesamiento de negocio de todas las versiones del método debería ser el mismo.

package curam.util.workflow.impl;
      
      ...
      
      public interface WorkResolver {
      
        void resolveWork(
          final TaskDetails taskDetails,
          final Object allocationTargets,
          final boolean previouslyAllocated);
      
        void resolveWork(
            final TaskDetails taskDetails,
            final Map allocationTargets,
            final boolean previouslyAllocated);
      
        void resolveWork(
            final TaskDetails taskDetails,
            final String allocationTargetID,
            final boolean previouslyAllocated);
            
            ...
      }

Para paliar este problema, curam.core.sl.impl.DefaultWorkResolverAdapter proporciona un mecanismo más cómodo de implementar un programa de resolución de trabajo. Esta clase implementa los distintos métodos y convierte sus parámetros de entrada en listas de destino de asignación, permitiendo a los desarrolladores de lógica de resolución de trabajo personalizada extender esta clase e implementar un método que se invoca independientemente del origen de los destinos de asignación.

package curam.core.sl.impl;
      
      ...
      
      public abstract class DefaultWorkResolverAdapter
        implements curam.util.workflow.impl.WorkResolver {
      
        public abstract void resolveWork(
          final TaskDetails taskDetails,
          final AllocationTargetList allocationTargets,
          final boolean previouslyAllocated);
            
            ...
      }

Además de esta clase de adaptador, la aplicación se distribuye con una implementación de resolución de trabajo que ya va lista para utilizarse. Dicha clase se denomina curam.core.sl.impl.DefaultWorkResolver y también sirve de ejemplo de cómo extender el adaptador.