Archive a File      
==============

Scenario
--------

    As a scientist, I want to remove a file so it is no longer associated with newer versions of my dataset and it will not be discoverable, but will remain citable if published.

Summary
-------
A scientist should be able to remove a file, which is similar to deleting a file, but preserves read access in the event the file has been published and directly cited.  The goal is to enable archiving of data files, as well as data packages that contain the data files.  The display should immediately remove the items that are archived, and they should be asychronously archived in the repository. If the file has been published, it will be archived with public read access.  If it is not published, it is archived with all read access removed (including the original rights holder). If only a data file is archived, the science metadata and containing package should be updated to reflect this. 

Mockup Image
------------

.. image:: images/Edit-Metadata-Remove-a-File.png

Technical Sequence Diagram
--------------------------

.. 
    @startuml images/remove-a-file-sequence-diagram.png

      !include ../plantuml-styles.txt
      skinparam SequenceGroupBorderColor #AAAAAA
      skinparam SequenceGroupBorderThickness #AAAAAA

      actor "Scientist"
      participant DataPackageView as PackageView <<Backbone.View>>
      participant ConfirmArchiveView as ConfirmArchiveView  <<ModalView>>
      participant DataPackage as DataPackage <<Backbone.Collection>>
      participant EML as EML <<DataONEObject>>
      participant DataObject as "dataObject:DataObject" <<DataONEObject>>
      participant LocalStorage as LocalStore  <<Store>>
      participant MN as MN  <<Store>>

      PackageView -> DataPackage : listenTo("remove", handleRemove())
      DataPackage -> DataPackage : on("remove", handleRemove())

      PackageView -> PackageView : listenTo("click menu.item", handleArchive())
      Scientist -> PackageView : Chooses "Archive ..." menu item

      activate PackageView
        PackageView -> PackageView : handleArchive()
        PackageView -> DataPackage : set("editable", false)
        note left
          Editing is disabled
        end note
        PackageView -> DataPackage : listenTo("change:editable", handleEditable())
        PackageView --> ConfirmArchiveView : render()
      deactivate PackageView
        
      activate ConfirmArchiveView
        ConfirmArchiveView -> ConfirmArchiveView : listenTo("click #ok", confirmArchive())
        ConfirmArchiveView -> ConfirmArchiveView : listenTo("click #cancel", confirmArchive())
        ConfirmArchiveView --> Scientist: Ok? Cancel?
        note right
          Dialog states:
          
          This file has been published and will
          be archived instead of removed. Are
          you sure you want to archive it?
          
          or it states:
          
          Are you sure you want to remove this file?
        end note
      deactivate ConfirmArchiveView
      
      Scientist -> ConfirmArchiveView : Clicks 'Ok'
      activate ConfirmArchiveView
        ConfirmArchiveView -> ConfirmArchiveView : confirmArchive()
        ConfirmArchiveView -> DataPackage : remove(id)
      deactivate ConfirmArchiveView
      
      activate DataPackage
      PackageView -> PackageView : handleRemove()
        DataPackage -> DataPackage : handleRemove(id)
        DataPackage -> EML : removeEntity(id)
      deactivate DataPackage
      
      activate EML
        EML --> DataPackage : success
      deactivate EML
        
      activate DataPackage
        DataPackage -> DataObject : destroy()
      deactivate DataPackage
      
      activate DataObject
        DataObject -> MN : archive()
      deactivate DataObject
      
      activate MN
        MN --> DataObject : identifier
      deactivate MN
        
      alt if published   
        activate DataObject
          DataObject -> MN : updateSystemMetadata(sysmeta)
          note left
            In sysmeta, ensure public
            read access
          end note
        deactivate DataObject
        
        activate MN
          MN --> DataObject : identifier
        deactivate MN       
      
        activate DataObject
          DataObject --> DataPackage : success
        deactivate DataObject
        
      else not published
        
          DataObject -> MN : updateSystemMetadata(sysmeta)
          note left
            In sysmeta, remove the AccessPolicy, and
            set the rightsHolder to the MN subject
          end note
        
        activate MN
          MN --> DataObject : identifier
        deactivate MN       
        
        activate DataObject  
          DataObject --> DataPackage : success
        deactivate DataObject          
      activate DataPackage
        
      end
      

        DataPackage -> EML : save()
      deactivate DataPackage
        
      activate EML
        EML -> MN : update(pid, newPid, sysmeta, object)
      deactivate EML
        
      activate MN
        MN --> EML : identifier
      deactivate MN
      
      activate EML
        EML -> DataPackage : success
      deactivate EML          
      
      activate DataPackage 
        DataPackage -> MN : update(pid, newPid, sysmeta, object)
      deactivate DataPackage
      
      activate MN
        MN --> DataPackage : identifier
      deactivate MN
        
      activate DataPackage
        DataPackage --> PackageView : handleEditable()
        note left
          Editing is enabled
        end note
      deactivate DataPackage
      
    @enduml

.. image:: images/remove-a-file-sequence-diagram.png