source: main/trunk/greenstone2/perllib/buildConfigxml.pm@ 26094

Last change on this file since 26094 was 26094, checked in by ak19, 12 years ago

Finally properly fixed the appearance and non-appearance of the quick search form. It should not appear if there are no query elements in the config file. However, even when no search indexes were built, query elements still came through in the XML and it was hard to distinguish at the XSLT stage whether any search indexes were built or not. Kathy suggested that the perl code writing out the buildconfig.xml should not write out the ServiceRacks for searching if no indexes were built and pointed out that the changes were required in buildconfigxml.pm which was called from basebuilder.pm to write out the buildConfig.xml file. Now the XSLT can at last do the right thing: it doesn't display the quick search area if there are no search elements, and doesn't provide the plain text query form in the quick search area if TextQuery isn't one of the query types, but does provide the buttons to other query types like form search if these are meant to be visible according to the SearchType format feature. If there are no search indexes built, then there is no quick search area.

  • Property svn:keywords set to Author Date Id Revision
File size: 22.2 KB
RevLine 
[15600]1###########################################################################
2#
[20096]3# buildConfigxml.pm --
[15600]4# A component of the Greenstone digital library software
5# from the New Zealand Digital Library Project at the
6# University of Waikato, New Zealand.
7#
8# Copyright (C) 1999 New Zealand Digital Library Project
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###########################################################################
[14741]25
[20105]26# reads in buildConfig.xml
27# Note, only implemented the bits that are currently used, eg by incremental
28# build code.
29# The resulting data is not a full representation on buildConfig.xml.
[15600]30
[20096]31package buildConfigxml;
[20105]32
[15600]33use strict;
34no strict 'refs';
35no strict 'subs';
36
[23895]37use XMLParser;
[15600]38
39
[17895]40# A mapping hash to resolve name discrepancy between gs2 and gs3.
[20105]41my $nameMap = {"numDocs" => "numdocs",
[24464]42 "buildType" => "buildtype",
43 "orthogonalBuildTypes" => "orthogonalbuildtypes"
[15600]44 };
[20105]45
46
[15600]47# A hash structure which is returned by sub read_cfg_file.
48my $data = {};
49
50# use those unique attribute values to locate the text within the elements
51my $currentLocation = "";
[20105]52my $stringexp = q/^(buildType|numDocs)$/;
[24464]53my $arrayexp = q/^(orthogonalBuildTypes)$/;
54
[20105]55my $indexmap_name = "";
56my $haveindexfields = 0;
[15600]57
[20105]58# Reads in the model collection configuration file, collectionConfig.xml,
59# into a structure which complies with the one used by gs2 (i.e. one read
60# in by &cfgread::read_cfg_file).
61sub read_cfg_file {
62 my ($filename) = @_;
63 $data = {};
64 if ($filename !~ /buildConfig\.xml$/ || !-f $filename) {
65 return undef;
66 }
[15600]67
[23895]68 # Removed ProtocolEncoding (see MetadataXMLPlugin for details)
69
[20105]70 # create XML::Parser object for parsing metadata.xml files
[23895]71 my $parser = new XML::Parser('Style' => 'Stream',
72 'Pkg' => 'buildConfigxml',
73 'Handlers' => {'Char' => \&Char,
[20105]74 'Doctype' => \&Doctype
75 });
[15600]76
[20105]77 if (!open (COLCFG, $filename)) {
78 print STDERR "buildConfigxml::read_cfg_file couldn't read the cfg file $filename\n";
79 } else {
[15600]80
[20105]81 $parser->parsefile ($filename);# (COLCFG);
82 close (COLCFG);
83 }
84
85 #&Display;
86 return $data;
87}
88
[15600]89sub StartTag {
90# Those marked with #@ will not be executed at the same time when this sub is being called
91# so that if/elsif is used to avoid unnecessary tests
92 my ($expat, $element) = @_;
[15619]93
[15600]94 my $name = $_{'name'};
[20105]95 my $shortname = $_{'shortname'};
[15600]96
[20105]97
[15600]98 #@ handling block metadataList
[24464]99 if (defined $name && (($name =~ m/$stringexp/) || ($name =~ m/$arrayexp/))) {
[15600]100 $currentLocation = $name;
[20105]101 # the value will be retrieved later in Text sub
[15600]102 }
103
[25758]104 #@ handle indexes - store indexmap (mg) or indexfields and indexfieldmap (mgpp/lucene/solr)
[20105]105 elsif ($element =~ /^indexList$/) {
106 # set up the data arrays
107 # this assumes that the build type has been read already, which is
108 # currently the order we save the file in.
109 if ($data->{'buildtype'} eq "mg") {
110 $indexmap_name = "indexmap";
111 if (!defined $data->{"indexmap"}) {
112 $data->{"indexmap"} = [];
113 }
[15619]114 }
[20105]115 else {
[25758]116 # mgpp, lucene or solr
[20105]117 $indexmap_name = "indexfieldmap";
118 $haveindexfields = 1;
119 if (!defined $data->{"indexfieldmap"}) {
120 $data->{"indexfieldmap"} = [];
121 }
122 if (!defined $data->{"indexfields"}) {
123 $data->{"indexfields"} = [];
124 }
[17895]125
[20105]126 }
127
[17895]128 }
[15619]129
[20105]130 elsif ($element =~ /index/) {
131 # store each index in the map
132 if (defined $name && defined $shortname) {
133 push @{$data->{$indexmap_name}}, "$name->$shortname";
134 if ($haveindexfields) {
135 push @{$data->{'indexfields'}}, $name;
136 }
[15600]137 }
138 }
139
140
141}
142
143sub EndTag {
144 my ($expat, $element) = @_;
145}
146
147sub Text {
[15619]148 if (defined $currentLocation) {
[20105]149 #@ Handling block metadataList(numDocs, buildType)
[24464]150 if ($currentLocation =~ /$stringexp/) {
[15619]151 #print $currentLocation;
152 my $key = $nameMap->{$currentLocation};
153 $data->{$key} = $_;
154 undef $currentLocation;
[20105]155 }
[24464]156 elsif ($currentLocation =~ /$arrayexp/) {
157 #print $currentLocation;
158 my $key = $nameMap->{$currentLocation};
159 push(@{$data->{$key}},$_);
160 undef $currentLocation;
161 }
162
[15619]163 }
[15600]164}
[15619]165
[15600]166# This sub is for debugging purposes
167sub Display {
[20105]168
169 print "NumDocs = ".$data->{'numdocs'}."\n" if (defined $data->{'numdocs'});
170 print "BuildType = ".$data->{'buildtype'}."\n" if (defined $data->{'buildtype'});
[24464]171 print "OrthogonalBuildTypes = ".join(",",@{$data->{'orthogonalbuildtypes'}})."\n" if (defined $data->{'orthogonalbuildtypes'});
[20105]172 print "IndexMap = ". join(" ",@{$data->{'indexmap'}})."\n" if (defined $data->{'indexmap'});
173 print "IndexFieldMap = ". join(" ",@{$data->{'indexfieldmap'}})."\n" if (defined $data->{'indexfieldmap'});
174 print "IndexFields = ". join(" ",@{$data->{'indexfields'}})."\n" if (defined $data->{'indexfields'});
175
[15600]176}
[20105]177
178# is this actually used??
[15600]179sub Doctype {
180 my ($expat, $name, $sysid, $pubid, $internal) = @_;
181
[20105]182 die if ($name !~ /^buildConfig$/);
[15600]183}
184
185# This Char function overrides the one in XML::Parser::Stream to overcome a
186# problem where $expat->{Text} is treated as the return value, slowing
187# things down significantly in some cases.
188sub Char {
189 if ($]<5.008) {
190 use bytes; # Necessary to prevent encoding issues with XML::Parser 2.31+ and Perl 5.6
191 }
192 $_[0]->{'Text'} .= $_[1];
193 return undef;
194}
[15619]195
[15600]196
197
198sub write_line {
199 my ($filehandle, $line) = @_;
200 print $filehandle join ("", @$line), "\n";
201}
202
[24464]203sub search_and_retrieve_settings
204{
205 my ($buildcfg,$collectcfg) = @_;
[15600]206
[24464]207 my $settings = {};
[15600]208
209 if (defined $buildcfg->{"buildtype"}) {
[24464]210 $settings->{'buildtype'} = $buildcfg->{"buildtype"};
[15600]211 } else {
[24464]212 $settings->{'buildtype'} = "mgpp";
[15600]213 }
[24464]214 my $buildtype = $settings->{'buildtype'};
215
216 if (defined $collectcfg->{"orthogonalbuildtypes"}) {
217 # Note the use of collectcfg, not bulidcfg
218 $settings->{'orthogonalbuildtypes'} = $collectcfg->{"orthogonalbuildtypes"};
219 } else {
220 $settings->{'orthogonalbuildtypes '}= [];
221 }
222
[15600]223 if (defined $buildcfg->{"numdocs"}) {
[24464]224 $settings->{'numdocs'} = $buildcfg->{"numdocs"};
[15600]225 }
[24464]226 else {
227 $settings->{'numdocs'} = 0;
[21783]228 }
[23939]229
[15600]230 my $service_type = "MGPP";
231 if ($buildtype eq "mg") {
232 $service_type = "MG";
233 } elsif ($buildtype eq "lucene") {
234 $service_type = "Lucene";
[25758]235 } elsif ($buildtype eq "solr") {
236 $service_type = "Solr";
[15600]237 }
[24464]238 $settings->{'service_type'} = $service_type;
[15600]239
240
[24464]241 if (defined $buildcfg->{"infodbtype"}) {
242 $settings->{'infodbtype'} = $buildcfg->{'infodbtype'};
[15600]243 }
[24464]244 else {
245 $settings->{'infodbtype'} = "gdbm";
[21439]246 }
[15600]247
[24464]248
249 #--
250 # indexes
251 #--
[15600]252
[24464]253 my $indexmap = {}; # maps index name to shortname
254 my $indexlist = []; # keeps the order for indexes
[15600]255 my $defaultindex = "";
[24464]256 my $maptype = ($buildtype eq "mg") ? "indexmap" : "indexfieldmap";
[15600]257
258 if (defined $buildcfg->{$maptype}) {
[24464]259 my $first = 1;
[15600]260 my $indexmap_t = $buildcfg->{$maptype};
[24464]261 foreach my $i (@$indexmap_t) {
262 my ($k, $v) = $i =~ /^(.*)\-\>(.*)$/;
[15600]263 $indexmap->{$k} = $v;
[24464]264 push @$indexlist, $k;
[15600]265 if ($first) {
266 $defaultindex = $v;
267 $first = 0;
[24464]268 }
[15600]269 }
[24464]270 # now if the user has assigned a default index, we use it
[15600]271 if (defined $collectcfg->{"defaultindex"}) {
[24464]272 $defaultindex = $indexmap->{$collectcfg->{"defaultindex"}};
[15600]273 }
274 } else {
[26094]275 print STDERR "$maptype not defined\n";
[24464]276 }
[15600]277
[26094]278 $settings->{'num_indexes'} = $buildcfg->{'num_indexes'};
[24464]279 $settings->{'defaultindex'} = $defaultindex;
280 $settings->{'indexmap'} = $indexmap;
281 $settings->{'indexlist'} = $indexlist;
282
283 #--
284 # default lang
285 #--
286 $settings->{'default_lang'} = "";
287 $settings->{'default_lang_short'} = "";
288
289 if (defined $buildcfg->{"languagemap"}) {
290 my $langmap_t = $buildcfg->{"languagemap"};
291 if ((defined $langmap_t) && (scalar(@$langmap_t)>=1)) {
292 my $l = $langmap_t->[0];
293 my ($k, $v) = $l =~ m/^(.*)\-\>(.*)$/;
294 $settings->{'default_lang'} = $k; #name
295 $settings->{'default_lang_short'} = $v; #short name
296 }
297
298 # now if the user has assigned a default language (as "en", "ru" etc.)
299 if (defined $collectcfg->{"defaultlanguage"}) {
300 $settings->{'default_lang'} = $collectcfg->{"defaultlanguage"};
301 # what about default_lang_short ?? ####
302 }
[22485]303 }
[15600]304
[24464]305 # default subcol
306 $settings->{'default_subcol'} = "";
307 if (defined $buildcfg->{'subcollectionmap'}) {
308 my $subcolmap_t = $buildcfg->{'subcollectionmap'};
309 if ((defined $subcolmap_t) && (scalar(@$subcolmap_t)>=1)) {
310 my $l = $subcolmap_t->[0];
311 my ($k, $v) = $l =~ m/^(.*)\-\>(.*)$/;
[20065]312
[24464]313 $settings->{'default_subcol'} = $v;
[15600]314 }
315 }
316
[24464]317
318 #--
319 # indexstem
320 #--
321 if (defined $buildcfg->{'indexstem'}) {
322 $settings->{'indexstem'} = $buildcfg->{'indexstem'};
323 }
324
325 #--
326 # levelList
327 #--
328
[15600]329 my $levelmap = {};
[24464]330 my $levellist = [];
[15600]331 my $default_search_level = "Doc";
332 my $default_retrieve_level = "Doc";
[15685]333 my $default_db_level = "Doc";
[24464]334
[25758]335 if ($buildtype eq "mgpp" || $buildtype eq "lucene" || $buildtype eq "solr") {
[15600]336 if (defined $buildcfg->{'levelmap'}) {
[24464]337 my $first = 1;
338
[15600]339 my $levelmap_t = $buildcfg->{'levelmap'};
340 foreach my $l (@$levelmap_t) {
341 my ($key, $val) = $l =~ /^(.*)\-\>(.*)$/;
342 $levelmap->{$key} = $val;
[24464]343 push @$levellist, $key;
[15600]344 if ($first) {
345 # let default search level follow the first level in the level list
346 $default_search_level = $val;
[15685]347 # retrieve/database levels may get modified later if text level is defined
[15600]348 $default_retrieve_level = $val;
[15685]349 $default_db_level = $val;
[15600]350 $first = 0;
351 }
352 }
353 }
354 # the default level assigned by the user is no longer ignored [Shaoqun], but the retrievel level stays the same.
[26094]355 if (defined $collectcfg->{"defaultlevel"}) {
356 $default_search_level = $levelmap->{$collectcfg->{"defaultlevel"}};
[15600]357 # $default_retrieve_level = $default_search_level;
[26094]358 }
[15600]359
360 if (defined $buildcfg->{'textlevel'}) {
[15685]361 # let the retrieve/database levels always follow the textlevel
[15600]362 $default_retrieve_level = $buildcfg->{'textlevel'};
[15685]363 $default_db_level = $buildcfg->{'textlevel'};
[15600]364
365 }
366 }
[24464]367 $settings->{'levelmap'} = $levelmap;
368 $settings->{'levellist'} = $levellist;
[26094]369 $settings->{'default_search_level'} = $default_search_level if $default_search_level;
[24464]370 $settings->{'default_retrieve_level'} = $default_retrieve_level;
371 $settings->{'default_db_level'} = $default_db_level;
372
373
374 return $settings;
375}
376
377
378sub write_search_servicerack
379{
380 my ($buildcfg,$settings) = @_;
381
382 my $buildtype = $settings->{'buildtype'};
383 my $infodbtype = $settings->{'infodbtype'};
384 my $service_type = $settings->{'service_type'};
385
[26094]386 # there's no searching and therefore no search services if there are no indexes
387 return if($settings->{'num_indexes'} <= 0);
388
[24464]389 # do the search service
390 &write_line('COLCFG', ["<serviceRack name=\"GS2", $service_type, "Search\">"]);
391 if (defined $buildcfg->{'indexstem'}) {
392 my $indexstem = $buildcfg->{'indexstem'};
393 &write_line('COLCFG', ["<indexStem name=\"", $indexstem, "\" />"]);
394 }
395 if (defined $buildcfg->{'infodbtype'}) {
396 &write_line('COLCFG', ["<databaseType name=\"", $infodbtype, "\" />"]);
397 }
398
399 #indexes
400 my $indexmap = $settings->{'indexmap'};
401 my $indexlist = $settings->{'indexlist'};
402 my $defaultindex = $settings->{'defaultindex'};
403
404 #for each index in indexList, write them out
405 &write_line('COLCFG', ["<indexList>"]);
406 foreach my $i (@$indexlist) {
407 my $index = $indexmap->{$i};
408 &write_line('COLCFG', ["<index name=\"", $i, "\" ", "shortname=\"", $index, "\" />"]);
409 }
410 &write_line('COLCFG', ["</indexList>"]);
411
412
413 #$defaultindex = "ZZ" if (!$defaultindex); # index allfields by default
414 if ($defaultindex) {
415 &write_line('COLCFG', ["<defaultIndex shortname=\"", $defaultindex, "\" />"]);
416 }
417
418
419 # do indexOptionList
420 if ($buildtype eq "mg" || $buildtype eq "mgpp") {
421 &write_line('COLCFG', ["<indexOptionList>"]);
422 my $stemindexes = 3; # default is stem and casefold
423 if (defined $buildcfg->{'stemindexes'} && $buildcfg->{'stemindexes'} =~ /^\d+$/ ) {
424 $stemindexes = $buildcfg->{'stemindexes'};
425 }
426 &write_line('COLCFG', ["<indexOption name=\"stemIndexes\" value=\"", $stemindexes, "\" />"]);
427
428 my $maxnumeric = 4; # default
429 if (defined $buildcfg->{'maxnumeric'} && $buildcfg->{'maxnumeric'} =~ /^\d+$/) {
430 $maxnumeric = $buildcfg->{'maxnumeric'};
431 }
432 &write_line('COLCFG', ["<indexOption name=\"maxnumeric\" value=\"", $maxnumeric, "\" />"]);
433 &write_line('COLCFG', ["</indexOptionList>"]);
434 }
435
436 #--
437 # levelList
438 #--
439 my $levelmap = $settings->{'levelmap'};
440 my $levellist = $settings->{'levellist'};
441 my $default_search_level = $settings->{'default_search_level'};
442 my $default_retrieve_level = $settings->{'default_retrieve_level'};
443 my $default_db_level = $settings->{'default_db_level'};
444
[15600]445 #for each level in levelList, write them out
[21783]446 if ($buildtype ne "mg") {
[24464]447 &write_line('COLCFG', ["<levelList>"]);
448 foreach my $lv (@$levellist) {
449 my $level = $levelmap->{$lv};
450 &write_line('COLCFG', ["<level name=\"", $lv, "\" shortname=\"", $level, "\" />"]);
451 }
452 &write_line('COLCFG', ["</levelList>"]);
[15600]453 }
454 # add in defaultLevel as the same level as indexLevelList, making the reading job easier
[25758]455 if ($buildtype eq "lucene" || $buildtype eq "mgpp" || $buildtype eq "solr") {
[15600]456 &write_line('COLCFG', ["<defaultLevel shortname=\"", $default_search_level, "\" />"]);
457 }
[25758]458 if ($buildtype eq "lucene" || $buildtype eq "mgpp" || $buildtype eq "solr") {
[15685]459 &write_line('COLCFG', ["<defaultDBLevel shortname=\"", $default_db_level, "\" />"]);
[15600]460 }
461 # do searchTypeList
[25758]462 if ($buildtype eq "mgpp" || $buildtype eq "lucene" || $buildtype eq "solr") {
[15600]463 &write_line('COLCFG', ["<searchTypeList>"]);
464
465 if (defined $buildcfg->{"searchtype"}) {
466 my $searchtype_t = $buildcfg->{"searchtype"};
467 foreach my $s (@$searchtype_t) {
468 &write_line('COLCFG', ["<searchType name=\"", $s, "\" />"]);
469 }
470 } else {
471 &write_line('COLCFG', ["<searchType name=\"plain\" />"]);
472 &write_line('COLCFG', ["<searchType name=\"form\" />"]);
473 }
474 &write_line('COLCFG', ["</searchTypeList>"]);
475 }
476
477 # do indexLanguageList [in collect.cfg: languages; in build.cfg: languagemap]
[24464]478 my $default_lang = $settings->{'default_lang'};
479 my $default_lang_short = $settings->{'default_lang_short'};
[15600]480 if (defined $buildcfg->{"languagemap"}) {
481 &write_line('COLCFG', ["<indexLanguageList>"]);
482
483 my $langmap_t = $buildcfg->{"languagemap"};
484 foreach my $l (@$langmap_t) {
485 my ($k, $v) = $l =~ /^(.*)\-\>(.*)$/;
486
487 &write_line('COLCFG', ["<indexLanguage name=\"", $k, "\" shortname=\"", $v, "\" />"]);
488 }
489
490 &write_line('COLCFG', ["</indexLanguageList>"]);
[24464]491
[15600]492 &write_line('COLCFG', ["<defaultIndexLanguage name=\"", $default_lang, "\" shortname=\"", $default_lang_short, "\" />"]);
493 }
494
[24464]495 # do indexSubcollectionList
496 my $default_subcol = $settings->{'default_subcol'};
[15600]497
498 if (defined $buildcfg->{'subcollectionmap'}) {
499 &write_line('COLCFG', ["<indexSubcollectionList>"]);
500 my $subcolmap = {};
501 my @subcollist = ();
[24464]502
[15600]503 my $subcolmap_t = $buildcfg->{'subcollectionmap'};
504 foreach my $l (@$subcolmap_t) {
505 my ($k, $v) = $l =~ /^(.*)\-\>(.*)$/;
506 $subcolmap->{$k} = $v;
507 push @subcollist, $k;
508 }
[24464]509
[15600]510 foreach my $sl (@subcollist) {
511 my $subcol = $subcolmap->{$sl};
512 &write_line('COLCFG', ["<indexSubcollection name=\"", $sl, "\" shortname=\"", $subcol, "\" />"]);
513 }
514
515 &write_line('COLCFG', ["</indexSubcollectionList>"]);
516 &write_line('COLCFG', ["<defaultIndexSubcollection shortname=\"", $default_subcol, "\" />"]);
517 }
518
519 # close off search service
520 &write_line('COLCFG', ["</serviceRack>"]);
521
[24464]522}
523
524
525sub write_orthogonalsearch_serviceracks
526{
527 my ($buildcfg,$settings) = @_;
528
[26094]529 #return if($settings->{'num_indexes'} <= 0); # no search if no indexes
530
[24464]531 my $infodbtype = $settings->{'infodbtype'};
532
533 my $orthogonalbuildtypes = $settings->{'orthogonalbuildtypes'};
534
535 foreach my $obt (@$orthogonalbuildtypes) {
536 $obt =~ s/^(.)/\u$1/; # capitialize initial letter
537 $obt =~ s/-(.)/\u$1/g; # change any hyphenated words to cap next letter
538
539 &write_line('COLCFG', ["<serviceRack name=\"GS2", $obt, "Search\">"]);
540
541 &write_line('COLCFG',["<databaseType name=\"",$infodbtype,"\" />"]);
542 &write_line('COLCFG', ["</serviceRack>"]);
543 }
544}
545
546
547
548sub write_retrieve_servicerack
549{
550 my ($buildcfg,$settings) = @_;
551
552 my $buildtype = $settings->{'buildtype'};
553 my $infodbtype = $settings->{'infodbtype'};
554
555 my $service_type = $settings->{'service_type'};
556
[15600]557 # do the retrieve service
558 &write_line('COLCFG', ["<serviceRack name=\"GS2", $service_type, "Retrieve\">"]);
559
560 # do default index
561 if (defined $buildcfg->{"languagemap"}) {
[24464]562 my $default_lang = $settings->{'default_lang'};
[15600]563 &write_line('COLCFG', ["<defaultIndexLanguage shortname=\"", $default_lang, "\" />"]);
564 }
565 if (defined $buildcfg->{'subcollectionmap'}) {
[24464]566 my $default_subcol = $settings->{'default_subcol'};
[15600]567 &write_line('COLCFG', ["<defaultIndexSubcollection shortname=\"", $default_subcol, "\" />"]);
568 }
569 if ($buildtype eq "mg") {
[24464]570 my $defaultindex = $settings->{'defaultindex'};
[15600]571 &write_line('COLCFG', ["<defaultIndex shortname=\"", $defaultindex, "\" />"]);
572 }
573
574 if (defined $buildcfg->{'indexstem'}) {
575 my $indexstem = $buildcfg->{'indexstem'};
576 &write_line('COLCFG', ["<indexStem name=\"", $indexstem, "\" />"]);
577 }
[25758]578 if ($buildtype eq "mgpp" || $buildtype eq "lucene" || $buildtype eq "solr") {
[24464]579 my $default_retrieve_level = $settings->{'default_retrieve_level'};
[15600]580 &write_line('COLCFG', ["<defaultLevel shortname=\"", $default_retrieve_level, "\" />"]);
581 }
[21439]582 if (defined $buildcfg->{'infodbtype'}) {
583 &write_line('COLCFG', ["<databaseType name=\"", $infodbtype, "\" />"]);
584 }
585
[15600]586 &write_line('COLCFG', ["</serviceRack>"]);
587
[24464]588}
589
590
591# Create the buildConfig.xml file for a specific collection
592sub write_cfg_file {
593 # this sub is called in make_auxiliary_files() in basebuilder.pm
594 # the received args: $buildoutfile - destination file: buildConfig.xml
595 # $buildcfg - all build options,
596 # $collectcfg - contents of collectionConfig.xml read in by read_cfg_file sub in buildConfigxml.pm.
597 my ($buildoutfile, $buildcfg, $collectcfg) = @_;
598 my $line = [];
599
600 if (!open (COLCFG, ">$buildoutfile")) {
601 print STDERR "buildConfigxml::write_cfg_file couldn't write the build config file $buildoutfile\n";
602 die;
603 }
604
605 my $settings = search_and_retrieve_settings($buildcfg,$collectcfg);
606
607 my $buildtype = $settings->{'buildtype'};
608 my $orthogonalbuildtypes = $settings->{'orthogonalbuildtypes'};
609 my $numdocs = $settings->{'numdocs'};
610
611 &write_line('COLCFG', ["<buildConfig xmlns:gsf=\"http://www.greenstone.org/greenstone3/schema/ConfigFormat\">"]);
612
613 # output building metadata to build config file
614 &write_line('COLCFG', ["<metadataList>"]);
615 &write_line('COLCFG', ["<metadata name=\"numDocs\">", $numdocs, "</metadata>"]);
616 &write_line('COLCFG', ["<metadata name=\"buildType\">", $buildtype, "</metadata>"]);
617 foreach my $obt (@$orthogonalbuildtypes) {
618 &write_line('COLCFG', ["<metadata name=\"orthogonalBuildTypes\">", $obt, "</metadata>"]);
619 }
620
621 if (defined $buildcfg->{'indexstem'}) {
622 &write_line('COLCFG', ["<metadata name=\"indexStem\">", $buildcfg->{"indexstem"}, "</metadata>"]);
623 }
624 if (defined $buildcfg->{'infodbtype'}) {
625 &write_line('COLCFG', ["<metadata name=\"infodbType\">", $buildcfg->{"infodbtype"}, "</metadata>"]);
626 }
627 if (defined $buildcfg->{'earliestdatestamp'}) {
628 &write_line('COLCFG', ["<metadata name=\"earliestdatestamp\">", $buildcfg->{"earliestdatestamp"}, "</metadata>"]);
629 }
630
631 &write_line('COLCFG', ["</metadataList>"]);
632
633 # output serviceRackList
634 &write_line('COLCFG', ["<serviceRackList>"]);
635
636 write_search_servicerack($buildcfg,$settings);
637
638 # add in orthogonalbuildtypes
639 write_orthogonalsearch_serviceracks($buildcfg,$settings);
640
641 write_retrieve_servicerack($buildcfg,$settings);
642
[15600]643 # do the browse service
644 my $count = 1;
645 my $phind = 0;
646 my $started_classifiers = 0;
647
648 my $classifiers = $collectcfg->{"classify"};
649 foreach my $cl (@$classifiers) {
650 my $name = "CL$count";
651 $count++;
652 my ($classname) = @$cl[0];
653 if ($classname =~ /^phind$/i) {
654 $phind=1;
655 #should add it into coll config classifiers
656 next;
657 }
658
659 if (not $started_classifiers) {
660 &write_line('COLCFG', ["<serviceRack name=\"GS2Browse\">"]);
661 if (defined $buildcfg->{'indexstem'}) {
662 my $indexstem = $buildcfg->{'indexstem'};
663 &write_line('COLCFG', ["<indexStem name=\"", $indexstem, "\" />"]);
664 }
[21439]665 if (defined $buildcfg->{'infodbtype'}) {
666 my $infodbtype = $buildcfg->{'infodbtype'};
667 &write_line('COLCFG', ["<databaseType name=\"", $infodbtype, "\" />"]);
668 }
[15600]669 &write_line('COLCFG', ["<classifierList>"]);
670 $started_classifiers = 1;
671 }
672 my $content = ''; #use buttonname first, then metadata
673 if ($classname eq "DateList") {
674 $content = "Date";
675 } else {
676 for (my $j=0; $j<scalar(@$cl); $j++) {
677 my $arg = @$cl[$j];
678 if ($arg eq "-buttonname"){
679 $content = @$cl[$j+1];
680 last;
681 } elsif ($arg eq "-metadata") {
682 $content = @$cl[$j+1];
683 }
684
685 }
686 }
687 &write_line('COLCFG', ["<classifier name=\"", $name, "\" content=\"", $content, "\" />"]);
688 }
689 if ($started_classifiers) {
690 # end the classifiers
691 &write_line('COLCFG', ["</classifierList>"]);
692 # close off the Browse service
693 &write_line('COLCFG', ["</serviceRack>"]);
694 }
695
696 # the phind classifier is a separate service
697 if ($phind) {
698 # if phind classifier
699 &write_line('COLCFG', ["<serviceRack name=\"PhindPhraseBrowse\" />"]);
700 }
701
702
703 &write_line('COLCFG', ["</serviceRackList>"]);
704 &write_line('COLCFG', ["</buildConfig>"]);
705
706 close (COLCFG);
707 }
708
709
710#########################################################
711
7121;
Note: See TracBrowser for help on using the repository browser.