Storage Engine
##############

Modes ReadOnly / Write Protection
#################################

Le storage engine peut être déployé sur site primaire (ReadWrite) ou sur site secondaire (ReadOnly)
L'annotation @WriteProtection est obligatoire pour toutes les ressources du Storage Engine.

Storage Engine Client
#####################

La factory
**********

Afin de récupérer le client une factory a été mise en place.

.. code-block:: java

  // Récupération du client
  StorageClientFactory.changeMode(ClientConfiguration configuration)    
  StorageClient client = StorageClientFactory.getInstance().getClient();


A la demande l'instance courante du client, si un fichier de configuration storage-client.conf est présent dans le classpath le client en mode de production est envoyé, sinon il s'agit du mock.


Le Mock
=======

En l'absence d'une configuration, le client est en mode Mock. Il est possible de récupérer directement le mock :

.. code-block:: java

  // Changer la configuration du Factory
  StorageClientFactory.changeMode(null)
  // Récupération explicite du client mock
  StorageClient client = StorageClientFactory.getInstance().getClient();


Le mode de production
=====================

Pour instancier son client en mode Production :

.. code-block:: java

  // Changer la configuration du Factory
  StorageClientFactory.setConfiguration(StorageConfiguration configuration);
  // Récupération explicite du client
  StorageClient client = StorageClientFactory.getInstance().getClient();

Les services
************

Le client propose actuellement des fonctionnalités nécéssitant toutes deux paramètres obligatoires :

- l'identifiant du tenant (valeur de test "0")
- l'identifiant de la stratégie de stockage (valeur de test "default")

Ces fonctionnalités sont :

- la récupération des informations sur une offre de stockage pour une stratégie (disponibilité et capacité) :

.. code-block:: java

  JsonNode result = client.getStorageInformation("0", "default");

- l'envoi d'un objet sur une offre de stockage selon une stratégie donnée :
	- pour les objets contenus dans le workspace (objets binaires) :

.. code-block:: java

	StoredInfoResult result = storeFileFromWorkspace("0", "default", StorageCollectionType.OBJECTS, "aeaaaaaaaaaam7mxaaaamakv3x3yehaaaaaq");


  - pour les metadatas Json (objectGroup, unit, logbook -- pas encore implémenté côté serveur) :

- la vérification de l'existance d'un objet dans l'offre de stockage selon  une stratégie donnée :
   - pour les conteneurs (pas encore implémenté côté serveur) :

.. code-block:: java

	boolean exist = existsContainer("0", "default");

   - pour les autres objets (object, objectGroup, unit, logbook -- implémenté côté serveur uniquement pour object) :

.. code-block:: java

		boolean exist = exists("0", "default", StorageCollectionType.OBJECTS, "aeaaaaaaaaaam7mxaaaamakv3x3yehaaaaaq");

- la suppression d'un objet dans l'offre de stockage selon  une stratégie donnée :
  - pour les conteneurs  (pas encore implémenté côté serveur) :

.. code-block:: java

  boolean deleted = deleteContainer("0", "default");

   - pour les autres objets (object, objectGroup, unit, logbook -- implémenté côté serveur uniquement pour object) :

.. code-block:: java

  boolean deleted = delete("0", "default", StorageCollectionType.OBJECTS, "aeaaaaaaaaaam7mxaaaamakv3x3yehaaaaaq");

- la récupération d'un objet (InputStream) contenu dans un container :

.. code-block:: java

  Response response = client.getContainerAsync("0", "default", "aeaaaaaaaaaam7mxaaaamakv3x3yehaaaaaq");

- La récupération de la liste d'objets d'un certain type :

.. code-block:: java

  // Si cursorId non connu
  Response response = listContainerObjects("default", DataCategory.OBJECT, null)
  // Si cursorId connu
  Response response = listContainerObjects("default", DataCategory.OBJECT, "idcursor")

- La récupération du status est également disponible :

.. code-block:: java

	StatusMessage status = client.getStatus();

