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!
Il y a beaucoup de classes concrètes mettant en oeuvre l'interface Light:
Il ya aussi plusieurs classes concrètes LightManager pour les traiter
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" :
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..
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.