NAME

FAIR::Accessor - all this does is assign the HTTP call to the correct routine

VERSION

version 0.20

SYNOPSIS

The following code is a complete implementation of a 'Hello, World!' FAIR Accessor

#!/usr/bin/perl -w

package HelloWorld_Accessor;  # this should be the same as your filename!

use strict;
use warnings;
use JSON;


#-----------------------------------------------------------------
# Configuration and Daemon
#-----------------------------------------------------------------

use base 'FAIR::Accessor';

my $config = {
   title => 'Hello World Data Accessor',
   serviceTextualDescription => 'Server for some Helloworld Data',
   textualAccessibilityInfo => "The information from this server requries no authentication",  # this could also be a $URI describing the accessibiltiy
   mechanizedAccessibilityInfo => "",  # this must be a URI to an RDF document
   textualLicenseInfo => "CC-BY",  # this could also be a URI to the license info
   mechanizedLicenseInfo =>  "", # this must be a URI to an RDF document
   baseURI => "", # I don't know what this is used for yet, but I have a feeling I will need it!
   ETAG_Base => "HelloWorld_Accessor_For_Greetings", # this is a unique identificaiton string for the service (required by the LDP specification)
   localNamespaces => {hw => 'http://hello.world.org/some/items/',
                       hw2 => 'http://another.hello.world.org/some/predicates/'},  # add a few new namespaces to the list of known namespaces....
   localMetadataElements => [qw(hw:Greeting hw2:grusse) ],  # things that we use in addition to common metadata elements

};

my $service = HelloWorld_Accessor->new(%$config);

# start daemon
$service->handle_requests;


#-----------------------------------------------------------------
# Accessor Implementation
#-----------------------------------------------------------------



=head2 get_all_meta_URIs

 Function: REQUIRED SUBROUTINE - returns the first-stage LD Platform list of contained URIs and the dataset metadata.
 Args    : $starting_at_record : this will be passed-in to tell you what record to start with (for paginated responses)
 $path : the webserver's PATH_INFO environment value (used to modify the behaviour of REST services)
 Returns : JSON encoded listref of 'meta URIs' representing individual records
 Note    :  meta URIs are generally URIs that point back to this same server; calling GET on a meta URI will
           return an RDF description of the set of DCAT distributions for that record.\
           this can be handled by the

=cut

sub get_all_meta_URIs {

   my ($starting_at_record, $path_info) = @_;
   $path_info ||="";
   
   my %result =  (  # NOTE THAT ALL OF THESE ARE OPTIONAL!  (and there are more fields.... see DCAT...)
                   'dc:title' => "Hello World Accessor Server",
                  'dcat:description' => "the prototype Accessor server for Hello World",
                   'dcat:identifier' => "handle:HelloWorld1234567",
                   'dcat:keyword' => ["greetings", "friendly", "welcome", "Hi"],
                   'dcat:landingPage' => 'http://hello.world.net/homepage.html',
                   'dcat:language' => 'en',
                   'dcat:publisher' => 'http://hello.world.net',
                   'dcat:temporal' => 'http://reference.data.gov.uk/id/quarter/2006-Q1',  # look at this!!  It doesn't have to be this complex, but it can be!
                   'dcat:theme'  => 'http://example.org/ConceptSchemes/HelloWorld.rdf',  # this is the URI to a SKOS Concept Scheme
                   );
   my $BASE_URL = "http://" . $ENV{'SERVER_NAME'} . $ENV{'REQUEST_URI'} . $path_info;

  # you may chose to return no record IDs at all, if you only want to serve repository-level metadata     
   my @known_records = ($BASE_URL . "/hello",
                        $BASE_URL . "/world",
                        # ...  you need to generate this list of record URIs here... somehow
                       );
   $result{'void:entities'} = scalar(@known_records);  #  THE TOTAL *NUMBER* OF RECORDS THAT CAN BE SERVED
   $result{'ldp:contains'} = \@known_records; # the listref of record ids
   
   return encode_json(\%result);

}


=head2 get_distribution_URIs

 Function: REQUIRED IF get_all_meta_URIs list of URIs point back to this script.
          returns the second-stage LD Platform metadata describing the DCAT distributions, formats, and URLs
          for a particular record
 Args    : $ID : the desired ID number, as determined by the Accessor.pm module
          $PATH_INFO : the webserver's PATH_INFO environment value (in case the $ID best-guess is wrong... then you're on your own!)
 Returns : JSON encoded hashref of 'meta URIs' representing individual DCAT distributions and their formats (format is key)
           The format for this response is:
           
           {"metadata":
               {"rdf:type": ["edam:data_0006","sio:SIO_000088"]
               },
           "distributions":
               {"application/rdf+xml":"http://myserver.org/ThisScript/record/479-467-29X.rdf",
                "text/html":"http://myserver.org/ThisScript/record/479-467-29X.html"
               }
           }

=cut


sub get_distribution_URIs {
   my ($self, $ID, $PATH_INFO) = @_;

   my %response;

   my %formats;
   my %metadata;
   
   $formats{'text/html'} = 'http://myserver.org/ThisScript/helloworld.html';
   $formats{'application/rdf+xml'} = 'http://myserver.org/ThisScript/helloworld.rdf';

   # set the ontological type for the record  (optional)
   $metadata{'rdf:type'} = ['edam:data_0006', 'sio:SIO_000088'];
   
   # and whatever other metadata you wish (also optional)
   # extractMetaDataFromSpreadsheet(\%metadata, $ID);    

   $response{distributions} = \%formats;
   $response{metadata} = \%metadata if (keys %metadata);  # only set it if you can provided something

   my $response  = encode_json(\%response);
   
   return $response;

}

DESCRIPTION

FAIR Accessors are an implementation of the W3Cs Linked Data Platform. FAIR Accessors follow a two-stage interaction model, where the first stage retrieves a series of URLs representing meta-records for every record in that repository (or whatever slice of the repository is being served). This is accomplished by the get_all_meta_URIs subroutine. These URLs will generally point back at this same Accessor script (e.g. with the record number appended to the URL: http://this.host/thisscript/12345).

This script then expresses metadata about that record, including the available DCAT distributions and their file formats. This is accomplished by the get_distribution_URIs subroutine.

The two subroutine names - get_all_meta_URIs and get_distribution_URIs - are not flexible, as they are called by the underlying libraries.

NAME

FAIR::Accessor - Module for creating Linked Data Platform Accessors for the FAIR Data project

AUTHOR

Mark Denis Wilkinson (markw [at] illuiminae [dot] com)

COPYRIGHT AND LICENSE

This software is Copyright (c) 2015 by Mark Denis Wilkinson.

This is free software, licensed under:

The Apache License, Version 2.0, January 2004