package com.xenoage.zong.musicxml.types; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; import com.xenoage.utils.Parser; import com.xenoage.utils.annotations.MaybeNull; 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.MxlMusicDataContent; import com.xenoage.zong.musicxml.types.groups.MxlEditorialVoice; import com.xenoage.zong.musicxml.util.IncompleteMusicXML; /** * MusicXML forward. * * @author Andreas Wenger */ @IncompleteMusicXML(missing = "staff", children = "editorial-voice") @AllArgsConstructor @Getter @Setter public final class MxlForward implements MxlMusicDataContent { public static final String elemName = "forward"; private final int duration; @MaybeNull private MxlEditorialVoice editorialVoice; @Override public MxlMusicDataContentType getMusicDataContentType() { return MxlMusicDataContentType.Forward; } @NonNull public static MxlForward read(XmlReader reader) { Integer duration = null; MxlEditorialVoice editorialVoice = new MxlEditorialVoice(); while (reader.openNextChildElement()) { String n = reader.getElementName(); if (n.equals("duration")) duration = Parser.parseInt(reader.getText()); else editorialVoice.readElement(reader); reader.closeElement(); } if (duration == null) throw reader.dataException("duration unknown"); if (false == editorialVoice.isUsed()) editorialVoice = null; return new MxlForward(duration, editorialVoice); } @Override public void write(XmlWriter writer) { writer.writeElementStart(elemName); writer.writeElementText("duration", duration); if (editorialVoice != null) editorialVoice.write(writer); writer.writeElementEnd(); } }