/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.springmvc;
import org.dspace.content.Metadatum;
import org.dspace.content.DSpaceObject;
import org.dspace.content.Item;
import org.dspace.core.Context;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.View;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
/**
* @author Fabio Bolognesi (fabio at atmire dot com)
* @author Mark Diggory (markd at atmire dot com)
* @author Ben Bosman (ben at atmire dot com)
*/
public class RisView implements View {
private static final Logger LOGGER = LoggerFactory.getLogger(RisView.class);
private static final String EOL = "\r\n";
private String resourceIdentifier=null;
public RisView(String resourceIdentifier)
{
this.resourceIdentifier = resourceIdentifier;
}
public String getContentType()
{
return "text/plain;charset=utf-8";
}
public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
DSpaceObject item = (DSpaceObject)request.getAttribute(ResourceIdentifierController.DSPACE_OBJECT);
Context context = new Context();
context.turnOffAuthorisationSystem();
String fileName = getFileName(item);
write(response, getRIS((Item) item, resourceIdentifier), fileName);
OutputStream aOutputStream = response.getOutputStream();
aOutputStream.close();
}
private String getFileName(DSpaceObject item)
{
String fileName = resourceIdentifier;
if(resourceIdentifier.indexOf("/") !=-1)
{
fileName = resourceIdentifier.replaceAll("/", "_") + ".ris";
}
return fileName;
}
private void write(HttpServletResponse aResponse, String aContent, String aFileName) throws IOException
{
aResponse.setContentType("text/plain;charset=utf-8");
aResponse.setContentLength(aContent.length());
aResponse.setHeader("Content-Disposition", "attachment; filename=\"" + aFileName + "\"");
// It's all over but the writing...
PrintWriter writer = aResponse.getWriter();
writer.print(aContent);
writer.close();
}
private String getRIS(Item item, String resourceIdentifier)
{
StringBuilder builder = new StringBuilder("TY - DATA").append(EOL);
String[] dateParts = getDate(item);
String title = getMetadataValue(item, "dc.title");
String description = getMetadataValue(item, "dc.description");
String[] keywords = getKeywords(item);
if (resourceIdentifier != null)
{
builder.append("ID - ").append(resourceIdentifier).append(EOL);
}
if (title != null)
{
builder.append("T1 - ").append(title).append(EOL);
}
for (String author : getAuthors(item)) {
builder.append("AU - ").append(author).append(EOL);
}
// Date for data package
if (dateParts.length > 0)
{
int count = 3;
builder.append("Y1 - ");
if (dateParts.length < 3)
{
count = dateParts.length;
}
for (int index = 0; index < count; index++) {
builder.append(dateParts[index]).append("/");
}
for (; count < 3; count++)
{
builder.append('/');
}
builder.append(EOL);
}
if (description != null)
{
builder.append("N2 - ").append(description).append(EOL);
}
for (String keyword : keywords)
{
builder.append("KW - ").append(keyword).append(EOL);
}
return builder.append("ER - ").append(EOL).toString();
}
private String[] getAuthors(Item aItem)
{
ArrayList<String> authors = new ArrayList<String>();
authors.addAll(getAuthors(aItem.getMetadataByMetadataString("dc.contributor.author")));
authors.addAll(getAuthors(aItem.getMetadataByMetadataString("dc.creator")));
authors.addAll(getAuthors(aItem.getMetadataByMetadataString("dc.contributor")));
return authors.toArray(new String[authors.size()]);
}
private String[] getKeywords(Item aItem)
{
ArrayList<String> keywordList = new ArrayList<String>();
for (Metadatum keyword : aItem.getMetadataByMetadataString("dc.subject"))
{
if (keyword.value.length() < 255)
{
keywordList.add(keyword.value);
}
}
for (Metadatum keyword : aItem.getMetadataByMetadataString("dwc.ScientificName"))
{
if (keyword.value.length() < 255)
{
keywordList.add(keyword.value);
}
}
return keywordList.toArray(new String[keywordList.size()]);
}
private String[] getDate(Item item)
{
StringTokenizer tokenizer;
for (Metadatum date : item.getMetadataByMetadataString("dc.date.issued"))
{
tokenizer = new StringTokenizer(date.value, "-/ T");
String[] dateParts = new String[tokenizer.countTokens()];
for (int index = 0; index < dateParts.length; index++)
{
dateParts[index] = tokenizer.nextToken();
}
return dateParts;
}
return new String[0];
}
private String getMetadataValue(Item item, String metadatafield)
{
for (Metadatum value : item.getMetadataByMetadataString(metadatafield))
{
return value.value;
}
return null;
}
private List<String> getAuthors(Metadatum[] aMetadata)
{
ArrayList<String> authors = new ArrayList<String>();
StringTokenizer tokenizer;
for (Metadatum metadata : aMetadata)
{
StringBuilder builder = new StringBuilder();
if (metadata.value.indexOf(",") != -1)
{
String[] parts = metadata.value.split(",");
if (parts.length > 1)
{
tokenizer = new StringTokenizer(parts[1], ". ");
builder.append(parts[0]).append(" ");
while (tokenizer.hasMoreTokens())
{
builder.append(tokenizer.nextToken().charAt(0));
}
}
else
{
builder.append(metadata.value);
}
authors.add(builder.toString());
}
// Now the minority case (as we've cleaned up data and input method)
else
{
String[] parts = metadata.value.split("\\s+|\\.");
String name = parts[parts.length - 1].replace("\\s+|\\.", "");
builder.append(name).append(" ");
for (int index = 0; index < parts.length - 1; index++)
{
if (parts[index].length() > 0)
{
name = parts[index].replace("\\s+|\\.", "");
builder.append(name.charAt(0));
}
}
}
}
return authors;
}
}