1 /* $Id: filter_query_rewrite.cpp,v 1.8 2006-06-10 14:29:12 adam Exp $
2 Copyright (c) 2005-2006, Index Data.
4 See the LICENSE file for details
10 #include "package.hpp"
13 #include "filter_query_rewrite.hpp"
16 #include <yaz/xmlquery.h>
17 #include <yaz/diagbib1.h>
19 #include <libxslt/xsltutils.h>
20 #include <libxslt/transform.h>
22 namespace mp = metaproxy_1;
23 namespace yf = mp::filter;
25 namespace metaproxy_1 {
27 class QueryRewrite::Rep {
31 void process(mp::Package &package) const;
32 void configure(const xmlNode * ptr);
34 xsltStylesheetPtr m_stylesheet;
39 yf::QueryRewrite::Rep::Rep()
44 yf::QueryRewrite::Rep::~Rep()
47 xsltFreeStylesheet(m_stylesheet);
50 yf::QueryRewrite::QueryRewrite() : m_p(new Rep)
54 yf::QueryRewrite::~QueryRewrite()
55 { // must have a destructor because of boost::scoped_ptr
58 void yf::QueryRewrite::process(mp::Package &package) const
60 m_p->process(package);
63 void mp::filter::QueryRewrite::configure(const xmlNode *ptr)
68 void yf::QueryRewrite::Rep::process(mp::Package &package) const
70 Z_GDU *gdu = package.request().get();
72 if (gdu && gdu->which == Z_GDU_Z3950)
74 Z_APDU *apdu_req = gdu->u.z3950;
75 if (apdu_req->which == Z_APDU_searchRequest)
78 const char *addinfo = 0;
80 Z_SearchRequest *req = apdu_req->u.searchRequest;
82 xmlDocPtr doc_input = 0;
83 yaz_query2xml(req->query, &doc_input);
87 error_code = YAZ_BIB1_MALFORMED_QUERY;
88 addinfo = "converion from Query to XML failed";
94 xmlDocPtr doc_res = xsltApplyStylesheet(m_stylesheet,
98 error_code = YAZ_BIB1_MALFORMED_QUERY;
99 addinfo = "XSLT transform failed for query";
103 const xmlNode *root_element = xmlDocGetRootElement(doc_res);
104 yaz_xml2query(root_element, &req->query, odr,
105 &error_code, &addinfo);
109 xmlFreeDoc(doc_input);
111 package.request() = gdu;
115 odr.create_searchResponse(apdu_req, error_code, addinfo);
116 package.response() = f_apdu;
124 void mp::filter::QueryRewrite::Rep::configure(const xmlNode *ptr)
126 for (ptr = ptr->children; ptr; ptr = ptr->next)
128 if (ptr->type != XML_ELEMENT_NODE)
130 if (!strcmp((const char *) ptr->name, "xslt"))
134 throw mp::filter::FilterException
135 ("Only one xslt element allowed in query_rewrite filter");
138 std::string fname = mp::xml::get_text(ptr);
139 m_stylesheet = xsltParseStylesheetFile(BAD_CAST fname.c_str());
142 throw mp::filter::FilterException
143 ("Failed to read stylesheet "
145 + " in query_rewrite filter");
150 throw mp::filter::FilterException
152 + std::string((const char *) ptr->name)
153 + " in query_rewrite filter");
158 static mp::filter::Base* filter_creator()
160 return new mp::filter::QueryRewrite;
164 struct metaproxy_1_filter_struct metaproxy_1_filter_query_rewrite = {
174 * indent-tabs-mode: nil
175 * c-file-style: "stroustrup"
177 * vim: shiftwidth=4 tabstop=8 expandtab