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

Revision 26094, 22.2 KB (checked in by ak19, 8 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
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   
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
386    # there's no searching and therefore no search services if there are no indexes
387    return if($settings->{'num_indexes'} <= 0);
388   
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
445    #for each level in levelList, write them out
446    if ($buildtype ne "mg") {
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>"]);
453    }
454    # add in defaultLevel as the same level as indexLevelList, making the reading job easier
455    if ($buildtype eq "lucene" || $buildtype eq "mgpp" || $buildtype eq "solr") {
456    &write_line('COLCFG', ["<defaultLevel shortname=\"", $default_search_level, "\" />"]);
457    }
458    if ($buildtype eq "lucene" || $buildtype eq "mgpp" || $buildtype eq "solr") {
459        &write_line('COLCFG', ["<defaultDBLevel shortname=\"", $default_db_level, "\" />"]);
460    }
461    # do searchTypeList
462    if ($buildtype eq "mgpp" || $buildtype eq "lucene" || $buildtype eq "solr") {
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]
478    my $default_lang = $settings->{'default_lang'};
479    my $default_lang_short = $settings->{'default_lang_short'};
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>"]);
491
492      &write_line('COLCFG', ["<defaultIndexLanguage name=\"", $default_lang, "\" shortname=\"", $default_lang_short, "\" />"]);
493    }
494
495    # do indexSubcollectionList
496    my $default_subcol = $settings->{'default_subcol'};
497
498    if (defined $buildcfg->{'subcollectionmap'}) {
499      &write_line('COLCFG', ["<indexSubcollectionList>"]);
500      my $subcolmap = {};
501      my @subcollist = ();
502
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      }
509
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
522}
523
524
525sub write_orthogonalsearch_serviceracks
526{
527    my ($buildcfg,$settings) = @_;
528
529    #return if($settings->{'num_indexes'} <= 0);    # no search if no indexes
530   
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
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"}) {
562    my $default_lang   = $settings->{'default_lang'};
563    &write_line('COLCFG', ["<defaultIndexLanguage shortname=\"", $default_lang, "\" />"]);
564    }
565    if (defined $buildcfg->{'subcollectionmap'}) {
566    my $default_subcol = $settings->{'default_subcol'};
567    &write_line('COLCFG', ["<defaultIndexSubcollection shortname=\"", $default_subcol, "\" />"]);
568    }
569    if ($buildtype eq "mg") {
570    my $defaultindex   = $settings->{'defaultindex'};
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    }
578    if ($buildtype eq "mgpp" || $buildtype eq "lucene" || $buildtype eq "solr") {
579    my $default_retrieve_level = $settings->{'default_retrieve_level'};
580      &write_line('COLCFG', ["<defaultLevel shortname=\"", $default_retrieve_level, "\" />"]);
581    }
582    if (defined $buildcfg->{'infodbtype'}) {
583        &write_line('COLCFG', ["<databaseType name=\"", $infodbtype, "\" />"]);     
584    }
585
586    &write_line('COLCFG', ["</serviceRack>"]);
587
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
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    }
665    if (defined $buildcfg->{'infodbtype'}) {
666        my $infodbtype = $buildcfg->{'infodbtype'};
667        &write_line('COLCFG', ["<databaseType name=\"", $infodbtype, "\" />"]);     
668    }
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 browser.