source: main/trunk/greenstone2/runtime-src/src/oaiservr/oaitools.cpp@ 22285

Last change on this file since 22285 was 22285, checked in by kjdon, 14 years ago

new toOID takes an extra arg, repos_id, so its generates ids like oai:repos-id:collname:doc-id. old version is still used for set spec ids which remain like demo:CL5. another method to extrac the collection name from a full id

  • Property svn:keywords set to Author Date Id Revision
File size: 3.1 KB
Line 
1#include "oaitools.h"
2
3#include "recptprototools.h"
4
5
6void oaiclassifier::swapColonsAndPeriods(text_t &classifier)
7{
8 for (int i = 1; i <= classifier.size(); ++i) {
9 if (classifier[i] == '.') {
10 classifier[i] = ':';
11 }
12 else if (classifier[i] == ':') {
13 classifier[i] = '.';
14 }
15 }
16
17}
18
19text_t oaiclassifier::getGSDL_OID(const text_t &collection, const text_t& oai_id,
20 recptproto *protocol, ostream &logout)
21{
22 FilterResponse_t response;
23 text_tset metadata;
24
25 // metadata.insert("gsdl_id");
26
27 bool status_ok = get_children(oai_id, collection, "", metadata, false, protocol, response, logout);
28 text_t gsdl_id = "";
29 if (status_ok) {
30 if(response.docInfo.size() > 0){
31 gsdl_id = response.docInfo[0].OID;
32 }
33 else {
34 // Response.docInfo is empty, meaning the doc in question didn't have an oai_id number.
35 return gsdl_id; // Return the empty string to indicate this.
36 }
37 }
38
39 return gsdl_id;
40}
41
42/**
43 * Called to convert GS classifier/document identifiers that use
44 * a '.' to separate levels in the hierarchy into OAI identifiers
45 * that use ':' instead.
46 */
47void oaiclassifier::toOAI(const text_t repos_id, const text_t &collection, text_t &classifier)
48{
49
50 text_t tmp = "oai:";
51 tmp.append(repos_id);
52 tmp.append(":");
53 tmp.append(collection);
54 toOAI(tmp, classifier);
55
56}
57
58/**
59 * Called to convert GS classifier/document identifiers that use
60 * a '.' to separate levels in the hierarchy into OAI identifiers
61 * that use ':' instead.
62 */
63void oaiclassifier::toOAI(const text_t &collection, text_t &classifier)
64{
65 oaiclassifier::swapColonsAndPeriods(classifier);
66
67 // prepend the collection identifier to the beginning of the
68 // OAI identifier.
69 text_t tmp = collection;
70 tmp.append(":");
71 tmp.append(classifier);
72
73 classifier = tmp;
74}
75
76void oaiclassifier::getCollectionFromOAIID(const text_t oai_id, text_t &collection_id) {
77
78 // id is like oai:repos-id:collection:OID, we just want the collection bit
79
80 text_t::const_iterator begin = oai_id.begin();
81 text_t::const_iterator end = oai_id.end();
82 text_t::const_iterator colon = findchar(begin, end, ':'); // 1
83 if (colon != end) {
84 colon = findchar(colon+1, end, ':'); // 2
85 }
86 text_t::const_iterator third_colon;
87 if (colon !=end) {
88 third_colon = findchar(colon+1, end, ':');
89 }
90 if (third_colon != end) {
91 collection_id = substr(colon+1, third_colon);
92 }
93}
94
95/**
96 * Called to convert OAI classifier/document identifiers that use
97 * a ':' to separate levels in the hierarchy into GS identifiers
98 * that use '.' instead.
99 */
100void oaiclassifier::toGSDL(text_t &collection, text_t &classifier)
101{
102 oaiclassifier::swapColonsAndPeriods(classifier);
103
104 // separate out the collection identifier that should be
105 // found at the beginning of the OAI identifier from the
106 // item identifier within the collection
107 text_t::iterator colon = find(classifier.begin(), classifier.end(), '.');
108 if (colon != classifier.end()) {
109 collection = substr(classifier.begin(), colon);
110 classifier = substr(colon + 1, classifier.end());
111 }
112 else{
113 collection = classifier;
114 classifier = "";
115 }
116}
Note: See TracBrowser for help on using the repository browser.