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/listrecsaction.cpp

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