Lecture Simple YAMLBeans

De EjnTricks

Cette page présente l'utilisation de YAMLBeans pour charger une ou plusieurs données depuis un flux d'entrées.


Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


Study icon.png Déclarations

Pour rappel, le code commun est utilisé dans le cadre de ces exemples. Chacun des services est implémenté et démontré à l'aide de tests unitaires.

Le code est disponible dans le module yamlbeans du projet d'étude.


Icon-database-search.png Chargement

Dans les deux cas de chargement, unique ou multiple, cela s'effectue à l'aide d'une instance de com.esotericsoftware.yamlbeans.YamlReader appelée avec la classe utilisée pour mapper les données. Le chargement d'une données unique s'effectue par la fonction read.

  /**
   * {@inheritDoc}
   */
  @Override
  public <T> T loadProperty(InputStream resource, Class<T> objectClass) {
    T res = null;

    YamlReader reader;
    try {
      reader = new YamlReader(new InputStreamReader(resource));
      res = reader.read(objectClass);
    } catch (YamlException yamlException) {
      LOGGER.error("Failed to load YAML content", yamlException);
    }

    return res;
  }

Le constructeur utilisé prend en compte une instance de javaio.Reader, soit un InputStreamReader dans le cas de l'exemple.

L'argument objectClass, de la fonction read permet de spécifier au framework quelle implémentation est utilisée pour charger les données.

Le chargement multiple s'effectue de la même façon en passant un la class List comme premier argument, et la classe comme second pour indiquer le type des élément de la liste.

  /**
   * {@inheritDoc}
   */
  @Override
  public <T> T loadProperty(InputStream resource, Class<T> objectClass) {
    T res = null;

    YamlReader reader;
    try {
      reader = new YamlReader(new InputStreamReader(resource));
      res = reader.read(objectClass);
    } catch (YamlException yamlException) {
      LOGGER.error("Failed to load YAML content", yamlException);
    }

    return res;
  }


Run-icon.png Exécution

L'utilisation de ces implémentations est démontrée à l'aide de tests unitaires, écrits dans la classe fr.ejn.tutorial.yamlbeans.impl.service.PropertiesServiceImplTest au format JUnit, avec validation avec le framework AssertJ.

La fonction loadProperty est testée à travers testLoadProperty.

package fr.ejn.tutorial.yamlbeans.impl.service;

import static org.assertj.core.api.Assertions.assertThat;

import fr.ejn.tutorial.yaml.data.Address;
import fr.ejn.tutorial.yaml.data.Person;
import fr.ejn.tutorial.yaml.service.PropertiesService;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

public class PropertiesServiceImplTest {

  @BeforeClass
  public static void setUpBeforeClass() throws Exception {
  }

  @AfterClass
  public static void tearDownAfterClass() throws Exception {
  }

  private PropertiesService instance;

  private Address createAddress(String city, String country, String street) {
    Address address = new Address();

    address.setCity(city);
    address.setCountry(country);
    address.setStreet(street);

    return address;
  }

  private Person createPerson(int age, String name, double size, String surname, boolean vip) {
    Person person = new Person();

    person.setAge(age);
    person.setName(name);
    person.setSize(size);
    person.setSurname(surname);
    person.setVip(vip);

    return person;
  }

  @Before
  public void setUp() throws Exception {
    instance = new PropertiesServiceImpl();
  }

  @After
  public void tearDown() throws Exception {
  }

  @Test
  public void testLoadProperty() throws Exception {
    Person expected = createPerson(18, "Name 1", 170.5, "Surname 1", true);
    List<Address> addresses = new ArrayList<Address>();
    addresses.add(createAddress("City 1.1", "Country 1.1", "Street 1.1"));
    addresses.add(createAddress("City 1.2", "Country 1.2", "Street 1.2"));
    expected.setAddresses(addresses);

    Person actual = instance.loadProperty(PropertiesServiceImplTest.class
        .getResourceAsStream("person.yaml"), Person.class);

    assertThat(actual).isEqualToComparingFieldByFieldRecursively(expected);
  }

}

