package com.xenoage.zong.musicxml.types.groups; 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.*; import com.xenoage.zong.musicxml.util.IncompleteMusicXML; import com.xenoage.zong.musicxml.util.error.handler.ErrorHandler; import lombok.Getter; import lombok.Setter; import java.util.ArrayList; import java.util.List; /** * MusicXML score-header. * * @author Andreas Wenger */ @IncompleteMusicXML(children = "work,identification,defaults,part-list") @Getter @Setter public final class MxlScoreHeader { @MaybeNull private MxlWork work; @MaybeNull private String movementNumber; @MaybeNull private String movementTitle; @MaybeNull private MxlIdentification identification; @MaybeNull private MxlDefaults defaults; @MaybeNull private List<MxlCredit> credits; @NonNull private MxlPartList partList; public void readElement(XmlReader reader, ErrorHandler errorHandler) { String n = reader.getElementName(); switch (n) { case MxlCredit.elemName: if (credits == null) credits = new ArrayList<>(); credits.add(MxlCredit.read(reader)); break; case MxlDefaults.elemName: defaults = MxlDefaults.read(reader); break; case MxlIdentification.elemName: identification = MxlIdentification.read(reader); break; case "movement-number": movementNumber = reader.getTextNotNull(); break; case "movement-title": movementTitle = reader.getTextNotNull(); break; case MxlPartList.elemName: partList = MxlPartList.read(reader, errorHandler); break; case MxlWork.elemName: work = MxlWork.read(reader); break; } } public void check(XmlReader reader) { if (partList == null) throw reader.dataException(MxlPartList.elemName + " missing"); } public void write(XmlWriter writer) { if (work != null) work.write(writer); writer.writeElementText("movement-number", movementNumber); writer.writeElementText("movement-title", movementTitle); if (identification != null) identification.write(writer); if (defaults != null) defaults.write(writer); if (credits != null) { for (MxlCredit credit : credits) credit.write(writer); } partList.write(writer); } }