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); } }