package org.celstec.ariadne.app;
import java.io.IOException;
import java.io.InputStream;
import org.ariadne.config.PropertiesManager;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;
import org.purl.sword.atom.ContentType;
import org.purl.sword.atom.Link;
import org.purl.sword.atom.Summary;
import org.purl.sword.atom.Title;
import org.purl.sword.base.AtomDocumentRequest;
import org.purl.sword.base.AtomDocumentResponse;
import org.purl.sword.base.Deposit;
import org.purl.sword.base.DepositResponse;
import org.purl.sword.base.SWORDAuthenticationException;
import org.purl.sword.base.SWORDEntry;
import org.purl.sword.base.SWORDErrorException;
import org.purl.sword.base.SWORDException;
import org.purl.sword.base.ServiceDocument;
import org.purl.sword.base.ServiceDocumentRequest;
public class SpiServer implements SpiSwordServer {
private SpiGateway sg = new SpiGateway();
public DepositResponse doDeposit(Deposit deposit) throws SWORDAuthenticationException, SWORDException {
if (deposit.getContentType() != null && deposit.getContentType().contains("application/atom+xml"))
return doMetadataDeposit(deposit);
return doResourceDeposit(deposit);
}
public void doPut(Deposit deposit) throws SWORDAuthenticationException, SWORDErrorException, SWORDException {
if (((SpiDeposit) deposit).getContextPath().contains("deposit/metadata")) {
putMetadata(deposit);
}
if (((SpiDeposit) deposit).getContextPath().contains("deposit/resource")) {
putResource(deposit);
}
}
public void putMetadata(Deposit deposit) {
Element atom = getXmlFromDeposit(deposit);
Element id = atom.getChild("id", Namespace.getNamespace("atom", "http://www.w3.org/2005/Atom"));
String resourceId = "";
String authorizationToken = "";
String metadataSchemaId = ((SpiDeposit) deposit).getSchema();
if (id != null) {
resourceId = id.getText();
}
String metadataId = "";
String contextPath = ((SpiDeposit) deposit).getContextPath();
if (contextPath.contains("deposit/metadataForMid")) {
resourceId = contextPath.substring(contextPath.indexOf("deposit/metadataForMid") + 23);
}
if (contextPath.contains("deposit/metadataForRid")) {
metadataId = contextPath.substring(contextPath.indexOf("deposit/metadataForRid") + 23);
}
sg.submitMetadata(authorizationToken, metadataId, resourceId, getMetadataFromDeposit(atom), metadataSchemaId, null);
}
public void putResource(Deposit deposit) {
String authorizationToken = deposit.getUsername() + deposit.getPassword();
String resourceId = "";
String contextPath = ((SpiDeposit) deposit).getContextPath();
if (contextPath.contains("deposit/resource")) {
resourceId = contextPath.substring(contextPath.indexOf("deposit/resource") + 17);
}
InputStream resource = deposit.getFile();
String packageType = deposit.getPackaging();
String contentType = deposit.getContentType();
String collection = "";
String filename = deposit.getFilename();
SpiGateway sg = new SpiGateway();
sg.submitResource(authorizationToken, resourceId, resource, packageType, contentType, collection, filename);
}
public ServiceDocument doServiceDocument(ServiceDocumentRequest arg0) throws SWORDAuthenticationException, SWORDException {
// TODO Auto-generated method stub
ServiceDocument document = new AriadneServiceDocument();
return document;
}
private DepositResponse doMetadataDeposit(Deposit deposit) {
Element atom = getXmlFromDeposit(deposit);
Element id = atom.getChild("id", Namespace.getNamespace("atom", "http://www.w3.org/2005/Atom"));
Element titleElement = atom.getChild("title", Namespace.getNamespace("atom", "http://www.w3.org/2005/Atom"));
String resourceId = "";
if (id != null) {
resourceId = id.getText();
}
String metadataSchemaId = ((SpiDeposit) deposit).getSchema();
String authorizationToken = "";
String metadataIdentifier = ((SpiDeposit) deposit).getXIdentifier();
String metadataId = sg.submitMetadata(authorizationToken, metadataIdentifier, resourceId, getMetadataFromDeposit(atom), metadataSchemaId, null);
DepositResponse dr = new DepositResponse(Deposit.CREATED);
String title = getTitleFromLom(atom);
if (title == null && titleElement != null)
title = titleElement.getText();
String mediaEditLinkEntry = "";
if (!resourceId.equals(""))
mediaEditLinkEntry = PropertiesManager.getInstance().getProperty("app.baseURL") + "/deposit/resource/" + resourceId;
String editLinkEntry = PropertiesManager.getInstance().getProperty("app.baseURL") + "/deposit/metadataForMid/" + metadataId;
dr.setEntry(createReturnEntry(title, resourceId, mediaEditLinkEntry, editLinkEntry));
dr.setLocation(PropertiesManager.getInstance().getProperty("app.baseURL") + "/services/oai?verb=GetRecord&metadataPrefix=oai_lom&identifier=" + metadataIdentifier);
return dr;
}
private DepositResponse doResourceDeposit(Deposit deposit) {
System.out.println("data received");
String authorizationToken = deposit.getUsername() + deposit.getPassword();
String resourceIdentifier = ((SpiDeposit) deposit).getXIdentifier();
InputStream resource = deposit.getFile();
String packageType = deposit.getPackaging();
String contentType = deposit.getContentType();
String collection = "";
String filename = deposit.getFilename();
SpiGateway sg = new SpiGateway();
sg.submitResource(authorizationToken, resourceIdentifier, resource, packageType, contentType, collection, filename);
DepositResponse dr = new DepositResponse(Deposit.CREATED);
dr.setLocation("http://localhost:80/todo");
String mediaEditLinkEntry = PropertiesManager.getInstance().getProperty("app.baseURL") + "/deposit/resource/" + resourceIdentifier;
String editLinkEntry = PropertiesManager.getInstance().getProperty("app.baseURL") + "/deposit/metadataForRid/" + resourceIdentifier;
dr.setEntry(createReturnEntry(deposit.getSlug(), resourceIdentifier, mediaEditLinkEntry, editLinkEntry));
return dr;
}
private SWORDEntry createReturnEntry(String title, String identifier, String mediaEditLinkEntry, String editLinkEntry) {
SWORDEntry entry = new SWORDEntry();
Title t = new Title();
if (title == null)
title = "no title";
t.setContent(title);
t.setType(ContentType.TEXT);
entry.setTitle(t);
if (identifier == null)
identifier = SpiGateway.generateIdentifier();
entry.setId(identifier);
Summary summary = new Summary();
entry.setSummary(summary);
Link em = new Link();
em.setRel("edit-media");
em.setHref(mediaEditLinkEntry);
entry.addLink(em);
Link e = new Link();
e.setRel("edit");
e.setHref(editLinkEntry);
entry.addLink(e);
return entry;
}
public AtomDocumentResponse doAtomDocument(AtomDocumentRequest arg0) throws SWORDAuthenticationException, SWORDErrorException, SWORDException {
// TODO Auto-generated method stub
return null;
}
private Element getXmlFromDeposit(Deposit deposit) {
SAXBuilder builder = new SAXBuilder();
Document doc = null;
try {
doc = builder.build(deposit.getFile());
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return doc.getRootElement();
}
private Element getMetadataFromDeposit(Element atom) {
if (atom == null)
return null;
Element spi = atom.getChild("metadata", Namespace.getNamespace("spi", "http://www.cenorm.be/xsd/SPI"));
if (spi == null)
return null;
Element lom = spi.getChild("lom", Namespace.getNamespace("lom", "http://ltsc.ieee.org/xsd/LOM"));
if (lom == null)
return null;
return lom;
}
private String getTitleFromLom(Element atom) {
Element lom = getMetadataFromDeposit(atom);
Element general = lom.getChild("lom", Namespace.getNamespace("lom", "http://ltsc.ieee.org/xsd/LOM"));
if (general == null)
return null;
Element identifier = lom.getChild("identifier", Namespace.getNamespace("lom", "http://ltsc.ieee.org/xsd/LOM"));
if (identifier == null)
return null;
Element entry = lom.getChild("entry", Namespace.getNamespace("lom", "http://ltsc.ieee.org/xsd/LOM"));
if (entry == null)
return null;
return entry.getText();
}
}