Añadir lógica de negocio nueva a un mandato de controlador

La nueva lógica de negocio puede añadirse antes de la lógica de negocio existente, después de la lógica existente y tanto antes como después. Suponga que hay un mandato de controlador de HCL Commerce denominado ExistingControllerCmd. Según los convenios de denominación de HCL Commerce, este mandato de controlador debe tener una clase de interfaz llamada ExistingControllerCmd y una clase de implementación llamada ExistingControllerCmdImpl. Ahora supongamos que surge un requisito de negocio y que debe añadir nueva lógica de negocio a este mandato ya existente. Una parte de la lógica debe ejecutarse antes de la lógica de mandatos existente y otra parte debe ejecutarse después de la lógica de mandatos existente.

Por qué y cuándo se efectúa esta tarea

El primer paso para añadir la lógica de negocio nueva es crear una clase de implementación nueva que amplíe la clase de implementación original. En este ejemplo, crearía una nueva clase ModifiedControllerCmdImpl que amplía la clase ExistingControllerCmdImpl. La nueva clase de implementación debería implementar la interfaz original (ExistingControllerCmd).

En la nueva clase de implementación debe crear un nuevo método performExecute para modificar el performExecute del mandato existente. En el nuevo performExecute método, hay dos formas en las que puede insertar la nueva lógica de negocio: puede incluir directamente el código en el mandato de controlador o puede crear un mandato de tarea nuevo para realizar la lógica de negocio nueva. Si crea un nuevo mandato de tarea, debe crear una instancia del objeto de mandato de tarea nuevo desde el mandato de controlador.

El siguiente fragmento de código demuestra cómo se añade la nueva lógica al principio y final de un mandato de controlador existente incluyendo la lógica directamente en el mandato de controlador:


public class ModifiedControllerCmdImpl extends ExistingControllerCmdImpl 
   implements ExistingControllerCmd 
   {
      public void performExecute () 
         throws com.ibm.commerce.exception.ECException 
         {
            
            /* Insert new business logic that must be 
               executed before the original command.
            */

            // Execute the original command logic.
            super.performExecute();

            /* Insert new business logic that must be 
               executed after the original command.
            */
          }
    }    

El siguiente fragmento de código demuestra cómo se añade la nueva lógica al principio de un mandato de controlador existente creando una instancia de un mandato de tarea nuevo desde el mandato de controlador. Además, también se ha de crear la interfaz del mandato de tarea nueva y la clase de implementación y se ha de registrar el mandato de tarea en el registro de mandatos.


// Import the package with the CommandFactory
import com.ibm.commerce.command.*;

public class ModifiedControllerCmdImpl extends ExistingControllerCmdImpl 
   implements ExistingControllerCmd 
   {

      public void performExecute () 
         throws com.ibm.commerce.exception.ECException 
         {
            MyNewTaskCmd cmd = null;
            cmd = (MyNewTaskCmd) CommandFactory.createCommand(
               "com.mycompany.mycommands.MyNewTaskCommand", 
               getStoreId());
    
            /*
            Set task command's input parameters, call its
            execute method and retrieve output
            parameters, as required. 
            */

            super.performExecute();
         }
   } 

Independientemente de si incluye la nueva lógica de negocio en el mandato de controlador o de si crea un mandato de tarea para ejecutar la lógica, debe también actualizar la tabla CMDREG en el registro de mandatos de HCL Commerce para asociar la nueva clase de implementación del mandato de controlador con la interfaz del mandato de controlador existente. La siguiente sentencia SQL muestra una actualización de ejemplo:


update CMDREG
set CLASSNAME='ModifiedControllerCmdImpl' 
where INTERFACENAME='ExistingControllerCmd'