/*
* Copyright (C) 2015 Jan Pokorsky
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package cz.cas.lib.proarc.common.object.oldprint;
import cz.cas.lib.proarc.common.fedora.DigitalObjectException;
import cz.cas.lib.proarc.common.fedora.PageView;
import cz.cas.lib.proarc.common.fedora.PageView.PageViewItem;
import cz.cas.lib.proarc.common.fedora.SearchView.HasSearchViewHandler;
import cz.cas.lib.proarc.common.fedora.SearchView.Item;
import cz.cas.lib.proarc.common.fedora.SearchView.SearchViewHandler;
import cz.cas.lib.proarc.common.i18n.BundleName;
import cz.cas.lib.proarc.common.i18n.BundleValue;
import cz.cas.lib.proarc.common.i18n.BundleValueMap;
import cz.cas.lib.proarc.common.mods.custom.ModsConstants;
import cz.cas.lib.proarc.common.mods.ndk.NdkMapper.Context;
import cz.cas.lib.proarc.common.mods.ndk.NdkPageMapper.Page;
import cz.cas.lib.proarc.common.object.DescriptionMetadata;
import cz.cas.lib.proarc.common.object.DigitalObjectHandler;
import cz.cas.lib.proarc.common.object.DigitalObjectPlugin;
import cz.cas.lib.proarc.common.object.HasDataHandler;
import cz.cas.lib.proarc.common.object.HasMetadataHandler;
import cz.cas.lib.proarc.common.object.MetadataHandler;
import cz.cas.lib.proarc.common.object.ValueMap;
import cz.cas.lib.proarc.common.object.model.DatastreamEditorType;
import cz.cas.lib.proarc.common.object.model.MetaModel;
import cz.cas.lib.proarc.common.object.ndk.NdkMetadataHandler;
import cz.cas.lib.proarc.mods.ModsDefinition;
import cz.cas.lib.proarc.oaidublincore.ElementType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.EnumSet;
import java.util.List;
import java.util.Locale;
/**
* The plug-in to support old print digital objects.
*
* @author Jan Pokorsky
*/
public class OldPrintPlugin implements DigitalObjectPlugin, HasMetadataHandler<ModsDefinition>,
HasSearchViewHandler {
/**
* The plugin ID. Old prints.
*/
public static final String ID = "oldprint";
/**
* The volume of old prints.
*/
public static final String MODEL_VOLUME = "model:oldprintvolume";
/**
* The supplement of old prints.
*/
public static final String MODEL_SUPPLEMENT = "model:oldprintsupplement";
/**
* The page of old prints.
*/
public static final String MODEL_PAGE = "model:oldprintpage";
private OldPrintSearchViewHandler searchViewHandler;
@Override
public String getId() {
return ID;
}
@Override
public Collection<MetaModel> getModel() {
// for now it is read only repository
List<MetaModel> models = new ArrayList<MetaModel>();
models.add(new MetaModel(
MODEL_VOLUME, true, null,
Arrays.asList(new ElementType("Old Print Volume", "en"), new ElementType("STT Svazek monografie", "cs")),
ModsConstants.NS,
MODEL_VOLUME,
this,
EnumSet.of(DatastreamEditorType.MODS, DatastreamEditorType.NOTE,
/*DatastreamEditorType.PARENT, */DatastreamEditorType.CHILDREN,
DatastreamEditorType.ATM)
));
models.add(new MetaModel(
MODEL_SUPPLEMENT, true, null,
Arrays.asList(new ElementType("Old Print Supplement", "en"), new ElementType("STT Příloha monografie", "cs")),
ModsConstants.NS,
MODEL_SUPPLEMENT,
this,
EnumSet.of(DatastreamEditorType.MODS, DatastreamEditorType.NOTE,
DatastreamEditorType.PARENT, DatastreamEditorType.CHILDREN,
DatastreamEditorType.ATM)
));
models.add(new MetaModel(
MODEL_PAGE, null, true,
Arrays.asList(new ElementType("Old Print Page", "en"), new ElementType("STT Strana", "cs")),
ModsConstants.NS,
MODEL_PAGE,
this,
EnumSet.complementOf(EnumSet.of(DatastreamEditorType.CHILDREN))
));
return models;
}
@Override
public <T extends HasDataHandler> T getHandlerProvider(Class<T> type) {
return type.isInstance(this) ? type.cast(this): null;
}
@Override
public List<ValueMap> getValueMaps(ValueMap.Context context) {
Locale locale = context.getLocale();
ArrayList<ValueMap> maps = new ArrayList<ValueMap>();
maps.add(readPageTypes(locale));
return maps;
}
private ValueMap<BundleValue> readPageTypes(Locale locale) {
return BundleValueMap.fromBundle(BundleName.MODS_OLDPRINT_PAGE_TYPES, locale);
}
@Override
public MetadataHandler<ModsDefinition> createMetadataHandler(DigitalObjectHandler handler) {
return new NdkMetadataHandler(handler, new OldPrintMapperFactory()) {
@Override
protected ModsDefinition createDefault(String modelId) throws DigitalObjectException {
ModsDefinition defaultMods = super.createDefault(modelId);
DigitalObjectHandler parent = handler.getParameterParent();
if (OldPrintPlugin.MODEL_SUPPLEMENT.equals(modelId)) {
// issue 329
DigitalObjectHandler title = findEnclosingObject(parent, OldPrintPlugin.MODEL_VOLUME);
if (title != null) {
ModsDefinition titleMods = title.<ModsDefinition>metadata().getMetadata().getData();
inheritSupplementTitleInfo(defaultMods, titleMods.getTitleInfo());
defaultMods.getLanguage().addAll(titleMods.getLanguage());
inheritIdentifier(defaultMods, titleMods.getIdentifier(), "ccnb", "isbn");
inheritOriginInfoDateIssued(defaultMods, titleMods.getOriginInfo());
inheritPhysicalDescriptionForm(defaultMods, titleMods.getPhysicalDescription());
}
}
return defaultMods;
}
@Override
public PageViewItem createPageViewItem(Locale locale) throws DigitalObjectException {
String modelId = handler.relations().getModel();
if (modelId.equals(MODEL_PAGE)) {
ModsDefinition mods = editor.read();
OldPrintPageMapper mapper = new OldPrintPageMapper();
Page page = mapper.toJsonObject(mods, new Context(handler));
PageViewItem item = new PageViewItem();
item.setPageIndex(page.getIndex());
item.setPageNumber(page.getNumber());
item.setPageType(page.getType());
item.setPageTypeLabel(OldPrintPageMapper.getPageTypeLabel(item.getPageType(), locale));
return item;
} else {
throw new DigitalObjectException(fobject.getPid(), "Unexpected model for oldprint page: " + modelId);
}
}
@Override
public void setPage(PageViewItem page, String message) throws DigitalObjectException {
String modelId = handler.relations().getModel();
if (modelId.equals(MODEL_PAGE)) {
DescriptionMetadata<ModsDefinition> metadata = new DescriptionMetadata<ModsDefinition>();
metadata.setTimestamp(editor.getLastModified());
OldPrintPageMapper mapper = new OldPrintPageMapper();
ModsDefinition mods = mapper.createPage(
page.getPageIndex(), page.getPageNumber(), page.getPageType(), new Context(handler));
metadata.setIgnoreValidation(true);
write(modelId, mods, metadata, message);
} else {
throw new DigitalObjectException(fobject.getPid(), "Unexpected model for oldprint page: " + modelId);
}
}
};
}
@Override
public SearchViewHandler createSearchViewHandler() {
if (searchViewHandler == null) {
searchViewHandler = new OldPrintSearchViewHandler();
}
return searchViewHandler;
}
private static class OldPrintSearchViewHandler implements SearchViewHandler {
@Override
public String getObjectLabel(Item item, Locale locale) {
if (MODEL_PAGE.equals(item.getModel())) {
return PageView.resolveFedoraObjectLabel(
item.getLabel(), OldPrintPageMapper.getPageTypeLabels(locale));
}
return item.getLabel();
}
}
}