package com.xenoage.zong.musicxml.types; import com.xenoage.utils.annotations.NonEmpty; import com.xenoage.utils.annotations.NonNull; import com.xenoage.utils.xml.XmlReader; import com.xenoage.utils.xml.XmlWriter; import com.xenoage.zong.musicxml.types.groups.MxlScoreHeader; import com.xenoage.zong.musicxml.types.partwise.MxlPart; import com.xenoage.zong.musicxml.util.IncompleteMusicXML; import com.xenoage.zong.musicxml.util.error.handler.ErrorHandler; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; import java.util.List; import static com.xenoage.utils.NullUtils.notNull; import static com.xenoage.utils.collections.CollectionUtils.alist; /** * MusicXML score-partwise. * * @author Andreas Wenger */ @IncompleteMusicXML(children = "score-header,part") @AllArgsConstructor @Getter @Setter public final class MxlScorePartwise { public static final String elemName = "score-partwise"; @NonNull private MxlScoreHeader scoreHeader; @NonEmpty private List<MxlPart> parts; @NonNull private String version; private static final String defaultVersion = "1.0"; @NonNull public static MxlScorePartwise read(XmlReader reader, ErrorHandler errorHandler) { //attributes String version = notNull(reader.getAttribute("version"), defaultVersion); //elements MxlScoreHeader scoreHeader = new MxlScoreHeader(); List<MxlPart> parts = alist(); while (reader.openNextChildElement()) { if (reader.getElementName().equals(MxlPart.elemName)) parts.add(MxlPart.read(reader)); else scoreHeader.readElement(reader, errorHandler); reader.closeElement(); } scoreHeader.check(reader); if (parts.size() < 1) throw reader.dataException("no parts found"); return new MxlScorePartwise(scoreHeader, parts, version); } public void write(XmlWriter writer) { writer.writeElementStart(elemName); writer.writeAttribute("version", version); scoreHeader.write(writer); for (MxlPart part : parts) { writeSeparatorComment(writer); part.write(writer); } writeSeparatorComment(writer); writer.writeElementEnd(); } private void writeSeparatorComment(XmlWriter writer) { writer.writeLineBreak(); writer.writeComment("======================================================="); } }