package edu.harvard.iq.dataverse.harvest.server.xoai;
import com.lyncode.xml.exceptions.XmlWriteException;
import com.lyncode.xoai.dataprovider.exceptions.BadArgumentException;
import com.lyncode.xoai.dataprovider.exceptions.CannotDisseminateFormatException;
import com.lyncode.xoai.dataprovider.parameters.OAICompiledRequest;
import com.lyncode.xoai.dataprovider.exceptions.CannotDisseminateRecordException;
import com.lyncode.xoai.dataprovider.exceptions.HandlerException;
import com.lyncode.xoai.dataprovider.exceptions.IdDoesNotExistException;
import com.lyncode.xoai.dataprovider.exceptions.NoMetadataFormatsException;
import com.lyncode.xoai.dataprovider.exceptions.OAIException;
import com.lyncode.xoai.dataprovider.handlers.VerbHandler;
import com.lyncode.xoai.dataprovider.handlers.helpers.ItemHelper;
import com.lyncode.xoai.dataprovider.model.Context;
import com.lyncode.xoai.dataprovider.model.Item;
import com.lyncode.xoai.dataprovider.model.MetadataFormat;
import com.lyncode.xoai.dataprovider.model.Set;
import com.lyncode.xoai.model.oaipmh.*;
import com.lyncode.xoai.dataprovider.repository.Repository;
import com.lyncode.xoai.xml.XSLPipeline;
import com.lyncode.xoai.xml.XmlWriter;
import edu.harvard.iq.dataverse.Dataset;
import javax.xml.stream.XMLStreamException;
import javax.xml.transform.TransformerException;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.logging.Logger;
/*
* @author Leonid Andreev
*/
public class XgetRecordHandler extends VerbHandler<GetRecord> {
private static Logger logger = Logger.getLogger("edu.harvard.iq.dataverse.harvest.server.xoai.XgetRecordHandler");
public XgetRecordHandler(Context context, Repository repository) {
super(context, repository);
}
@Override
public GetRecord handle(OAICompiledRequest parameters) throws OAIException, HandlerException {
MetadataFormat format = getContext().formatForPrefix(parameters.getMetadataPrefix());
Item item = getRepository().getItemRepository().getItem(parameters.getIdentifier());
if (getContext().hasCondition() &&
!getContext().getCondition().getFilter(getRepository().getFilterResolver()).isItemShown(item))
throw new IdDoesNotExistException("This context does not include this item");
if (format.hasCondition() &&
!format.getCondition().getFilter(getRepository().getFilterResolver()).isItemShown(item))
throw new CannotDisseminateRecordException("Format not applicable to this item");
Xrecord record = this.createRecord(parameters, item);
GetRecord result = new XgetRecord(record);
return result;
}
private Xrecord createRecord(OAICompiledRequest parameters, Item item)
throws BadArgumentException, CannotDisseminateRecordException,
OAIException, NoMetadataFormatsException, CannotDisseminateFormatException {
MetadataFormat format = getContext().formatForPrefix(parameters.getMetadataPrefix());
Header header = new Header();
Dataset dataset = ((Xitem)item).getDataset();
Xrecord xrecord = new Xrecord().withFormatName(parameters.getMetadataPrefix()).withDataset(dataset);
header.withIdentifier(item.getIdentifier());
ItemHelper itemHelperWrap = new ItemHelper(item);
header.withDatestamp(item.getDatestamp());
for (Set set : itemHelperWrap.getSets(getContext(), getRepository().getFilterResolver()))
header.withSetSpec(set.getSpec());
if (item.isDeleted())
header.withStatus(Header.Status.DELETED);
xrecord.withHeader(header);
xrecord.withMetadata(item.getMetadata());
return xrecord;
}
private XSLPipeline toPipeline(Item item) throws XmlWriteException, XMLStreamException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
XmlWriter writer = new XmlWriter(output);
Metadata metadata = item.getMetadata();
metadata.write(writer);
writer.close();
return new XSLPipeline(new ByteArrayInputStream(output.toByteArray()), true);
}
}