content: /**
   * Copyright 2020 Alexander Herzog
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   * http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package ui.parameterseries;
  
  import org.w3c.dom.Document;
  import org.w3c.dom.Element;
  import org.w3c.dom.NodeList;
  
  import language.Language;
  
  /**
   * Basisklasse zum Speichern von Teilinformationen der
   * Parameter-Vergleichs-Funktion
   * @author Alexander Herzog
   * @see ParameterCompareSetup
   */
  public abstract class ParameterCompareSetupBase {
  	/**
  	 * Name fr das Element
  	 * @see #getName()
  	 * @see #setName(String)
  	 */
  	private String name;
  
  	/**
  	 * Konstruktor der Klasse
  	 */
  	public ParameterCompareSetupBase() {
  		name="";
  	}
  
  	/**
  	 * Konstruktor der Klasse
  	 * @param name	Name fr das Element
  	 */
  	public ParameterCompareSetupBase(final String name) {
  		this.name=name;
  	}
  
  	/**
  	 * Liefert den Namen des Elements
  	 * @return	Name des Elements
  	 */
  	public final String getName() {
  		return name;
  	}
  
  	/**
  	 * Stellt einen neuen Namen fr das Element ein
  	 * @param name	Neuer Name
  	 */
  	public final void setName(final String name) {
  		if (name!=null) this.name=name.trim();
  	}
  
  	/**
  	 * Liefert die Liste der Sprach-Bezeichner fr die XML-Basisklasse Elements
  	 * @return	Name der XML-Basisklasse des Elements in den verschiedenen Sprachen (aktuelle Sprache zuerst)
  	 */
  	public abstract String[] getRootNodeNames();
  
  
  	/**
  	 * Ldt einen einzelnen Unterschlssel fr das Element aus einer XML-Datei.<br>
  	 * Diese Methode muss von abgeleiteten Klassen berschrieben werden, aber die Basismethode
  	 * muss aufgerufen werden, um den Namen zu laden.
  	 * @param name	Name des Unterschlssels
  	 * @param content	Textinhalt es Unterschlssels
  	 * @param node	Unterschlssel
  	 * @return	Gibt im Erfolgsfall <code>null</code> zurck, sonst eine Fehlermeldung
  	 */
  	protected String loadPropertyFromXML(final String name, final String content, final Element node) {
  		if (Language.trAll("ParameterCompare.XML.Name",name)) {
  			this.name=content;
  			return null;
  		}
  
  		return null;
  	}
  
  	/**
  	 * Ldt das Element aus einem XML-Knoten
  	 * @param node	XML-Knoten, aus dem das Element geladen werden soll
  	 * @return	Gibt im Erfolgsfall <code>null</code> zurck, sonst eine Fehlermeldung
  	 */
  	public final String loadFromXML(Element node) {
  		final NodeList l=node.getChildNodes();
  		for (int i=0; i<l.getLength();i++) {
  			if (!(l.item(i) instanceof Element)) continue;
  			final Element e=(Element)l.item(i);
  			final String error=loadPropertyFromXML(e.getNodeName(),e.getTextContent(),e);
  			if (error!=null) return error;
  		}
  
  		return null;
  	}
  
  	/**
  	 * Speichert die Daten des Elements als Unterschlssel unter einem XML-Knoten.<br>
  	 * Diese Methode muss von abgeleiteten Klassen berschrieben werden, aber die Basismethode
  	 * muss aufgerufen werden, um den Namen zu speichern.
  	 * @param doc	XML-Dokument
  	 * @param node	XML-Knoten fr das Element
  	 */
  	protected void addPropertiesToXML(Document doc, Element node) {
  		if (name!=null && !name.isBlank()) {
  			final Element sub=doc.createElement(Language.tr("ParameterCompare.XML.Name"));
  			node.appendChild(sub);
  			sub.setTextContent(name);
  		}
  	}
  
  	/**
  	 * Speichert die Daten des Elements in einem XML-Dokument
  	 * @param doc	XML-Dokument
  	 * @param parent	bergeordneter XML-Knoten
  	 */
  	public final void addDataToXML(Document doc, Element parent) {
  		final Element node=doc.createElement(getRootNodeNames()[0]);
  		parent.appendChild(node);
  
  		addPropertiesToXML(doc,node);
  	}
  }
  