Ignore:
Timestamp:
2010-03-03T14:59:22+13:00 (14 years ago)
Author:
kjdon
Message:

adding code to provide a URL in a dc.identifier field to link to the document. half finished

Location:
main/trunk/greenstone2/runtime-src/src/oaiservr
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone2/runtime-src/src/oaiservr/dublincore.cpp

    r18895 r21761  
    11
    22#include "dublincore.h"
     3#include "gsdltools.h"
    34
    45dublin_core::dublin_core() : metaformat() {
     
    7273}
    7374
     75bool dublin_core::output_custom_metadata(ostream &output, outconvertclass &outconvert, bool &headerDone, const text_t &collection, ResultDocInfo_t &docInfo) {
     76  text_t value = get_metadata_value(docInfo, "srclink_file");
     77  if (value.empty()) {
     78    value = "gs doc"; // todo, situation where no source doc.
     79  } else {
     80    if (starts_with(value, "[")) {
     81      // its a format statement type value eg [SourceFile], need to get the appropriate metadata
     82      value = substr(findchar(value.begin(), value.end(), '[')+1,findchar(value.begin(), value.end(), ']') );
     83      value = get_metadata_value(docInfo, value);
     84    }
     85  }
     86  if (!value.empty()) {
     87    text_t assocfilepath = get_metadata_value(docInfo, "assocfilepath");
     88    if (!assocfilepath.empty()) {
     89      value = this->oaiConfigure->getCollectionConfig("", "baseDocRoot")+"/collect/"+collection+"/index/assoc/"+assocfilepath+"/"+value;
     90    } else {
     91      value = "";
     92    }
     93   
     94  }
     95  if (!value.empty()) {
     96    if (!headerDone) {
     97      this->output_metadata_header(output);
     98      headerDone = true;
     99    }
     100    if (this->oaiConfigure->getOAIVersion() >= 200) {
     101      output << outconvert << "        <dc:identifier>" << xml_safe(value) << "</dc:identifier>\n";
     102    }
     103    else {
     104      output << outconvert << "        <identifier>"  << xml_safe(value) << "</identifier>\n";
     105    }
     106  }
     107}
     108
    74109bool dublin_core::output_formatdata(ostream &output)
    75110{
  • main/trunk/greenstone2/runtime-src/src/oaiservr/dublincore.h

    r18895 r21761  
    66  virtual void output_metadata_header(ostream &output);
    77  virtual void output_metadata_footer(ostream &output);
    8 
     8  virtual bool output_custom_metadata(ostream &output, outconvertclass &outconvert, bool &headerDone, const text_t &collection, ResultDocInfo_t &docInfo);
    99 public:
    1010  dublin_core();
  • main/trunk/greenstone2/runtime-src/src/oaiservr/metaformat.cpp

    r21605 r21761  
    3939}
    4040
     41bool metaformat::output_custom_metadata(ostream &output, outconvertclass &outconvert, bool &headerDone, const text_t &collection, ResultDocInfo_t &docInfo) {
     42  return false;
     43}
    4144bool metaformat::scan_metadata(ostream &output, const text_t &collection, ResultDocInfo_t &docInfo,
    4245                   bool doOutput)
     
    7073    text_t mapTo = this->get_mapping(collection, here->first);
    7174    if (mapTo != "") {
    72       // Do we actually want to do anything here? Doesn't getting here imply that this
    73       // particular metadata is stuff we don't want?
    7475      if (doOutput) {
    7576    if (this->is_valid_element(mapTo)) {
     
    8586
    8687    // Otherwise try to map the element automatically
    87     // For example, dc.X is mapped to oai_dc.X (doesn't check X is a valid Dublin Core element though)
     88    // For example, dc.X is mapped to oai_dc.X
    8889    else if (metaItem == this->formatPrefix()) {
    8990      metaItem = substr(last+1, here->first.end()); // Get the rest of the metadata tag (it's name) but without the '.'
     
    117118    return false;
    118119  }
    119  
     120  // specific metadata formats might need to do some custom metadata that is not just a standard mapping. eg oai_dc outputting an identifier that is a link
     121  this->output_custom_metadata(output, utf8convert, headerDone, collection, docInfo);
    120122  if (headerDone) {
     123
    121124    this->output_metadata_footer(output);
    122125  }
     
    125128}
    126129
     130text_t metaformat::get_metadata_value(ResultDocInfo_t &docInfo, const text_t &meta_name) {
     131  MetadataInfo_tmap::iterator here = docInfo.metadata.find(meta_name);
     132  if (here == docInfo.metadata.end()) {
     133    return "";
     134  }
     135  return here->second.values[0];
     136 
     137}
     138
     139void metaformat::get_metadata_values(ResultDocInfo_t &docInfo, const text_t &meta_name, text_tarray &values) {
     140  MetadataInfo_tmap::iterator here = docInfo.metadata.find(meta_name);
     141  if (here != docInfo.metadata.end()) {
     142    values = here->second.values;
     143  }
     144}
    127145
    128146bool metaformat::is_available(const text_t &collection, ResultDocInfo_t &docInfo)
  • main/trunk/greenstone2/runtime-src/src/oaiservr/metaformat.h

    r18895 r21761  
    2626  virtual bool scan_metadata(ostream &output, const text_t &collection, 
    2727                 ResultDocInfo_t &docInfo, bool doOutput);
     28  virtual bool output_custom_metadata(ostream &output, outconvertclass &outconvert, bool &headerDone, const text_t &collection,
     29                   ResultDocInfo_t &docInfo);
     30  text_t get_metadata_value(ResultDocInfo_t &docInfo, const text_t &meta_name);
     31  void get_metadata_values(ResultDocInfo_t &docInfo, const text_t &meta_name, text_tarray & values);
    2832  oaiconfig *    oaiConfigure;
    2933
Note: See TracChangeset for help on using the changeset viewer.