blob: 87892d240988316d1b9eeb9d8e114f65948eb0aa [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011,2012 Torkild U. Resheim.
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the Eclipse License v1.0 which
* accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Torkild U. Resheim - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.docs.epub.ui;
import java.io.File;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
import java.util.UUID;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.FeatureMap;
import org.eclipse.emf.ecore.util.FeatureMapUtil.FeatureEList;
import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
import org.eclipse.mylyn.docs.epub.core.OPSPublication;
import org.eclipse.mylyn.docs.epub.dc.Creator;
import org.eclipse.mylyn.docs.epub.dc.Date;
import org.eclipse.mylyn.docs.epub.dc.Identifier;
import org.eclipse.mylyn.docs.epub.dc.Language;
import org.eclipse.mylyn.docs.epub.dc.Rights;
import org.eclipse.mylyn.docs.epub.dc.Subject;
import org.eclipse.mylyn.docs.epub.dc.Title;
import org.eclipse.mylyn.docs.epub.opf.Item;
/**
* Simplified representation of an EPUB revision 2.0 instance.
*
* @author Torkild U. Resheim
*/
class EPUB2Bean {
private static final String STYLING_ID = "styling"; //$NON-NLS-1$
private static final String EMPTY_STRING = ""; //$NON-NLS-1$
private static final EStructuralFeature TEXT = XMLTypePackage.eINSTANCE.getXMLTypeDocumentRoot_Text();
private final OPSPublication epub;
private final File markupFile;
public File getMarkupFile() {
return markupFile;
}
public EPUB2Bean() {
epub = OPSPublication.getVersion2Instance();
markupFile = null;
}
class ValueComparator implements Comparator<String> {
Map<String, String> base;
public ValueComparator(Map<String, String> base) {
this.base = base;
}
public int compare(String a, String b) {
String key_a = a;
String key_b = b;
return key_a.compareTo(key_b);
}
}
TreeMap<String, String> sorted_locales;
public EPUB2Bean(OPSPublication epub, File markupFile, File epubFile, File workingFolder) {
this.epub = epub;
this.markupFile = markupFile;
String id = epub.getOpfPackage().getUniqueIdentifier();
if (id == null || id.trim().length() == 0) {
epub.getOpfPackage().setUniqueIdentifier(ID);
epub.addIdentifier(ID, "UUID", UUID.randomUUID().toString()); //$NON-NLS-1$
}
// Clear everything except the metadata
epub.getOpfPackage().getManifest().getItems().clear();
epub.getOpfPackage().getGuide().getGuideItems().clear();
epub.getOpfPackage().getSpine().getSpineItems().clear();
sorted_locales = new TreeMap<String, String>();
String[] iso639s = Locale.getISOLanguages();
for (String iso639 : iso639s) {
Locale locale = new Locale(iso639);
sorted_locales.put(locale.getDisplayLanguage(), locale.getLanguage());
}
}
public String getCover() {
Item item = epub.getItemById(OPSPublication.COVER_IMAGE_ID);
if (item == null) {
return EMPTY_STRING;
} else {
return item.getFile();
}
}
@SuppressWarnings("rawtypes")
public String getCreator() {
EList<Creator> creators = epub.getOpfPackage().getMetadata().getCreators();
if (creators.size() > 0) {
FeatureMap fm = creators.get(0).getMixed();
Object o = fm.get(TEXT, false);
if (o instanceof FeatureEList) {
if (((FeatureEList) o).size() > 0) {
return ((FeatureEList) o).get(0).toString();
}
}
}
return EMPTY_STRING;
}
public OPSPublication getEPUB() {
return epub;
}
@SuppressWarnings("rawtypes")
public String getIdentifier() {
EList<Identifier> identifiers = epub.getOpfPackage().getMetadata().getIdentifiers();
if (identifiers.size() > 0) {
FeatureMap fm = identifiers.get(0).getMixed();
Object o = fm.get(TEXT, false);
if (o instanceof FeatureEList) {
if (((FeatureEList) o).size() > 0) {
return ((FeatureEList) o).get(0).toString();
}
}
}
return EMPTY_STRING;
}
@SuppressWarnings("rawtypes")
public String getLanguage() {
EList<Language> languages = epub.getOpfPackage().getMetadata().getLanguages();
if (languages.size() > 0) {
FeatureMap fm = languages.get(0).getMixed();
Object o = fm.get(TEXT, false);
if (o instanceof FeatureEList) {
if (((FeatureEList) o).size() > 0) {
String iso639 = ((FeatureEList) o).get(0).toString();
Locale l = new Locale(iso639);
return l.getDisplayLanguage();
}
}
}
return EMPTY_STRING;
}
public void setLanguage(String language) {
epub.getOpfPackage().getMetadata().getLanguages().clear();
epub.addLanguage(null, sorted_locales.get(language));
}
@SuppressWarnings("rawtypes")
public String getRights() {
EList<Rights> rights = epub.getOpfPackage().getMetadata().getRights();
if (rights.size() > 0) {
FeatureMap fm = rights.get(0).getMixed();
Object o = fm.get(TEXT, false);
if (o instanceof FeatureEList) {
if (((FeatureEList) o).size() > 0) {
return ((FeatureEList) o).get(0).toString();
}
}
}
return EMPTY_STRING;
}
public String getStyleSheet() {
List<Item> stylesheets = epub.getItemsByMIMEType(OPSPublication.MIMETYPE_CSS);
if (stylesheets.isEmpty()) {
return EMPTY_STRING;
} else {
return stylesheets.get(0).getHref();
}
}
@SuppressWarnings("rawtypes")
public String getSubject() {
EList<Subject> subjects = epub.getOpfPackage().getMetadata().getSubjects();
if (subjects.size() > 0) {
FeatureMap fm = subjects.get(0).getMixed();
Object o = fm.get(TEXT, false);
if (o instanceof FeatureEList) {
if (((FeatureEList) o).size() > 0) {
return ((FeatureEList) o).get(0).toString();
}
}
}
return EMPTY_STRING;
}
@SuppressWarnings("rawtypes")
public String getTitle() {
EList<Title> titles = epub.getOpfPackage().getMetadata().getTitles();
if (titles.size() > 0) {
FeatureMap fm = titles.get(0).getMixed();
Object o = fm.get(TEXT, false);
if (o instanceof FeatureEList) {
if (((FeatureEList) o).size() > 0) {
return ((FeatureEList) o).get(0).toString();
}
}
}
return EMPTY_STRING;
}
public void setCover(String cover) {
if (cover.length() > 0) {
epub.setCover(new File(cover), Messages.EPUB2Bean_0);
}
}
public void setCreator(String creator) {
epub.getOpfPackage().getMetadata().getCreators().clear();
epub.addCreator(null, null, creator, null, null);
}
private final static String ID = "epub-id"; //$NON-NLS-1$
public void setIdentifier(String identifier) {
String scheme = getScheme();
epub.getOpfPackage().getMetadata().getIdentifiers().clear();
epub.addIdentifier(ID, scheme, identifier);
epub.getOpfPackage().setUniqueIdentifier(ID);
}
public void setScheme(String schemeName) {
String identifier = getIdentifier();
epub.getOpfPackage().getMetadata().getIdentifiers().clear();
epub.getOpfPackage().setUniqueIdentifier(ID);
epub.addIdentifier(ID, schemeName, identifier);
}
public String getScheme() {
Identifier ident = epub.getOpfPackage().getMetadata().getIdentifiers().get(0);
return ident.getScheme();
}
public void setRights(String rights) {
epub.getOpfPackage().getMetadata().getRights().clear();
epub.addRights(null, null, rights);
}
public void setStyleSheet(String css) {
if (css.length() > 0) {
epub.getOpfPackage().getManifest().getItems().remove(epub.getItemsByMIMEType(OPSPublication.MIMETYPE_CSS));
epub.addItem(STYLING_ID, null, new File(css), null, null, false, false, true);
}
}
public void setSubject(String subject) {
epub.getOpfPackage().getMetadata().getSubjects().clear();
epub.addSubject(null, null, subject);
}
public void setTitle(String title) {
epub.getOpfPackage().getMetadata().getTitles().clear();
epub.addTitle(null, null, title);
}
public void setPublicationDate(String date) {
epub.getOpfPackage().getMetadata().getDates().clear();
epub.addDate(null, date, "publication"); //$NON-NLS-1$
}
@SuppressWarnings("rawtypes")
public String getPublicationDate() {
EList<Date> dates = epub.getOpfPackage().getMetadata().getDates();
if (dates.size() > 0) {
for (Date date : dates) {
if (date.getEvent().equals("publication")) { //$NON-NLS-1$
FeatureMap fm = date.getMixed();
Object o = fm.get(TEXT, false);
if (o instanceof FeatureEList) {
if (((FeatureEList) o).size() > 0) {
return ((FeatureEList) o).get(0).toString();
}
}
}
}
}
return EMPTY_STRING;
}
public Map<String, String> getLocales() {
return sorted_locales;
}
}