com.lyncode.xoai.dataprovider.handlers.GetRecordHandler Maven / Gradle / Ivy
The newest version!
package com.lyncode.xoai.dataprovider.handlers;
import com.lyncode.xml.exceptions.XmlWriteException;
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.OAIException;
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 javax.xml.stream.XMLStreamException;
import javax.xml.transform.TransformerException;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class GetRecordHandler extends VerbHandler {
public GetRecordHandler(Context context, Repository repository) {
super(context, repository);
}
@Override
public GetRecord handle(OAICompiledRequest parameters) throws OAIException, HandlerException {
Header header = new Header();
Record record = new Record().withHeader(header);
GetRecord result = new GetRecord(record);
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");
header.withIdentifier(item.getIdentifier());
header.withDatestamp(item.getDatestamp());
for (Set set : getContext().getSets())
if (set.getCondition().getFilter(getRepository().getFilterResolver()).isItemShown(item))
header.withSetSpec(set.getSpec());
for (Set set : item.getSets())
header.withSetSpec(set.getSpec());
if (item.isDeleted())
header.withStatus(Header.Status.DELETED);
if (!item.isDeleted()) {
Metadata metadata = null;
try {
if (getContext().hasTransformer()) {
metadata = new Metadata(toPipeline(item)
.apply(getContext().getTransformer())
.apply(format.getTransformer())
.process());
} else {
metadata = new Metadata(toPipeline(item)
.apply(format.getTransformer())
.process());
}
} catch (XMLStreamException e) {
throw new OAIException(e);
} catch (TransformerException e) {
throw new OAIException(e);
} catch (IOException e) {
throw new OAIException(e);
} catch (XmlWriteException e) {
throw new OAIException(e);
}
record.withMetadata(metadata);
if (item.getAbout() != null) {
for (About about : item.getAbout())
record.withAbout(about);
}
}
return result;
}
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);
}
}