root/main/trunk/greenstone2/perllib/buildConfigxml.pm @ 27818

Revision 27818, 24.0 KB (checked in by kjdon, 7 years ago)

adding in stuff for facets

  • Property svn:keywords set to Author Date Id Revision
Line 
1###########################################################################
2#
3# buildConfigxml.pm --
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###########################################################################
25
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.
30
31package buildConfigxml;
32
33use strict;
34no strict 'refs';
35no strict 'subs';
36
37use XMLParser;
38
39
40# A mapping hash to resolve name discrepancy between gs2 and gs3.
41my $nameMap = {"numDocs" => "numdocs",
42           "buildType" => "buildtype",
43           "orthogonalBuildTypes" => "orthogonalbuildtypes"
44           };
45
46
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 = "";
52my $stringexp = q/^(buildType|numDocs)$/;
53my $arrayexp = q/^(orthogonalBuildTypes)$/;
54
55my $indexmap_name = "";
56my $haveindexfields = 0;
57
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    }
67
68    # Removed ProtocolEncoding (see MetadataXMLPlugin for details)
69
70    # create XML::Parser object for parsing metadata.xml files
71    my $parser = new XML::Parser('Style' => 'Stream',
72                 'Pkg' => 'buildConfigxml',
73                 'Handlers' => {'Char' => \&Char,
74                         'Doctype' => \&Doctype
75                         });
76
77    if (!open (COLCFG, $filename)) {
78    print STDERR "buildConfigxml::read_cfg_file couldn't read the cfg file $filename\n";
79    } else {
80
81      $parser->parsefile ($filename);# (COLCFG);
82      close (COLCFG);
83    }
84
85    #&Display;
86    return $data;
87}
88
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) = @_;
93   
94    my $name = $_{'name'};
95    my $shortname = $_{'shortname'};
96
97   
98    #@ handling block metadataList
99    if (defined $name && (($name =~ m/$stringexp/) || ($name =~ m/$arrayexp/))) {
100      $currentLocation = $name;
101      # the value will be retrieved later in Text sub
102    }
103
104    #@ handle indexes - store indexmap (mg) or indexfields and indexfieldmap (mgpp/lucene/solr)
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        }
114    }
115    else {
116        # mgpp, lucene or solr
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        }
125
126    }
127   
128    }
129   
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        }
137    }
138    }
139
140
141}
142
143sub EndTag {
144    my ($expat, $element) = @_;
145}
146
147sub Text {
148    if (defined $currentLocation) {
149    #@ Handling block metadataList(numDocs, buildType)
150    if ($currentLocation =~ /$stringexp/) {
151        #print $currentLocation;
152        my $key = $nameMap->{$currentLocation};
153        $data->{$key} = $_;
154        undef $currentLocation;
155    }   
156    elsif ($currentLocation =~ /$arrayexp/) {
157        #print $currentLocation;
158        my $key = $nameMap->{$currentLocation};
159        push(@{$data->{$key}},$_);
160        undef $currentLocation;
161    }   
162
163    }   
164}
165
166# This sub is for debugging purposes
167sub Display {
168
169    print "NumDocs = ".$data->{'numdocs'}."\n" if (defined $data->{'numdocs'});
170    print "BuildType = ".$data->{'buildtype'}."\n" if (defined $data->{'buildtype'});
171    print "OrthogonalBuildTypes = ".join(",",@{$data->{'orthogonalbuildtypes'}})."\n" if (defined $data->{'orthogonalbuildtypes'});
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
176}
177
178# is this actually used??
179sub Doctype {
180    my ($expat, $name, $sysid, $pubid, $internal) = @_;
181
182    die if ($name !~ /^buildConfig$/);
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}
195
196
197
198sub write_line {
199    my ($filehandle, $line) = @_;
200    print $filehandle join ("", @$line), "\n";
201}
202
203sub search_and_retrieve_settings
204{
205    my ($buildcfg,$collectcfg) = @_;
206
207    my $settings = {};
208
209    if (defined $buildcfg->{"buildtype"}) {
210    $settings->{'buildtype'} = $buildcfg->{"buildtype"};
211    } else {
212    $settings->{'buildtype'} = "mgpp";
213    }
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
223    if (defined $buildcfg->{"numdocs"}) {
224    $settings->{'numdocs'} = $buildcfg->{"numdocs"};
225    }
226    else {
227    $settings->{'numdocs'} = 0;
228    }
229
230    my $service_type = "MGPP";
231    if ($buildtype eq "mg") {
232    $service_type = "MG";
233    } elsif ($buildtype eq "lucene") {
234    $service_type = "Lucene";
235    } elsif ($buildtype eq "solr") {
236    $service_type = "Solr";
237    }
238    $settings->{'service_type'} = $service_type;
239
240
241    if (defined $buildcfg->{"infodbtype"}) {
242    $settings->{'infodbtype'} = $buildcfg->{'infodbtype'};
243    }
244    else {
245    $settings->{'infodbtype'} = "gdbm";
246    }
247
248
249    #--
250    # indexes
251    #--
252   
253    my $indexmap = {};  # maps index name to shortname
254    my $indexlist = []; # keeps the order for indexes
255    my $defaultindex = "";
256    my $maptype = ($buildtype eq "mg")  ? "indexmap" : "indexfieldmap";
257
258    if (defined $buildcfg->{$maptype}) {
259    my $first = 1;
260    my $indexmap_t = $buildcfg->{$maptype};
261    foreach my $i (@$indexmap_t) {
262        my ($k, $v) = $i =~ /^(.*)\-\>(.*)$/;
263        $indexmap->{$k} = $v;
264        push @$indexlist, $k;
265        if ($first) {
266        $defaultindex = $v;
267        $first = 0;
268        }
269    }
270       # now if the user has assigned a default index, we use it
271    if (defined $collectcfg->{"defaultindex"}) {
272        $defaultindex = $indexmap->{$collectcfg->{"defaultindex"}};
273    }
274    } else {
275    print STDERR "$maptype not defined\n";
276    }
277
278    $settings->{'num_indexes'} = $buildcfg->{'num_indexes'};
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      }
303    }
304
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/^(.*)\-\>(.*)$/;
312
313        $settings->{'default_subcol'} = $v;
314    }
315    }
316
317
318    #--
319    # indexstem
320    #--
321    if (defined $buildcfg->{'indexstem'}) {
322    $settings->{'indexstem'} = $buildcfg->{'indexstem'};
323    }
324
325    #--
326    # levelList
327    #--
328
329    my $levelmap = {};
330    my $levellist = [];
331    my $default_search_level = "Doc";
332    my $default_retrieve_level = "Doc";
333    my $default_db_level = "Doc";
334
335    if ($buildtype eq "mgpp" || $buildtype eq "lucene" || $buildtype eq "solr") {
336    if (defined $buildcfg->{'levelmap'}) {
337        my $first = 1;
338
339        my $levelmap_t = $buildcfg->{'levelmap'};
340        foreach my $l (@$levelmap_t) {
341        my ($key, $val) = $l =~ /^(.*)\-\>(.*)$/;
342        $levelmap->{$key} = $val;
343        push @$levellist, $key;
344        if ($first) {
345            # let default search level follow the first level in the level list
346            $default_search_level = $val;
347            # retrieve/database levels may get modified later if text level is defined
348            $default_retrieve_level = $val;
349            $default_db_level = $val;
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.
355    if (defined $collectcfg->{"defaultlevel"}) {
356        $default_search_level = $levelmap->{$collectcfg->{"defaultlevel"}};
357        #  $default_retrieve_level = $default_search_level;
358    }
359   
360    if (defined $buildcfg->{'textlevel'}) {
361       # let the retrieve/database levels always follow the textlevel
362           $default_retrieve_level = $buildcfg->{'textlevel'};
363       $default_db_level = $buildcfg->{'textlevel'};
364         
365    }
366    }
367    $settings->{'levelmap'} = $levelmap;
368    $settings->{'levellist'} = $levellist;
369    $settings->{'default_search_level'} = $default_search_level if $default_search_level;
370    $settings->{'default_retrieve_level'} = $default_retrieve_level;
371    $settings->{'default_db_level'} = $default_db_level;
372
373    # sort field list
374    ######
375
376    my $sortmap = {};  # maps index name to shortname
377    my $sortlist = []; # keeps the order for indexes
378
379    if (defined ($buildcfg->{"indexsortfieldmap"})) {
380    my $sortmap_t = $buildcfg->{"indexsortfieldmap"};
381    foreach my $s (@$sortmap_t) {
382        my ($k, $v) = $s =~ /^(.*)\-\>(.*)$/;
383        $sortmap->{$v} = $k;
384    }
385    }
386    if (defined ($buildcfg->{"indexsortfields"})) {
387    $sortlist = $buildcfg->{"indexsortfields"};
388    }
389
390    $settings->{'sortlist'} = $sortlist;
391    $settings->{'sortmap'} = $sortmap;
392
393    # facet field list
394    ######
395
396    my $facetmap = {};  # maps index name to shortname
397    my $facetlist = []; # keeps the order for indexes
398
399    if (defined ($buildcfg->{"indexfacetfieldmap"})) {
400    my $facetmap_t = $buildcfg->{"indexfacetfieldmap"};
401    foreach my $s (@$facetmap_t) {
402        my ($k, $v) = $s =~ /^(.*)\-\>(.*)$/;
403        $facetmap->{$v} = $k;
404    }
405    }
406    if (defined ($buildcfg->{"indexfacetfields"})) {
407    $facetlist = $buildcfg->{"indexfacetfields"};
408    }
409
410    $settings->{'facetlist'} = $facetlist;
411    $settings->{'facetmap'} = $facetmap;
412
413
414    return $settings;
415}
416
417
418sub write_search_servicerack
419{
420    my ($buildcfg,$settings) = @_;
421
422    my $buildtype    = $settings->{'buildtype'};
423    my $infodbtype   = $settings->{'infodbtype'};
424    my $service_type = $settings->{'service_type'};
425
426    # there's no searching and therefore no search services if there are no indexes
427    return if($settings->{'num_indexes'} <= 0);
428   
429    # do the search service
430    &write_line('COLCFG', ["<serviceRack name=\"GS2", $service_type, "Search\">"]);
431    if (defined $buildcfg->{'indexstem'}) {
432      my $indexstem = $buildcfg->{'indexstem'};
433      &write_line('COLCFG', ["<indexStem name=\"", $indexstem, "\" />"]);     
434    }
435    if (defined $buildcfg->{'infodbtype'}) {
436        &write_line('COLCFG', ["<databaseType name=\"", $infodbtype, "\" />"]);     
437    }
438
439    #indexes
440    my $indexmap = $settings->{'indexmap'};
441    my $indexlist = $settings->{'indexlist'};
442    my $defaultindex = $settings->{'defaultindex'};
443
444    #for each index in indexList, write them out
445    &write_line('COLCFG', ["<indexList>"]);
446    foreach my $i (@$indexlist) {
447    my $index = $indexmap->{$i};
448    &write_line('COLCFG', ["<index name=\"", $i, "\" ", "shortname=\"", $index, "\" />"]);
449    }   
450    &write_line('COLCFG', ["</indexList>"]);
451
452   
453    #$defaultindex = "ZZ" if (!$defaultindex); # index allfields by default
454    if ($defaultindex) {
455    &write_line('COLCFG', ["<defaultIndex shortname=\"", $defaultindex, "\" />"]);
456    }
457
458
459    # do indexOptionList
460    if ($buildtype eq "mg" || $buildtype eq "mgpp") {
461        &write_line('COLCFG', ["<indexOptionList>"]);
462    my $stemindexes = 3; # default is stem and casefold
463    if (defined $buildcfg->{'stemindexes'} && $buildcfg->{'stemindexes'} =~ /^\d+$/ ) {
464        $stemindexes = $buildcfg->{'stemindexes'};
465    }
466    &write_line('COLCFG', ["<indexOption name=\"stemIndexes\" value=\"", $stemindexes, "\" />"]);
467   
468    my $maxnumeric = 4; # default
469    if (defined $buildcfg->{'maxnumeric'} && $buildcfg->{'maxnumeric'} =~ /^\d+$/) {
470        $maxnumeric = $buildcfg->{'maxnumeric'};
471    }
472    &write_line('COLCFG', ["<indexOption name=\"maxnumeric\" value=\"", $maxnumeric, "\" />"]);
473        &write_line('COLCFG', ["</indexOptionList>"]);
474    }
475
476    #--
477    # levelList
478    #--
479    my $levelmap = $settings->{'levelmap'};
480    my $levellist = $settings->{'levellist'};
481    my $default_search_level = $settings->{'default_search_level'};
482    my $default_retrieve_level = $settings->{'default_retrieve_level'};
483    my $default_db_level = $settings->{'default_db_level'};
484
485    #for each level in levelList, write them out
486    if ($buildtype ne "mg") {
487    &write_line('COLCFG', ["<levelList>"]);
488    foreach my $lv (@$levellist) {
489        my $level = $levelmap->{$lv};
490        &write_line('COLCFG', ["<level name=\"", $lv, "\" shortname=\"", $level, "\" />"]);
491    }   
492    &write_line('COLCFG', ["</levelList>"]);
493    }
494    # add in defaultLevel as the same level as indexLevelList, making the reading job easier
495    if ($buildtype eq "lucene" || $buildtype eq "mgpp" || $buildtype eq "solr") {
496    &write_line('COLCFG', ["<defaultLevel shortname=\"", $default_search_level, "\" />"]);
497    }
498    if ($buildtype eq "lucene" || $buildtype eq "mgpp" || $buildtype eq "solr") {
499        &write_line('COLCFG', ["<defaultDBLevel shortname=\"", $default_db_level, "\" />"]);
500    }
501
502    # do sort list
503    if ($buildtype eq "lucene" || $buildtype eq "solr") {
504    my $sortlist = $settings->{'sortlist'};
505    my $sortmap = $settings->{'sortmap'};
506    &write_line('COLCFG', ["<sortList>"]);
507    foreach my $sf (@$sortlist) {
508        my $sortf = $sortmap->{$sf};
509        &write_line('COLCFG', ["<sort name=\"", $sortf, "\" shortname=\"", $sf, "\" />"]);
510    }
511    &write_line('COLCFG', ["</sortList>"]);
512    }
513
514    # do facet list
515    if ($buildtype eq "solr") {
516    &write_line('COLCFG', ["<facetList>"]);
517    my $facetlist = $settings->{'facetlist'};
518    my $facetmap = $settings->{'facetmap'};
519    foreach my $ff (@$facetlist) {
520        my $facetf = $facetmap->{$ff};
521        &write_line('COLCFG', ["<facet name=\"", $facetf, "\" shortname=\"", $ff, "\" />"]);
522    }
523    &write_line('COLCFG', ["</facetList>"]);
524    }
525    # do searchTypeList
526    if ($buildtype eq "mgpp" || $buildtype eq "lucene" || $buildtype eq "solr") {
527      &write_line('COLCFG', ["<searchTypeList>"]);
528     
529      if (defined $buildcfg->{"searchtype"}) {
530      my $searchtype_t = $buildcfg->{"searchtype"};
531      foreach my $s (@$searchtype_t) {
532      &write_line('COLCFG', ["<searchType name=\"", $s, "\" />"]);
533    }
534      } else {
535      &write_line('COLCFG', ["<searchType name=\"plain\" />"]);
536      &write_line('COLCFG', ["<searchType name=\"form\" />"]);
537      }
538      &write_line('COLCFG', ["</searchTypeList>"]);
539    }
540
541    # do indexLanguageList [in collect.cfg: languages; in build.cfg: languagemap]
542    my $default_lang = $settings->{'default_lang'};
543    my $default_lang_short = $settings->{'default_lang_short'};
544    if (defined $buildcfg->{"languagemap"}) {
545      &write_line('COLCFG', ["<indexLanguageList>"]);
546
547      my $langmap_t = $buildcfg->{"languagemap"};
548      foreach my $l (@$langmap_t) {
549    my ($k, $v) = $l =~ /^(.*)\-\>(.*)$/;
550
551    &write_line('COLCFG', ["<indexLanguage name=\"", $k, "\" shortname=\"", $v, "\" />"]);
552      }
553
554      &write_line('COLCFG', ["</indexLanguageList>"]);
555
556      &write_line('COLCFG', ["<defaultIndexLanguage name=\"", $default_lang, "\" shortname=\"", $default_lang_short, "\" />"]);
557    }
558
559    # do indexSubcollectionList
560    my $default_subcol = $settings->{'default_subcol'};
561
562    if (defined $buildcfg->{'subcollectionmap'}) {
563      &write_line('COLCFG', ["<indexSubcollectionList>"]);
564      my $subcolmap = {};
565      my @subcollist = ();
566
567      my $subcolmap_t = $buildcfg->{'subcollectionmap'};
568      foreach my $l (@$subcolmap_t) {
569    my ($k, $v) = $l =~ /^(.*)\-\>(.*)$/;
570    $subcolmap->{$k} = $v;
571    push @subcollist, $k;
572      }
573
574      foreach my $sl (@subcollist) {
575    my $subcol = $subcolmap->{$sl};
576    &write_line('COLCFG', ["<indexSubcollection name=\"", $sl, "\" shortname=\"", $subcol, "\" />"]);
577      }
578
579      &write_line('COLCFG', ["</indexSubcollectionList>"]);
580      &write_line('COLCFG', ["<defaultIndexSubcollection shortname=\"", $default_subcol, "\" />"]);
581    }
582     
583    # close off search service
584    &write_line('COLCFG', ["</serviceRack>"]);
585
586}
587
588
589sub write_orthogonalsearch_serviceracks
590{
591    my ($buildcfg,$settings) = @_;
592
593    #return if($settings->{'num_indexes'} <= 0);    # no search if no indexes
594   
595    my $infodbtype   = $settings->{'infodbtype'};
596
597    my $orthogonalbuildtypes = $settings->{'orthogonalbuildtypes'};
598
599    foreach my $obt (@$orthogonalbuildtypes) {
600    $obt =~ s/^(.)/\u$1/; # capitialize initial letter
601    $obt =~ s/-(.)/\u$1/g; # change any hyphenated words to cap next letter
602
603    &write_line('COLCFG', ["<serviceRack name=\"GS2", $obt, "Search\">"]);
604
605    &write_line('COLCFG',["<databaseType name=\"",$infodbtype,"\" />"]); 
606    &write_line('COLCFG', ["</serviceRack>"]);
607    }
608}
609
610
611
612sub write_retrieve_servicerack
613{
614    my ($buildcfg,$settings) = @_;
615
616    my $buildtype      = $settings->{'buildtype'};
617    my $infodbtype     = $settings->{'infodbtype'};
618   
619    my $service_type   = $settings->{'service_type'};
620
621    # do the retrieve service
622    &write_line('COLCFG', ["<serviceRack name=\"GS2", $service_type, "Retrieve\">"]);
623
624    # do default index
625    if (defined $buildcfg->{"languagemap"}) {
626    my $default_lang   = $settings->{'default_lang'};
627    &write_line('COLCFG', ["<defaultIndexLanguage shortname=\"", $default_lang, "\" />"]);
628    }
629    if (defined $buildcfg->{'subcollectionmap'}) {
630    my $default_subcol = $settings->{'default_subcol'};
631    &write_line('COLCFG', ["<defaultIndexSubcollection shortname=\"", $default_subcol, "\" />"]);
632    }
633    if ($buildtype eq "mg") {
634    my $defaultindex   = $settings->{'defaultindex'};
635      &write_line('COLCFG', ["<defaultIndex shortname=\"", $defaultindex, "\" />"]);
636    }
637
638    if (defined $buildcfg->{'indexstem'}) {
639      my $indexstem = $buildcfg->{'indexstem'};
640      &write_line('COLCFG', ["<indexStem name=\"", $indexstem, "\" />"]);     
641    }
642    if ($buildtype eq "mgpp" || $buildtype eq "lucene" || $buildtype eq "solr") {
643    my $default_retrieve_level = $settings->{'default_retrieve_level'};
644      &write_line('COLCFG', ["<defaultLevel shortname=\"", $default_retrieve_level, "\" />"]);
645    }
646    if (defined $buildcfg->{'infodbtype'}) {
647        &write_line('COLCFG', ["<databaseType name=\"", $infodbtype, "\" />"]);     
648    }
649
650    &write_line('COLCFG', ["</serviceRack>"]);
651
652}
653
654
655# Create the buildConfig.xml file for a specific collection
656sub write_cfg_file {
657    # this sub is called in make_auxiliary_files() in basebuilder.pm
658    # the received args: $buildoutfile - destination file: buildConfig.xml
659    #                    $buildcfg - all build options,
660    #                    $collectcfg - contents of collectionConfig.xml read in by read_cfg_file sub in buildConfigxml.pm.
661    my ($buildoutfile, $buildcfg, $collectcfg) = @_;
662    my $line = [];
663
664    if (!open (COLCFG, ">$buildoutfile")) {
665    print STDERR "buildConfigxml::write_cfg_file couldn't write the build config file $buildoutfile\n";
666    die;
667    }
668
669    my $settings = search_and_retrieve_settings($buildcfg,$collectcfg);
670
671    my $buildtype = $settings->{'buildtype'};
672    my $orthogonalbuildtypes = $settings->{'orthogonalbuildtypes'};
673    my $numdocs = $settings->{'numdocs'};
674
675    &write_line('COLCFG', ["<buildConfig xmlns:gsf=\"http://www.greenstone.org/greenstone3/schema/ConfigFormat\">"]); 
676
677    # output building metadata to build config file
678    &write_line('COLCFG', ["<metadataList>"]);
679    &write_line('COLCFG', ["<metadata name=\"numDocs\">", $numdocs, "</metadata>"]);
680    &write_line('COLCFG', ["<metadata name=\"buildType\">", $buildtype, "</metadata>"]);
681    foreach my $obt (@$orthogonalbuildtypes) {
682    &write_line('COLCFG', ["<metadata name=\"orthogonalBuildTypes\">", $obt, "</metadata>"]);
683    }
684
685    if (defined $buildcfg->{'indexstem'}) {
686    &write_line('COLCFG', ["<metadata name=\"indexStem\">", $buildcfg->{"indexstem"}, "</metadata>"]);
687    }
688    if (defined $buildcfg->{'infodbtype'}) {
689    &write_line('COLCFG', ["<metadata name=\"infodbType\">", $buildcfg->{"infodbtype"}, "</metadata>"]);
690    }
691    if (defined $buildcfg->{'earliestdatestamp'}) {
692    &write_line('COLCFG', ["<metadata name=\"earliestdatestamp\">", $buildcfg->{"earliestdatestamp"}, "</metadata>"]);
693    }
694
695    &write_line('COLCFG', ["</metadataList>"]);
696
697    # output serviceRackList
698    &write_line('COLCFG', ["<serviceRackList>"]);
699
700    write_search_servicerack($buildcfg,$settings);
701
702    # add in orthogonalbuildtypes
703    write_orthogonalsearch_serviceracks($buildcfg,$settings);
704
705    write_retrieve_servicerack($buildcfg,$settings);
706
707    # do the browse service
708    my $count = 1;
709    my $phind = 0;
710    my $started_classifiers = 0;
711
712    my $classifiers = $collectcfg->{"classify"};
713    foreach my $cl (@$classifiers) {
714      my $name = "CL$count";
715      $count++;
716      my ($classname) = @$cl[0];
717      if ($classname =~ /^phind$/i) {
718    $phind=1;
719    #should add it into coll config classifiers
720    next;
721      }
722     
723      if (not $started_classifiers) {
724    &write_line('COLCFG', ["<serviceRack name=\"GS2Browse\">"]);
725    if (defined $buildcfg->{'indexstem'}) {
726      my $indexstem = $buildcfg->{'indexstem'};
727      &write_line('COLCFG', ["<indexStem name=\"", $indexstem, "\" />"]);     
728    }
729    if (defined $buildcfg->{'infodbtype'}) {
730        my $infodbtype = $buildcfg->{'infodbtype'};
731        &write_line('COLCFG', ["<databaseType name=\"", $infodbtype, "\" />"]);     
732    }
733    &write_line('COLCFG', ["<classifierList>"]);       
734    $started_classifiers = 1;
735      }
736      my $content = ''; #use buttonname first, then metadata
737      if ($classname eq "DateList") {
738    $content = "Date";
739      } else {
740    for (my $j=0; $j<scalar(@$cl); $j++) {
741      my $arg = @$cl[$j];
742      if ($arg eq "-buttonname"){
743        $content = @$cl[$j+1];
744        last;
745      } elsif ($arg eq "-metadata") {
746        $content = @$cl[$j+1];
747      }
748     
749    }
750      }
751      &write_line('COLCFG', ["<classifier name=\"", $name, "\" content=\"", $content, "\" />"]);
752    }     
753    if ($started_classifiers) {
754      # end the classifiers
755      &write_line('COLCFG', ["</classifierList>"]);
756      # close off the Browse service
757      &write_line('COLCFG', ["</serviceRack>"]);
758    }
759   
760    # the phind classifier is a separate service
761    if ($phind) {
762    # if phind classifier
763    &write_line('COLCFG', ["<serviceRack name=\"PhindPhraseBrowse\" />"]);
764    }
765
766   
767    &write_line('COLCFG', ["</serviceRackList>"]);
768    &write_line('COLCFG', ["</buildConfig>"]);
769
770    close (COLCFG);
771  }
772
773
774#########################################################
775
7761;
Note: See TracBrowser for help on using the browser.