Source: themes/ess-dive/models/DataONEObject.js

/* global define */
define(['jquery', 'underscore', 'backbone', 'uuid', 'collections/ObjectFormats', 'models/BaseDataONEObject', 'md5'],
    function ($, _, Backbone, uuid, ObjectFormats, BaseDataONEObject, md5) {

        /* 
         A DataONEObject represents a DataONE object that has a format
         type of DATA, METADATA, or RESOURCE.  It stores the system
         metadata attributes for the object at a minimum.
         */
        var DataONEObject = BaseDataONEObject.extend({

                /**
                 * Override defaults
                 * @returns {*}
                 */
                defaults: function () {
                    return _.extend(BaseDataONEObject.prototype.defaults(), {
                        accessPolicy: MetacatUI.appModel.get("defaultAccessPolicy"),
                        id: DataONEObject.generateEssDiveId()
                    });

                },

                /**
                 * Override the updateID() method to pass in  and ESS-DIVE identifier
                 * 
                 * @param id
                 * @returns {*}
                 */
                updateID: function(id){
                    
                    BaseDataONEObject.prototype.updateID.apply(this,[DataONEObject.generateEssDiveId(this)])
                }
            },
            {

                
                /***
                 * Generates an ESS-DIVE identifier.
                 *
                 * The format is `ess-dive-{hash}-{timestamp}`.
                 *
                 * The `hash` is generated from the seriesId, if it exists.
                 *
                 * @param thisDataONEObject
                 * @returns {string}
                 */
                generateEssDiveId: function (thisDataONEObject) {

                    // Create the Date suffix of the ID
                    //      Metacat does not like colons, removing
                    //      them along with Z
                    var suffix_date = new Date().toISOString().replace(/:|Z|\.|-/g,"");

                    // Hash is  generated from Math.random if there is no series id
                    var hash;
                    if (typeof thisDataONEObject != "undefined" && thisDataONEObject.get("seriesId")) {
                        // Generate an MD5 hash from the seriesID.  Take the first 12 chars
                        hash =  md5(thisDataONEObject.get("seriesId"));
                    }
                    else {
                        hash =  md5(suffix_date+Math.random().toString());
                    }

                    // Truncating the hash at 15 characters means collisions will start
                    // happening at ~4.2 trillion (collisions = 2^2n where n = # hex digits)
                    return "ess-dive-" + hash.substr(0, 15) + "-" + suffix_date;


                },
            });

        return DataONEObject;
    }
);