/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package edu.harvard.iq.dataverse; import edu.harvard.iq.dataverse.harvest.client.HarvestingClient; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.stream.Collectors; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; /** * * @author gdurand */ public class DataCitation { private String authors; private String title; private String year; private GlobalId persistentId; private String version; private String UNF; private String distributors; private List<DatasetField> optionalValues = new ArrayList<>(); private int optionalURLcount = 0; public DataCitation(DatasetVersion dsv) { // authors (or producer) authors = dsv.getAuthorsStr(false); if (StringUtils.isEmpty(authors)) { authors = dsv.getDatasetProducersString(); } // year SimpleDateFormat sdf = new SimpleDateFormat("yyyy"); if (!dsv.getDataset().isHarvested()) { Date citationDate = dsv.getCitationDate(); if (citationDate == null) { if (dsv.getDataset().getPublicationDate() != null) { citationDate = dsv.getDataset().getPublicationDate(); } else { // for drafts citationDate = new Date(); } } year = new SimpleDateFormat("yyyy").format(citationDate); } else { try { year = sdf.format(sdf.parse(dsv.getDistributionDate())); } catch (ParseException ex) { // ignore } catch (Exception ex) { // ignore } } // title title = dsv.getTitle(); // The Global Identifier: // It is always part of the citation for the local datasets; // And for *some* harvested datasets. if (!dsv.getDataset().isHarvested() || HarvestingClient.HARVEST_STYLE_VDC.equals(dsv.getDataset().getHarvestedFrom().getHarvestStyle()) || HarvestingClient.HARVEST_STYLE_ICPSR.equals(dsv.getDataset().getHarvestedFrom().getHarvestStyle()) || HarvestingClient.HARVEST_STYLE_DATAVERSE.equals(dsv.getDataset().getHarvestedFrom().getHarvestStyle())) { if (!StringUtils.isEmpty(dsv.getDataset().getIdentifier())) { // creating a global id like this: // persistentId = new GlobalId(dsv.getDataset().getGlobalId()); // you end up doing new GlobalId((New GlobalId(dsv.getDataset())).toString()) // - doing an extra formatting-and-parsing-again // This achieves the same thing: persistentId = new GlobalId(dsv.getDataset()); } } // distributors if (!dsv.getDataset().isHarvested()) { distributors = dsv.getRootDataverseNameforCitation(); } else { distributors = dsv.getDistributorName(); //remove += [distributor] SEK 8-18-2016 } // version if (!dsv.getDataset().isHarvested()) { if (dsv.isDraft()) { version = "DRAFT VERSION"; } else if (dsv.getVersionNumber() != null) { version = "V" + dsv.getVersionNumber(); if (dsv.isDeaccessioned()) { version += ", DEACCESSIONED VERSION"; } } } // UNF UNF = dsv.getUNF(); // optional values for (DatasetFieldType dsfType : dsv.getDataset().getOwner().getCitationDatasetFieldTypes()) { DatasetField dsf = dsv.getDatasetField(dsfType); if (dsf != null) { optionalValues.add(dsf); if (dsf.getDatasetFieldType().getFieldType().equals(DatasetFieldType.FieldType.URL)) { optionalURLcount++; } } } } public String getAuthors() { return authors; } public String getTitle() { return title; } public String getYear() { return year; } public GlobalId getPersistentId() { return persistentId; } public String getVersion() { return version; } public String getUNF() { return UNF; } public String getDistributors() { return distributors; } @Override public String toString() { return toString(false); } public String toString(boolean html) { // first add comma separated parts List<String> citationList = new ArrayList<>(); citationList.add(formatString(authors, html)); citationList.add(year); citationList.add(formatString(title, html, "\"")); if (persistentId != null) { citationList.add(formatURL(persistentId.toString(), persistentId.toURL().toString(), html)); } citationList.add(formatString(distributors, html)); citationList.add(version); StringBuilder citation = new StringBuilder( citationList.stream() .filter(value -> !StringUtils.isEmpty(value)) .collect(Collectors.joining(", "))); // append UNF if (!StringUtils.isEmpty(UNF)) { citation.append(", ").append(UNF); } for (DatasetField dsf : optionalValues) { String displayName = dsf.getDatasetFieldType().getDisplayName(); String displayValue; if (dsf.getDatasetFieldType().getFieldType().equals(DatasetFieldType.FieldType.URL)) { displayValue = formatURL(dsf.getDisplayValue(), dsf.getDisplayValue(), html); if (optionalURLcount == 1) { displayName = "URL"; } } else { displayValue = formatString(dsf.getDisplayValue(), html); } citation.append(" [") .append(displayName).append(": ") .append(displayValue) .append("]"); } return citation.toString(); } // helper methods private String formatString(String value, boolean escapeHtml) { return formatString(value, escapeHtml, ""); } private String formatString(String value, boolean escapeHtml, String wrapper) { if (!StringUtils.isEmpty(value)) { return new StringBuilder(wrapper) .append(escapeHtml ? StringEscapeUtils.escapeHtml(value) : value) .append(wrapper).toString(); } return null; } private String formatURL(String text, String url, boolean html) { if (text == null) { return null; } if (html && url != null) { return "<a href=\"" + url + "\" target=\"_blank\">" + StringEscapeUtils.escapeHtml(text) + "</a>"; } else { return text; } } }