Les premières instructions permettent juste de construire les données attendues. Puis le fichier person.yaml est chargé avec le contenu est le suivant.

name: Name 1
surname: Surname 1
size: 170.5
age: 18
vip: true
addresses :
  -
    city: City 1.1
    country: Country 1.1
    street: Street 1.1
  -
    city: City 1.2
    country: Country 1.2
    street: Street 1.2

De la même façon, la fonction loadProperties est testée à travers testLoadProperties.

package fr.ejn.tutorial.yamlbeans.impl.service;

import static org.assertj.core.api.Assertions.assertThat;

import fr.ejn.tutorial.yaml.data.Address;
import fr.ejn.tutorial.yaml.data.Person;
import fr.ejn.tutorial.yaml.service.PropertiesService;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

public class PropertiesServiceImplTest {

  @BeforeClass
  public static void setUpBeforeClass() throws Exception {
  }

  @AfterClass
  public static void tearDownAfterClass() throws Exception {
  }

  private PropertiesService instance;

  private Address createAddress(String city, String country, String street) {
    Address address = new Address();

    address.setCity(city);
    address.setCountry(country);
    address.setStreet(street);

    return address;
  }

  private Person createPerson(int age, String name, double size, String surname, boolean vip) {
    Person person = new Person();

    person.setAge(age);
    person.setName(name);
    person.setSize(size);
    person.setSurname(surname);
    person.setVip(vip);

    return person;
  }

  @Before
  public void setUp() throws Exception {
    instance = new PropertiesServiceImpl();
  }

  @After
  public void tearDown() throws Exception {
  }

  @Test
  public void testLoadProperties() throws Exception {
    // Build expected datas.
    List<Person> expected = new ArrayList<Person>();

    Person person = createPerson(18, "Name 1", 170.5, "Surname 1", true);
    List<Address> addresses = new ArrayList<Address>();
    addresses.add(createAddress("City 1.1", "Country 1.1", "Street 1.1"));
    addresses.add(createAddress("City 1.2", "Country 1.2", "Street 1.2"));
    person.setAddresses(addresses);
    expected.add(person);

    person = createPerson(20, "Name 2", 180.5, "Surname 2", false);
    addresses = new ArrayList<Address>();
    addresses.add(createAddress("City 2.1", "Country 2.1", "Street 2.1"));
    addresses.add(createAddress("City 2.2", "Country 2.2", "Street 2.2"));
    person.setAddresses(addresses);
    expected.add(person);

    List<Person> actual = instance.loadProperties(PropertiesServiceImplTest.class
        .getResourceAsStream("persons.yaml"), Person.class);

    assertThat(actual).usingRecursiveFieldByFieldElementComparator()
        .containsExactlyElementsOf(expected);
  }

}

Dans celui-ci, le fichier persons.yaml est chargé avec le contenu suivant.

-
   name: Name 1
   addresses: 
   -
      city: City 1.1
      country: Country 1.1
      street: Street 1.1
   -
      city: City 1.2
      country: Country 1.2
      street: Street 1.2
   age: 18
   size: 170.5
   surname: Surname 1
   vip: true
-
   name: Name 2
   addresses: 
   -
      city: City 2.1
      country: Country 2.1
      street: Street 2.1
   -
      city: City 2.2
      country: Country 2.2
      street: Street 2.2
   age: 20
   size: 180.5
   surname: Surname 2


Warning-icon.png Conclusion

Ces exemples ont permit de démontrer la simplicié de chargement des données dans des classes Java.

Le point important concerne le chargement des données multiples, dont les définitions sont séparées comme des éléments d'une liste, séparés par le marqueur -. Ceci présente une distinction importante par rapport à SnakeYAML, qui met en évidence un adhérence entre le format du fichier et le framework utilisé.


Viewer icon.png Voir Aussi

Code source : http://www.dev.jouvinio.net/svn/study/trunk/yaml/YAMLBeans