source: gsdl/trunk/runtime-src/src/oaiservr/metaformat.cpp@ 18884

Last change on this file since 18884 was 18884, checked in by kjdon, 15 years ago

the mapping now uses the metadata set name instead of the prefix, so pass this in instead to getMapping

  • Property svn:keywords set to Author Date Id Revision
File size: 5.0 KB
Line 
1#include <fstream>
2#include "metaformat.h"
3#include "gsdltools.h"
4#include "gsdlunicode.h"
5#include "recptprototools.h"
6
7
8metaformat::metaformat()
9{
10}
11
12text_t metaformat::get_mapping(const text_t &collection, const text_t &collectionField)
13{
14 if (this->oaiConfigure == NULL) {
15 return "";
16 }
17
18 return this->oaiConfigure->getMapping(collection, collectionField, this->formatName());
19}
20
21void metaformat::output_item(ostream &output, outconvertclass &outconvert,
22 bool &headerDone, const text_t &label,
23 const text_tarray &values)
24{
25
26 if (!headerDone && (values.size() > 0)) {
27 this->output_metadata_header(output);
28 headerDone = true;
29 }
30
31 for (int item = 0; item < values.size(); ++item) {
32 if (this->oaiConfigure->getOAIVersion() >= 200) { // TODO: GRB: This code may need to be subclassed by dc for 200 and later...
33 output << outconvert << " <" << this->formatPrefix() << ":" << label << ">" << xml_safe(values[item]) << "</" << this->formatPrefix() << ":" << label << ">\n";
34 }
35 else {
36 output << outconvert << " <" << label << ">" << xml_safe(values[item]) << "</" << label << ">\n";
37 }
38 }
39}
40
41bool metaformat::scan_metadata(ostream &output, const text_t &collection, ResultDocInfo_t &docInfo,
42 bool doOutput)
43{
44 bool headerDone = false;
45 MetadataInfo_tmap::iterator here = docInfo.metadata.begin();
46 MetadataInfo_tmap::iterator end = docInfo.metadata.end();
47
48 utf8outconvertclass utf8convert; // we want to output metadata in utf8
49
50 // metaItem is used initially to identify the rfc1807 (etc) metadata items. It is
51 // then used to hold the name of the metadata item, such as "title" or "subject".
52 text_t metaItem;
53 text_t::const_iterator start, last; // Use two iterators to go through metaItem
54
55 while (here != end) {
56 start = last = here->first.begin();
57
58 if (here->first.size() < this->formatPrefix().size() ||
59 here->first[this->formatPrefix().size()] != '.') {
60 metaItem == "";
61 }
62 else {
63 last += this->formatPrefix().size(); // Move last so that it is at the
64 // '.'
65 metaItem = substr(start, last); // Gets the substring starting at start and going up to (but
66 // not including) last. This should be "dc" (for example)
67 }
68
69 if (metaItem == this->formatPrefix()) {
70 metaItem = substr(last+1, here->first.end()); // Get the rest of the metadata tag (it's name) but without the '.'
71 lc(metaItem); // Convert it to lowercase for putting in the xml tags
72
73 if (doOutput) {
74 this->output_item(output, utf8convert, headerDone, metaItem, here->second.values);
75 }
76 else {
77 if (here->second.values.size() > 0) {
78 return true;
79 }
80 }
81 }
82 else {
83 text_t mapTo = this->get_mapping(collection, here->first);
84 if (mapTo != "") {
85 // Do we actually want to do anything here? Doesn't getting here imply that this
86 // particular metadata is stuff we don't want?
87 if (doOutput) {
88 this->output_item(output, utf8convert, headerDone, mapTo, here->second.values);
89 }
90 else {
91 if (here->second.values.size() > 0) {
92 return true;
93 }
94 }
95 }
96 }
97
98 ++here;
99 }
100
101 if (!doOutput) {
102 return false;
103 }
104
105 if (headerDone) {
106 this->output_metadata_footer(output);
107 }
108
109 return headerDone;
110}
111
112
113bool metaformat::is_available(const text_t &collection, ResultDocInfo_t &docInfo)
114{
115 ofstream o("dummy", ios::out);
116 return this->scan_metadata(o, collection, docInfo, false);
117}
118
119bool metaformat::output_metadata(ostream &output, const text_t &collection, ResultDocInfo_t &docInfo)
120{
121 return this->scan_metadata(output, collection, docInfo, true);
122}
123
124bool metaformat::output_record(ostream &output, recptproto *protocol, const text_t &collection,
125 const text_t &OID)
126{
127 FilterResponse_t response;
128 text_tset metadata;
129 ofstream logout("oai.log", ios::app);
130
131 // get the document information
132 if (!get_info(OID, collection, "", metadata, false, protocol, response, logout)) {
133 // TODO: error, bad request
134 // cerr << "Bad identifier or protocol " << OID << endl;
135 return false;
136 }
137
138 // check to see if it's a classifier
139 text_t childHead;
140 // int oaiVersion = this->oaiConfigure->getOAIVersion();
141 text_t::const_iterator start = OID.begin();
142 text_t::const_iterator here = OID.begin();
143 here += 2;
144 childHead = substr(start, here);
145
146 // if it isn't a document, kill it now
147 if (childHead == "CL") {
148 // cerr << "Not a document" << endl;
149 return false;
150 }
151
152 // output record header
153 output << "<record>\n";
154
155 // output header part of oai response
156 output << "<header>" << endl;
157 output << " <identifier>" << OID << "</identifier>" << endl;
158 // TODO: add modified date
159
160 output << "</header>" << endl;
161
162 // output metadata part of oai response
163 this->output_metadata(output, collection, response.docInfo[0]);
164
165 // output the description of the document
166 // output << "<about>\n";
167 // output << "</about>\n";
168
169 // close record
170 output << "</record>\n";
171
172 return true;
173}
Note: See TracBrowser for help on using the repository browser.