package com.xenoage.zong.io.musicxml.in; import static com.xenoage.utils.PlatformUtils.platformUtils; import static com.xenoage.utils.collections.CollectionUtils.alist; import java.io.IOException; import java.util.List; import com.xenoage.utils.Parser; import com.xenoage.utils.exceptions.InvalidFormatException; import com.xenoage.utils.io.InputStream; import com.xenoage.utils.xml.XmlReader; import com.xenoage.zong.io.musicxml.link.LinkAttributes; import com.xenoage.zong.io.musicxml.opus.Opus; import com.xenoage.zong.io.musicxml.opus.OpusItem; import com.xenoage.zong.io.musicxml.opus.OpusLink; import com.xenoage.zong.io.musicxml.opus.Score; /** * This class reads a MusicXML 2.0 opus file. * * @author Andreas Wenger */ public class OpusFileInput { /** * Creates an {@link Opus} instance from the document * behind the given {@link InputStream}. */ public Opus readOpusFile(InputStream inputStream) throws InvalidFormatException, IOException { XmlReader reader = platformUtils().createXmlReader(inputStream); //first element must be "opus" if (false == reader.openNextChildElement() || false == reader.getElementName().equals("opus")) throw new InvalidFormatException("No opus document"); return readOpus(reader); } private Opus readOpus(XmlReader reader) { String title = null; List<OpusItem> items = alist(); while (reader.openNextChildElement()) { String n = reader.getElementName(); if (reader.getElementName().equals("title")) title = reader.getTextNotNull(); else if (n.equals("opus")) items.add(readOpus(reader)); else if (n.equals("opus-link")) items.add(readOpusLink(reader)); else if (n.equals("score")) items.add(readScore(reader)); reader.closeElement(); } return new Opus(title, items); } private OpusLink readOpusLink(XmlReader reader) { String href = reader.getAttributeNotNull("href"); return new OpusLink(new LinkAttributes(href)); } private Score readScore(XmlReader reader) { String href = reader.getAttribute("href"); Boolean newPage = Parser.parseBooleanNullYesNo(reader.getAttribute("new-page")); return new Score(new LinkAttributes(href), newPage); } }