Ignore:
Timestamp:
2008-08-12T12:13:25+12:00 (16 years ago)
Author:
mdewsnip
Message:

Removed the abstractlistaction::validateAction() function and duplicated the code in listidsaction::validateAction() and listrecsaction::validateAction(), since the handling of the metadataPrefix is slightly different.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • gsdl/trunk/runtime-src/src/oaiservr/listidsaction.cpp

    r16710 r16712  
    77bool listidsaction::validateAction(recptproto *protocol, oaiargs &params)
    88{
    9   return abstractlistaction::validateAction(protocol, params);
     9  // ----------------------------------------------------------------------------
     10  //  1. Check for invalid arguments
     11  // ----------------------------------------------------------------------------
     12  bool invalid_argument_supplied = false;
     13  text_tmap::const_iterator param_iterator = params.begin();
     14  while (param_iterator != params.end())
     15  {
     16    // Check for arguments that aren't valid for this action
     17    if (param_iterator->first != "verb" &&
     18    param_iterator->first != "from" &&
     19    param_iterator->first != "until" &&
     20    param_iterator->first != "set" &&
     21    param_iterator->first != "resumptionToken" &&
     22    param_iterator->first != "metadataPrefix")
     23    {
     24      // We've found an invalid argument
     25      invalid_argument_supplied = true;
     26
     27      // Delete the invalid argument from the list so it doesn't end up in the <request> tag that is returned
     28      params.erase(param_iterator->first);
     29    }
     30
     31    // The metadataPrefix argument is not allowed in OAI v1.1
     32    else if (param_iterator->first == "metadataPrefix" && this->configuration->getOAIVersion() <= 110)
     33    {
     34      // We've found an invalid argument
     35      invalid_argument_supplied = true;
     36
     37      // Delete the invalid argument from the list so it doesn't end up in the <request> tag that is returned
     38      params.erase(param_iterator->first);
     39    }
     40
     41    param_iterator++;
     42  }
     43
     44  // If we found an invalid argument it's an error, so don't go any further
     45  if (invalid_argument_supplied)
     46  {
     47    this->errorType = "badArgument";
     48    return false;
     49  }
     50
     51  // ----------------------------------------------------------------------------
     52  //  2. Handle any exclusive arguments
     53  // ----------------------------------------------------------------------------
     54
     55  //  The resumptionToken argument is exclusive
     56  if (params["resumptionToken"] != "")
     57  {
     58    // This argument is exclusive, so no other arguments are allowed (except "verb" of course)
     59    if (params.getSize() != 2)
     60    {
     61      this->errorType = "badArgument";
     62      return false;
     63    }
     64
     65    // Check the resumption token is valid
     66    ResumptionToken token(params["resumptionToken"]);
     67    if (token.isValid())
     68    {
     69      // Everything is fine, and we don't continue further because this is an exclusive argument
     70      this->errorType = "";
     71      return true;
     72    }
     73    else
     74    {
     75      // There was an error with the resumption token
     76      this->errorType = "badResumptionToken";
     77      return false;
     78    }
     79  }
     80
     81  // ----------------------------------------------------------------------------
     82  //  3. Handle any required arguments
     83  // ----------------------------------------------------------------------------
     84
     85  // OAI v2.0 requires metadataPrefix
     86  if (this->configuration->getOAIVersion() > 110)
     87  {
     88    text_t metadataPrefix = params["metadataPrefix"];
     89
     90    // Check that the metadataPrefix argument exists
     91    if (metadataPrefix == "")
     92    {
     93      this->errorType = "badArgument";
     94      return false;
     95    }
     96    // Check that the metadataPrefix is a format we support
     97    if (this->formatNotSupported(metadataPrefix))
     98    {
     99      this->errorType = "cannotDisseminateFormat";
     100      return false;
     101    }
     102  }
     103
     104  // ----------------------------------------------------------------------------
     105  // 4. Check any remaining arguments
     106  // ----------------------------------------------------------------------------
     107
     108  // Check "from" and "until" arguments
     109  if (params["from"] != "" || params["until"] != "")
     110  {
     111    text_t from  = params["from"];
     112    text_t until = params["until"];
     113
     114    // Check the from date is in the correct format: YYYY-MM-DD
     115    if (from != "")
     116    {
     117      // Must be in the form YYYY-MM-DD
     118      if (from.size() != 10 || from[4] != '-' || from[7] != '-')
     119      {
     120    this->errorType = "badArgument";
     121    params.erase("from");
     122      }
     123    }
     124    // Check the until date is in the correct format: YYYY-MM-DD
     125    if (until != "")
     126    {
     127      // Must be in the form YYYY-MM-DD
     128      if (until.size() != 10 || until[4] != '-' || until[7] != '-')
     129      {
     130    this->errorType = "badArgument";
     131    params.erase("until");
     132      }
     133    }
     134
     135    if (this->errorType == "badArgument")
     136    {
     137      return false;
     138    }
     139
     140    // If both arguments are supplied the from date must be less than or equal to the until date
     141    if (from != "" && until != "" && !(from <= until))
     142    {
     143      this->errorType = "badArgument";
     144      return false;
     145    }
     146  }
     147
     148  // Check "set" argument
     149  if (params["set"] != "")
     150  {
     151    // Example set specification: "demo:CL2"
     152    text_t set = params["set"];
     153
     154    // given 'demo:CL2', toGSDL returns 'demo' in collection and 'CL2' in set. If there is no further
     155    // set specified after the name of the collection however, then set is empty.
     156    text_t collection = "";
     157    oaiclassifier::toGSDL(collection, set);
     158
     159    // Check that the collection is accessible
     160    ColInfoResponse_t cinfo;
     161    comerror_t err;
     162    protocol->get_collectinfo(collection, cinfo, err, cerr);
     163    if (err != noError)
     164    {
     165      this->errorType = "badArgument";
     166      return false;
     167    }
     168
     169    // Check the collection is one that is in the list in the oai.cfg file
     170    text_tarray &collections = this->configuration->getCollectionsList();
     171    bool collection_found = false;
     172    for (int c = 0; c < collections.size(); c++)
     173    {
     174      if (collections[c] == collection)
     175      {
     176    collection_found = true;
     177    break;
     178      }
     179    }
     180
     181    // The collection was not found
     182    if (!collection_found)
     183    {
     184      this->errorType = "badArgument";
     185      return false;
     186    }
     187
     188    // Check the child set if it was given
     189    if (set != "" && !this->check_classifier(protocol, collection, set))
     190    {
     191      this->errorType = "badArgument";
     192      return false;
     193    }
     194  }
     195
     196  // If we've reached here everything must be fine
     197  this->errorType = "";
     198  return true;
    10199}
    11200
Note: See TracChangeset for help on using the changeset viewer.