File:  [LON-CAPA] / nsdl / lib / perl / Apache / NSDL / ToTheGateway.pm
Revision 1.7: download - view: text, annotated - select for diffs
Sun Jul 14 08:12:13 2002 UTC (22 years, 2 months ago) by harris41
Branches: MAIN
CVS tags: HEAD
minor syntax error

    1: # Apache::NSDL::ToTheGateway
    2: #
    3: # ToTheGateway.pm
    4: # API for passing information from NSDL to the Gateway Server
    5: #
    6: # For more documentation, read the POD documentation
    7: # of this module with the perldoc command:
    8: #
    9: #         perldoc ./ToTheGateway.pm
   10: #
   11: # Brief description
   12: # =================
   13: #
   14: # This module contains functionality for
   15: # transferring information from NSDL to the Gateway Server.
   16: #
   17: # In terms of the overall data flow, the
   18: # '=====>' below indicates the role of this
   19: # module.
   20: #
   21: # NSDL =========> Gateway --------> LON-CAPA
   22: # LON-CAPA -----> Gateway --------> NSDL
   23: #
   24: # SUBROUTINES:
   25: # NSDL->answer_list_records_request
   26: # NSDL->answer_search_request
   27: # NSDL->answer_metadata_record_request
   28: # NSDL->answer_resource_request
   29: 
   30: # Year 2002
   31: # Scott Harrison
   32: # February-May
   33: #
   34: ###
   35: 
   36: package Apache::NSDL::ToTheGateway;
   37: 
   38: # ================================================================ DEPENDENCIES
   39: use strict; # enforce handling of variables, references and subroutines
   40: use Apache::Constants qw(:common);
   41: use Apache::GATEWAY::Common;
   42: use Apache::NSDL::FromTheGateway;
   43: 
   44: # ============================================================ MODULE VARIABLES
   45: my $VERSION = sprintf("%d.%02d", q$Revision: 1.7 $ =~ /(\d+)\.(\d+)/);
   46: my $hostname='nsdl.lon-capa.org';
   47: 
   48: # ================================================================= SUBROUTINES
   49: 
   50: # ----------------------------- Handling routine called via Apache and mod_perl
   51: sub handler {
   52:     my $r = shift;
   53:     Apache::GATEWAY::Common::readCGI($r);
   54:     my $output;
   55:     if ($ENV{'form.verb'} eq 'GetRecord') {
   56: 	# arguments: identifier, metadataPrefix
   57: 	if(!defined($ENV{'form.identifier'})) {
   58: 	    my $responseDate=Apache::GATEWAY::Common::responseDate();
   59: 	    my $requestURL=Apache::GATEWAY::Common::requestURL();
   60: 	    $output=(<<END);
   61: <?xml version="1.0" encoding="UTF-8"?>
   62:  <OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" 
   63:           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   64:           xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/
   65:           http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
   66:    <responseDate>$responseDate</responseDate>
   67:    <request>$requestURL</request>
   68:    <error code="badArgument">Missing identifier argument</error>
   69:  </OAI-PMH>
   70: END
   71: 	}
   72: 	elsif(!defined($ENV{'form.metadataPrefix'})) {
   73: 	    my $responseDate=Apache::GATEWAY::Common::responseDate();
   74: 	    my $requestURL=Apache::GATEWAY::Common::requestURL();
   75: 	    $output=(<<END);
   76: <?xml version="1.0" encoding="UTF-8"?>
   77:  <OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" 
   78:           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   79:           xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/
   80:           http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
   81:    <responseDate>$responseDate</responseDate>
   82:    <request>$requestURL</request>
   83:    <error code="badArgument">Missing metadataPrefix argument</error>
   84:  </OAI-PMH>
   85: END
   86: 	}
   87: 	elsif ($ENV{'form.metadataPrefix'} ne 'oai_dc' and
   88: 	       $ENV{'form.metadataPrefix'} ne 'loncapa_ieeelom') {
   89: 	    my $responseDate=Apache::GATEWAY::Common::responseDate();
   90: 	    my $requestURL=Apache::GATEWAY::Common::requestURL();
   91: 	    $output=(<<END);
   92: <?xml version="1.0" encoding="UTF-8"?>
   93:  <OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" 
   94:           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   95:           xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/
   96:           http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
   97:    <responseDate>$responseDate</responseDate>
   98:    <request>$requestURL</request>
   99:    <error code="cannotDisseminateFormat">Cannot disseminate the requested
  100: metadata format</error>
  101:  </OAI-PMH>
  102: END
  103: 	}
  104: 	else {
  105: 	    my $status;
  106: 	    ($status,$output)=
  107:       Apache::NSDL::FromTheGateway::view_LONCAPAgateway_metadata_record(\%ENV);
  108: 	}
  109:     }
  110:     elsif ($ENV{'form.verb'} eq 'Identify') {
  111: 	# arguments: none
  112: 	my $responseDate=Apache::GATEWAY::Common::responseDate();
  113: 	my $requestURL=Apache::GATEWAY::Common::requestURL();
  114: 	$output=(<<END);
  115: <?xml version="1.0" encoding="UTF-8"?>
  116:   <OAI-PMH
  117:      xmlns="http://www.openarchives.org/OAI/2.0/"
  118:      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  119:      xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/
  120:                          http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
  121:     <responseDate>$responseDate</responseDate>
  122:     <requestURL>$requestURL</requestURL>
  123:   <Identify >
  124:     <repositoryName>The LearningOnline Network with CAPA</repositoryName>
  125:     <baseURL>http://$hostname/OAI-script</baseURL>
  126:     <protocolVersion>1.1</protocolVersion>
  127:     <adminEmail>mailto:korte\@lite.msu.edu</adminEmail>
  128:     <description>
  129:      <oai-identifier xmlns="http://www.openarchives.org/OAI/2.0/oai-identifier"
  130:          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  131:          xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai-identifier
  132:                        http://www.openarchives.org/OAI/2.0/oai-identifier.xsd">
  133:         <scheme>oai</scheme>
  134:         <repositoryIdentifier>loncapa</repositoryIdentifier>
  135:         <delimiter>:</delimiter>
  136:         <sampleIdentifier>oai:loncapa:harrison2002-1</sampleIdentifier>
  137:       </oai-identifier>
  138:     </description>
  139:     <description>
  140:       <eprints xmlns="http://www.openarchives.org/OAI/2.0/eprints"
  141:             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  142:             xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/eprints
  143:                               http://www.openarchives.org/OAI/2.0/eprints.xsd">
  144:         <content>
  145:           <URL>http://$hostname/info/content.html</URL>
  146:           <text>Educational materials from the LearningOnline Network</text>
  147:         </content>
  148:         <metadataPolicy>
  149:           <text>Metadata can be used by authorized users</text>
  150:         </metadataPolicy>
  151:         <dataPolicy>
  152:        <text>Full content, i.e. preprints may not be harvested by robots</text>
  153:         </dataPolicy>
  154:         <submissionPolicy>
  155:           <text>Submissions can be made by institutions with installed
  156: LON-CAPA servers.</text>
  157:         </submissionPolicy>
  158:       </eprints>
  159:     </description>
  160:   </Identify> 
  161:  </OAI-PMH>
  162: END
  163:     }
  164:     elsif ($ENV{'form.verb'} eq 'ListIdentifiers') {
  165: 	# arguments: until, from, set, resumptionToken
  166: #	$output=
  167: #      Apache::NSDL::FromTheGateway::search_against_LONCAPAgateway(\%ENV);
  168: 	# no full implementation scheme yet so...
  169: 	    my $responseDate=Apache::GATEWAY::Common::responseDate();
  170: 	    my $requestURL=Apache::GATEWAY::Common::requestURL();
  171: 	    $output=(<<END);
  172: <?xml version="1.0" encoding="UTF-8"?>
  173:  <OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" 
  174:           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  175:           xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/
  176:           http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
  177:    <responseDate>$responseDate</responseDate>
  178:    <request>$requestURL</request>
  179:    <error code="noSetHierarchy">No set hierarchy available yet for this
  180: gateway.</error>
  181:  </OAI-PMH>
  182: END
  183:     }
  184:     elsif ($ENV{'form.verb'} eq 'ListMetadataFormats') {
  185: 	# arguments: identifier
  186: 	my $responseDate=Apache::GATEWAY::Common::responseDate();
  187: 	my $requestURL=Apache::GATEWAY::Common::requestURL();
  188: 	$output=(<<END);
  189: <?xml version="1.0" encoding="UTF-8"?>
  190:   <ListMetadataFormats 
  191:       xmlns="http://www.openarchives.org/OAI/1.1/OAI_ListMetadataFormats"
  192:       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  193: xsi:schemaLocation="http://www.openarchives.org/OAI/1.1/OAI_ListMetadataFormats
  194:               http://www.openarchives.org/OAI/1.1/OAI_ListMetadataFormats.xsd">
  195:     <responseDate>$responseDate</responseDate> 
  196:     <requestURL>$requestURL</requestURL>
  197:     <metadataFormat>
  198:       <metadataPrefix>oai_dc</metadataPrefix>
  199:       <schema>http://www.openarchives.org/OAI/1.1/dc.xsd</schema>
  200:       <metadataNamespace>http://purl.org/dc/elements/1.1/</metadataNamespace>
  201:     </metadataFormat>
  202:     <metadataFormat>
  203:       <metadataPrefix>loncapa_ieeelom</metadataPrefix>
  204:       <schema>http://nsdl.lon-capa.org/lom/6.4/ieeelom.xsd</schema>
  205:       <metadataNamespace>http://nsdl.lon-capa.org/lom/6.4/</metadataNamespace>
  206:     </metadataFormat>
  207: </ListMetadataFormats>
  208: END
  209:     }
  210:     elsif ($ENV{'form.verb'} eq 'ListRecords') {
  211: 	# arguments: until, from, set, resumptionToken
  212: #	$output=
  213: #      Apache::NSDL::FromTheGateway::search_against_LONCAPAgateway(\%ENV);
  214: 	    my $responseDate=Apache::GATEWAY::Common::responseDate();
  215: 	    my $requestURL=Apache::GATEWAY::Common::requestURL();
  216: 	    $output=(<<END);
  217: <?xml version="1.0" encoding="UTF-8"?>
  218:  <OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" 
  219:           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  220:           xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/
  221:           http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
  222:    <responseDate>$responseDate</responseDate>
  223:    <request>$requestURL</request>
  224:    <error code="noSetHierarchy">No set hierarchy available yet for this
  225: gateway.</error>
  226:  </OAI-PMH>
  227: END
  228:     }
  229:     elsif ($ENV{'form.verb'} eq 'ListSets') {
  230: 	# arguments: resumptionToken
  231: #	$output='not yet implemented';
  232: 	    my $responseDate=Apache::GATEWAY::Common::responseDate();
  233: 	    my $requestURL=Apache::GATEWAY::Common::requestURL();
  234: 	    $output=(<<END);
  235: <?xml version="1.0" encoding="UTF-8"?>
  236:  <OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" 
  237:           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  238:           xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/
  239:           http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
  240:    <responseDate>$responseDate</responseDate>
  241:    <request>$requestURL</request>
  242:    <error code="noSetHierarchy">No set hierarchy available yet for this
  243: gateway.</error>
  244:  </OAI-PMH>
  245: END
  246:     }
  247:     else {
  248: 	my $responseDate=Apache::GATEWAY::Common::responseDate();
  249: 	my $requestURL=Apache::GATEWAY::Common::requestURL();
  250: 	$output=(<<END);
  251: <?xml version="1.0" encoding="UTF-8"?>
  252:  <OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" 
  253:           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  254:           xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/
  255:           http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
  256:    <responseDate>$responseDate</responseDate>
  257:    <request>$requestURL</request>
  258:    <error code="badVerb">Illegal OAI verb</error>
  259:  </OAI-PMH>
  260: END
  261:     }
  262:     $r->content_type('text/xml');
  263:     $r->send_http_header;
  264:     return(OK) if $r->header_only;
  265:     $r->print(<<END);
  266: $output
  267: END
  268:     
  269: #    $output=~s/\>/\&gt;/g;
  270: #    $output=~s/\</\&lt;/g;
  271: #    my $cgi;
  272: #    foreach my $key (keys %ENV) {
  273: #	if ($key=~/^form\./) {
  274: #	    $cgi.="$key: $ENV{$key}\n";
  275: #	}
  276: #    }
  277: #    $r->content_type('text/html');
  278: #    $r->send_http_header;
  279: #    return(OK) if $r->header_only;
  280: #    $r->print(<<END);
  281: #<html>
  282: #<head><title>Test Output</title></head>
  283: #<body>
  284: #<h1>Apache::NSDL::ToTheGateway</h1>
  285: #<h2>Input</h2>
  286: #<pre>
  287: #$cgi
  288: #</pre>
  289: #<h2>Output</h2>
  290: #<pre>
  291: #$output
  292: #</pre>
  293: #</body>
  294: #</html>
  295: #END
  296:     return(OK);
  297: }
  298: 
  299: # ------------------------------------------- NSDL->answer_list_records_request
  300: sub answer_list_records_request {
  301: # Not yet implemented
  302: # Need to specifically characterize INPUT arguments and OUTPUT data
  303: }
  304: 
  305: # ------------------------------------------------- NSDL->answer_search_request
  306: sub answer_search_request {
  307:     my ($url)=@_;
  308:     return "will have http querying strategy against NSDL servers\n";
  309: }
  310: 
  311: # ---------------------------------------- NSDL->answer_metadata_record_request
  312: sub answer_metadata_record_request {
  313:     my ($eref)=@_;
  314:     return Apache::NSDL::FromTheGateway($eref);
  315: }
  316: 
  317: # ----------------------------------------------- NSDL->answer_resource_request
  318: sub answer_resource_request {
  319:     my ($eref)=@_;
  320:     return Apache::NSDL::FromTheGateway($eref);
  321: }
  322: 
  323: 1;
  324: 
  325: __END__
  326: 
  327: =pod
  328: 
  329: =head1 NAME
  330: 
  331: B<Apache::NSDL::ToTheGateway> - API for passing information from NSDL to the Gateway Server
  332: 
  333: =head1 SYNOPSIS
  334: 
  335:  use Apache::NSDL::ToTheGateway;
  336: 
  337:  my $arrayref=
  338:     Apache::NSDL::ToTheGateway::answer_list_records_request
  339:       ($OAI_protocol_request);
  340: 
  341: =head1 DESCRIPTION
  342: 
  343: This module contains functionality for
  344: transferring information from NSDL to the Gateway Server.
  345: 
  346: In terms of the overall data flow, the
  347: '=====>' below indicates the role of this
  348: module.
  349: 
  350: B<NSDL =========E<gt> Gateway> --------E<gt> LON-CAPA
  351: 
  352: LON-CAPA -----E<gt> Gateway --------E<gt> NSDL
  353: 
  354: =head2 EXIT CODES
  355: 
  356: The subroutines of this module all output an exit code which
  357: describes the status of function completion.  The exit code
  358: may be followed by a more descriptive message such as:
  359: 
  360:  FORMATERROR:Sun May  5 20:15:16 GMT 2002:missing 'protocol://' pattern
  361: 
  362: =over 4
  363: 
  364: =item *
  365: 
  366: B<'SUCCESS'>, information was found and is being returned
  367: 
  368: =item *
  369: 
  370: B<'EMPTY'>, everything functioned properly, but no information was present
  371: 
  372: =item *
  373: 
  374: B<'BADEMPTY'>, everything appeared to function properly, but no information
  375: was present (which defies expectation); this is useful for detecting phantom
  376: cases of connectivity when verifying test cases of vertical software partitions
  377: 
  378: =item *
  379: 
  380: B<'TIMEOUT'>, the request is taking WAY too long
  381: 
  382: =item *
  383: 
  384: B<'FORMATERROR'>, the input argument is not formatted correctly in a way that
  385: can be processed by the NSDL server
  386: 
  387: =item *
  388: 
  389: B<'CONNECTIONFAILURE'>, the NSDL server cannot be contacted
  390: 
  391: =back
  392: 
  393: =head2 SUBROUTINES
  394: 
  395: Note that the subroutines all output an exit code which
  396: describes the status of function completion.
  397: 
  398: In the case of failed function completion, the other
  399: output argument(s) will typically only be 'NULL' values.
  400: 
  401: =over 4
  402: 
  403: =item B<Apache::NSDL::answer_list_records_request>
  404: 
  405: =over 4
  406: 
  407: =item B<Input> - Scalar string
  408: 
  409: Take in an OAI-format request for a specific NSDL server.
  410: 
  411: =item B<Output> - Scalar string, Scalar array reference
  412: 
  413: An exit code is returned as a scalar string.
  414: 
  415: A list of records returned via an array reference.
  416: 
  417: =item B<Description>
  418: 
  419: This lists the records matching a given request.
  420: The request comes from the Gateway Server, B<and the information
  421: passes from NSDL I<to the> GATEWAY>.
  422: 
  423: =item B<Status of Implementation>
  424: 
  425: n/a
  426: 
  427: =back
  428: 
  429: =item B<Apache::NSDL::answer_search_request>
  430: 
  431: =over 4
  432: 
  433: =item B<Input> - Scalar string
  434: 
  435: Take in an OAI-format request for a specific NSDL server (a search expression
  436: is passed).
  437: 
  438: =item B<Output> - Scalar string, Scalar array reference
  439: 
  440: An exit code is returned as a scalar string.
  441: 
  442: A list of relevant records (matching the search request) returned via an
  443: array reference.
  444: 
  445: =item B<Description>
  446: 
  447: This lists the records matching a given search request.
  448: The request comes from the Gateway Server, B<and the information
  449: passes from NSDL I<to the> GATEWAY>.
  450: 
  451: =item B<Status of Implementation>
  452: 
  453: n/a
  454: 
  455: =back
  456: 
  457: =item B<Apache::NSDL::answer_metadata_record_request>
  458: 
  459: =over 4
  460: 
  461: =item B<Input> - Scalar string
  462: 
  463: Take in an OAI-format request for a specific NSDL server resource's
  464: metadata.
  465: 
  466: =item B<Output> - Scalar string, Scalar string reference
  467: 
  468: An exit code is returned as a scalar string.
  469: 
  470: The metadata entries for the resource; returned via a scalar reference.
  471: 
  472: =item B<Description>
  473: 
  474: This lists the records matching a given request.
  475: The request comes from the Gateway Server, B<and the information
  476: passes from NSDL I<to the> GATEWAY>.
  477: 
  478: =item B<Status of Implementation>
  479: 
  480: n/a
  481: 
  482: =back
  483: 
  484: =item B<Apache::NSDL::answer_resource_request>
  485: 
  486: =over 4
  487: 
  488: =item B<Input> - Scalar string
  489: 
  490: Take in an OAI-format request for a specific NSDL server's
  491: resource content.
  492: 
  493: =item B<Output> - Scalar string, Scalar string reference
  494: 
  495: An exit code is returned as a scalar string.
  496: 
  497: A reference to the resource content (now physically present in computer
  498: memory).
  499: 
  500: =item B<Description>
  501: 
  502: This provides the content of the resource matching a given request.
  503: The request comes from the Gateway Server, B<and the information
  504: passes from NSDL I<to the> GATEWAY>.
  505: 
  506: =item B<Status of Implementation>
  507: 
  508: n/a
  509: 
  510: =back
  511: 
  512: =back
  513: 
  514: =head1 README
  515: 
  516: B<Apache::NSDL::ToTheGateway>
  517: is part of the NSDL-LONCAPA Gateway Server system.
  518: Please see http://nsdl.lon-capa.org/ for more information.
  519: 
  520: =head1 AUTHOR
  521: 
  522: Scott Harrison, 2002
  523: 
  524: =head1 PREREQUISITES
  525: 
  526: This module requires the C<strict> module.
  527: 
  528: =head1 COREQUISITES
  529: 
  530: Apache::NSDL::FromTheGateway
  531: Apache::GATEWAY::ToNSDL
  532: Apache::GATEWAY::FromNSDL
  533: Apache::GATEWAY::ToLONCAPA
  534: Apache::GATEWAY::FromLONCAPA
  535: Apache::LONCAPA::FromTheGateway
  536: Apache::LONCAPA::ToTheGateway
  537: 
  538: =head1 SEE ALSO
  539: 
  540: http://www.lon-capa.org/
  541: 
  542: http://www.smete.org/
  543: 
  544: Also visit the other Apache::NSDL::*, Apache::LONCAPA::*,
  545: and Apache::GATEWAY::* manpages.
  546: 
  547: =head1 OSNAMES
  548: 
  549: linux
  550: 
  551: =cut

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>