€cdocutils.nodes document q)q}q(U nametypesq}q(X!handling document read operationsqNX#handling document update operationsqNX#handling document delete operationsqNX#handling document create operationsq NXidentifier resolutionq NXidentifier table structureq NXidentifier managementq NuUsubstitution_defsq }qUparse_messagesq]qUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}q(hU!handling-document-read-operationsqhU#handling-document-update-operationsqhU#handling-document-delete-operationsqh U#handling-document-create-operationsqh Uidentifier-resolutionqh Uidentifier-table-structureqh Uidentifier-managementquUchildrenq]q(cdocutils.nodes raw q)q }q!(U rawsourceq"X\newpageUparentq#hUsourceq$XY/var/lib/jenkins/jobs/metacat-unstable/workspace/docs/user/metacat/source/identifiers.rstq%Utagnameq&Urawq'U attributesq(}q)(UformatXlatexU xml:spaceq*Upreserveq+Uidsq,]Ubackrefsq-]Udupnamesq.]Uclassesq/]Unamesq0]uUlineq1KUdocumentq2hh]q3cdocutils.nodes Text q4X\newpageq5…q6}q7(h"Uh#h ubaubcdocutils.nodes section q8)q9}q:(h"Uh#hh$h%h&Usectionq;h(}q<(h.]h/]h-]h,]q=hah0]q>h auh1Kh2hh]q?(cdocutils.nodes title q@)qA}qB(h"XIdentifier ManagementqCh#h9h$h%h&UtitleqDh(}qE(h.]h/]h-]h,]h0]uh1Kh2hh]qFh4XIdentifier ManagementqG…qH}qI(h"hCh#hAubaubcsphinx.addnodes index qJ)qK}qL(h"Uh#h9h$h%h&UindexqMh(}qN(h,]h-]h.]h/]h0]UentriesqO]qP(UsingleqQX IdentifiersUindex-0qRUtqSaUinlineqT‰uh1K h2hh]ubcdocutils.nodes target qU)qV}qW(h"Uh#h9h$h%h&UtargetqXh(}qY(h,]h-]h.]h/]h0]UrefidqZhRuh1K h2hh]ubcdocutils.nodes definition_list q[)q\}q](h"Uh#h9h$h%Uexpect_referenced_by_nameq^}h&Udefinition_listq_h(}q`(h.]h/]h-]h,]qahRah0]uh1Nh2hUexpect_referenced_by_idqb}qchRhVsh]qd(cdocutils.nodes definition_list_item qe)qf}qg(h"XAuthor Matthew B. Jones h#h\h$h%h&Udefinition_list_itemqhh(}qi(h.]h/]h-]h,]h0]uh1K h]qj(cdocutils.nodes term qk)ql}qm(h"XAuthorh#hfh$h%h&Utermqnh(}qo(h.]h/]h-]h,]h0]uh1K h]qph4XAuthorqq…qr}qs(h"XAuthorqth#hlubaubcdocutils.nodes definition qu)qv}qw(h"Uh(}qx(h.]h/]h-]h,]h0]uh#hfh]qycdocutils.nodes paragraph qz)q{}q|(h"XMatthew B. Jonesq}h#hvh$h%h&U paragraphq~h(}q(h.]h/]h-]h,]h0]uh1K h]q€h4XMatthew B. Jonesq…q‚}qƒ(h"h}h#h{ubaubah&U definitionq„ubeubhe)q…}q†(h"X@Date - 20100301 [MBJ] Initial draft of Identifier documentation h#h\h$h%h&hhh(}q‡(h.]h/]h-]h,]h0]uh1Kh2hh]qˆ(hk)q‰}qŠ(h"XDateh#h…h$h%h&hnh(}q‹(h.]h/]h-]h,]h0]uh1Kh]qŒh4XDateq…qŽ}q(h"XDateqh#h‰ubaubhu)q‘}q’(h"Uh(}q“(h.]h/]h-]h,]h0]uh#h…h]q”cdocutils.nodes bullet_list q•)q–}q—(h"Uh(}q˜(Ubulletq™X-h,]h-]h.]h/]h0]uh#h‘h]qšcdocutils.nodes list_item q›)qœ}q(h"X920100301 [MBJ] Initial draft of Identifier documentation h(}qž(h.]h/]h-]h,]h0]uh#h–h]qŸhz)q }q¡(h"X820100301 [MBJ] Initial draft of Identifier documentationq¢h#hœh$h%h&h~h(}q£(h.]h/]h-]h,]h0]uh1Kh]q¤h4X820100301 [MBJ] Initial draft of Identifier documentationq¥…q¦}q§(h"h¢h#h ubaubah&U list_itemq¨ubah&U bullet_listq©ubah&h„ubeubhe)qª}q«(h"XAGoal Extend Metacat to support identifiers with arbitrary syntax h#h\h$h%h&hhh(}q¬(h.]h/]h-]h,]h0]uh1Kh2hh]q­(hk)q®}q¯(h"XGoalh#hªh$h%h&hnh(}q°(h.]h/]h-]h,]h0]uh1Kh]q±h4XGoalq²…q³}q´(h"XGoalqµh#h®ubaubhu)q¶}q·(h"Uh(}q¸(h.]h/]h-]h,]h0]uh#hªh]q¹hz)qº}q»(h"X;Extend Metacat to support identifiers with arbitrary syntaxq¼h#h¶h$h%h&h~h(}q½(h.]h/]h-]h,]h0]uh1Kh]q¾h4X;Extend Metacat to support identifiers with arbitrary syntaxq¿…qÀ}qÁ(h"h¼h#hºubaubah&h„ubeubhe)qÂ}qÃ(h"XÇSummary Metacat currently supports identifier strings called 'docids' that have the syntax 'scope.object.revision', such as 'foo.34.1' (we will refer to these as 'LocalIDs'). We now want Metacat to support identifiers that are arbitrary strings, but still enforce uniqueness and proper revision handling (refer to these as GUIDs). Metacat must be able to accept these strings as identifiers for all CRUD operations, and reference them in search results. h#h\h$h%h&hhh(}qÄ(h.]h/]h-]h,]h0]uh1Kh2hh]qÅ(hk)qÆ}qÇ(h"XSummaryh#hÂh$h%h&hnh(}qÈ(h.]h/]h-]h,]h0]uh1Kh]qÉh4XSummaryqÊ…qË}qÌ(h"XSummaryqÍh#hÆubaubhu)qÎ}qÏ(h"Uh(}qÐ(h.]h/]h-]h,]h0]uh#hÂh]qÑhz)qÒ}qÓ(h"X¾Metacat currently supports identifier strings called 'docids' that have the syntax 'scope.object.revision', such as 'foo.34.1' (we will refer to these as 'LocalIDs'). We now want Metacat to support identifiers that are arbitrary strings, but still enforce uniqueness and proper revision handling (refer to these as GUIDs). Metacat must be able to accept these strings as identifiers for all CRUD operations, and reference them in search results.qÔh#hÎh$h%h&h~h(}qÕ(h.]h/]h-]h,]h0]uh1Kh]qÖh4X¾Metacat currently supports identifier strings called 'docids' that have the syntax 'scope.object.revision', such as 'foo.34.1' (we will refer to these as 'LocalIDs'). We now want Metacat to support identifiers that are arbitrary strings, but still enforce uniqueness and proper revision handling (refer to these as GUIDs). Metacat must be able to accept these strings as identifiers for all CRUD operations, and reference them in search results.q×…qØ}qÙ(h"hÔh#hÒubaubah&h„ubeubeubh8)qÚ}qÛ(h"Uh#h9h$h%h&h;h(}qÜ(h.]h/]h-]h,]qÝhah0]qÞh auh1Kh2hh]qß(h@)qà}qá(h"XIdentifier Resolutionqâh#hÚh$h%h&hDh(}qã(h.]h/]h-]h,]h0]uh1Kh2hh]qäh4XIdentifier Resolutionqå…qæ}qç(h"hâh#hàubaubhz)qè}qé(h"XþBecause Metacat uses LocalIDs throughout the code for references to objects, and that LocalID has a constrained structure that includes semantics about revisions in the identifier, it is difficult to wholesale replace it with less-constrained string identifiers without re-writing much of Metacat. Thus, our alternate strategy is to wrap the Metacat APIs with a identifier resolution layer that keeps track of the unconstrained GUIDs and maps them to constrained local identifiers which are used internally within Metacat. The basic identifer table model is shown in Figure 1, while the basic strategy for retrieving an object is shown in Figure 2, creating an object is shown in Figure 3, updating an object in Figure 4, and deleting an object is shown in Figure 5.qêh#hÚh$h%h&h~h(}që(h.]h/]h-]h,]h0]uh1Kh2hh]qìh4XþBecause Metacat uses LocalIDs throughout the code for references to objects, and that LocalID has a constrained structure that includes semantics about revisions in the identifier, it is difficult to wholesale replace it with less-constrained string identifiers without re-writing much of Metacat. Thus, our alternate strategy is to wrap the Metacat APIs with a identifier resolution layer that keeps track of the unconstrained GUIDs and maps them to constrained local identifiers which are used internally within Metacat. The basic identifer table model is shown in Figure 1, while the basic strategy for retrieving an object is shown in Figure 2, creating an object is shown in Figure 3, updating an object in Figure 4, and deleting an object is shown in Figure 5.qí…qî}qï(h"hêh#hèubaubh8)qð}qñ(h"Uh#hÚh$h%h&h;h(}qò(h.]h/]h-]h,]qóhah0]qôh auh1K-h2hh]qõ(h@)qö}q÷(h"XIdentifier Table Structureqøh#hðh$h%h&hDh(}qù(h.]h/]h-]h,]h0]uh1K-h2hh]qúh4XIdentifier Table Structureqû…qü}qý(h"høh#höubaubcdocutils.nodes figure qþ)qÿ}r(h"Uh#hðh$h%h&Ufigurerh(}r(h.]h/]h-]h,]rUid1rah0]uh1Nh2hh]r(cdocutils.nodes image r)r}r(h"XR.. figure:: images/identifiers.png Figure 1. Table structure for identifiers. h(}r (UuriXimages/identifiers.pngr h,]h-]h.]h/]U candidatesr }r U*j sh0]uh#hÿh]h&Uimager ubcdocutils.nodes caption r)r}r(h"X*Figure 1. Table structure for identifiers.rh#hÿh$h%h&Ucaptionrh(}r(h.]h/]h-]h,]h0]uh1K1h]rh4X*Figure 1. Table structure for identifiers.r…r}r(h"jh#jubaubeubcdocutils.nodes comment r)r}r(h"X‚This block defines the table structure diagram referenced above. @startuml images/identifiers.png identifiers "*" -- "1" xml_documents identifiers : String identifier identifiers : String docid identifiers : Integer rev xml_documents : String docid xml_documents : String rev note right of identifiers "identifiers.(docid,rev) is a foreign key into xml_documents" end note @endumlh#hðh$h%h&Ucommentrh(}r(h*h+h,]h-]h.]h/]h0]uh1KDh2hh]rh4X‚This block defines the table structure diagram referenced above. @startuml images/identifiers.png identifiers "*" -- "1" xml_documents identifiers : String identifier identifiers : String docid identifiers : Integer rev xml_documents : String docid xml_documents : String rev note right of identifiers "identifiers.(docid,rev) is a foreign key into xml_documents" end note @endumlr…r}r (h"Uh#jubaubh)r!}r"(h"X\newpageh#hðh$h%h&h'h(}r#(UformatXlatexh*h+h,]h-]h.]h/]h0]uh1KEh2hh]r$h4X\newpager%…r&}r'(h"Uh#j!ubaubh)r(}r)(h"X PageBreakh#hðh$h%h&h'h(}r*(UformatXpdfh*h+h,]h-]h.]h/]h0]uh1KIh2hh]r+h4X PageBreakr,…r-}r.(h"Uh#j(ubaubeubh8)r/}r0(h"Uh#hÚh$h%h&h;h(}r1(h.]h/]h-]h,]r2hah0]r3hauh1KOh2hh]r4(h@)r5}r6(h"X!Handling document read operationsr7h#j/h$h%h&hDh(}r8(h.]h/]h-]h,]h0]uh1KOh2hh]r9h4X!Handling document read operationsr:…r;}r<(h"j7h#j5ubaubhz)r=}r>(h"XAAn overview of the process needed to read an object using a GUID.r?h#j/h$h%h&h~h(}r@(h.]h/]h-]h,]h0]uh1KQh2hh]rAh4XAAn overview of the process needed to read an object using a GUID.rB…rC}rD(h"j?h#j=ubaubhþ)rE}rF(h"Uh#j/h$h%h&jh(}rG(h.]h/]h-]h,]rHUid2rIah0]uh1Nh2hh]rJ(j)rK}rL(h"X–.. figure:: images/guid_read.png Figure 2. Basic handling for string identifiers (GUIDs) as mapped to docids (LocalIDs) to retrieve an object. h(}rM(UuriXimages/guid_read.pngrNh,]h-]h.]h/]j }rOU*jNsh0]uh#jEh]h&j ubj)rP}rQ(h"XmFigure 2. Basic handling for string identifiers (GUIDs) as mapped to docids (LocalIDs) to retrieve an object.rRh#jEh$h%h&jh(}rS(h.]h/]h-]h,]h0]uh1KVh]rTh4XmFigure 2. Basic handling for string identifiers (GUIDs) as mapped to docids (LocalIDs) to retrieve an object.rU…rV}rW(h"jRh#jPubaubeubj)rX}rY(h"X@startuml images/guid_read.png !include plantuml.conf actor User participant "Client" as app_client << Application >> participant "CRUD API" as c_crud << MetacatRestServlet >> participant "Identifier Manager" as ident_man << IdentifierManager >> participant "Handler" as handler << MetacatHandler >> User -> app_client app_client -> c_crud: get(token, GUID) c_crud -> ident_man: getLocalID(GUID) c_crud <-- ident_man: localID c_crud -> handler: handleReadAction(localID) c_crud <-- handler: object c_crud --> app_client: object @endumlh#j/h$h%h&jh(}rZ(h*h+h,]h-]h.]h/]h0]uh1Kjh2hh]r[h4X@startuml images/guid_read.png !include plantuml.conf actor User participant "Client" as app_client << Application >> participant "CRUD API" as c_crud << MetacatRestServlet >> participant "Identifier Manager" as ident_man << IdentifierManager >> participant "Handler" as handler << MetacatHandler >> User -> app_client app_client -> c_crud: get(token, GUID) c_crud -> ident_man: getLocalID(GUID) c_crud <-- ident_man: localID c_crud -> handler: handleReadAction(localID) c_crud <-- handler: object c_crud --> app_client: object @endumlr\…r]}r^(h"Uh#jXubaubeubh8)r_}r`(h"Uh#hÚh$h%h&h;h(}ra(h.]h/]h-]h,]rbhah0]rch auh1Klh2hh]rd(h@)re}rf(h"X#Handling document create operationsrgh#j_h$h%h&hDh(}rh(h.]h/]h-]h,]h0]uh1Klh2hh]rih4X#Handling document create operationsrj…rk}rl(h"jgh#jeubaubhz)rm}rn(h"XCAn overview of the process needed to create an object using a GUID.roh#j_h$h%h&h~h(}rp(h.]h/]h-]h,]h0]uh1Knh2hh]rqh4XCAn overview of the process needed to create an object using a GUID.rr…rs}rt(h"joh#jmubaubhþ)ru}rv(h"Uh#j_h$h%h&jh(}rw(h.]h/]h-]h,]rxUid3ryah0]uh1Nh2hh]rz(j)r{}r|(h"X–.. figure:: images/guid_insert.png Figure 3. Basic handling for string identifiers (GUIDs) as mapped to docids (LocalIDs) to create an object. h(}r}(UuriXimages/guid_insert.pngr~h,]h-]h.]h/]j }rU*j~sh0]uh#juh]h&j ubj)r€}r(h"XkFigure 3. Basic handling for string identifiers (GUIDs) as mapped to docids (LocalIDs) to create an object.r‚h#juh$h%h&jh(}rƒ(h.]h/]h-]h,]h0]uh1Krh]r„h4XkFigure 3. Basic handling for string identifiers (GUIDs) as mapped to docids (LocalIDs) to create an object.r……r†}r‡(h"j‚h#j€ubaubeubj)rˆ}r‰(h"X{@startuml images/guid_insert.png !include plantuml.conf actor User participant "Client" as app_client << Application >> participant "CRUD API" as c_crud << MetacatRestServlet >> participant "Identifier Manager" as ident_man << IdentifierManager >> participant "Handler" as handler << MetacatHandler >> User -> app_client app_client -> c_crud: create(token, GUID, object, sysmeta) c_crud -> ident_man: identifierExists(GUID) c_crud <-- ident_man: T or F alt identifierExists == "F" c_crud -> ident_man: mapToLocalId(GUID) c_crud <-- ident_man: localID c_crud -> handler: handleInsertAction(localID) c_crud <-- handler: success note right of c_crud "Also need to address how to handle the sysmeta information wrt insertion methods" end note app_client <-- c_crud: success else identifierExists == "T" app_client <-- c_crud: IdentifierNotUnique end @endumlh#j_h$h%h&jh(}rŠ(h*h+h,]h-]h.]h/]h0]uh1KŽh2hh]r‹h4X{@startuml images/guid_insert.png !include plantuml.conf actor User participant "Client" as app_client << Application >> participant "CRUD API" as c_crud << MetacatRestServlet >> participant "Identifier Manager" as ident_man << IdentifierManager >> participant "Handler" as handler << MetacatHandler >> User -> app_client app_client -> c_crud: create(token, GUID, object, sysmeta) c_crud -> ident_man: identifierExists(GUID) c_crud <-- ident_man: T or F alt identifierExists == "F" c_crud -> ident_man: mapToLocalId(GUID) c_crud <-- ident_man: localID c_crud -> handler: handleInsertAction(localID) c_crud <-- handler: success note right of c_crud "Also need to address how to handle the sysmeta information wrt insertion methods" end note app_client <-- c_crud: success else identifierExists == "T" app_client <-- c_crud: IdentifierNotUnique end @endumlrŒ…r}rŽ(h"Uh#jˆubaubeubh8)r}r(h"Uh#hÚh$h%h&h;h(}r‘(h.]h/]h-]h,]r’hah0]r“hauh1Kh2hh]r”(h@)r•}r–(h"X#Handling document update operationsr—h#jh$h%h&hDh(}r˜(h.]h/]h-]h,]h0]uh1Kh2hh]r™h4X#Handling document update operationsrš…r›}rœ(h"j—h#j•ubaubhz)r}rž(h"XCAn overview of the process needed to update an object using a GUID.rŸh#jh$h%h&h~h(}r (h.]h/]h-]h,]h0]uh1K’h2hh]r¡h4XCAn overview of the process needed to update an object using a GUID.r¢…r£}r¤(h"jŸh#jubaubhþ)r¥}r¦(h"Uh#jh$h%h&jh(}r§(h.]h/]h-]h,]r¨Uid4r©ah0]uh1Nh2hh]rª(j)r«}r¬(h"X–.. figure:: images/guid_update.png Figure 4. Basic handling for string identifiers (GUIDs) as mapped to docids (LocalIDs) to update an object. h(}r­(UuriXimages/guid_update.pngr®h,]h-]h.]h/]j }r¯U*j®sh0]uh#j¥h]h&j ubj)r°}r±(h"XkFigure 4. Basic handling for string identifiers (GUIDs) as mapped to docids (LocalIDs) to update an object.r²h#j¥h$h%h&jh(}r³(h.]h/]h-]h,]h0]uh1K–h]r´h4XkFigure 4. Basic handling for string identifiers (GUIDs) as mapped to docids (LocalIDs) to update an object.rµ…r¶}r·(h"j²h#j°ubaubeubj)r¸}r¹(h"Xƒ@startuml images/guid_update.png !include plantuml.conf actor User participant "Client" as app_client << Application >> participant "CRUD API" as c_crud << MetacatRestServlet >> participant "Identifier Manager" as ident_man << IdentifierManager >> participant "Handler" as handler << MetacatHandler >> User -> app_client app_client -> c_crud: update(token, GUID, object, obsoletedGUID, sysmeta) c_crud -> ident_man: identifierExists(obsoletedGUID) c_crud <-- ident_man: T or F alt identifierExists == "T" c_crud -> ident_man: identifierExists(GUID) c_crud <-- ident_man: T or F alt identifierExists == "F" c_crud -> ident_man: mapToLocalId(GUID, obsoletedGUID) c_crud <-- ident_man: localID c_crud -> handler: handleUpdateAction(localID) c_crud <-- handler: success note right of c_crud "Also need to address how to handle the sysmeta information wrt update methods" end note app_client <-- c_crud: success else identifierExists == "T" app_client <-- c_crud: IdentifierNotUnique end else identifierExists == "F" app_client <-- c_crud: NotFound end @endumlh#jh$h%h&jh(}rº(h*h+h,]h-]h.]h/]h0]uh1Kºh2hh]r»h4Xƒ@startuml images/guid_update.png !include plantuml.conf actor User participant "Client" as app_client << Application >> participant "CRUD API" as c_crud << MetacatRestServlet >> participant "Identifier Manager" as ident_man << IdentifierManager >> participant "Handler" as handler << MetacatHandler >> User -> app_client app_client -> c_crud: update(token, GUID, object, obsoletedGUID, sysmeta) c_crud -> ident_man: identifierExists(obsoletedGUID) c_crud <-- ident_man: T or F alt identifierExists == "T" c_crud -> ident_man: identifierExists(GUID) c_crud <-- ident_man: T or F alt identifierExists == "F" c_crud -> ident_man: mapToLocalId(GUID, obsoletedGUID) c_crud <-- ident_man: localID c_crud -> handler: handleUpdateAction(localID) c_crud <-- handler: success note right of c_crud "Also need to address how to handle the sysmeta information wrt update methods" end note app_client <-- c_crud: success else identifierExists == "T" app_client <-- c_crud: IdentifierNotUnique end else identifierExists == "F" app_client <-- c_crud: NotFound end @endumlr¼…r½}r¾(h"Uh#j¸ubaubeubh8)r¿}rÀ(h"Uh#hÚh$h%h&h;h(}rÁ(h.]h/]h-]h,]rÂhah0]rÃhauh1K¼h2hh]rÄ(h@)rÅ}rÆ(h"X#Handling document delete operationsrÇh#j¿h$h%h&hDh(}rÈ(h.]h/]h-]h,]h0]uh1K¼h2hh]rÉh4X#Handling document delete operationsrÊ…rË}rÌ(h"jÇh#jÅubaubhz)rÍ}rÎ(h"XCAn overview of the process needed to delete an object using a GUID.rÏh#j¿h$h%h&h~h(}rÐ(h.]h/]h-]h,]h0]uh1K¾h2hh]rÑh4XCAn overview of the process needed to delete an object using a GUID.rÒ…rÓ}rÔ(h"jÏh#jÍubaubhþ)rÕ}rÖ(h"Uh#j¿h$h%h&jh(}r×(h.]h/]h-]h,]rØUid5rÙah0]uh1Nh2hh]rÚ(j)rÛ}rÜ(h"X–.. figure:: images/guid_delete.png Figure 5. Basic handling for string identifiers (GUIDs) as mapped to docids (LocalIDs) to delete an object. h(}rÝ(UuriXimages/guid_delete.pngrÞh,]h-]h.]h/]j }rßU*jÞsh0]uh#jÕh]h&j ubj)rà}rá(h"XkFigure 5. Basic handling for string identifiers (GUIDs) as mapped to docids (LocalIDs) to delete an object.râh#jÕh$h%h&jh(}rã(h.]h/]h-]h,]h0]uh1KÂh]räh4XkFigure 5. Basic handling for string identifiers (GUIDs) as mapped to docids (LocalIDs) to delete an object.rå…ræ}rç(h"jâh#jàubaubeubj)rè}ré(h"Xà@startuml images/guid_delete.png !include plantuml.conf actor User participant "Client" as app_client << Application >> participant "CRUD API" as c_crud << MetacatRestServlet >> participant "Identifier Manager" as ident_man << IdentifierManager >> participant "Handler" as handler << MetacatHandler >> User -> app_client app_client -> c_crud: delete(token, GUID) c_crud -> ident_man: identifierExists(GUID) c_crud <-- ident_man: T or F alt identifierExists == "T" c_crud -> ident_man: mapToLocalId(GUID) c_crud <-- ident_man: localID c_crud -> handler: handleDeleteAction(localID) c_crud <-- handler: success app_client <-- c_crud: success else identifierExists == "F" app_client <-- c_crud: NotFound end @endumlh#j¿h$h%h&jh(}rê(h*h+h,]h-]h.]h/]h0]uh1KÛh2hh]rëh4Xà@startuml images/guid_delete.png !include plantuml.conf actor User participant "Client" as app_client << Application >> participant "CRUD API" as c_crud << MetacatRestServlet >> participant "Identifier Manager" as ident_man << IdentifierManager >> participant "Handler" as handler << MetacatHandler >> User -> app_client app_client -> c_crud: delete(token, GUID) c_crud -> ident_man: identifierExists(GUID) c_crud <-- ident_man: T or F alt identifierExists == "T" c_crud -> ident_man: mapToLocalId(GUID) c_crud <-- ident_man: localID c_crud -> handler: handleDeleteAction(localID) c_crud <-- handler: success app_client <-- c_crud: success else identifierExists == "F" app_client <-- c_crud: NotFound end @endumlrì…rí}rî(h"Uh#jèubaubj)rï}rð(h"XNThis block defines the interaction diagram referenced above. startuml images/01_interaction.png !include plantuml.conf actor User participant "Client" as app_client << Application >> User -> app_client participant "CRUD API" as c_crud << Coordinating Node >> activate c_crud app_client -> c_crud: resolve(GUID, auth_token) participant "Authorization API" as c_authorize << Coordinating Node >> c_crud -> c_authorize: isAuth(auth_token, GUID) participant "Verify API" as c_ver << Coordinating Node >> c_authorize -> c_ver: isValidToken (token) c_authorize <-- c_ver: T or F c_crud <-- c_authorize: T or F app_client <-- c_crud: handle_list deactivate c_crud participant "CRUD API" as m_crud << Member Node >> activate m_crud app_client -> m_crud: get(auth_token, handle) participant "Server Authentication API" as m_authenticate << Member Node >> m_crud -> m_authenticate: isAuth(auth_token, GUID) m_crud <-- m_authenticate: T or F m_crud -> m_crud: log(get, UserID, GUID) app_client <-- m_crud: object or unauth or doesNotExist deactivate m_crud endumlh#j¿h$h%h&jh(}rñ(h*h+h,]h-]h.]h/]h0]uh1Kùh2hh]ròh4XNThis block defines the interaction diagram referenced above. startuml images/01_interaction.png !include plantuml.conf actor User participant "Client" as app_client << Application >> User -> app_client participant "CRUD API" as c_crud << Coordinating Node >> activate c_crud app_client -> c_crud: resolve(GUID, auth_token) participant "Authorization API" as c_authorize << Coordinating Node >> c_crud -> c_authorize: isAuth(auth_token, GUID) participant "Verify API" as c_ver << Coordinating Node >> c_authorize -> c_ver: isValidToken (token) c_authorize <-- c_ver: T or F c_crud <-- c_authorize: T or F app_client <-- c_crud: handle_list deactivate c_crud participant "CRUD API" as m_crud << Member Node >> activate m_crud app_client -> m_crud: get(auth_token, handle) participant "Server Authentication API" as m_authenticate << Member Node >> m_crud -> m_authenticate: isAuth(auth_token, GUID) m_crud <-- m_authenticate: T or F m_crud -> m_crud: log(get, UserID, GUID) app_client <-- m_crud: object or unauth or doesNotExist deactivate m_crud endumlró…rô}rõ(h"Uh#jïubaubeubeubeubeh"UU transformerröNU footnote_refsr÷}røUrefnamesrù}rúUsymbol_footnotesrû]rüUautofootnote_refsrý]rþUsymbol_footnote_refsrÿ]rU citationsr]rh2hU current_linerNUtransform_messagesr]rcdocutils.nodes system_message r)r}r(h"Uh(}r (h.]UlevelKh,]h-]Usourceh%h/]h0]UlineK UtypeUINFOr uh]r hz)r }r (h"Uh(}r(h.]h/]h-]h,]h0]uh#jh]rh4X-Hyperlink target "index-0" is not referenced.r…r}r(h"Uh#j ubah&h~ubah&Usystem_messagerubaUreporterrNUid_startrKU autofootnotesr]rU citation_refsr}rUindirect_targetsr]rUsettingsr(cdocutils.frontend Values ror}r(Ufootnote_backlinksr KUrecord_dependenciesr!NU rfc_base_urlr"Uhttps://tools.ietf.org/html/r#U tracebackr$ˆUpep_referencesr%NUstrip_commentsr&NU toc_backlinksr'Uentryr(U language_coder)Uenr*U datestampr+NU report_levelr,KU _destinationr-NU halt_levelr.KU strip_classesr/NhDNUerror_encoding_error_handlerr0Ubackslashreplacer1Udebugr2NUembed_stylesheetr3‰Uoutput_encoding_error_handlerr4Ustrictr5U sectnum_xformr6KUdump_transformsr7NU docinfo_xformr8KUwarning_streamr9NUpep_file_url_templater:Upep-%04dr;Uexit_status_levelr<KUconfigr=NUstrict_visitorr>NUcloak_email_addressesr?ˆUtrim_footnote_reference_spacer@‰UenvrANUdump_pseudo_xmlrBNUexpose_internalsrCNUsectsubtitle_xformrD‰U source_linkrENUrfc_referencesrFNUoutput_encodingrGUutf-8rHU source_urlrINUinput_encodingrJU utf-8-sigrKU_disable_configrLNU id_prefixrMUU tab_widthrNKUerror_encodingrOUUTF-8rPU_sourcerQh%Ugettext_compactrRˆU generatorrSNUdump_internalsrTNU smart_quotesrU‰U pep_base_urlrVU https://www.python.org/dev/peps/rWUsyntax_highlightrXUlongrYUinput_encoding_error_handlerrZj5Uauto_id_prefixr[Uidr\Udoctitle_xformr]‰Ustrip_elements_with_classesr^NU _config_filesr_]Ufile_insertion_enabledr`ˆU raw_enabledraKU dump_settingsrbNubUsymbol_footnote_startrcKh,}rd(hj_hj/hjj©j¥jÙjÕjIjEjyjuhh9hj¿hhðhhÚhRh\jhÿuUsubstitution_namesre}rfh&h2h(}rg(h.]h,]h-]Usourceh%h/]h0]uU footnotesrh]riUrefidsrj}rkhR]rlhVasub.