Changeset 16710
- Timestamp:
- 2008-08-12T11:57:10+12:00 (16 years ago)
- Location:
- gsdl/trunk/runtime-src/src/oaiservr
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
gsdl/trunk/runtime-src/src/oaiservr/abstractlistaction.cpp
r16708 r16710 4 4 #include "oaitools.h" 5 5 6 bool abstractlistaction::validateAction(recptproto *protocol, oaiargs ¶ms, int &numArgs) 7 { 8 // Remove any parameters that aren't valid for this action 6 bool abstractlistaction::validateAction(recptproto *protocol, oaiargs ¶ms) 7 { 8 // ---------------------------------------------------------------------------- 9 // 1. Check for invalid arguments 10 // ---------------------------------------------------------------------------- 11 bool invalid_argument_supplied = false; 9 12 text_tmap::const_iterator param_iterator = params.begin(); 10 13 while (param_iterator != params.end()) 11 14 { 15 // Check for arguments that aren't valid for this action 12 16 if (param_iterator->first != "verb" && 13 17 param_iterator->first != "from" && … … 17 21 param_iterator->first != "metadataPrefix") 18 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 19 27 params.erase(param_iterator->first); 20 28 } 21 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 22 40 param_iterator++; 23 41 } 24 42 25 text_t from = params["from"]; 26 text_t until = params["until"]; 27 28 // from date must be less than, or equal to, until date 29 if ((from != "") && (until != "") && !(from <= until)){ 43 // If we found an invalid argument it's an error, so don't go any further 44 if (invalid_argument_supplied) 45 { 30 46 this->errorType = "badArgument"; 31 47 return false; 32 48 } 33 49 34 if (from != ""){ 35 // Must be in the form YYYY-MM-DD 36 if(from.size() != 10){ 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 { 37 60 this->errorType = "badArgument"; 38 params.erase("from"); 39 } 40 else{ 41 if(from[4] != '-' || from[7] != '-'){ 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 { 42 119 this->errorType = "badArgument"; 43 120 params.erase("from"); 44 121 } 45 122 } 46 ++numArgs; // Increase valid args count 47 } 48 49 if (until != ""){ 50 // Must be in the form YYYY-MM-DD 51 if(until.size() != 10){ 52 this->errorType = "badArgument"; 53 params.erase("until"); 54 } 55 else{ 56 if(until[4] != '-' || until[7] != '-'){ 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 { 57 129 this->errorType = "badArgument"; 58 130 params.erase("until"); 59 131 } 60 132 } 61 ++numArgs; // Increase valid args count 62 } 63 64 if (this->errorType == "badArgument") 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"] != "") 65 149 { 66 return false; 67 } 68 69 if (params["set"] != "") { 70 text_t gsdlSet = params["set"]; 71 text_t gsdlCollect = ""; 72 73 // given 'demo:CL2', toGSDL returns 'demo' in gsdlCollect and 'CL2' in gsdlSet. If there is no further 74 // set specified after the name of the collection however, then gsdlSet is empty. 75 oaiclassifier::toGSDL(gsdlCollect, gsdlSet); 76 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; 77 160 comerror_t err; 78 ColInfoResponse_t cinfo; 79 80 // check that the collection is accessible 81 protocol->get_collectinfo(gsdlCollect, cinfo, err, cerr); 82 if (err != noError) { 161 protocol->get_collectinfo(collection, cinfo, err, cerr); 162 if (err != noError) 163 { 83 164 this->errorType = "badArgument"; 84 165 return false; 85 166 } 86 167 87 // exclude collections that are not listed in the configured OAI list168 // Check the collection is one that is in the list in the oai.cfg file 88 169 text_tarray &collections = this->configuration->getCollectionsList(); 89 int c; 90 for (c = 0; c < collections.size(); c ++) { 91 if (collections[c] == gsdlCollect) 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; 92 176 break; 93 } 94 if (c == collections.size()) { 177 } 178 } 179 180 // The collection was not found 181 if (!collection_found) 182 { 95 183 this->errorType = "badArgument"; 96 184 return false; 97 185 } 98 99 if (gsdlSet != "") { 100 // check the child set if it is given 101 if (!this->check_classifier(protocol, gsdlCollect, gsdlSet)) { 102 this->errorType = "badArgument"; 103 return false; 104 } 105 } 106 ++numArgs; 107 } 108 109 if (params["resumptionToken"] != "") { 110 ResumptionToken token(params["resumptionToken"]); 111 112 if (!token.isValid()) { 113 this->errorType = "badResumptionToken"; 114 return false; 115 } 116 ++numArgs; 117 } 118 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 119 196 this->errorType = ""; 120 197 return true; -
gsdl/trunk/runtime-src/src/oaiservr/abstractlistaction.h
r11732 r16710 9 9 public: 10 10 abstractlistaction(const text_t &name) : oaiaction(name) {this->prevDocSeen = false;} 11 virtual bool validateAction(recptproto *protocol, oaiargs ¶ms , int &numArgs); // Check that this is a valid action11 virtual bool validateAction(recptproto *protocol, oaiargs ¶ms); // Check that this is a valid action 12 12 virtual bool output_document(ostream &output, recptproto *protocol, const text_t &collection, 13 13 const text_t &OID, const text_t &metadataPrefix) = 0; -
gsdl/trunk/runtime-src/src/oaiservr/listidsaction.cpp
r15428 r16710 6 6 7 7 bool listidsaction::validateAction(recptproto *protocol, oaiargs ¶ms) 8 { 9 int params_size = params.getSize(); 10 int numArgs = 1; // For "verb" arg 11 12 if (!abstractlistaction::validateAction(protocol, params, numArgs)) { 13 return false; 14 } 15 16 // In OAI v1.1 metadataPrefix is not allowed. 17 if (this->configuration->getOAIVersion() <= 110){ 18 if(numArgs != params_size){ 19 this->errorType = "badArgument"; 20 return false; 21 } 22 } 23 else { // In OAI v2.0, it is compulsory 24 text_t metaFormat = params["metadataPrefix"]; 25 if (metaFormat == ""){ 26 this->errorType = "badArgument"; 27 return false; 28 } 29 else { // If it isn't empty, increase the valid args count and compare this to the total num of args 30 if (++numArgs != params_size){ 31 this->errorType = "badArgument"; 32 return false; 33 } 34 } 35 // Check that the metadataPrefix is a format we support 36 if (this->formatNotSupported(metaFormat)){ 37 this->errorType = "cannotDisseminateFormat"; 38 return false; 39 } 40 } 41 this->errorType = ""; 42 return true; 8 { 9 return abstractlistaction::validateAction(protocol, params); 43 10 } 44 11 -
gsdl/trunk/runtime-src/src/oaiservr/listrecsaction.cpp
r15198 r16710 6 6 bool listrecsaction::validateAction(recptproto *protocol, oaiargs ¶ms) 7 7 { 8 int params_size = params.getSize(); 9 10 text_t meta = params["metadataPrefix"]; 11 int numArgs = 1; // 1st arg (Verb=ListRecords) must be present for us to be here 12 13 if (!abstractlistaction::validateAction(protocol, params, numArgs)) { 14 return false; 15 } 16 17 // metadataPrefix is required - if it's not there, throw an error. Note that the arg isn't 18 // required (or allowed) if a resumptionToken is given, but as we don't handle resumption 19 // tokens this is sufficient. When we DO handle the tokens, this will have to change. 20 if (meta == "") { 21 this->errorType = "badArgument"; 22 return false; 23 } 24 else { 25 ++numArgs; // If it's there, increase arg count 26 } 27 28 // The number of valid args should be exactly equal to the number of args actually there. 29 // If not, throw a 'badArgument' error. 30 if (numArgs != params_size) { 31 this->errorType = "badArgument"; 32 return false; 33 } 34 35 if (this->formatNotSupported(meta)) { // Check that the metadataPrefix is supported 36 this->errorType = "cannotDisseminateFormat"; 37 this->record_action->setErrorType(this->errorType); 38 return false; 39 } 40 41 return true; 8 return abstractlistaction::validateAction(protocol, params); 42 9 } 43 10
Note:
See TracChangeset
for help on using the changeset viewer.