package com.xenoage.zong.musicxml.types;
import static com.xenoage.utils.EnumUtils.getEnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import com.xenoage.utils.annotations.NonNull;
import com.xenoage.utils.xml.XmlReader;
import com.xenoage.utils.xml.XmlWriter;
import com.xenoage.zong.musicxml.types.choice.MxlLyricContent;
import com.xenoage.zong.musicxml.types.enums.MxlSyllabic;
import com.xenoage.zong.musicxml.util.IncompleteMusicXML;
/**
* MusicXML syllabic and its text.
* See lines 3312 and 3313 in musicxml.xsd (version 2.0).
* Elisions are not handled.
*
* @author Andreas Wenger
*/
@IncompleteMusicXML(partly = "", children="text-element-data")
@AllArgsConstructor @Getter @Setter
public final class MxlSyllabicText
implements MxlLyricContent {
/** The {@link MxlSyllabic} element. Never null (since missing syllabic element in MusicXML
* means single, see {@link #read(XmlReader)}). */
@NonNull private MxlSyllabic syllabic;
@NonNull private MxlTextElementData text;
private static final MxlSyllabic defaultSyllabic = MxlSyllabic.Single;
@Override public MxlLyricContentType getLyricContentType() {
return MxlLyricContentType.SyllabicText;
}
/**
* Reads the given syllabic text.
* If the syllabic element is missing, it is treated as {@link MxlSyllabic#Single}
* (according to MusicXML mailgroup, R. Kainhofer, 2010-04-08).
*/
public static MxlSyllabicText read(XmlReader reader) {
MxlSyllabic syllabic = defaultSyllabic;
MxlTextElementData text = null;
//the first element can be "syllabic"
if (reader.getElementName().equals("syllabic")) {
String syllabicText = reader.getText();
syllabic = getEnumValue(syllabicText, MxlSyllabic.values());
if (syllabic == null)
throw reader.dataException("syllabic = " + syllabicText);
//open next element
reader.closeElement();
if (false == reader.openNextChildElement())
throw reader.dataException("missing text element after syllabic");
}
//next one must be "text"
if (false == reader.getElementName().equals("text"))
throw reader.dataException("text element must follow after syllabic");
text = MxlTextElementData.read(reader);
if (text == null)
throw reader.dataException("missing text element");
return new MxlSyllabicText(syllabic, text);
}
@Override public void write(XmlWriter writer) {
syllabic.write(writer);
writer.writeElementStart("text");
text.write(writer);
writer.writeElementEnd();
}
}