-/* $Id: alvis.c,v 1.3 2006-08-22 13:39:26 adam Exp $
- Copyright (C) 1995-2006
+/* $Id: alvis.c,v 1.12 2007-02-12 10:33:51 adam Exp $
+ Copyright (C) 1995-2007
Index Data ApS
This file is part of the Zebra server.
#include <libxslt/transform.h>
#include <libxslt/xsltutils.h>
+#if YAZ_HAVE_EXSLT
+#include <libexslt/exslt.h>
+#endif
+
#include <idzebra/util.h>
#include <idzebra/recctrl.h>
char *fname;
char *full_name;
const char *profile_path;
- const char *split_level;
+ int split_level;
const char *split_path;
ODR odr;
struct filter_schema *schemas;
tinfo->doc = 0;
tinfo->schemas = 0;
+#if YAZ_HAVE_EXSLT
+ exsltRegisterAll();
+#endif
+
#if ENABLE_INPUT_CALLBACK
xmlRegisterDefaultInputCallbacks();
xmlRegisterInputCallbacks(zebra_xmlInputMatchCallback,
static int attr_content(struct _xmlAttr *attr, const char *name,
const char **dst_content)
{
- if (!XML_STRCMP(attr->name, name) && attr->children &&
- attr->children->type == XML_TEXT_NODE)
+ if (!XML_STRCMP(attr->name, name) && attr->children
+ && attr->children->type == XML_TEXT_NODE)
{
*dst_content = (const char *)(attr->children->content);
return 1;
char tmp_full_name[1024];
xmlNodePtr ptr;
tinfo->fname = xstrdup(fname);
-
- if (yaz_filepath_resolve(tinfo->fname, tinfo->profile_path,
+
+ if (yaz_filepath_resolve(tinfo->fname, tinfo->profile_path,
NULL, tmp_full_name))
- tinfo->full_name = xstrdup(tmp_full_name);
+ tinfo->full_name = xstrdup(tmp_full_name);
else
- tinfo->full_name = xstrdup(tinfo->fname);
-
+ tinfo->full_name = xstrdup(tinfo->fname);
+
yaz_log(YLOG_LOG, "alvis filter: loading config file %s", tinfo->full_name);
-
+
tinfo->doc = xmlParseFile(tinfo->full_name);
-
- if (!tinfo->doc){
+
+ if (!tinfo->doc)
+ {
yaz_log(YLOG_WARN, "alvis filter: could not parse config file %s",
tinfo->full_name);
-
+
return ZEBRA_FAIL;
}
ptr = xmlDocGetRootElement(tinfo->doc);
- if (!ptr || ptr->type != XML_ELEMENT_NODE ||
- XML_STRCMP(ptr->name, "schemaInfo")){
+ if (!ptr || ptr->type != XML_ELEMENT_NODE
+ || XML_STRCMP(ptr->name, "schemaInfo"))
+ {
yaz_log(YLOG_WARN,
"alvis filter: config file %s :"
" expected root element <schemaInfo>",
continue;
if (!XML_STRCMP(ptr->name, "schema"))
{
- char tmp_xslt_full_name[1024];
struct _xmlAttr *attr;
struct filter_schema *schema = xmalloc(sizeof(*schema));
schema->name = 0;
/* find requested schema */
- if (schema->stylesheet){
- yaz_filepath_resolve(schema->stylesheet, tinfo->profile_path,
- NULL, tmp_xslt_full_name);
- schema->stylesheet_xsp
- = xsltParseStylesheetFile((const xmlChar*) tmp_xslt_full_name);
- if (!schema->stylesheet_xsp)
- yaz_log(YLOG_WARN,
- "alvis filter: could not parse xslt stylesheet %s",
- tmp_xslt_full_name);
+ if (schema->stylesheet)
+ {
+ char tmp_xslt_full_name[1024];
+ if (!yaz_filepath_resolve(schema->stylesheet, tinfo->profile_path,
+ NULL, tmp_xslt_full_name))
+ {
+ yaz_log(YLOG_WARN,
+ "alvis filter: stylesheet %s not found in path %s",
+ schema->stylesheet, tinfo->profile_path);
+ return ZEBRA_FAIL;
+ }
+ schema->stylesheet_xsp
+ = xsltParseStylesheetFile((const xmlChar*) tmp_xslt_full_name);
+ if (!schema->stylesheet_xsp)
+ {
+ yaz_log(YLOG_WARN,
+ "alvis filter: could not parse xslt stylesheet %s",
+ tmp_xslt_full_name);
+ return ZEBRA_FAIL;
+ }
}
-
-
}
else if (!XML_STRCMP(ptr->name, "split"))
{
struct _xmlAttr *attr;
for (attr = ptr->properties; attr; attr = attr->next)
{
- attr_content(attr, "level", &tinfo->split_level);
- attr_content(attr, "path", &tinfo->split_path);
+ const char *split_level_str = 0;
+ attr_content(attr, "level", &split_level_str);
+ tinfo->split_level =
+ split_level_str ? atoi(split_level_str) : 0;
}
}
else
static ZEBRA_RES filter_config(void *clientData, Res res, const char *args)
{
struct filter_info *tinfo = clientData;
- if (!args || !*args){
- yaz_log(YLOG_WARN, "alvis filter: need config file");
- return ZEBRA_FAIL;
+ if (!args || !*args)
+ {
+ yaz_log(YLOG_WARN, "alvis filter: need config file");
+ return ZEBRA_FAIL;
}
if (tinfo->fname && !strcmp(args, tinfo->fname))
return ZEBRA_OK;
- tinfo->profile_path
- /* = res_get_def(res, "profilePath", DEFAULT_PROFILE_PATH); */
- = res_get(res, "profilePath");
+ tinfo->profile_path = res_get(res, "profilePath");
yaz_log(YLOG_LOG, "alvis filter: profilePath %s", tinfo->profile_path);
destroy_schemas(tinfo);
- create_schemas(tinfo, args);
- return ZEBRA_OK;
+ return create_schemas(tinfo, args);
}
static void filter_destroy(void *clientData)
sscanf(id_str, "%255s", ctrl->match_criteria);
if (rank_str)
- ctrl->staticrank = atoi(rank_str);
-
+ ctrl->staticrank = atozint(rank_str);
ptr = ptr->children;
}
else
{
yaz_log(YLOG_WARN, "No root for index XML record."
- " split_level=%s stylesheet=%s",
+ " split_level=%d stylesheet=%s",
tinfo->split_level, schema->stylesheet);
}
xmlFreeDoc(resDoc);
static int extract_split(struct filter_info *tinfo, struct recExtractCtrl *p)
{
int ret;
- int split_depth = 0;
+
if (p->first_record)
{
if (tinfo->reader)
p /* I/O handler */,
0 /* URL */,
0 /* encoding */,
- XML_PARSE_XINCLUDE);
+ XML_PARSE_XINCLUDE|XML_PARSE_NOENT);
}
if (!tinfo->reader)
return RECCTRL_EXTRACT_ERROR_GENERIC;
- if (tinfo->split_level)
- split_depth = atoi(tinfo->split_level);
ret = xmlTextReaderRead(tinfo->reader);
- while (ret == 1) {
+ while (ret == 1)
+ {
int type = xmlTextReaderNodeType(tinfo->reader);
int depth = xmlTextReaderDepth(tinfo->reader);
- if (split_depth == 0 ||
- (split_depth > 0 &&
- type == XML_READER_TYPE_ELEMENT && split_depth == depth))
+ if (type == XML_READER_TYPE_ELEMENT && tinfo->split_level == depth)
{
xmlNodePtr ptr = xmlTextReaderExpand(tinfo->reader);
- xmlNodePtr ptr2 = xmlCopyNode(ptr, 1);
- xmlDocPtr doc = xmlNewDoc((const xmlChar*) "1.0");
-
- xmlDocSetRootElement(doc, ptr2);
-
- return extract_doc(tinfo, p, doc);
+ if (ptr)
+ {
+ xmlNodePtr ptr2 = xmlCopyNode(ptr, 1);
+ xmlDocPtr doc = xmlNewDoc((const xmlChar*) "1.0");
+
+ xmlDocSetRootElement(doc, ptr2);
+
+ return extract_doc(tinfo, p, doc);
+ }
+ else
+ {
+ xmlFreeTextReader(tinfo->reader);
+ tinfo->reader = 0;
+ return RECCTRL_EXTRACT_ERROR_GENERIC;
+ }
}
ret = xmlTextReaderRead(tinfo->reader);
}
{
if (p->first_record) /* only one record per stream */
{
- xmlDocPtr doc = xmlReadIO(ioread_ex, ioclose_ex, p /* I/O handler */,
- 0 /* URL */,
- 0 /* encoding */,
- XML_PARSE_XINCLUDE);
- if (!doc)
- {
- return RECCTRL_EXTRACT_ERROR_GENERIC;
- }
- return extract_doc(tinfo, p, doc);
+ xmlDocPtr doc = xmlReadIO(ioread_ex, ioclose_ex, p /* I/O handler */,
+ 0 /* URL */,
+ 0 /* encoding */,
+ XML_PARSE_XINCLUDE|XML_PARSE_NOENT);
+ if (!doc)
+ {
+ return RECCTRL_EXTRACT_ERROR_GENERIC;
+ }
+ return extract_doc(tinfo, p, doc);
}
else
- return RECCTRL_EXTRACT_EOF;
+ return RECCTRL_EXTRACT_EOF;
}
static int filter_extract(void *clientData, struct recExtractCtrl *p)
struct filter_info *tinfo = clientData;
odr_reset(tinfo->odr);
-
- if (tinfo->split_level == 0 && tinfo->split_path == 0)
- return extract_full(tinfo, p);
+ if (tinfo->split_level == 0)
+ return extract_full(tinfo, p);
else
- {
- return extract_split(tinfo, p);
- }
+ return extract_split(tinfo, p);
}
static int ioread_ret(void *context, char *buffer, int len)
return 0;
}
-
static const char *snippet_doc(struct recRetrieveCtrl *p, int text_mode,
int window_size)
{
doc = xmlReadIO(ioread_ret, ioclose_ret, p /* I/O handler */,
0 /* URL */,
0 /* encoding */,
- XML_PARSE_XINCLUDE);
+ XML_PARSE_XINCLUDE|XML_PARSE_NOENT);
if (!doc)
{
p->diagnostic = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
xmlChar *buf_out;
int len_out;
- xsltSaveResultToString(&buf_out, &len_out, resDoc,
- schema->stylesheet_xsp);
+ if (schema->stylesheet_xsp)
+ xsltSaveResultToString(&buf_out, &len_out, resDoc,
+ schema->stylesheet_xsp);
+ else
+ xmlDocDumpMemory(resDoc, &buf_out, &len_out);
p->output_format = VAL_TEXT_XML;
p->rec_len = len_out;
xmlChar *buf_out;
int len_out;
- xsltSaveResultToString(&buf_out, &len_out, resDoc,
- schema->stylesheet_xsp);
+ if (schema->stylesheet_xsp)
+ xsltSaveResultToString(&buf_out, &len_out, resDoc,
+ schema->stylesheet_xsp);
+ else
+ xmlDocDumpMemory(resDoc, &buf_out, &len_out);
p->output_format = VAL_SUTRS;
p->rec_len = len_out;