view src/main/java/edu/harvard/iq/dataverse/DOIEZIdServiceBean.java @ 14:be7787c36e58 default tip

new: nofity LGSercies for deleted files
author Zoe Hong <zhong@mpiwg-berlin.mpg.de>
date Mon, 02 Nov 2015 16:41:23 +0100
parents a50cf11e5178
children
line wrap: on
line source

/*
 * 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.ucsb.nceas.ezid.EZIDException;
import edu.ucsb.nceas.ezid.EZIDService;
import edu.ucsb.nceas.ezid.EZIDServiceRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 *
 * @author skraffmiller
 */
@Stateless
public class DOIEZIdServiceBean  {
    @EJB
    DataverseServiceBean dataverseService;
    @EJB 
    SettingsServiceBean settingsService;
    EZIDService ezidService;
    EZIDServiceRequest ezidServiceRequest;    
    String baseURLString =  "https://ezid.cdlib.org";  
    private static final Logger logger = Logger.getLogger("edu.harvard.iq.dvn.core.index.DOIEZIdServiceBean");
    
    // get username and password from system properties
    private String DOISHOULDER = "";
    private String USERNAME = "";
    private String PASSWORD = "";    
    
    public DOIEZIdServiceBean(){
        baseURLString = System.getProperty("doi.baseurlstring");
        ezidService = new EZIDService (baseURLString);    
        USERNAME  = System.getProperty("doi.username");
        PASSWORD  = System.getProperty("doi.password");
        logger.log(Level.FINE, "baseURLString " + baseURLString);
        try {
           ezidService.login(USERNAME, PASSWORD);  
        } catch(Exception e){
            logger.log(Level.INFO, "login 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());           
        }
    }    
    
    public String createIdentifier(Dataset dataset) {
        String retString = "";
        String identifier = getIdentifierFromDataset(dataset);
        HashMap metadata = getMetadataFromStudyForCreateIndicator(dataset);
        metadata.put("_status", "reserved");;       
        try {
            retString = ezidService.createIdentifier(identifier, metadata);
            logger.log(Level.FINE, "create DOI identifier retString : " + retString);
        } catch (EZIDException 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());
            return "Identifier not created "  +  e.getLocalizedMessage();
        }
        return retString;
    }
    
   
    public HashMap getIdentifierMetadata(Dataset dataset){
        String identifier = getIdentifierFromDataset(dataset);        
        HashMap metadata = new HashMap();
       try {
              metadata = ezidService.getMetadata(identifier);
            }  catch (EZIDException 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 = ezidService.getMetadata(identifierOut);
            }  catch (EZIDException e){                
            logger.log(Level.FINE, "None existing so we can use this identifier");
            logger.log(Level.FINE, "identifier: " + 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 ){
       String identifier = getIdentifierFromDataset(dataset);
       try {
               ezidService.setMetadata(identifier, metadata);
               return identifier;
            }  catch (EZIDException 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());    
        } 
       return null;
    }
    
    public void deleteIdentifier(Dataset datasetIn) {
        String identifier = getIdentifierFromDataset(datasetIn);
        HashMap doiMetadata = new HashMap();
        try {
            doiMetadata = ezidService.getMetadata(identifier);
        } catch (EZIDException 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());
            return;
        }

        String idStatus = (String) doiMetadata.get("_status");
        
        if (idStatus.equals("reserved")) {
            logger.log(Level.INFO, "Delete status is reserved..");
            try {
                ezidService.deleteIdentifier(identifier);
            } catch (EZIDException 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.equals("public")) { 
            //if public then it has been released set to unavaialble and reset target to n2t url
            updateIdentifierStatus(datasetIn, "unavailable | withdrawn by author");
            HashMap metadata = new HashMap();
            metadata.put("_target", "http://ezid.cdlib.org/id/" + datasetIn.getProtocol() + ":" + datasetIn.getAuthority() 
              + datasetIn.getDoiSeparator()      + datasetIn.getIdentifier());
            modifyIdentifier(datasetIn, metadata);
        }
    }
    
    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);       

        return metadata;
        
    }
    
    public 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("datacite.resourcetype", "Dataset");
        String inetAddress = getSiteUrl();
        String targetUrl = "";     
        DOISHOULDER = "doi:" + datasetIn.getAuthority();
        
        if (inetAddress.equals("localhost")){                    
           targetUrl ="http://localhost:8080" + "/dataset.xhtml?persistentId=" + DOISHOULDER 
                    + datasetIn.getDoiSeparator()       + datasetIn.getIdentifier();
        } else{
           targetUrl = inetAddress + "/dataset.xhtml?persistentId=" + DOISHOULDER 
                + datasetIn.getDoiSeparator()     + datasetIn.getIdentifier();
        }            
        metadata.put("_target", targetUrl);
        return metadata;
    }
    
    public HashMap getMetadataFromDatasetForTargetURL(Dataset datasetIn) {
        HashMap<String, String> metadata = new HashMap<String, String>();
        
        String inetAddress = getSiteUrl();
        String targetUrl = "";     
        DOISHOULDER = "doi:" + datasetIn.getAuthority();
        
        if (inetAddress.equals("localhost")){                    
           targetUrl ="http://localhost:8080" + "/dataset.xhtml?persistentId=" + DOISHOULDER 
                    + datasetIn.getDoiSeparator()       + datasetIn.getIdentifier();
        } else{
           targetUrl = inetAddress + "/dataset.xhtml?persistentId=" + DOISHOULDER 
                + datasetIn.getDoiSeparator()     + datasetIn.getIdentifier();
        }            
        metadata.put("_target", targetUrl);
        return metadata;
    }
    
    public String getSiteUrl() {
        String hostUrl = System.getProperty("dataverse.siteUrl");
        if (hostUrl != null && !"".equals(hostUrl)) {
            return hostUrl;
        }
        String hostName = System.getProperty("dataverse.fqdn");
        if (hostName == null) {
            try {
                hostName = InetAddress.getLocalHost().getCanonicalHostName();
            } catch (UnknownHostException e) {
                return null;
            }
        }
        hostUrl = "https://" + hostName;
        return hostUrl;
    }
   
    private String getIdentifierFromDataset(Dataset dataset){       
        return dataset.getGlobalId();
    }
    

    public void publicizeIdentifier(Dataset studyIn) {
        updateIdentifierStatus(studyIn, "public");
    }
    
    private void updateIdentifierStatus(Dataset dataset, String statusIn){
        String identifier = getIdentifierFromDataset(dataset);
        HashMap metadata = getUpdateMetadataFromDataset(dataset);
        metadata.put("_status", statusIn);
       try {
               ezidService.setMetadata(identifier, metadata);
            }  catch (EZIDException 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());    
        }
        
    }
    
    
    public static String generateYear()
    {
        StringBuffer guid = new StringBuffer();

        // 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()
    {
        StringBuffer guid = new StringBuffer();

        // 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();
    }  
}