Author: Bob Jacobsen
Keywords: JMRI technical code xml persistance

# JMRI: Persistence XML

JMRI utilise XML pour la persistance des structures internes, en particulier lors du stockage des préférences et des fichiers de panneau.

La persistance de XML se fait via un code écrit explicitement. Fondamentalement, certaines catégories s'enregistrent auprès d'une instance de la "ConfigureManager". La mise en oeuvre de l'un de ceux que nous avons est celui pour le chargement et le stockage des fichiers XML: jmri.configurexml. ConfigXmlManager. Quand il est temps d'enregistrer, on dit au ConfigureXmlManager de le faire. Il va au travers des objets enregistrés et trouve la classe responsable de la persistance du stockage de l'objet. Par exemple, abFoo class aura la classe a.b.configurexml.FooXml localisée. Si cette catégorie est trouvée, elle est dite pour enregistrer l'objet Foo, et il ajoute un contenu Xml dans un document JDOM pour le faire. Si ce n'est pas localisé, un message d'erreur est émis.

En charge, un fichier XML est lu par le gestionnaire. Chaque élément est examiné par un attribut "class". S'il est trouvé, cette classe est chargée et à remis l'élément à traiter. Etc

C'est assez une méthode de hackers, et pas très proprement tenu . Il y a une bonne quantité de duplication de code, mais peut-être parce qu'il vient d'un C + + de base et que le développeur souhaite le garder pour des modèles et classes mixin. Mais il marche!

### Exemple

Un LightManager connaît Lights.

Il y a beaucoup de classes concrètes mettant en oeuvre l'interface Light:

- jmri.jmrix.loconet.LnLight
- jmri.jmrix.cmri.serial.SerialLight
- jmri.jmrix.powerline.SerialLight

Celles-ci ont leurs propres informations internes, ce qui n'est pas toujours le cas.

Il ya aussi plusieurs classes concrètes LightManager pour les traiter

- jmri.jmrix.loconet.LnLightManager
- jmri.jmrix.cmri.serial.SerialLightManager
- jmri.jmrix.powerline.SerialLightManager

Chaque type de gestionnaire est stocké et chargé par l'intermédiaire d'une classe de persistance, qui se trouve en consultant la classe A avec "XML" ajouté au nom, dans un sous-paquet direct "configurexml" :

- jmri.jmrix.loconet.configurexml.LnLightManagerXml
- jmri.jmrix.cmri.serial.configurexml.SerialLightManagerXml
- jmri.jmrix.powerline.configurexml.SerialLightManagerXml

Dans le cas des classes concrètes Light, le code de persistance du gestionnaire enregistre directement et charge même directement les lumières individuelles. Ceci est parce qu' (à ce jour) un gestionnaire donné a un seul type de Light (par exemple LnLightManager n'a pas à se soucier de LnLight). Dans les cas où cela n'est pas vrai, par exemple, SignalHeads qui ont plusieurs classes, ils sont classes de persistance pour les objets individuels, en plus du gestionnaire.

### Ajout d'informations à une Classe

Si vous souhaitez enregistrer plus de renseignements sur l'état, trouver la classe persistante et ajouter du code pour créer et lire des attributs ou des éléments.

Peut-être la meilleure façon de faire est de créer un fichier de panneau de l'échantillon de l'objet que vous souhaitez stocker dedans:

      <sensors class="jmri.jmrix.cmri.serial.configurexml.SerialSensorManagerXml" />
        <sensor systemName="CS3001" />
      </sensor>
      <sensors class="jmri.managers.configurexml.InternalSensorManagerXml" />
       <sensor systemName="IS21" />
      </sensors>
      <signalheads class="jmri.configurexml.AbstractSignalHeadManagerXml">
        <signalhead class="jmri.configurexml.DoubleTurnoutSignalHeadXml" systemName="IH1P">
          <turnout systemName="CT10" userName="1-bit pulsed green" />
          <turnout systemName="CT2" userName="1-bit pulsed red" />
        </signalhead>
      </signalheads>

Notez la "classe" attributs. Elle donne le nom pleinement qualifié de la classe qui permet de charger ou stocker cet élément particulier. Dans le cas de capteurs, nous voyons qu'il y a deux gestionnaires en service: un pour C/MRI, et un pour les capteurs internes. Pour SignalHeads, il n'y a qu'un seul gérant, jmri.configurexml.AbstractSignalHeadManager persisté par jmri.configurexml.AbstractSignalHeadManager, mais chaque SignalHead notamment la mise en oeuvre de classe a sa propre classe persistante.

Par exemple pour ajouter des données sur un capteur, le jmri.jmrix.cmri.serial.configurexml.SerialSensorManagerXml et les classes jmri.managers.configurexml.InternalSensorManagerXml devraient être modifiées.

Notez que dans certains cas, il y a une relation d'héritage entre la persistance des classes qui peut aider. Par exemple, la classe LocoNet LnSensorManagerXml hérite de jmri.configurexml.AbstractSensorManagerConfigXML , qui fait presque tout le travail d'enregistrement et de chargement des capteurs.

Si vous ajoutez des attributs ou des éléments nouveaux, n'oubliez pas de mettre à jour la définition du format, voir ci-dessous..

## Schéma de Gestion

JMRI contrôle la sémantique de XML utilisant le Schéma XML.

Par exemple, l'information mise en page est enregistrée dans des fichiers XML en tant qu'un élément de "schéma de configuration" , dont le contenu est alors défini par un fichier de schéma. Ces fichiers sont conservés dans le répertoire xml/schema.