/* * 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.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.SystemConfig; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.SimpleTimeZone; import java.util.TimeZone; import java.util.logging.Level; import java.util.logging.Logger; import javax.ejb.EJB; import javax.ejb.Stateless; /** * * @author luopc */ @Stateless public class DOIDataCiteServiceBean { private static final Logger logger = Logger.getLogger("edu.harvard.iq.dataverse.DOIDataCiteServiceBean"); @EJB DataverseServiceBean dataverseService; @EJB SettingsServiceBean settingsService; @EJB DOIDataCiteRegisterService doiDataCiteRegisterService; @EJB SystemConfig systemConfig; private String DOISHOULDER = ""; public DOIDataCiteServiceBean() { } public boolean alreadyExists (Dataset dataset){ boolean alreadyExists; String identifier = getIdentifierFromDataset(dataset); try{ alreadyExists = doiDataCiteRegisterService.testDOIExists(identifier); } catch (Exception e){ logger.log(Level.INFO, "alreadyExists failed"); return false; } return alreadyExists; } public String createIdentifier(Dataset dataset) throws Exception { String retString = ""; String identifier = getIdentifierFromDataset(dataset); HashMap metadata = getMetadataFromStudyForCreateIndicator(dataset); metadata.put("_status", "reserved"); try { retString = doiDataCiteRegisterService.createIdentifier(identifier, metadata, dataset); } catch (Exception e) { logger.log(Level.INFO, "Identifier not created: create failed"); logger.log(Level.INFO, "String " + e.toString()); logger.log(Level.INFO, "localized message " + e.getLocalizedMessage()); logger.log(Level.INFO, "cause " + e.getCause()); logger.log(Level.INFO, "message " + e.getMessage()); throw e; // return "Identifier not created " + e.getLocalizedMessage(); } return retString; } public HashMap getIdentifierMetadata(Dataset dataset) { String identifier = getIdentifierFromDataset(dataset); HashMap metadata = new HashMap(); try { metadata = doiDataCiteRegisterService.getMetadata(identifier); } catch (Exception e) { logger.log(Level.INFO, "getIdentifierMetadata failed"); logger.log(Level.INFO, "String " + e.toString()); logger.log(Level.INFO, "localized message " + e.getLocalizedMessage()); logger.log(Level.INFO, "cause " + e.getCause()); logger.log(Level.INFO, "message " + e.getMessage()); return metadata; } return metadata; } public HashMap lookupMetadataFromIdentifier(String protocol, String authority, String separator, String identifier) { String identifierOut = getIdentifierForLookup(protocol, authority, separator, identifier); HashMap metadata = new HashMap(); try { metadata = doiDataCiteRegisterService.getMetadata(identifierOut); } catch (Exception e) { logger.log(Level.INFO, "None existing so we can use this identifier"); logger.log(Level.INFO, "identifier: {0}", identifierOut); return metadata; } return metadata; } public String getIdentifierForLookup(String protocol, String authority, String separator, String identifier) { return protocol + ":" + authority + separator + identifier; } public String modifyIdentifier(Dataset dataset, HashMap metadata) throws Exception { String identifier = getIdentifierFromDataset(dataset); try { doiDataCiteRegisterService.createIdentifier(identifier, metadata, dataset); } catch (Exception e) { logger.log(Level.INFO, "modifyMetadata failed"); logger.log(Level.INFO, "String " + e.toString()); logger.log(Level.INFO, "localized message " + e.getLocalizedMessage()); logger.log(Level.INFO, "cause " + e.getCause()); logger.log(Level.INFO, "message " + e.getMessage()); throw e; } return identifier; } public void deleteRecordFromCache(Dataset datasetIn){ String identifier = getIdentifierFromDataset(datasetIn); HashMap doiMetadata = new HashMap(); try { doiMetadata = doiDataCiteRegisterService.getMetadata(identifier); } catch (Exception e) { logger.log(Level.INFO, "get matadata failed cannot delete"); logger.log(Level.INFO, "String " + e.toString()); logger.log(Level.INFO, "localized message " + e.getLocalizedMessage()); logger.log(Level.INFO, "cause " + e.getCause()); logger.log(Level.INFO, "message " + e.getMessage()); } String idStatus = (String) doiMetadata.get("_status"); if (idStatus == null || idStatus.equals("reserved")) { logger.log(Level.INFO, "Delete status is reserved.."); try { doiDataCiteRegisterService.deleteIdentifier(identifier); } catch (Exception e) { logger.log(Level.INFO, "delete failed"); logger.log(Level.INFO, "String " + e.toString()); logger.log(Level.INFO, "localized message " + e.getLocalizedMessage()); logger.log(Level.INFO, "cause " + e.getCause()); logger.log(Level.INFO, "message " + e.getMessage()); throw new RuntimeException(e); } return; } } public void deleteIdentifier(Dataset datasetIn) throws Exception { String identifier = getIdentifierFromDataset(datasetIn); HashMap doiMetadata = new HashMap(); try { doiMetadata = doiDataCiteRegisterService.getMetadata(identifier); } catch (Exception e) { logger.log(Level.INFO, "get matadata failed cannot delete"); logger.log(Level.INFO, "String " + e.toString()); logger.log(Level.INFO, "localized message " + e.getLocalizedMessage()); logger.log(Level.INFO, "cause " + e.getCause()); logger.log(Level.INFO, "message " + e.getMessage()); } String idStatus = (String) doiMetadata.get("_status"); if (idStatus != null && idStatus.equals("reserved")) { logger.log(Level.INFO, "Delete status is reserved.."); try { doiDataCiteRegisterService.deleteIdentifier(identifier); } catch (Exception e) { logger.log(Level.INFO, "delete failed"); logger.log(Level.INFO, "String " + e.toString()); logger.log(Level.INFO, "localized message " + e.getLocalizedMessage()); logger.log(Level.INFO, "cause " + e.getCause()); logger.log(Level.INFO, "message " + e.getMessage()); } return; } if (idStatus != null && idStatus.equals("public")) { //if public then it has been released set to unavailable and reset target to n2t url updateIdentifierStatus(datasetIn, "unavailable"); } } private HashMap getUpdateMetadataFromDataset(Dataset datasetIn) { HashMap<String, String> metadata = new HashMap<String, String>(); String authorString = datasetIn.getLatestVersion().getAuthorsStr(); if (authorString.isEmpty()) { authorString = ":unav"; } String producerString = dataverseService.findRootDataverse().getName() + " Dataverse"; if (producerString.isEmpty()) { producerString = ":unav"; } metadata.put("datacite.creator", authorString); metadata.put("datacite.title", datasetIn.getLatestVersion().getTitle()); metadata.put("datacite.publisher", producerString); metadata.put("datacite.publicationyear", generateYear()); return metadata; } private HashMap getMetadataFromStudyForCreateIndicator(Dataset datasetIn) { HashMap<String, String> metadata = new HashMap<String, String>(); String authorString = datasetIn.getLatestVersion().getAuthorsStr(); if (authorString.isEmpty()) { authorString = ":unav"; } String producerString = dataverseService.findRootDataverse().getName() + " Dataverse"; if (producerString.isEmpty()) { producerString = ":unav"; } metadata.put("datacite.creator", authorString); metadata.put("datacite.title", datasetIn.getLatestVersion().getTitle()); metadata.put("datacite.publisher", producerString); metadata.put("datacite.publicationyear", generateYear()); metadata.put("_target", getTargetUrl(datasetIn)); return metadata; } public HashMap getMetadataFromDatasetForTargetURL(Dataset datasetIn) { HashMap<String, String> metadata = new HashMap<>(); metadata.put("_target", getTargetUrl(datasetIn)); return metadata; } private String getTargetUrl(Dataset datasetIn){ return systemConfig.getDataverseSiteUrl() + Dataset.TARGET_URL + datasetIn.getGlobalId(); } private String getIdentifierFromDataset(Dataset dataset) { return dataset.getGlobalId(); } public void publicizeIdentifier(Dataset dataset) throws Exception { updateIdentifierStatus(dataset, "public"); } private void updateIdentifierStatus(Dataset dataset, String statusIn) throws Exception { String identifier = getIdentifierFromDataset(dataset); HashMap metadata = getUpdateMetadataFromDataset(dataset); metadata.put("_target", getTargetUrl(dataset)); metadata.put("_status", statusIn); try { doiDataCiteRegisterService.createIdentifier(identifier, metadata, dataset); } catch (Exception e) { logger.log(Level.INFO, "modifyMetadata failed"); logger.log(Level.INFO, "String " + e.toString()); logger.log(Level.INFO, "localized message " + e.getLocalizedMessage()); logger.log(Level.INFO, "cause " + e.getCause()); logger.log(Level.INFO, "message " + e.getMessage()); throw e; } } public static String generateYear() { StringBuilder guid = new StringBuilder(); // Create a calendar to get the date formatted properly String[] ids = TimeZone.getAvailableIDs(-8 * 60 * 60 * 1000); SimpleTimeZone pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids[0]); pdt.setStartRule(Calendar.APRIL, 1, Calendar.SUNDAY, 2 * 60 * 60 * 1000); pdt.setEndRule(Calendar.OCTOBER, -1, Calendar.SUNDAY, 2 * 60 * 60 * 1000); Calendar calendar = new GregorianCalendar(pdt); Date trialTime = new Date(); calendar.setTime(trialTime); guid.append(calendar.get(Calendar.YEAR)); return guid.toString(); } public static String generateTimeString() { StringBuilder guid = new StringBuilder(); // Create a calendar to get the date formatted properly String[] ids = TimeZone.getAvailableIDs(-8 * 60 * 60 * 1000); SimpleTimeZone pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids[0]); pdt.setStartRule(Calendar.APRIL, 1, Calendar.SUNDAY, 2 * 60 * 60 * 1000); pdt.setEndRule(Calendar.OCTOBER, -1, Calendar.SUNDAY, 2 * 60 * 60 * 1000); Calendar calendar = new GregorianCalendar(pdt); Date trialTime = new Date(); calendar.setTime(trialTime); guid.append(calendar.get(Calendar.YEAR)); guid.append(calendar.get(Calendar.DAY_OF_YEAR)); guid.append(calendar.get(Calendar.HOUR_OF_DAY)); guid.append(calendar.get(Calendar.MINUTE)); guid.append(calendar.get(Calendar.SECOND)); guid.append(calendar.get(Calendar.MILLISECOND)); double random = Math.random(); guid.append(random); return guid.toString(); } }