9 nov. 2021 15:52:58 Thomas Dumont avatar

Créer un ResourceService

Services de chargement des resources pour les applications

Lutece propose une implémentation de base pour des services internes aux applications leur permettant de charger leurs resources. Par exemple, le plugin calendar gère des agendas et dispose d'un service AgendaService qui permet de charger une resource, en l'occurence ici d'un agenda, à partir de son identifiant.

Les objectifs de l'implémentation de base appelée ResourceService sont de fournir :

  • une couche d'abstraction par rapport au mode de chargement des resources. Celles-ci peuvent être chargées à partir de fichiers, d'une base de données ou autre. Chaque dispositif de chargement correspond à une implémentation de l'interface ResourceLoader. Il est possible de combiner plusieurs dispositifs de chargement.
  • un système de cache intégré pour optimiser l'accès aux ressources. Le cache de chaque service est administrable à partir de la fonctionnalité Gestion des caches de Lutèce.
  • des facilités de configuration du service ( nom , activation du cache, ...) basées sur le fichier properties de l'application.

Voici le diagramme de classes de l'API :

Diagramme de classe API ResourceService

Implémentation d'un ResourceService

Voici l'implémentation minimale d'un service sous la forme d'un singleton.

public class MyResourceService extends ResourceService
{
    private static MyResourceService _singleton = new MyResourceService
    private static final String PROPERTY_NAME = "myplugin.service.name";
    private static final String PROPERTY_CACHE = "myplugin.service.cache";
    private static final String PROPERTY_LOADERS = "myplugin.service.loaders";

    /**
     * Private constructor
     */
    private MyResourceService
    {
        super();
        setCacheKey( PROPERTY_CACHE );
        setNameKey( PROPERTY_NAME );
    }

    /**
     * Returns the instance of the singleton
     *
     * @return The instance of the singleton
     */
    public static MyResourceService getInstance()
    {
        return _singleton;
    }

    /**
     * Returns the property key that contains the loaders list
     * @return A property key
     */
    protected String getLoadersProperty(  )
    {
        return PROPERTY_LOADERS;
    }

    /**
     * Returns the Resource corresponding to the given name
     *
     * @param strResourceName The resource name
     * @return the Resource corresponding to the given name
     */
    public MyResource getMyResource( String strResourceName )
    {
        return  ( MyResource ) getResource( strResourceName );
    }
}

La configuration du service se fait dans le fichier properties. Les valeurs de base à configurer sont :

Elément de configuration Exemple dans le fichier properties
Nom du service myplugin.service.name=Plugin MyPlugin - MyResources Loading Service
Activation du cache myplugin.service.cache=true
Liste des loaders myplugin.service.loaders=com.mycompany.myapp.service.MyResourceLoader

Implémentation d'un ResourceLoader

L'implémentation minimum d'un ResourceLoader est la suivante :

import fr.paris.lutece.portal.service.resource.Resource;
import fr.paris.lutece.portal.service.resource.ResourceLoader;

import java.util.ArrayList;

/**
 * MyResourceLoader
 */
public class MyResourceLoader implements ResourceLoader
{

    /**
     * Implementation of the ResourceLoader interface
     * @return A collection of resources
     */
    public Collection getResources(  )
    {
        // Build a collection of all resources available by this loader
        ArrayList listResources = new ArrayList(  );
        ...
        return listResources
    }

    /**
     * Implementation of the ResourceLoader interface
     * @param strId The resource Id
     * @return The Resource
     */
    public Resource getResource( String strId )
    {
        ...
    }
}