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.choice.MxlPartListContent;
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.collections.CollectionUtils.alist;
/**
* MusicXML part-list.
*
* @author Andreas Wenger
*/
@IncompleteMusicXML(children = "part-group,score-part")
@AllArgsConstructor @Getter @Setter
public final class MxlPartList {
public static final String elemName = "part-list";
@NonEmpty private List<MxlPartListContent> content;
@NonNull public static MxlPartList read(XmlReader reader, ErrorHandler errorHandler) {
List<MxlPartListContent> content = alist();
boolean scorePartFound = false;
while (reader.openNextChildElement()) {
String n = reader.getElementName();
if (n.equals(MxlPartGroup.elemName)) {
content.add(MxlPartGroup.read(reader));
}
else if (n.equals(MxlScorePart.elemName)) {
content.add(MxlScorePart.read(reader, errorHandler));
scorePartFound = true;
}
reader.closeElement();
}
if (false == scorePartFound)
throw reader.dataException("no " + MxlScorePart.elemName + " found");
if (content.size() == 0)
throw reader.dataException("no content");
return new MxlPartList(content);
}
public void write(XmlWriter writer) {
writer.writeElementStart(elemName);
for (MxlPartListContent item : content)
item.write(writer);
writer.writeElementEnd();
}
}