package nl.siegmann.epublib.epub; import java.io.IOException; import java.util.List; import java.util.Map; import javax.xml.namespace.QName; import nl.siegmann.epublib.domain.Author; import nl.siegmann.epublib.domain.Book; import nl.siegmann.epublib.domain.Date; import nl.siegmann.epublib.domain.Identifier; import nl.siegmann.epublib.domain.Meta; import org.rr.commons.utils.StringUtil; import org.xmlpull.v1.XmlSerializer; public class PackageDocumentMetadataWriter extends PackageDocumentBase { /** * Writes the book's metadata. * * @param book * @param serializer * @throws IOException * @throws IllegalStateException * @throws IllegalArgumentException * @ */ public static void writeMetaData(Book book, XmlSerializer serializer) throws IllegalArgumentException, IllegalStateException, IOException { serializer.startTag(NAMESPACE_OPF, OPFTags.metadata); serializer.setPrefix(PREFIX_DUBLIN_CORE, NAMESPACE_DUBLIN_CORE); serializer.setPrefix(PREFIX_OPF, NAMESPACE_OPF); writeIdentifiers(book.getMetadata().getIdentifiers(), serializer); writeSimpleMetdataElements(DCTags.title, book.getMetadata().getTitles(), serializer); writeSimpleMetdataElements(DCTags.subject, book.getMetadata().getSubjects(), serializer); writeSimpleMetdataElements(DCTags.description, book.getMetadata().getDescriptions(), serializer); writeSimpleMetdataElements(DCTags.publisher, book.getMetadata().getPublishers(), serializer); writeSimpleMetdataElements(DCTags.type, book.getMetadata().getTypes(), serializer); writeSimpleMetdataElements(DCTags.rights, book.getMetadata().getRights(), serializer); // write authors for(Author author: book.getMetadata().getAuthors()) { serializer.startTag(NAMESPACE_DUBLIN_CORE, DCTags.creator); serializer.attribute(NAMESPACE_OPF, OPFAttributes.role, author.getRelator().getCode()); serializer.attribute(NAMESPACE_OPF, OPFAttributes.file_as, author.toString()); serializer.text((author.getFirstname() + " " + author.getLastname()).trim()); serializer.endTag(NAMESPACE_DUBLIN_CORE, DCTags.creator); } // write contributors for(Author author: book.getMetadata().getContributors()) { serializer.startTag(NAMESPACE_DUBLIN_CORE, DCTags.contributor); serializer.attribute(NAMESPACE_OPF, OPFAttributes.role, author.getRelator().getCode()); serializer.attribute(NAMESPACE_OPF, OPFAttributes.file_as, author.toString()); serializer.text((author.getFirstname() + " " + author.getLastname()).trim()); serializer.endTag(NAMESPACE_DUBLIN_CORE, DCTags.contributor); } // write dates for (Date date: book.getMetadata().getDates()) { serializer.startTag(NAMESPACE_DUBLIN_CORE, DCTags.date); if (date.getEvent() != null) { serializer.attribute(NAMESPACE_OPF, OPFAttributes.event, date.getEvent().toString()); } serializer.text(date.getValue()); serializer.endTag(NAMESPACE_DUBLIN_CORE, DCTags.date); } // write language if(StringUtil.isNotEmpty(book.getMetadata().getLanguage())) { serializer.startTag(NAMESPACE_DUBLIN_CORE, "language"); serializer.text(book.getMetadata().getLanguage()); serializer.endTag(NAMESPACE_DUBLIN_CORE, "language"); } //write name content meta tags Meta coverMeta = removeMetaByName(book.getMetadata().getOtherMeta(), OPFValues.meta_cover); if(book.getMetadata().getOtherMeta() != null) { final List<Meta> otherMeta = book.getMetadata().getOtherMeta(); for(Meta meta: otherMeta) { serializer.startTag(NAMESPACE_OPF, "meta"); serializer.attribute(EpubWriter.EMPTY_NAMESPACE_PREFIX, OPFAttributes.name, meta.getName()); serializer.attribute(EpubWriter.EMPTY_NAMESPACE_PREFIX, OPFAttributes.content, meta.getContent()); serializer.endTag(NAMESPACE_OPF, "meta"); } } // write other properties if(book.getMetadata().getOtherProperties() != null) { for(Map.Entry<QName, String> mapEntry: book.getMetadata().getOtherProperties().entrySet()) { serializer.startTag(mapEntry.getKey().getNamespaceURI(), mapEntry.getKey().getLocalPart()); serializer.text(mapEntry.getValue()); serializer.endTag(mapEntry.getKey().getNamespaceURI(), mapEntry.getKey().getLocalPart()); } } // write coverimage if(book.getCoverImage() != null || coverMeta != null) { serializer.startTag(NAMESPACE_OPF, OPFTags.meta); serializer.attribute(EpubWriter.EMPTY_NAMESPACE_PREFIX, OPFAttributes.name, OPFValues.meta_cover); if(book.getCoverImage() != null) { serializer.attribute(EpubWriter.EMPTY_NAMESPACE_PREFIX, OPFAttributes.content, book.getCoverImage().getId()); } else { serializer.attribute(EpubWriter.EMPTY_NAMESPACE_PREFIX, OPFAttributes.content, coverMeta.getContent()); } serializer.endTag(NAMESPACE_OPF, OPFTags.meta); } // write generator //Now handled with the otherMetadata // serializer.startTag(NAMESPACE_OPF, OPFTags.meta); // serializer.attribute(EpubWriter.EMPTY_NAMESPACE_PREFIX, OPFAttributes.name, OPFValues.generator); // serializer.attribute(EpubWriter.EMPTY_NAMESPACE_PREFIX, OPFAttributes.content, Constants.EPUBLIB_GENERATOR_NAME); // serializer.endTag(NAMESPACE_OPF, OPFTags.meta); serializer.endTag(NAMESPACE_OPF, OPFTags.metadata); } private static Meta removeMetaByName(List<Meta> meta, String name) { if(meta != null) { for (int i=0; i < meta.size(); i++) { Meta m = meta.get(i); if(m.getName().equals(name)) { return meta.remove(i); } } } return null; } private static void writeSimpleMetdataElements(String tagName, List<String> values, XmlSerializer serializer) throws IllegalArgumentException, IllegalStateException, IOException { for(String value: values) { if (StringUtil.isEmpty(value)) { continue; } serializer.startTag(NAMESPACE_DUBLIN_CORE, tagName); serializer.text(value); serializer.endTag(NAMESPACE_DUBLIN_CORE, tagName); } } /** * Writes out the complete list of Identifiers to the package document. * The first identifier for which the bookId is true is made the bookId identifier. * If no identifier has bookId == true then the first bookId identifier is written as the primary. * * @param identifiers * @param serializer * @throws IOException * @throws IllegalStateException * @throws IllegalArgumentException */ private static void writeIdentifiers(List<Identifier> identifiers, XmlSerializer serializer) throws IllegalArgumentException, IllegalStateException, IOException { Identifier bookIdIdentifier = Identifier.getBookIdIdentifier(identifiers); if(bookIdIdentifier == null) { bookIdIdentifier = new Identifier(); identifiers.add(bookIdIdentifier); } serializer.startTag(NAMESPACE_DUBLIN_CORE, DCTags.identifier); serializer.attribute(EpubWriter.EMPTY_NAMESPACE_PREFIX, DCAttributes.id, BOOK_ID_ID); if(bookIdIdentifier.getScheme() != null && !bookIdIdentifier.getScheme().isEmpty()) { serializer.attribute(NAMESPACE_OPF, OPFAttributes.scheme, bookIdIdentifier.getScheme()); } serializer.text(bookIdIdentifier.getValue()); serializer.endTag(NAMESPACE_DUBLIN_CORE, DCTags.identifier); for(Identifier identifier: identifiers.subList(1, identifiers.size())) { if(identifier == bookIdIdentifier) { continue; } serializer.startTag(NAMESPACE_DUBLIN_CORE, DCTags.identifier); serializer.attribute(NAMESPACE_OPF, "scheme", identifier.getScheme()); serializer.text(identifier.getValue()); serializer.endTag(NAMESPACE_DUBLIN_CORE, DCTags.identifier); } } }