source: gsdl/trunk/src/recpt/dynamicclassifieraction.cpp@ 15847

Last change on this file since 15847 was 15847, checked in by mdewsnip, 16 years ago

(Adding dynamic classifiers) Now defines _dynamicclassifiernavbarentries_ to add buttons to the navigation bar for the dynamic classifiers.

  • Property svn:executable set to *
File size: 9.2 KB
Line 
1/**********************************************************************
2 *
3 * dynamicclassifieraction.cpp --
4 * Copyright (C) 2008 DL Consulting Ltd
5 *
6 * A component of the Greenstone digital library software
7 * from the New Zealand Digital Library Project at the
8 * University of Waikato, New Zealand.
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 *
24 *********************************************************************/
25
26#include "dynamicclassifieraction.h"
27#include "recptprototools.h"
28
29
30dynamicclassifieraction::dynamicclassifieraction ()
31{
32 recpt = NULL;
33
34 cgiarginfo arg_ainfo;
35 arg_ainfo.shortname = "dcl";
36 arg_ainfo.longname = "dynamic classifier ID";
37 arg_ainfo.multiplechar = true;
38 arg_ainfo.defaultstatus = cgiarginfo::weak;
39 arg_ainfo.argdefault = "";
40 arg_ainfo.savedarginfo = cgiarginfo::must;
41 argsinfo.addarginfo (NULL, arg_ainfo);
42
43 arg_ainfo.shortname = "dcn";
44 arg_ainfo.longname = "dynamic classifier node";
45 arg_ainfo.multiplechar = true;
46 arg_ainfo.defaultstatus = cgiarginfo::weak;
47 arg_ainfo.argdefault = "";
48 arg_ainfo.savedarginfo = cgiarginfo::must;
49 argsinfo.addarginfo (NULL, arg_ainfo);
50}
51
52
53dynamicclassifieraction::~dynamicclassifieraction()
54{
55}
56
57
58bool dynamicclassifieraction::check_cgiargs (cgiargsinfoclass &argsinfo, cgiargsclass &args,
59 recptprotolistclass *protos, ostream &logout)
60{
61 return true;
62}
63
64
65void dynamicclassifieraction::get_cgihead_info (cgiargsclass &args, recptprotolistclass *protos,
66 response_t &response,text_t &response_data,
67 ostream &logout)
68{
69 response = content;
70 response_data = "text/html";
71}
72
73
74// define all the macros which might be used by other actions to produce pages.
75void dynamicclassifieraction::define_external_macros (displayclass &disp, cgiargsclass &args,
76 recptprotolistclass *protos, ostream &logout)
77{
78 // A valid collection server is vital
79 recptproto *collectproto = protos->getrecptproto (args["c"], logout);
80 if (collectproto == NULL)
81 {
82 logout << "dynamicclassifieraction::define_external_macros called with NULL collectproto\n";
83 return;
84 }
85
86 // Define _dynamicclassifiernavbarentries_ to add buttons to the navigation bar for the dynamic classifiers
87 text_t navigation_bar_entries = "";
88 ColInfoResponse_t *cinfo = recpt->get_collectinfo_ptr (collectproto, args["c"], logout);
89 text_tmap::iterator dynamic_classifier_iterator = cinfo->dynamic_classifiers.begin();
90 while (dynamic_classifier_iterator != cinfo->dynamic_classifiers.end())
91 {
92 text_t dynamic_classifier_id = (*dynamic_classifier_iterator).first;
93 navigation_bar_entries += "_navbarspacer_";
94 navigation_bar_entries += "_navtab_(_gwcgi_?c=" + args["c"] + "&amp;a=dc&amp;dcl=" + dynamic_classifier_id + "," + dynamic_classifier_id;
95 if (args["a"] == "dc" && args["dcl"] == dynamic_classifier_id)
96 {
97 navigation_bar_entries += ",selected";
98 }
99 navigation_bar_entries += ")";
100 dynamic_classifier_iterator++;
101 }
102
103 disp.setmacro("dynamicclassifiernavbarentries", displayclass::defaultpackage, navigation_bar_entries);
104}
105
106
107// define all the macros which are related to pages generated
108// by this action. we also load up the formatinfo structure
109// here (it's used in do_action as well as here)
110void dynamicclassifieraction::define_internal_macros (displayclass &disp, cgiargsclass &args,
111 recptprotolistclass *protos, ostream &logout)
112{
113 // define_internal_macros sets the following macros:
114}
115
116
117bool dynamicclassifieraction::do_action(cgiargsclass &args, recptprotolistclass *protos,
118 browsermapclass *browsers, displayclass &disp,
119 outconvertclass &outconvert, ostream &textout,
120 ostream &logout)
121{
122 // A valid collection server is vital
123 recptproto *collectproto = protos->getrecptproto (args["c"], logout);
124 if (collectproto == NULL)
125 {
126 logout << "dynamicclassifieraction::do_action called with NULL collectproto\n";
127 return false;
128 }
129
130 textout << outconvert << disp << "_document:header_\n";
131 textout << outconvert << disp << "_document:content_\n";
132
133 // Check a dynamic classifier ID has been specified
134 text_t arg_dcl = args["dcl"];
135 if (arg_dcl.empty())
136 {
137 textout << outconvert << disp << "Error: Missing dcl argument.\n";
138 textout << outconvert << disp << "_document:footer_\n";
139 return true;
140 }
141
142 // Check the dynamic classifier ID is valid (ie. there is an entry in the collect.cfg file for it)
143 ColInfoResponse_t *cinfo = recpt->get_collectinfo_ptr (collectproto, args["c"], logout);
144 if (cinfo->dynamic_classifiers.find(arg_dcl) == cinfo->dynamic_classifiers.end())
145 {
146 textout << outconvert << disp << "Error: Invalid dcl value \"" << arg_dcl << "\".\n";
147 textout << outconvert << disp << "_document:footer_\n";
148 return true;
149 }
150
151 text_t metadata_element_name = cinfo->dynamic_classifiers[arg_dcl];
152 text_t classifier_type = "VList";
153 browserclass *bptr = browsers->getbrowser (classifier_type);
154
155 // Get the formatstring if there is one, or use the browser's default otherwise
156 text_t formatstring;
157 if (!get_formatstring (arg_dcl, classifier_type, cinfo->format, formatstring))
158 {
159 formatstring = bptr->get_default_formatstring();
160 }
161 format_t *formatlistptr = new format_t();
162 text_tset metadata;
163 bool getParents = false;
164 parse_formatstring (formatstring, formatlistptr, metadata, getParents);
165 bool use_table = is_table_content (formatlistptr);
166
167 // Check if a dynamic classifier node has been specified
168 text_t arg_dcn = args["dcn"];
169 if (arg_dcn.empty())
170 {
171 // No, so display the top-level classifier page, containing all the metadata values for the specified element
172 FilterResponse_t metadata_values_response;
173 get_metadata_values (metadata_element_name, args["c"], collectproto, metadata_values_response, logout);
174
175 // Add metadata necessary for output_section_group() to display the results as classifier nodes
176 ResultDocInfo_tarray::iterator metadata_value_iterator = metadata_values_response.docInfo.begin();
177 while (metadata_value_iterator != metadata_values_response.docInfo.end())
178 {
179 (*metadata_value_iterator).metadata["doctype"].values.push_back("classify");
180 (*metadata_value_iterator).metadata["haschildren"].values.push_back("1");
181 (*metadata_value_iterator).metadata["numleafdocs"].values.push_back((*metadata_value_iterator).result_num);
182 (*metadata_value_iterator).metadata["Title"].values.push_back((*metadata_value_iterator).OID);
183 metadata_value_iterator++;
184 }
185
186 // Display the classifier nodes
187 bptr->output_section_group (metadata_values_response, args, args["c"], 0, formatlistptr, use_table, metadata, getParents, collectproto, disp, outconvert, textout, logout);
188 }
189 else
190 {
191 // Yes, so get all the documents that fall under this node
192 text_t metadata_value = arg_dcn;
193 FilterResponse_t document_OIDs_response;
194 get_documents_with_metadata_value (metadata_element_name, metadata_value, "dls.Title", args["c"], collectproto, document_OIDs_response, logout);
195
196 // Check the metadata value is valid
197 if (document_OIDs_response.docInfo.empty())
198 {
199 textout << outconvert << disp << "Error: No documents have metadata value \"" << arg_dcn << "\".\n";
200 textout << outconvert << disp << "_document:footer_\n";
201 return true;
202 }
203
204 // Make an array of matching document OIDs
205 text_tarray document_OIDs;
206 ResultDocInfo_tarray::iterator document_OID_iterator = document_OIDs_response.docInfo.begin();
207 while (document_OID_iterator != document_OIDs_response.docInfo.end())
208 {
209 document_OIDs.push_back ((*document_OID_iterator).OID);
210 document_OID_iterator++;
211 }
212
213 // Display the classifier node
214 ResultDocInfo_t classifier_node;
215 classifier_node.OID = arg_dcn;
216 classifier_node.metadata["doctype"].values.push_back("classify");
217 classifier_node.metadata["haschildren"].values.push_back("1");
218 classifier_node.metadata["numleafdocs"].values.push_back(document_OIDs.size());
219 classifier_node.metadata["Title"].values.push_back(classifier_node.OID);
220 bptr->output_section_group (classifier_node, args, args["c"], 0, formatlistptr, use_table, metadata, getParents, collectproto, disp, outconvert, textout, logout);
221
222 // Request the necessary metadata for the documents under this node
223 FilterResponse_t document_info_response;
224 get_info (document_OIDs, args["c"], args["l"], metadata, getParents, collectproto, document_info_response, logout);
225
226 // Display the document nodes
227 bptr->output_section_group (document_info_response, args, args["c"], 1, formatlistptr, use_table, metadata, getParents, collectproto, disp, outconvert, textout, logout);
228 }
229
230 textout << outconvert << disp << "_document:footer_\n";
231 return true;
232}
Note: See TracBrowser for help on using the repository browser.