Développer un OperationHook

14/04/2017


Développer votre OperationHook afin de réagir à des opérations exécutées au sein de Flower.

Introduction

Cet articule décrit le développement d’un OperationHook. Il s’agit d’un OperationHandler, une classe Java permettant de réagir à l’exécution d’une opération au sein de Flower, pouvant être exécuté à travers une API REST :

  • /{scope}/documents
  • /{scope}/tasks
  • /{scope}/folders
  • /{scope}/virtual_folders

Un OperationContext est fourni au hook pour fournir le contexte d’exécution de l’opération.

Prérequis :

A l’action !

Dans cette partie, nous allons mettre en place un com.flower.docs.operation.api.OperationHook permettant de logger des composants qui ont été créés ou mis à jour.

A chaque fois que notre OperationHook sera notifié, un contexte, correspondant à l’opération exécutée auprès de Flower, sera fourni en entrée de la méthode process(OperationContext context)

  • Créez la classe suivante :

    package com.flower.samples;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.flower.docs.domain.exception.FunctionalException;
    import com.flower.docs.domain.exception.TechnicalException;
    import com.flower.docs.operation.api.DefaultComponentOperationContext;
    import com.flower.docs.operation.api.OperationContext;
    import com.flower.docs.operation.api.OperationHook;
    
    @RestController
    public class SampleOperationHook extends OperationHook
    {
    private static final Logger LOGGER = LoggerFactory.getLogger(SampleOperationHook.class);
    
    @Override
    public void process(OperationContext context) throws TechnicalException, FunctionalException
    {
        LOGGER.info("Processing context={}", context);
        if (context instanceof DefaultComponentOperationContext)
        {
            DefaultComponentOperationContext componentContext = (DefaultComponentOperationContext) context;
            LOGGER.info("Processing components={}", componentContext.getComponents());
        }
    }
    }
    
  • Suivez la procédure de Compilation & Lancement de cet article

Nota :

  • Notre hook SampleOperationHook est annoté avec l’annotation @RestController afin d’indiquer à Sring qu’il s’agit d’un service REST.
  • Pour chaque notification d’une opération, un object portant le contexte d’exécution est fourni par Flower : OperationContext. En fonction de l’opération, différentes sous classes peuvent être fournies:
    • com.flower.docs.operation.api.OperationContext
    • com.flower.docs.operation.api.DefaultComponentOperationContext
    • com.flower.docs.operation.api.TaskOperationContext
    • com.flower.docs.operation.api.SearchOperationContext

Test du hook

Simulation

Pour tester notre hook, nous allons simuler la notification d’une opération : la création d’un document.

  • Commençons par envoyer en POST le contenu JSON suivant :

    {
    "type":"com.flower.docs.operation.api.DefaultComponentOperationContext",
    "id":{
      "value":"158ec44f-026d-42ba-b943-52bfe618caec"
    },
    "operation":{
      "action":"CREATE",
      "objectType":"DOCUMENT"
    },
    "executionPhase":"AFTER",
    "user":{
      "value":"fadmin"
    },
    "time":1493035556793,
    "components":[
      "java.util.ArrayList",
      [
         [
            "com.flower.docs.domain.document.Document",
            {
               "id":{
                  "value":"95b7059c-08a6-49b8-9fcb-d8db29f1b7f3"
               },
               "data":{
                  "owner":"fadmin",
                  "creationDate":1493035556505,
                  "lastUpdateDate":1493035556505,
                  "acl":{
                     "value":"4a3682a6-48f7-40e7-8990-54634e0aa42e"
                  },
                  "classId":{
                     "value":"Claim"
                  },
                  "status":"NEW"
               },
               "tags":{
                  "tags":[
                     "java.util.ArrayList",
                     [
                        {
                           "value":[
                              "java.util.ArrayList",
                              [
                                 "dfsdf"
                              ]
                           ],
                           "name":"Comments",
                           "readOnly":false
                        }
                     ]
                  ]
               },
               "category":"DOCUMENT",
               "name":"-.txt",
               "files":[
                  "java.util.ArrayList",
                  [
                     {
                        "id":{
                           "value":"6445f4b5-ac42-456f-8ef5-ad2e8ccbc3cc"
                        },
                        "name":"-.txt",
                        "formatCode":"text/plain",
                        "creationDate":1493035556641,
                        "size":16967
                     }
                  ]
               ]
            }
         ]
      ]
    ]
    }
    
  • Pour valider la bonne réception de la notification de l’opération de création, consultez les logs ou la console et vérifiez que la ligne suivante s’y trouve :

    com.flower.samples.SampleOperationHook - Processing components=[Document{id=Id{value=95b7059c-08a6-49b8-9fcb-d8db29f1b7f3}, 
    data=ComponentData{owner=fadmin, creationDate=Mon Apr 24 14:05:56 CEST 2017, lastUpdateDate=Mon Apr 24 14:05:56 CEST 2017, 
    retentionStartDate=null, retentionEndDate=null, validityCode=null, acl=Id{value=4a3682a6-48f7-40e7-8990-54634e0aa42e}, 
    classId=Id{value=Claim}, status=NEW}, tags=Tags{tags=[Tag{value=[dfsdf], name=Comments, readOnly=false}]}, category=DOCUMENT, 
    name=-.txt, version=null, mimeType=null, parentId=null, files=[com.flower.docs.domain.file.DocumentFile@7cc06d4b]}]
    

Abonnement

Pour vous abonner à une opération, consulter l’article sur les abonnements à des opérations