package org.rr.jeborker.metadata; import static org.rr.commons.utils.StringUtil.EMPTY; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; import org.rr.commons.log.LoggerFactory; import org.rr.commons.mufs.IResourceHandler; import org.rr.commons.utils.CommonUtils; import org.rr.jeborker.db.item.EbookPropertyItem; import org.rr.jeborker.gui.cell.DatePropertyCellRenderer; import org.rr.jeborker.gui.cell.DefaultPropertyRenderer; import org.rr.jeborker.gui.cell.MandatorySelectionPropertyEditor; import org.rr.jeborker.gui.cell.StarRatingPropertyEditor; import org.rr.jeborker.gui.cell.StarRatingPropertyRenderer; import org.rr.jeborker.metadata.comicbook.ComicBookDocument; import org.rr.jeborker.metadata.comicbook.ComicBookReader; import org.rr.jeborker.metadata.comicbook.YeyNoType; import com.l2fprod.common.beans.editor.IntegerPropertyEditor; class ComicBookMetadataReader implements IMetadataReader { private IResourceHandler ebookResourceHandler; private ComicBookDocument doc; private ComicBookReader comicBookReader; ComicBookMetadataReader(IResourceHandler resource) { ebookResourceHandler = resource; } @Override public List<IResourceHandler> getEbookResource() { return Collections.singletonList(ebookResourceHandler); } @Override public List<MetadataProperty> readMetadata() { final ArrayList<MetadataProperty> result = new ArrayList<>(); try { final ComicBookDocument document = getDocument(); HashMap<String, Object> docInfo = document.getInfo(); for (Entry<String, Object> entry : docInfo.entrySet()) { final String key = entry.getKey(); final Object value = entry.getValue(); try { MetadataProperty metadataProperty; COMICBOOK_METADATA_TYPES type = getTypeByName(key); if(type != null) { metadataProperty = createMetadataProperty(type, value); } else { metadataProperty = new MetadataProperty(key, value); } result.add(metadataProperty); } catch(Exception e) { LoggerFactory.logWarning(this, "could not handle property " + key + " and value " + value, e); } } byte[] cover = doc.getCover(); if(cover != null) { result.add(new MetadataProperty(IMetadataReader.COMMON_METADATA_TYPES.COVER.getName(), cover)); } } catch (Throwable e) { LoggerFactory.logWarning(getClass(), "Could not read metadata for comicbook " + ebookResourceHandler, e); } return result; } @Override public List<MetadataProperty> getSupportedMetadata() { final ArrayList<MetadataProperty> result = new ArrayList<>(); for(COMICBOOK_METADATA_TYPES type : COMICBOOK_METADATA_TYPES.values()) { MetadataProperty metadataProperty = createMetadataProperty(type, EMPTY); result.add(metadataProperty); } return result; } @Override public void fillEbookPropertyItem(List<MetadataProperty> metadataProperties, EbookPropertyItem item) { item.clearMetadata(); for(MetadataProperty metadataProperty : metadataProperties) { for(COMICBOOK_METADATA_TYPES type : COMICBOOK_METADATA_TYPES.values()) { if(type.getName().equals(metadataProperty.getName())) { type.fillItem(metadataProperty, item); break; } } } } @Override public String getPlainMetadata() { return new String(doc.getComicInfoXml()); } @Override public String getPlainMetadataMime() { return "text/xml"; } @Override public List<MetadataProperty> getMetadataByType(boolean create, List<MetadataProperty> props, COMMON_METADATA_TYPES type) { MetadataProperty newProperty; switch(type) { case AUTHOR: newProperty = new MetadataProperty(COMICBOOK_METADATA_TYPES.WRITER.getName(), EMPTY); break; case TITLE: newProperty = new MetadataProperty(COMICBOOK_METADATA_TYPES.TITLE.getName(), EMPTY); break; case GENRE: newProperty = new MetadataProperty(COMICBOOK_METADATA_TYPES.GENRE.getName(), EMPTY); break; case SERIES_NAME: newProperty = new MetadataProperty(COMICBOOK_METADATA_TYPES.SERIES.getName(), EMPTY); break; case RATING: newProperty = new MetadataProperty(COMICBOOK_METADATA_TYPES.RATING.getName(), EMPTY); break; case AGE_SUGGESTION: newProperty = new MetadataProperty(COMICBOOK_METADATA_TYPES.AGE_SUGGESTION.getName(), EMPTY); break; case DESCRIPTION: newProperty = new MetadataProperty(COMICBOOK_METADATA_TYPES.SUMMARY.getName(), EMPTY); break; case ISBN: newProperty = new MetadataProperty(COMICBOOK_METADATA_TYPES.ISBN.getName(), EMPTY); break; case LANGUAGE: newProperty = new MetadataProperty(COMICBOOK_METADATA_TYPES.LANGUAGE.getName(), EMPTY); break; case COVER: newProperty = new MetadataProperty(COMMON_METADATA_TYPES.COVER.getName(), null); break; default: newProperty = null; } final ArrayList<MetadataProperty> result = new ArrayList<>(); if(newProperty != null) { for(MetadataProperty prop : props) { if(prop.getName().equalsIgnoreCase(newProperty.getName())) { result.add(prop); } } } if(create && result.isEmpty() && newProperty != null) { result.add(newProperty); } return result; } private ComicBookReader getComicBookReader() { if(comicBookReader == null) { comicBookReader = new ComicBookReader(ebookResourceHandler); } return comicBookReader; } ComicBookDocument getDocument() throws IOException { if(doc == null) { doc = getComicBookReader().getDocument(); } return doc; } /** * Get the {@link COMICBOOK_METADATA_TYPES} with the name specified with the name parameter. * @param name The name for the {@link COMICBOOK_METADATA_TYPES} to be searched. * @return The desired {@link COMICBOOK_METADATA_TYPES} or <code>null</code> if no type with the * given name was found.. */ private COMICBOOK_METADATA_TYPES getTypeByName(String name) { for(COMICBOOK_METADATA_TYPES type : COMICBOOK_METADATA_TYPES.values()) { if(type.getName().equals(name)) { return type; } } return null; } private MetadataProperty createMetadataProperty(COMICBOOK_METADATA_TYPES type, Object value) { MetadataProperty metadataProperty = new MetadataProperty(type.getName(), value); metadataProperty.addValidValues(type.getValidValues()); metadataProperty.setPropertyClass(type.getPropertyClass()); metadataProperty.setPropertyEditorClass(type.getPropertyEditorClass()); metadataProperty.setPropertyRendererClass(type.getPropertyRendererClass()); return metadataProperty; } protected static interface MetadataEntryType { public String getName(); public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item); public List<String> getValidValues(); public Class<?> getPropertyClass(); public Class<?> getPropertyEditorClass(); public Class<?> getPropertyRendererClass(); } static enum COMICBOOK_METADATA_TYPES implements MetadataEntryType { TITLE { public String getName() { return "Title"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { COMMON_METADATA_TYPES.TITLE.fillItem(metadataProperty, item); } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },SERIES { public String getName() { return "Series"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { COMMON_METADATA_TYPES.SERIES_NAME.fillItem(metadataProperty, item); } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },NUMBER { public String getName() { return "Number"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { item.setSeriesIndex(metadataProperty.getValueAsString()); } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },COUNT { public String getName() { return "Count"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return Integer.class; } public Class<?> getPropertyEditorClass() { return IntegerPropertyEditor.class; } public Class<?> getPropertyRendererClass() { return DefaultPropertyRenderer.class; } },VOLUME { public String getName() { return "Volume"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { //no EbookPropertyItem } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return Integer.class; } public Class<?> getPropertyEditorClass() { return IntegerPropertyEditor.class; } public Class<?> getPropertyRendererClass() { return DefaultPropertyRenderer.class; } },ALTERNATE_SERIES { public String getName() { return "AlternateSeries"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { //no EbookPropertyItem } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },ALTERNATE_NUMBER { public String getName() { return "AlternateNumber"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { //no EbookPropertyItem } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },ALTERNATE_COUNT { public String getName() { return "AlternateCount"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { //no EbookPropertyItem } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return Integer.class; } public Class<?> getPropertyEditorClass() { return IntegerPropertyEditor.class; } public Class<?> getPropertyRendererClass() { return DefaultPropertyRenderer.class; } },SUMMARY { public String getName() { return "Summary"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { item.setDescription(metadataProperty.getValueAsString()); } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },NOTES { public String getName() { return "Notes"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { //no EbookPropertyItem } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },YEAR { public String getName() { return "Year"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { //no EbookPropertyItem } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return Integer.class; } public Class<?> getPropertyEditorClass() { return IntegerPropertyEditor.class; } public Class<?> getPropertyRendererClass() { return DefaultPropertyRenderer.class; } },MONTH { public String getName() { return "Month"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { //no EbookPropertyItem } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return Integer.class; } public Class<?> getPropertyEditorClass() { return IntegerPropertyEditor.class; } public Class<?> getPropertyRendererClass() { return DefaultPropertyRenderer.class; } },WRITER { public String getName() { return "Writer"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { COMMON_METADATA_TYPES.AUTHOR.fillItem(metadataProperty, item); } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },PENCILLER { public String getName() { return "Penciller"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { //no EbookPropertyItem } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },INKER { public String getName() { return "Inker"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { //no EbookPropertyItem } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },COLORIST { public String getName() { return "Colorist"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { //no EbookPropertyItem } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },LETTERER { public String getName() { return "Letterer"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { //no EbookPropertyItem } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },COVERARTIST { public String getName() { return "CoverArtist"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { //no EbookPropertyItem } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },EDITOR { public String getName() { return "Editor"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { //no EbookPropertyItem } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },PUBLISHER { public String getName() { return "Publisher"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { item.setPublisher(metadataProperty.getValueAsString()); } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },IMPRINT { public String getName() { return "Imprint"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { //no EbookPropertyItem } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },GENRE { public String getName() { return "Genre"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { COMMON_METADATA_TYPES.GENRE.fillItem(metadataProperty, item); } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },WEB { public String getName() { return "Web"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { //no EbookPropertyItem } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },PAGECOUNT { public String getName() { return "PageCount"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { //no EbookPropertyItem } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return Integer.class; } public Class<?> getPropertyEditorClass() { return IntegerPropertyEditor.class; } public Class<?> getPropertyRendererClass() { return DefaultPropertyRenderer.class; } },LANGUAGE_ISO { public String getName() { return "LanguageISO"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { item.setLanguage(metadataProperty.getValueAsString()); } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },LANGUAGE { public String getName() { return "Language"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { item.setLanguage(metadataProperty.getValueAsString()); } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },FORMAT { public String getName() { return "Format"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { //no EbookPropertyItem } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },BLACK_AND_WHITE { List<String> validValues = new ArrayList<>(Arrays.asList(new String[] {YeyNoType.UNKNOWN, YeyNoType.NO, YeyNoType.YES})); public String getName() { return "BlackAndWhite"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { //no EbookPropertyItem } public List<String> getValidValues() { return validValues; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return MandatorySelectionPropertyEditor.class; } public Class<?> getPropertyRendererClass() { return DatePropertyCellRenderer.class; } },MANGA { List<String> validValues = new ArrayList<>(Arrays.asList(new String[] {YeyNoType.UNKNOWN, YeyNoType.NO, YeyNoType.YES})); public String getName() { return "Manga"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { //no EbookPropertyItem } public List<String> getValidValues() { return validValues; } public Class<?> getPropertyClass() { return null; } public Class<?> getPropertyEditorClass() { return MandatorySelectionPropertyEditor.class; } public Class<?> getPropertyRendererClass() { return DatePropertyCellRenderer.class; } },RATING { public String getName() { return "Rating"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { Number number = CommonUtils.toNumber(metadataProperty.getValueAsString()); item.setRating(number != null ? number.intValue() : null); } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return Integer.class; } public Class<?> getPropertyEditorClass() { return StarRatingPropertyEditor.class; } public Class<?> getPropertyRendererClass() { return StarRatingPropertyRenderer.class; } },AGE_SUGGESTION { public String getName() { return "AgeSuggestion"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { item.setAgeSuggestion(metadataProperty.getValueAsString()); } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } },ISBN { public String getName() { return "ISBN"; } public void fillItem(MetadataProperty metadataProperty, EbookPropertyItem item) { item.setIsbn(metadataProperty.getValueAsString()); } public List<String> getValidValues() { return null; } public Class<?> getPropertyClass() { return String.class; } public Class<?> getPropertyEditorClass() { return null; } public Class<?> getPropertyRendererClass() { return null; } } } }