diff --git a/dcd.pl b/dcd.pl index 744090ece59637ff4876428c40fdad106689ca41..539dcb33149c396885d20e1ef2644e453351018a 100755 --- a/dcd.pl +++ b/dcd.pl @@ -41,6 +41,7 @@ my $config_file= '/etc/irma/DataCite.json'; # identifiers table my $na_path= 'na/na-dcd-10-25365'; my $identifiers_file= join ('/', $na_path, 'identifiers.tsv'); + my $ifx= '10.25365/phaidra'; my $na_id= 1; my $context_id= 1; @@ -63,7 +64,12 @@ while (defined ($arg= shift (@ARGV))) if ($opt eq 'help') { usage(); } elsif ($opt eq 'ticket') { $ticket= $val || shift (@ARGV); } elsif ($opt eq 'doit') { $register_live= 1; } - else { usage(); } + elsif ($opt eq 'test') + { + $na_path= 'na/na-dcd-10-5072'; + $identifiers_file= join ('/', $na_path, 'identifiers.tsv'); + } + else { usage(); } } elsif ($arg =~ /^-(.+)/) { @@ -130,6 +136,7 @@ sub register_url print __LINE__, " repo_url=[$repo_url]\n"; if ($repo_url =~ m#^https?://(phaidra(-(sandbox|temp))?\.univie\.ac\.at)/(detail_object|view/)?(o:\d+)$# # || $repo_url =~ m# ... uscholar ... #) + || $repo_url =~ m#https://(ojs3test\.(univie)\.(ac)\.at)/(index\.php)/wks/article/view/(\d+)$# ) { my ($repo, $s1, $s2, $s3, $pid)= ($1, $2, $3, $4, $5); @@ -154,101 +161,110 @@ sub register_url } my ($pfx, $ns, $nr)= split_doi_string ($prod_doi_string); +# print __LINE__, " prod_doi_string=[$prod_doi_string] pfx=[$pfx] ns=[$ns] nr=[$nr]\n"; - my $fo_xml= join ('/', $na_path, 'metadata', $ns, join ('.', $ns, $nr, 'xml')); + my $dc_xml= join ('/', $na_path, 'metadata', $ns, join ($repo_cnf->{id_separator}, $ns, $nr) .'.xml'); -print __LINE__, " prod_doi_string=[$prod_doi_string] pfx=[$pfx] ns=[$ns] nr=[$nr] fo_xml=[$fo_xml]\n"; +print __LINE__, " prod_doi_string=[$prod_doi_string] pfx=[$pfx] ns=[$ns] nr=[$nr] dc_xml=[$dc_xml]\n"; my $prod_xml_new; # DataCite Metadata in XML format - if (-f $fo_xml) + if (-f $dc_xml) { my @st= stat(_); my $size= $st[7]; - print "ATTN: XML file [$fo_xml] already exists, reading it!\n"; - unless (open (FO_XML, '<:utf8', $fo_xml)) + print "ATTN: XML file [$dc_xml] already exists, reading it!\n"; + unless (open (DC_XML, '<:utf8', $dc_xml)) { - print "ATTN: can not read XML from [$fo_xml]\n"; + print "ATTN: can not read XML from [$dc_xml]\n"; return; } - sysread (FO_XML, $prod_xml_new, $size); - close (FO_XML); + sysread (DC_XML, $prod_xml_new, $size); + close (DC_XML); } else { # no XML found, so fetch metadata, convert it to XML and test it on the mds.test.datacite.org - my $repo_obj= new Phaidra::DataCite (config => $repo_cnf); - # print __LINE__, " repo_obj: ", main::Dumper ($repo_obj); - - # my ($c1, $xml)= $repo_obj->get_metadata ($pid, 'xml'); - my ($c2, $json)= $repo_obj->get_metadata ($pid, 'json'); - my $api_res= decode_json ($json); - if ($api_res->{status} ne '200') - { - print __LINE__, " api_res: ", Dumper ($api_res); - return undef; - } - - my $dc_res= $api_res->{datacite}; - print __LINE__, " dc_res: ", Dumper ($dc_res); - - # TODO: - # * mint new DOI - # * insert DOI in metadata - - # NOTE: if ($dc_res->{status} ne 'OK') request a dummy doi_string - - my $t_reg_obj= new DataCite::API (config => $t_reg_cnf, 'xmode' => 'test'); - my $doi_string= $t_reg_obj->mint_doi(); - - my $doi_element= + if ($repo_cnf->{repo_type} eq 'phaidra') { - xmlname => 'identifier', - value => $doi_string, - attributes => - [ - { - xmlname => 'identifierType', - value => 'DOI' - } - ] - }; - print __LINE__, " doi_element: ", main::Dumper($doi_element); + my $repo_obj= new Phaidra::DataCite (config => $repo_cnf); + # print __LINE__, " repo_obj: ", main::Dumper ($repo_obj); - my $md= $dc_res->{datacite_elements}; - unshift (@$md, $doi_element); - print __LINE__, " md: ", main::Dumper ($md); + # my ($c1, $xml)= $repo_obj->get_metadata ($pid, 'xml'); + my ($c2, $json)= $repo_obj->get_metadata ($pid, 'json'); + my $api_res= decode_json ($json); + if ($api_res->{status} ne '200') + { + print __LINE__, " api_res: ", Dumper ($api_res); + return undef; + } - my $xml_new= $repo_obj->json_2_xml ($md); - print __LINE__, " xml_new=[$xml_new]\n"; + my $dc_res= $api_res->{datacite}; + print __LINE__, " dc_res: ", Dumper ($dc_res); - # TODO: interact with the IRMA database to find out if the DOI string is really unique and register in there + # TODO: + # * mint new DOI + # * insert DOI in metadata - # TODO: interact with DataCite API to register the DOI with the metadata - my $t_reg_result= $t_reg_obj->register_doi ($doi_string, $xml_new, $repo_url); + # NOTE: if ($dc_res->{status} ne 'OK') request a dummy doi_string - $doi_element->{value}= $prod_doi_string; # overwrite test DOI string with real DOI string - - $prod_xml_new= $repo_obj->json_2_xml ($md); - - unless (open (FO_XML, '>:utf8', $fo_xml)) - { - print "ATTN: can not write XML to [$fo_xml]\n"; - return; - } - syswrite (FO_XML, $prod_xml_new); - close (FO_XML); - - print "metatada fetched: ", get_ts(), "\n"; - if ($dc_res->{status} ne 'OK') - { - print "Metadata not ok; status=[$dc_res->{status}] errors: ", Dumper ($dc_res->{errors}); - return undef; + my $t_reg_obj= new DataCite::API (config => $t_reg_cnf, 'xmode' => 'test'); + my $doi_string= $t_reg_obj->mint_doi(); + + my $doi_element= + { + xmlname => 'identifier', + value => $doi_string, + attributes => + [ + { + xmlname => 'identifierType', + value => 'DOI' + } + ] + }; + print __LINE__, " doi_element: ", main::Dumper($doi_element); + + my $md= $dc_res->{datacite_elements}; + unshift (@$md, $doi_element); + print __LINE__, " md: ", main::Dumper ($md); + + my $xml_new= $repo_obj->json_2_xml ($md); + print __LINE__, " xml_new=[$xml_new]\n"; + + # TODO: interact with the IRMA database to find out if the DOI string is really unique and register in there + + # TODO: interact with DataCite API to register the DOI with the metadata + my $t_reg_result= $t_reg_obj->register_doi ($doi_string, $xml_new, $repo_url); + + $doi_element->{value}= $prod_doi_string; # overwrite test DOI string with real DOI string + + $prod_xml_new= $repo_obj->json_2_xml ($md); + + unless (open (DC_XML, '>:utf8', $dc_xml)) + { + print "ATTN: can not write XML to [$dc_xml]\n"; + return; + } + syswrite (DC_XML, $prod_xml_new); + close (DC_XML); + + print "metatada fetched: ", get_ts(), "\n"; + if ($dc_res->{status} ne 'OK') + { + print "Metadata not ok; status=[$dc_res->{status}] errors: ", Dumper ($dc_res->{errors}); + return undef; + } + + unless ($t_reg_result) + { + print "ATTN: register_doi with Test-DOI was not ok\n"; + return undef; + } } - - unless ($t_reg_result) + else { - print "ATTN: register_doi with Test-DOI was not ok\n"; - return undef; + print "ERROR: can't fetch metadata for this type of repository! [", $repo_cnf->{repo_type}, "]\n"; + return undef; } } @@ -309,7 +325,7 @@ sub split_doi_string my $doi= shift; # e.g. 10.25365/phaidra.1 my ($pfx, $sfx)= split ('/', $doi, 2); - my ($ns, $nr)= split (/\./, $sfx, 2); + my ($ns, $nr)= split (/[\.\-]/, $sfx, 2); ($pfx, $ns, $nr); } diff --git a/lib/DataCite/API.pm b/lib/DataCite/API.pm index fdd03936b0336ed33ef427dfd68d0a3240f2531d..caba36a8631838d4ec95c0c4a8745a0883ebbfd5 100644 --- a/lib/DataCite/API.pm +++ b/lib/DataCite/API.pm @@ -55,13 +55,13 @@ sub register_doi return undef; } - my $doi_reg = <<"EOX"; + my $doi_reg= <<"EOX"; doi=$doi url=$repo_url EOX my ($code2, $res2)= $self->datacite_request ('POST', 'doi', $doi_reg, 'application/xml;charset=UTF-8'); - print __LINE__, " code2=[$code2] res2=[$res2]\n"; + print __LINE__, " doi_reg=[$doi_reg] code2=[$code2] res2=[$res2]\n"; unless ($code2 =~ m#^20[01]#) {