source: trunk/gsdl3/bin/script/convert_coll_from_gs2.pl@ 13912

Last change on this file since 13912 was 13912, checked in by kjdon, 17 years ago

changed the format of index and field info in buildConfig and collectionConfig. No fields any more, just use indexes. index has a shortname and a name - name comes from collect.cfg, shortname from build.cfg, eg text and TX, or section:text and ste. mg/mgpp/lucene colls config files are moresimilar now

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 21.6 KB
Line 
1#!/usr/bin/perl -w
2
3BEGIN {
4 die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
5 die "GSDL3HOME not set\n" unless defined $ENV{'GSDL3HOME'};
6 die "GSDL3SRCHOME not set\n" unless defined $ENV{'GSDL3SRCHOME'};
7 die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
8 unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
9 unshift (@INC, "$ENV{'GSDL3SRCHOME'}/lib/perl/cpan");
10}
11
12use colcfg;
13use util;
14use parsargv;
15use FileHandle;
16use XML::Writer;
17#can't get this to work on windows
18#use GDBM_File;
19
20use strict;
21
22&main();
23sub print_usage() {
24 print STDOUT "Usage: convert_coll_from_gs2.pl [options] coll-name\n";
25 print STDOUT "options:\n";
26
27 print STDOUT " -collectdir Directory where collection lives.\n";
28 print STDOUT " -verbosity Controls the amount of output.\n";
29 print STDOUT " -defaultlang The language that is considered the default (for display text etc). defaults to 'en'\n\n";
30}
31
32
33sub main {
34
35 my ($defaultlang, $verbosity, $collectdir);
36 # note that no defaults are passed for most options as they're set
37 # later (after we check the collect.cfg file)
38 if (!&parsargv::parse(\@ARGV,
39 'verbosity/\d+/', \$verbosity,
40 'collectdir/.*/', \$collectdir,
41 'defaultlang/.*/', \$defaultlang)) {
42 &print_usage();
43 die "\n";
44 }
45
46 # get and check the collection name
47 my ($collection) = @ARGV;
48 if (!defined($collection) || $collection eq "") {
49 die "No collection specified\n";
50 }
51 if ($collection eq "gs2model") {
52 die "You cant convert the model collection\n";
53 }
54
55 if (!defined $collectdir || $collectdir eq "") {
56 $collectdir = &util::filename_cat ($ENV{'GSDLHOME'}, "collect");
57 }
58
59 if (!defined $defaultlang || $defaultlang eq "") {
60 $defaultlang = 'en';
61 }
62 # add on the coll name
63 $collectdir = &util::filename_cat ($collectdir, $collection);
64
65 my $collconfigfilename = &util::filename_cat ($collectdir, "etc", "collect.cfg");
66 print STDOUT "coll config=$collconfigfilename\n";
67 my $collectcfg;
68 if (-e $collconfigfilename) {
69 $collectcfg = &colcfg::read_collect_cfg ($collconfigfilename);
70
71 } else {
72 print STDERR "collect.cfg not found!!";
73 die "\n";
74 }
75
76
77 my $buildconfigfilename = &util::filename_cat ($collectdir, "index", "build.cfg");
78 my $buildcfg;
79 if (-e $buildconfigfilename) {
80 $buildcfg = &colcfg::read_build_cfg ($buildconfigfilename);
81
82 } else {
83 print STDERR "build.cfg not found!!";
84 die "\n";
85 }
86
87
88
89 my $colloutfile = &util::filename_cat ($collectdir, "etc", "collectionConfig.xml");
90 if (-e $colloutfile) {
91 print STDOUT "collectionConfig file already exists! overwriting it!\n";
92
93 }
94
95 my $buildoutfile = &util::filename_cat ($collectdir, "index", "buildConfig.xml");
96 if (-e $buildoutfile) {
97 print STDOUT "buildConfig file already exists! overwriting it!\n";
98
99 }
100
101# my $db_file = &util::filename_cat ($collectdir, "index", "text", "$collection.ldb");
102 my $database;
103# if (-e $db_file) {
104# $database = &open_database($db_file);
105# } else {
106# print STDERR "gdbm database file $db_file not found!!";
107# die "\n";
108# }
109
110 my $buildtype;
111 if (defined $buildcfg->{'buildtype'}) {
112 $buildtype = $buildcfg->{'buildtype'};
113 } else {
114 $buildtype = 'mg';
115 }
116
117 my $indexstem = undef;
118 if (defined $buildcfg->{'indexstem'}) {
119 $indexstem = $buildcfg->{'indexstem'};
120 }
121
122 my $buildoutput = new IO::File(">$buildoutfile");
123 my $buildwriter = new XML::Writer(OUTPUT => $buildoutput, NEWLINES => 1);
124
125 $buildwriter->startTag('buildConfig', 'xmlns:gsf'=>"http://www.greenstone.org/greenstone3/schema/ConfigFormat");
126
127 my $colloutput = new IO::File(">$colloutfile");
128 my $collwriter = new XML::Writer(OUTPUT => $colloutput, NEWLINES => 1);
129
130 $collwriter->startTag('collectionConfig', 'xmlns:gsf'=>"http://www.greenstone.org/greenstone3/schema/ConfigFormat", 'xmlns:xsl'=>'http://www.w3.org/1999/XSL/Transform');
131
132 #output the collection metadata to the collectionConfig file
133 $collwriter->startTag('metadataList');
134
135 my $creator = $collectcfg->{'creator'};
136 &output_metadata($collwriter, 'creator', $creator);
137 my $public =$collectcfg->{'public'};
138 &output_metadata($collwriter, 'public', $public);
139 $collwriter->endTag('metadataList');
140
141 #output the display collectionmeta to collectionConfig.xml
142
143 my $collectionmeta = $collectcfg->{'collectionmeta'};
144 if (defined $collectionmeta) {
145 my %name_map = ('collectionname', 'name',
146 'collectionextra', 'description',
147 'iconcollection', 'icon',
148 'iconcollectionsmall', 'smallicon');
149
150 $collwriter->startTag('displayItemList');
151 foreach my $entry ( keys %$collectionmeta) {
152 if (defined $name_map{$entry}) {
153 my $name= $name_map{$entry};
154 foreach my $lang (keys %{$collectionmeta->{$entry}}) {
155 my $value = $collectionmeta->{$entry}->{$lang};
156 if ($entry =~ /^icon/) {
157 $value = format_icon_value($value);
158 } else {
159 $value = tidy_up_display_item($value);
160 }
161 &output_display($collwriter, $name, $lang, $value);
162 }
163 }
164 }
165 $collwriter->endTag('displayItemList');
166 }
167
168 # output building metadata to build config file
169 my $numdocs = $buildcfg->{'numdocs'};
170 $buildwriter->startTag('metadataList');
171 &output_metadata($buildwriter, 'numDocs', $numdocs);
172 &output_metadata($buildwriter, 'buildType', $buildtype);
173 $buildwriter->endTag('metadataList');
174
175
176 #indexes
177 # maps index name to shortname
178 my $indexmap = {};
179 # keeps the order for indexes
180 my @indexlist = ();
181 my $firstindex = "";
182 my $first = 1;
183 my $maptype = "indexfieldmap";
184 if ($buildtype eq "mg") {
185 $maptype = "indexmap";
186 }
187 if (defined $buildcfg->{$maptype}) {
188 my $indexmap_t = $buildcfg->{$maptype};
189 foreach my $i (@$indexmap_t) {
190 my ($k, $v) = $i =~ /^(.*)\-\>(.*)$/;
191 $indexmap->{$k} = $v;
192 push @indexlist, $k;
193 if ($first) {
194 $firstindex = $v;
195 $first = 0;
196 }
197 }
198 } else {
199 print STDERR "$maptype not defined";
200 }
201 # we use the shortname for default index
202 my $defaultindex;
203 if (defined $collectcfg->{'defaultindex'}) {
204 $defaultindex = $collectcfg->{'defaultindex'};
205 $defaultindex = $indexmap->{$defaultindex};
206 } else {
207 # use the first one
208 $defaultindex = $firstindex;
209 }
210
211 # format stuff
212 my $format = $collectcfg->{'format'};
213
214 #output the search stuff to coll cfg
215 $collwriter->startTag('search');
216 foreach my $i (keys %$indexmap) {
217 $collwriter->startTag('index', 'name'=>$i);
218 #find the coll meta stuff
219 my $indexdisplay = ".$i";
220 foreach my $lang (keys %{$collectionmeta->{$indexdisplay}}) {
221 my $value = $collectionmeta->{$indexdisplay}->{$lang};
222 output_display($collwriter, 'name', $lang, $value);
223 }
224 $collwriter->endTag('index');
225 }
226
227 # add in the format stuff
228 if (defined $format->{'SearchVList'}) {
229
230 $collwriter->startTag('format');
231 write_format($collwriter, $format->{'SearchVList'}, "document");
232 $collwriter->endTag('format');
233 }
234 elsif (defined $format->{'VList'}) {
235 $collwriter->startTag('format');
236 write_format($collwriter, $format->{'VList'}, "document");
237 $collwriter->endTag('format');
238 }
239
240 $collwriter->endTag('search');
241
242 $buildwriter->startTag('serviceRackList');
243
244 my @levels = ();
245 my $defaultlevel;
246 my $service_type = "MG";
247 if ($buildtype eq 'mgpp') {
248 $service_type = "MGPP";
249 } elsif ($buildtype eq "lucene") {
250 $service_type = "Lucene";
251 }
252
253 #do the retrieve service
254 # assume mgpp or mg
255 if ($buildtype eq 'mgpp' || $buildtype eq 'lucene') {
256 #for each level
257 if (defined $buildcfg->{'indexlevels'}) {
258 push @levels, @{$buildcfg->{'indexlevels'}};
259
260 if (defined $buildcfg->{'textlevel'}) {
261 $defaultlevel = $buildcfg->{'textlevel'};
262 } else {
263 $defaultlevel = $levels[0];
264 }
265 } else { #use levels from collect.cfg - must be an old collection
266 @levels = ('Document');
267 $defaultlevel = 'Document';
268 if (defined $collectcfg->{'levels'}) {
269 foreach my $l (@{$collectcfg->{'levels'}}) {
270 if ($l eq "Section") {
271 $defaultlevel = 'Section';
272 }
273 push @levels, $l;
274 }
275 }
276 }
277 $buildwriter->startTag('serviceRack', 'name'=>"GS2".$service_type."Retrieve");
278 $buildwriter->emptyTag('defaultLevel', 'name'=>$defaultlevel);
279
280
281 } elsif ($buildtype eq "mg") {
282 $buildwriter->startTag('serviceRack', 'name'=>'GS2MGRetrieve');
283 $buildwriter->emptyTag('defaultIndex', 'shortname'=>$defaultindex);
284
285 }
286 if (defined $indexstem) {
287 $buildwriter->emptyTag('indexStem', 'name'=>$indexstem);
288 }
289 # close off the Retrieve service
290 $buildwriter->endTag('serviceRack');
291
292 # add in the classifiers if needed
293
294 my $count = 1;
295 my $phind = 0;
296 my $started_classifiers = 0;
297 if (defined $collectcfg->{'classify'}) {
298 $collwriter->startTag('browse');
299 # add in default format if necessary
300 if (defined $format->{"VList"} || defined $format->{"HList"}) {
301 # global formats
302 $collwriter->startTag('format');
303 if (defined $format->{"VList"}) {
304 # VLIst applies to both classifier and doc nodes
305 write_format($collwriter, $format->{"VList"}, "document");
306 write_format($collwriter, $format->{"VList"}, "classifier");
307 }
308 if (defined $format->{"HList"}) {
309 # hlist is only for classifier nodes
310 write_format($collwriter, $format->{"HList"}, "horizontal");
311 }
312 $collwriter->endTag('format');
313 }
314 my $classifiers = $collectcfg->{'classify'};
315 foreach my $cl (@$classifiers) {
316 my $name = "CL$count";
317 $count++;
318 my ($classname) = @$cl[0];
319 if ($classname =~ /^phind$/i) {
320 $phind=1;
321 #should add it into coll config classifiers
322 next;
323 }
324
325 my $horizontalAtTop = &isHorizontalClassifier($database, $name);
326 if (not $started_classifiers) {
327 $buildwriter->startTag('serviceRack', 'name'=>'GS2Browse');
328 if (defined $indexstem) {
329 $buildwriter->emptyTag('indexStem', 'name'=>$indexstem);
330 }
331
332 $buildwriter->startTag('classifierList');
333 $started_classifiers = 1;
334 }
335 my $content = ''; #use buttonname first, then metadata
336 if ($classname eq "DateList") {
337 $content = "Date";
338 } else {
339 for (my $i=0; $i<scalar(@$cl); $i++) {
340 my $arg = @$cl[$i];
341 if ($arg eq "-buttonname"){
342 $content = @$cl[$i+1];
343 last;
344 } elsif ($arg eq "-metadata") {
345 $content = @$cl[$i+1];
346 }
347
348 }
349 }
350 if ($horizontalAtTop) {
351 $buildwriter->emptyTag('classifier', 'name'=>$name, 'content'=>$content, 'horizontalAtTop'=>'true');
352 } else {
353 $buildwriter->emptyTag('classifier', 'name'=>$name, 'content'=>$content);
354 }
355
356
357 $collwriter->startTag('classifier', 'name'=>$name);
358 my $vlist = $name."VList";
359 my $hlist = $name."HList";
360 my $dlist = "";
361 if ($classname eq "DateList") {
362 $dlist = "DateList";
363 }
364 # need to work out how to split into classifier and document
365 if (defined $format->{$vlist} || defined $format->{$hlist} || defined $format->{$dlist}) {
366 $collwriter->startTag('format');
367 if (defined $format->{$vlist}) {
368 write_format($collwriter, $format->{$vlist}, "document");
369 write_format($collwriter, $format->{$vlist}, "classifier");
370 }
371 if (defined $format->{$hlist}) {
372 write_format($collwriter, $format->{$hlist}, "horizontal");
373 }
374
375 if (defined $format->{$dlist}) {
376 write_format($collwriter, $format->{$dlist}, "document");
377 }
378 $collwriter->endTag('format');
379 }
380 $collwriter->endTag('classifier');
381 } #foreach classifier
382 if ($started_classifiers) {
383 # end the classifiers
384 $buildwriter->endTag('classifierList');
385 # close off the Browse service
386 $buildwriter->endTag('serviceRack');
387 }
388
389 $collwriter->endTag('browse');
390 }
391
392
393 # the phind classifier is a separate service
394 if ($phind) {
395 # if phind classifier
396 $buildwriter->emptyTag('serviceRack', 'name'=>'PhindPhraseBrowse');
397 }
398
399 # do the search service
400 $buildwriter->startTag('serviceRack', 'name'=>'GS2'.$service_type.'Search');
401 $buildwriter->emptyTag('defaultIndex', 'shortname'=>$defaultindex);
402 $buildwriter->startTag('indexList');
403 #for each index
404 foreach my $i (@indexlist) {
405 my $index = $indexmap->{$i};
406 $buildwriter->emptyTag('index', 'name'=>$i, 'shortname'=>$index);
407 }
408 $buildwriter->endTag('indexList');
409 if (defined $indexstem) {
410 $buildwriter->emptyTag('indexStem', 'name'=>$indexstem);
411 }
412
413 # index options
414 if ($buildtype eq 'mg' || $buildtype eq 'mgpp') {
415 $buildwriter->startTag('indexOptionList');
416 my $stemindexes = 3; # default is stem and casefold
417 if (defined $buildcfg->{'stemindexes'} && $buildcfg->{'stemindexes'} =~ /^\d+$/ ) {
418 $stemindexes = $buildcfg->{'stemindexes'};
419 }
420 $buildwriter->emptyTag('indexOption', 'name'=>'stemIndexes', 'value'=>$stemindexes);
421
422 my $maxnumeric = 4; # default
423 if (defined $buildcfg->{'maxnumeric'} && $buildcfg->{'maxnumeric'} =~ /^\d+$/) {
424 $maxnumeric = $buildcfg->{'maxnumeric'};
425 }
426 $buildwriter->emptyTag('indexOption', 'name'=>'maxnumeric', 'value'=>$maxnumeric);
427
428 $buildwriter->endTag('indexOptionList');
429 }
430
431 if ($buildtype eq 'mgpp' || $buildtype eq 'lucene') {
432
433 # level info
434 $buildwriter->emptyTag('defaultLevel', 'name'=>$defaultlevel);
435 $buildwriter->startTag('levelList');
436 foreach my $level (@levels) {
437 $buildwriter->emptyTag('level', 'name'=>$level);
438 }
439 $buildwriter->endTag('levelList');
440
441 # do the search types if there
442 if (defined $collectcfg->{'searchtype'}) {
443 $buildwriter->startTag('searchTypeList');
444 foreach my $st (@{$collectcfg->{'searchtype'}}) {
445 $buildwriter->emptyTag('searchType', 'name'=>$st);
446 }
447 $buildwriter->endTag('searchTypeList');
448 } elsif (defined $format->{'SearchTypes'}) {
449 #check format statement
450 my $searchtype = $format->{'SearchTypes'};
451 $buildwriter->startTag('searchTypeList');
452 if ($searchtype =~ /form/) {
453 $buildwriter->emptyTag('searchType', 'name'=>'form');
454 }
455 if ($searchtype =~ /plain/) {
456 $buildwriter->emptyTag('searchType', 'name'=>'plain');
457 }
458 $buildwriter->endTag('searchTypeList');
459 }
460 }
461
462
463
464 $buildwriter->endTag('serviceRack');
465
466 $buildwriter->endTag('serviceRackList');
467 $buildwriter->endTag('buildConfig');
468
469 # we add in the default replace list just in case we have macros in the
470 # collection
471 $collwriter->emptyTag('replaceListRef', 'id'=>'gs2-standard');
472 $collwriter->endTag('collectionConfig');
473 $collwriter->end();
474 $buildwriter->end();
475 $buildoutput->close();
476 $colloutput->close();
477 &close_database($database);
478}
479
480
481sub output_metadata {
482 my ($writer, $metaname, $metavalue) = @_;
483 $writer->startTag('metadata', 'name'=>$metaname);
484 $writer->characters($metavalue);
485 $writer->endTag('metadata');
486}
487
488sub output_display {
489 my ($writer, $name, $lang, $value) = @_;
490 $lang = 'en' if $lang eq 'default';
491 if ($lang =~ /^\[/) {
492 ($lang) = $lang =~ /\[l=(.*)\]/;
493 }
494 $writer->startTag('displayItem', 'name'=>$name, 'lang'=>$lang);
495 $writer->characters($value);
496 $writer->endTag('displayItem');
497}
498sub format_icon_value {
499 my ($value) = @_;
500 if ($value =~ /^_/) {
501 my ($newvalue) = $value =~ /images\/(.*)$/;
502 if ($newvalue) {
503 return $newvalue;
504 }
505 }
506 return $value;
507}
508
509sub tidy_up_display_item {
510 my ($value) = @_;
511 # remove \n
512 $value =~ s/\\n//g;
513 # replace \' with '
514 $value =~ s/\\\'/\'/g;
515 # replace \" with "
516 $value =~ s/\\\"/\"/g;
517 # replace _httpprefix_ with _httpsite_
518 $value =~ s/_httpprefix_/_httpsite_/g;
519 $value =~ s/_gwcgi_//g;
520 $value =~ s/[a-z][a-z]?=_cgiarg[a-z][a-z]?_&?//g;
521 $value =~ s/&p=/&sa=/g;
522 return $value;
523}
524
525sub write_format {
526 my ($writer, $old_format, $node_type) = @_;
527 # replace \' with '
528 $old_format =~ s/\\\'/\'/g;
529 # replace \" with "
530 $old_format =~ s/\\\"/\"/g;
531 #convert [] to <gsf:...>
532 # assume no nesting {If} or {Or} for now
533 $old_format =~ s/\{If\}\{([^\}]*)\}/&format_if($1, $node_type)/eg;
534 $old_format =~ s/\{Or\}\{([^\}]*)\}/&format_or($1)/eg;
535 $old_format =~ s/\[Text\]/\<gsf:text\/\>/g;
536 $old_format =~ s/\[num\]/\<gsf:num\/\>/g;
537 $old_format =~ s/\[link\]/\<gsf:link type=\'$node_type\'\>/g;
538 $old_format =~ s/\[\/link\]/\<\/gsf:link\>/g;
539 $old_format =~ s/\[srclink\]/\<gsf:link type=\'source\'\>/g;
540 $old_format =~ s/\[\/srclink\]/\<\/gsf:link\>/g;
541 $old_format =~ s/\[icon\]/\<gsf:icon type=\'$node_type\'\/\>/g;
542 $old_format =~ s/\[srcicon\]/\<gsf:icon type=\'source\'\/\>/g;
543
544 # what to do with hightlight??
545 $old_format =~ s/\[\/?highlight\]//g;
546
547 #now do the rest of the [] which are assumed to be metadata
548 $old_format =~ s/\[([^\]]*)\]/&format_metadata($1)/eg;
549
550 # some html tidy
551 #turn <br> into <br />
552 $old_format =~ s/\<br\>/\<br \/\>/g;
553 #turn <p> into <p />
554 $old_format =~ s/\<p\>/\<p \/\>/g;
555
556 #put quotes around any atts
557 $old_format =~ s/=([a-z]+)([> ])/=\'$1\'$2/g;
558
559 if ($node_type eq "document") {
560 $writer->startTag('gsf:template', 'match'=>'documentNode');
561 $writer->charactersXML($old_format);
562 $writer->endTag('gsf:template');
563 } elsif ($node_type eq "classifier") {
564 $writer->startTag('gsf:template', 'match'=>'classifierNode');
565 $writer->charactersXML($old_format);
566 $writer->endTag('gsf:template');
567 } elsif ($node_type eq "horizontal") {
568 $writer->startTag('gsf:template', 'match'=>'classifierNode', 'mode'=>'horizontal');
569 $writer->charactersXML($old_format);
570 $writer->endTag('gsf:template');
571
572 }
573}
574
575sub format_metadata {
576 my ($metadata_string) = @_;
577
578 #print STDERR "original meta = $metadata_string\n";
579
580 # what shall we do with cgisafe??
581 my $cgisafe = $metadata_string =~ s/^cgisafe://;
582
583 my ($select) = $metadata_string =~ /^(parent|sibling)/;
584 $metadata_string =~ s/^(parent|sibling)//;
585 my ($scope, $delim);
586
587 if ($select) {
588 ($scope) = $metadata_string =~ /^\((Top|All)/;
589 $metadata_string =~ s/^\((Top|All)\)?//;
590 if ($scope) {
591 ($delim) = $metadata_string =~ /^\'([^\']*)\'\)/;
592 $metadata_string =~ s/^\'([^\']*)\'\)//;
593 }
594 }
595 $metadata_string =~ s/^://;
596 # remove ex.
597 $metadata_string =~ s/^ex\.//;
598
599 #print STDERR "select=$select, scope=$scope, delim=|$delim|, meta = $metadata_string\n";
600
601 my $new_format = "<gsf:metadata name='$metadata_string' ";
602 if (defined $select) {
603 if ($select eq "sibling") {
604 $new_format .= "multiple='true' ";
605 if (defined $delim) {
606 $new_format .= "separator='$delim' ";
607 }
608 } elsif ($select eq "parent"){
609 if (defined $scope) {
610 if ($scope eq "Top") {
611 $new_format .= "select='root' ";
612 } elsif ($scope eq "All") {
613 $new_format .= "select='ancestors' ";
614 if (defined $delim) {
615 $new_format .= "separator='$delim' ";
616 }
617 }
618 } else {
619 $new_format .= "select='parent' ";
620 }
621 }
622 }
623 $new_format .= "/>";
624 #print STDERR "$new_format\n";
625 return $new_format;
626
627}
628
629sub format_if {
630
631 my ($if_string, $node_type) = @_;
632 #print STDERR "if string = $if_string\n";
633
634 my @parts = split /,/, $if_string;
635 my $test = $parts[0];
636 my $true_option = $parts[1];
637 my $false_option;
638 if (scalar (@parts) == 3) {
639 $false_option = $parts[2];
640 }
641 $test =~ s/^\s*//;
642 $test =~ s/\s*$//;
643 my ($test_meta, $test_type, $test_value);
644 if ($test =~ /^(\[.+\])$/) {
645 $test_meta = $1;
646 $test_type = 'exists';
647 } else {
648 my ($lhs, $exp, $rhs) = $test =~ /^(.+)\s+(eq|ne|lt|gt|le|ge|sw|ew)\s+(.+)$/;
649 #print STDERR "lhs, exp, rhs = $lhs, $exp, $rhs\n";
650 if ($exp eq "eq") {
651 $test_type = "equals";
652 } elsif ($exp eq "sw") {
653 $test_type = "startsWith";
654 } elsif ($exp eq "ew") {
655 $test_type = "endsWith";
656 } elsif ($exp eq "ne") {
657 $test_type = "notEquals";
658 } elsif ($exp eq "lt") {
659 $test_type = "lessThan";
660 }elsif ($exp eq "gt") {
661 $test_type = "greaterThan";
662 }elsif ($exp eq "le") {
663 $test_type = "lessThanOrEquals";
664 }elsif ($exp eq "ge") {
665 $test_type = "greaterThanOrEquals";
666 }
667 if ($lhs =~ /^\[.+\]$/) {
668 $test_meta = $lhs;
669 $test_value = $rhs;
670 } else {
671 # assume rhs has meta
672 $test_meta = $rhs;
673 $test_value = $lhs;
674 }
675
676 #remove beginning and end quotes
677 $test_value =~ s/^[\'\"]//;
678 $test_value =~ s/[\'\"]$//;
679 }
680 my $test_atts = "test='$test_type' ";
681 if (defined $test_value) {
682 $test_atts .= "test-value='$test_value' ";
683 }
684 #print STDERR "test, true, false = $test, $true_option, $false_option\n";
685 my $new_format = "<gsf:switch>$test_meta";
686 $new_format .= "<gsf:when $test_atts>$true_option</gsf:when>";
687 if (defined $false_option) {
688 $new_format .="<gsf:otherwise>$false_option</gsf:otherwise>";
689 }
690 $new_format .= "</gsf:switch>";
691
692 #print STDERR "new format = $new_format\n";
693 return $new_format;
694}
695
696sub format_or {
697 my ($or_string) = @_;
698 my @meta_list = split (',', $or_string);
699 return "" unless scalar (@meta_list);
700 my $new_format = "<gsf:choose-metadata>";
701 foreach my $m (@meta_list) {
702 if ($m =~ /^\[(.*)\]$/) {
703 $new_format .= &format_metadata($1);
704 } else {
705 # a default value
706 $new_format .= "<gsf:default>$m</gsf:default>";
707 last;
708 }
709 }
710 $new_format .= "</gsf:choose-metadata>";
711 return $new_format;
712}
713
714sub open_database {
715 my ($db_file) = @_;
716
717 my $database = ();
718# tie (%$database, 'GDBM_File', $db_file, GDBM_READER, 0400) ||
719# die "Couldn't open database $db_file\n";
720
721 return $database;
722}
723
724sub close_database {
725 my ($database) = @_;
726 untie %$database;
727}
728sub isHorizontalClassifier {
729 my ($database, $name) = @_;
730
731 return 0; # can't get this to work for windows
732 my $record = $database->{$name};
733 my ($childtype) = $record =~ /<childtype>(\w*)/;
734 if ($childtype eq "HList") {
735 return 1;
736 }
737 return 0;
738}
739#$writer->startTag('');
740#$writer->endTag('');
741#$writer->characters();
742#$writer->emptyTag('');
743
7441;
Note: See TracBrowser for help on using the repository browser.