Implémentation


Ce tutoriel est basé sur Maven et nécessite l’utilisation de l’Artifactory Arondor dans lequel sont déployées les librairies FlowerDocs.

Quand vous aurez terminé ce module de formation, vous serez capable de développer un OperationHook sécurisé permettant de réagir à la création de documents et de les renommer automatiquement.

Création du projet

A l’aide de votre IDE préféré, commencez par créer un nouveau projet Maven avec le POM suivant :

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

    <groupId>com.flower.docs.samples</groupId>
    <artifactId>modify-operation-hook</artifactId>
    <version>0.0.1-SNAPSHOT</version>

	<dependencies>
		<dependency>
			<groupId>com.flower.docs</groupId>
			<artifactId>flower-docs-starter-client</artifactId>
			<version>2.7.6</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<version>2.5.14</version>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
							<goal>build-info</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<executable>true</executable>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

Application Spring Boot

Cette application Spring Boot s’appuie sur le starter Spring Boot fourni par FlowerDocs.

  • Pour commencer, nous avons besoin d’une main class Spring Boot annotée avec l’annotation @SpringBootApplication :
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package com.flower.samples;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.flower.docs.FlowerDocsClient;
import com.flower.docs.SecurityMode;

@SpringBootApplication
@FlowerDocsClient(security = SecurityMode.USER)
public class ModifyHookApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(ModifyHookApplication.class, args);
    }
}
  • Ajoutez ensuite le fichier application.properties dans le répertoire src/main/resources de votre projet pour configurer l’application :

    1
    2
    3
    4
    5
    6
    7
    8
    
    spring.application.name=modify-hook
    server.port=7777
    server.servlet.context-path=/modify
    
    ws.url=http://localhost:8081/core/services
    
    internal.realm.users[0].id=<user>
    internal.realm.users[0].password=<password>

    1 Nom de l’application Spring Boot

    2 Port utilisé pour exposer l’application WEB

    3 Chemin de l’application. L’application est ainsi accessible via l’URL de base http://localhost:7777/modify

    5 URL d’accès aux web services exposés par FlowerDocs Core.

    7 Identifiant de l’utilisateur permettant d’accéder à l’OperationHook

    8 Mot de passe de l’utilisateur permettant d’accéder à l’OperationHook

Développement du hook

Passons maintenant à l’OperationHook ! Pour implémenter votre premier hook, créez la classe ModifyOperationHook telle que :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.flower.samples;

import org.springframework.web.bind.annotation.RestController;
import org.terracotta.statistics.Time;

import com.flower.docs.domain.component.Component;
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 ModifyOperationHook extends OperationHook
{
    @Override
    public void process(OperationContext context) throws TechnicalException, FunctionalException
    {
        if (context instanceof DefaultComponentOperationContext)
        {
            DefaultComponentOperationContext componentContext = (DefaultComponentOperationContext) context;
            for (Component component : componentContext.getComponents())
            {
                component.setName(component.getName() + "_" + Time.absoluteTime());
            }
        }
    }
}

13 L’annotation @RestController définie le hook comme étant un web service REST exposé sur /

14 La classe ModifyOperationHook étend la classe OperationHook qui permet de faciliter l’implémentation d’un hook à l’aide du framework Spring Boot

17 La méthode process doit être implémentée afin de définir le comportement suite à l’exécution d’une opération au sein de FlowerDocs Core

17 L’OperationHook réagit seulement aux contextes de classe DefaultComponentOperationContext

24 Chaque composant du contexte d’opération est renommé à l’aide de la date courrante