xref: /AOO42X/main/solenv/bin/modules/installer/javainstaller.pm (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1#*************************************************************************
2#
3# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4#
5# Copyright 2000, 2010 Oracle and/or its affiliates.
6#
7# OpenOffice.org - a multi-platform office productivity suite
8#
9# This file is part of OpenOffice.org.
10#
11# OpenOffice.org is free software: you can redistribute it and/or modify
12# it under the terms of the GNU Lesser General Public License version 3
13# only, as published by the Free Software Foundation.
14#
15# OpenOffice.org 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 Lesser General Public License version 3 for more details
19# (a copy is included in the LICENSE file that accompanied this code).
20#
21# You should have received a copy of the GNU Lesser General Public License
22# version 3 along with OpenOffice.org.  If not, see
23# <http://www.openoffice.org/license.html>
24# for a copy of the LGPLv3 License.
25#
26#*************************************************************************
27package installer::javainstaller;
28
29use Cwd;
30use installer::exiter;
31use installer::files;
32use installer::globals;
33use installer::languages;
34use installer::pathanalyzer;
35use installer::scriptitems;
36use installer::systemactions;
37use installer::worker;
38use installer::logger;
39
40##############################################################
41# Returning a specific language string from the block
42# of all translations
43##############################################################
44
45sub get_language_string_from_language_block
46{
47    my ($language_block, $language, $oldstring) = @_;
48
49    my $newstring = "";
50
51    for ( my $i = 0; $i <= $#{$language_block}; $i++ )
52    {
53        if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ )
54        {
55            $newstring = $1;
56            last;
57        }
58    }
59
60    if ( $newstring eq "" )
61    {
62        $language = "en-US";    # defaulting to english
63
64        for ( my $i = 0; $i <= $#{$language_block}; $i++ )
65        {
66            if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ )
67            {
68                $newstring = $1;
69                last;
70            }
71        }
72    }
73
74    return $newstring;
75}
76
77##############################################################
78# Returning the complete block in all languages
79# for a specified string
80##############################################################
81
82sub get_language_block_from_language_file
83{
84    my ($searchstring, $languagefile) = @_;
85
86    my @language_block = ();
87
88    for ( my $i = 0; $i <= $#{$languagefile}; $i++ )
89    {
90        if ( ${$languagefile}[$i] =~ /^\s*\[\s*$searchstring\s*\]\s*$/ )
91        {
92            my $counter = $i;
93
94            push(@language_block, ${$languagefile}[$counter]);
95            $counter++;
96
97            while (( $counter <= $#{$languagefile} ) && (!( ${$languagefile}[$counter] =~ /^\s*\[/ )))
98            {
99                push(@language_block, ${$languagefile}[$counter]);
100                $counter++;
101            }
102
103            last;
104        }
105    }
106
107    return \@language_block;
108}
109
110#######################################################
111# Searching for the module name and description in the
112# modules collector
113#######################################################
114
115sub get_module_name_description
116{
117    my ($modulesarrayref, $onelanguage, $gid, $type) = @_;
118
119    my $found = 0;
120
121    my $newstring = "";
122
123    for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ )
124    {
125        my $onemodule = ${$modulesarrayref}[$i];
126
127        if ( $onemodule->{'gid'} eq $gid )
128        {
129            my $typestring = $type . " " . "(" . $onelanguage . ")";
130            if ( $onemodule->{$typestring} ) { $newstring = $onemodule->{$typestring}; }
131            $found = 1;
132        }
133
134        if ( $found ) { last; }
135    }
136
137    # defaulting to english
138
139    if ( ! $found )
140    {
141        my $defaultlanguage = "en-US";
142
143        for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ )
144        {
145            my $onemodule = ${$modulesarrayref}[$i];
146
147            if ( $onemodule->{'gid'} eq $gid )
148            {
149                my $typestring = $type . " " . "(" . $defaultlanguage . ")";
150                if ( $onemodule->{$typestring} ) { $newstring = $onemodule->{$typestring}; }
151                $found = 1;
152            }
153
154            if ( $found ) { last; }
155        }
156    }
157
158    return $newstring;
159}
160
161#######################################################
162# Setting the productname and productversion
163#######################################################
164
165sub set_productname_and_productversion
166{
167    my ($templatefile, $variableshashref) = @_;
168
169    my $infoline = "\nSetting product name and product version in Java template file\n";
170    push( @installer::globals::logfileinfo, $infoline);
171
172    my $productname = $variableshashref->{'PRODUCTNAME'};
173    my $productversion = $variableshashref->{'PRODUCTVERSION'};
174
175    for ( my $i = 0; $i <= $#{$templatefile}; $i++ )
176    {
177        ${$templatefile}[$i] =~ s/\{PRODUCTNAME\}/$productname/g;
178        ${$templatefile}[$i] =~ s/\{PRODUCTVERSION\}/$productversion/g;
179    }
180
181    $infoline = "End of: Setting product name and product version in Java template file\n\n";
182    push( @installer::globals::logfileinfo, $infoline);
183}
184
185#######################################################
186# Setting the localized Module name and description
187#######################################################
188
189sub set_component_name_and_description
190{
191    my ($templatefile, $modulesarrayref, $onelanguage) = @_;
192
193    my $infoline = "\nSetting component names and description in Java template file\n";
194    push( @installer::globals::logfileinfo, $infoline);
195
196    for ( my $i = 0; $i <= $#{$templatefile}; $i++ )
197    {
198        # OOO_gid_Module_Prg_Wrt_Name
199        # OOO_gid_Module_Prg_Wrt_Description
200
201        my $oneline = ${$templatefile}[$i];
202        my $oldstring = "";
203        my $gid = "";
204        my $type = "";
205
206        if ( $oneline =~ /\b(OOO_gid_\w+)\b/ )
207        {
208            $oldstring = $1;
209
210            $infoline = "Found: $oldstring\n";
211            push( @installer::globals::logfileinfo, $infoline);
212
213            if ( $oldstring =~ /^\s*OOO_(gid_\w+)_(\w+?)\s*$/ )
214            {
215                $gid = $1;
216                $type = $2;
217            }
218
219            my $newstring = get_module_name_description($modulesarrayref, $onelanguage, $gid, $type);
220
221            $infoline = "\tReplacing (language $onelanguage): OLDSTRING: $oldstring NEWSTRING $newstring\n";
222            push( @installer::globals::logfileinfo, $infoline);
223
224            ${$templatefile}[$i] =~ s/$oldstring/$newstring/;   # always substitute, even if $newstring eq ""
225        }
226    }
227
228    $infoline = "End of: Setting component names and description in Java template file\n\n";
229    push( @installer::globals::logfileinfo, $infoline);
230}
231
232#######################################################
233# Translating the Java file
234#######################################################
235
236sub translate_javafile
237{
238    my ($templatefile, $languagefile, $onelanguage) = @_;
239
240    for ( my $i = 0; $i <= $#{$templatefile}; $i++ )
241    {
242        my @allstrings = ();
243
244        my $oneline = ${$templatefile}[$i];
245
246        while ( $oneline =~ /\b(OOO_\w+)\b/ )
247        {
248            my $replacestring = $1;
249            push(@allstrings, $replacestring);
250            $oneline =~ s/$replacestring//;
251        }
252
253        my $oldstring;
254
255        foreach $oldstring (@allstrings)
256        {
257            my $language_block = get_language_block_from_language_file($oldstring, $languagefile);
258            my $newstring = get_language_string_from_language_block($language_block, $onelanguage, $oldstring);
259
260            $newstring =~ s/\"/\\\"/g;  # masquerading the "
261            $newstring =~ s/\\\\\"/\\\"/g;  # unmasquerading if \" was converted to \\" (because " was already masked)
262
263            # if (!( $newstring eq "" )) { ${$idtfile}[$i] =~ s/$oldstring/$newstring/; }
264            ${$templatefile}[$i] =~ s/$oldstring/$newstring/;   # always substitute, even if $newstring eq ""
265        }
266    }
267}
268
269###########################################################
270# Returning the license file name for a defined language
271###########################################################
272
273sub get_licensefilesource
274{
275    my ($language, $includepatharrayref) = @_;
276
277    my $licensefilename = "LICENSE_" . $language;
278
279    my $licenseref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, $includepatharrayref, 0);
280    if ($$licenseref eq "") { installer::exiter::exit_program("ERROR: Could not find License file $licensefilename!", "get_licensefilesource"); }
281
282    my $infoline = "Found licensefile $licensefilename: $$licenseref \n";
283    push( @installer::globals::logfileinfo, $infoline);
284
285    return $$licenseref;
286}
287
288#######################################################
289# Converting the license string into the
290# Java specific encoding.
291#######################################################
292
293sub convert_licenstring
294{
295    my ($licensefile, $includepatharrayref, $javadir, $onelanguage) = @_;
296
297    my $licensedir = $javadir . $installer::globals::separator . "license";
298    installer::systemactions::create_directory($licensedir);
299
300    # saving the original license file
301
302    my $licensefilename = $licensedir . $installer::globals::separator . "licensefile.txt";
303    installer::files::save_file($licensefilename, $licensefile);
304
305    # creating the ulf file from the license file
306
307    $licensefilename = $licensedir . $installer::globals::separator . "licensefile.ulf";
308    my @licensearray = ();
309
310    my $section = "\[TRANSLATE\]\n";
311    push(@licensearray, $section);
312
313    for ( my $i = 0; $i <= $#{$licensefile}; $i++ )
314    {
315        my $oneline = ${$licensefile}[$i];
316
317        if ($i == 0) { $oneline =~ s/^\s*\�\�\�//; }
318
319        $oneline =~ s/\s*$//;
320        $oneline =~ s/\"/\\\"/g;    # masquerading the "
321        $oneline =~ s/\'/\\\'/g;    # masquerading the '
322
323        $oneline =~ s/\$\{/\{/g;    # replacement of variables, only {PRODUCTNAME}, not ${PRODUCTNAME}
324
325        my $ulfstring = $onelanguage . " = " . "\"" . $oneline . "\"\n";
326        push(@licensearray, $ulfstring);
327    }
328
329    installer::files::save_file($licensefilename, \@licensearray);
330
331    # converting the ulf file to the jlf file with ulfconv
332
333    @licensearray = ();
334
335    my $converter = "ulfconv";
336
337    my $converterref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$converter, $includepatharrayref, 0);
338    if ($$converterref eq "") { installer::exiter::exit_program("ERROR: Could not find converter $converter!", "convert_licenstring"); }
339
340    my $infoline = "Found converter file $converter: $$converterref \n";
341    push( @installer::globals::logfileinfo, $infoline);
342
343    my $systemcall = "$$converterref $licensefilename |";
344    open (CONV, "$systemcall");
345    @licensearray = <CONV>;
346    close (CONV);
347
348    $licensefilename = $licensedir . $installer::globals::separator . "licensefile.jlf";
349    installer::files::save_file($licensefilename, \@licensearray);
350
351    # creating the license string from the jlf file
352
353    $licensestring = "";
354
355    for ( my $i = 1; $i <= $#licensearray; $i++ )   # not the first line!
356    {
357        my $oneline = $licensearray[$i];
358        $oneline =~ s/^\s*$onelanguage\s*\=\s*\"//;
359        $oneline =~ s/\"\s*$//;
360        $licensestring = $licensestring . $oneline . "\\n";
361    }
362
363    $infoline = "Systemcall: $systemcall\n";
364    push( @installer::globals::logfileinfo, $infoline);
365
366    if ( $licensestring eq "" )
367    {
368        $infoline = "ERROR: Could not convert $licensefilename !\n";
369        push( @installer::globals::logfileinfo, $infoline);
370    }
371
372    return $licensestring;
373}
374
375#######################################################
376# Adding the license file into the java file
377# In the template java file there are two
378# occurences of INSTALLSDK_GUI_LICENSE
379# and INSTALLSDK_CONSOLE_LICENSE
380#######################################################
381
382sub add_license_file_into_javafile
383{
384    my ( $templatefile, $licensefile, $includepatharrayref, $javadir, $onelanguage ) = @_;
385
386    my $licensestring = convert_licenstring($licensefile, $includepatharrayref, $javadir, $onelanguage);
387
388    # saving the licensestring in an ulf file
389    # converting the file using "ulfconv license.ulf"
390    # including the new string into the java file
391
392    for ( my $i = 0; $i <= $#{$templatefile}; $i++ )
393    {
394        ${$templatefile}[$i] =~ s/INSTALLSDK_GUI_LICENSE/$licensestring/;
395        ${$templatefile}[$i] =~ s/INSTALLSDK_CONSOLE_LICENSE/$licensestring/;
396    }
397}
398
399#######################################################
400# Executing one system call
401#######################################################
402
403sub make_systemcall
404{
405    my ( $systemcall, $logreturn ) = @_;
406
407    my @returns = ();
408
409    installer::logger::print_message( "... $systemcall ...\n" );
410
411    open (REG, "$systemcall");
412    while (<REG>) {push(@returns, $_); }
413    close (REG);
414
415    my $returnvalue = $?;   # $? contains the return value of the systemcall
416
417    my $infoline = "Systemcall: $systemcall\n";
418    push( @installer::globals::logfileinfo, $infoline);
419
420    if ( $logreturn )
421    {
422        for ( my $j = 0; $j <= $#returns; $j++ ) { push( @installer::globals::logfileinfo, "$returns[$j]"); }
423    }
424
425    if ($returnvalue)
426    {
427        $infoline = "ERROR: $systemcall\n";
428        push( @installer::globals::logfileinfo, $infoline);
429        $error_occured = 1;
430    }
431    else
432    {
433        $infoline = "SUCCESS: $systemcall\n";
434        push( @installer::globals::logfileinfo, $infoline);
435    }
436
437    return \@returns;
438}
439
440#######################################################
441# Setting the class path for the Installer SDK
442#######################################################
443
444sub set_classpath_for_install_sdk
445{
446    my ( $directory ) = @_;
447
448    my $installsdk = "";
449    my $solarVersion = "";
450    my $inPath = "";
451    my $updMinorExt = "";
452
453    if ( defined( $ENV{ 'SOLARVERSION' } ) ) { $solarVersion =  $ENV{'SOLARVERSION'}; }
454    else { installer::exiter::exit_program("ERROR: Environment variable \"SOLARVERSION\" not set!", "set_classpath_for_install_sdk"); }
455
456    if ( defined( $ENV{ 'INPATH' } ) ) { $inPath =  $ENV{'INPATH'}; }
457    else { installer::exiter::exit_program("ERROR: Environment variable \"INPATH\" not set!", "set_classpath_for_install_sdk"); }
458
459    if ( defined( $ENV{ 'UPDMINOREXT' } ) ) { $updMinorExt =  $ENV{'UPDMINOREXT'}; }
460
461    $installsdk = $solarVersion .  $installer::globals::separator . $inPath . $installer::globals::separator . "bin" . $updMinorExt;
462    $installsdk = $installsdk . $installer::globals::separator . "javainstaller";
463
464    if ( $ENV{'INSTALLSDK_SOURCE'} ) { $installsdk = $ENV{'INSTALLSDK_SOURCE'}; }   # overriding the Install SDK with INSTALLSDK_SOURCE
465
466    # The variable CLASSPATH has to contain:
467    # $installsdk/classes:$installsdk/classes/setupsdk.jar:
468    # $installsdk/classes/parser.jar:$installsdk/classes/jaxp.jar:
469    # $installsdk/classes/ldapjdk.jar:$directory
470
471    my @additional_classpath = ();
472    push(@additional_classpath, "$installsdk\/classes");
473    push(@additional_classpath, "$installsdk\/installsdk.jar");
474    push(@additional_classpath, "$installsdk\/classes\/parser.jar");
475    push(@additional_classpath, "$installsdk\/classes\/jaxp.jar");
476    push(@additional_classpath, "$directory");
477
478    my $newclasspathstring = "";
479    my $oldclasspathstring = "";
480    if ( $ENV{'CLASSPATH'} ) { $oldclasspathstring = $ENV{'CLASSPATH'}; }
481    else { $oldclasspathstring = "\."; }
482
483    for ( my $i = 0; $i <= $#additional_classpath; $i++ )
484    {
485        $newclasspathstring = $newclasspathstring . $additional_classpath[$i] . ":";
486    }
487
488    $newclasspathstring = $newclasspathstring . $oldclasspathstring;
489
490    $ENV{'CLASSPATH'} = $newclasspathstring;
491
492    my $infoline = "Setting CLASSPATH to $ENV{'CLASSPATH'}\n";
493    push( @installer::globals::logfileinfo, $infoline);
494}
495
496#######################################################
497# Setting the class file name in the Java locale file
498#######################################################
499
500sub set_classfilename
501{
502    my ($templatefile, $classfilename, $searchstring) = @_;
503
504    for ( my $j = 0; $j <= $#{$templatefile}; $j++ )
505    {
506        if ( ${$templatefile}[$j] =~ /\Q$searchstring\E/ )
507        {
508            ${$templatefile}[$j] =~ s/$searchstring/$classfilename/;
509            last;
510        }
511    }
512}
513
514#######################################################
515# Substituting one variable in the xml file
516#######################################################
517
518sub replace_one_variable
519{
520    my ($xmlfile, $variable, $searchstring) = @_;
521
522    for ( my $i = 0; $i <= $#{$xmlfile}; $i++ )
523    {
524        ${$xmlfile}[$i] =~ s/\$\{$searchstring\}/$variable/g;
525    }
526}
527
528#######################################################
529# Substituting the variables in the xml file
530#######################################################
531
532sub substitute_variables
533{
534    my ($xmlfile, $variableshashref) = @_;
535
536    my $key;
537
538    foreach $key (keys %{$variableshashref})
539    {
540        my $value = $variableshashref->{$key};
541        replace_one_variable($xmlfile, $value, $key);
542    }
543}
544
545##########################################################
546# Finding the line number in xml file of a special
547# component
548##########################################################
549
550sub find_component_line
551{
552    my ($xmlfile, $componentname) = @_;
553
554    my $linenumber = 0;
555
556    for ( my $i = 0; $i <= $#{$xmlfile}; $i++ )
557    {
558        if ( ${$xmlfile}[$i] =~ /name\s*\=\'\s*$componentname/ )
559        {
560            $linenumber = $i;
561            last;
562        }
563    }
564
565    return $linenumber;
566}
567
568##########################################################
569# Removing one package from the xml file
570##########################################################
571
572sub remove_package
573{
574    my ($xmlfile, $packagename) = @_;
575
576    my $searchstring = $packagename;
577    if ( $searchstring =~ /\-(\S+?)\s*$/ ) { $searchstring = $1; } # "SUNW%PRODUCTNAME-mailcap" -> "mailcap"
578
579    my $packagestring = "";
580    my $namestring = "";
581    my $infoline = "";
582
583    if ( $installer::globals::issolarispkgbuild )
584    {
585        $packagestring = "\<pkgunit";
586        $namestring = "pkgName";
587    }
588    elsif ( $installer::globals::islinuxrpmbuild )
589    {
590        $packagestring = "\<rpmunit";
591        $namestring = "rpmUniqueName";
592    }
593
594    my $removed_packge = 0;
595
596    for ( my $i = 0; $i <= $#{$xmlfile}; $i++ )
597    {
598        if ( ${$xmlfile}[$i] =~ /^\s*\Q$packagestring\E/ )
599        {
600            # this is a package, but is it the correct one?
601
602            my $do_delete = 0;
603            my $linecounter = 1;
604            my $startline = $i+1;
605            my $line = ${$xmlfile}[$startline];
606            if (($line =~ /^\s*\Q$namestring\E\s*\=/) && ($line =~ /\-\Q$searchstring\E/)) { $do_delete = 1; }
607
608            # but not deleting fonts package in language packs
609            if ( $line =~ /-ONELANGUAGE-/ ) { $do_delete = 0; }
610
611            my $endcounter = 0;
612
613            while ((!( $line =~ /\/\>/ )) && ( $startline <= $#{$xmlfile} ))
614            {
615                $linecounter++;
616                $startline++;
617                $line = ${$xmlfile}[$startline];
618                if (($line =~ /^\s*\Q$namestring\E\s*\=/) && ($line =~ /\-\Q$searchstring\E/)) { $do_delete = 1; }
619            }
620
621            $linecounter = $linecounter + 1;
622
623            if ( $do_delete )
624            {
625                my $infoline = "\tReally removing package $packagename from xml file.\n";
626                push( @installer::globals::logfileinfo, $infoline);
627                splice(@{$xmlfile},$i, $linecounter);   # removing $linecounter lines, beginning in line $i
628                $removed_packge = 1;
629                last;
630            }
631        }
632    }
633
634    if ( $removed_packge )
635    {
636        $infoline = "Package $packagename successfully removed from xml file.\n";
637        push( @installer::globals::logfileinfo, $infoline);
638    }
639    else
640    {
641        $infoline = "Did not find package $packagename in xml file.\n";
642        push( @installer::globals::logfileinfo, $infoline);
643    }
644
645}
646
647##########################################################
648# Removing one component from the xml file
649##########################################################
650
651sub remove_component
652{
653    my ($xmlfile, $componentname) = @_;
654
655    my @removed_lines = ();
656
657    push(@removed_lines, "\n");
658
659    for ( my $i = 0; $i <= $#{$xmlfile}; $i++ )
660    {
661        if ( ${$xmlfile}[$i] =~ /name\s*\=\'\s*$componentname/ )
662        {
663            # Counting the lines till the second "</component>"
664
665            push(@removed_lines, ${$xmlfile}[$i]);
666            my $linecounter = 1;
667            my $startline = $i+1;
668            my $line = ${$xmlfile}[$startline];
669            push(@removed_lines, $line);
670            my $endcounter = 0;
671
672            while ((!( $line =~ /^\s*\<\/component\>\s*$/ )) && ( $startline <= $#{$xmlfile} ))
673            {
674                $linecounter++;
675                $startline++;
676                $line = ${$xmlfile}[$startline];
677                push(@removed_lines, $line);
678            }
679
680            $linecounter = $linecounter + 2;     # last line and following empty line
681
682            splice(@{$xmlfile},$i, $linecounter);   # removing $linecounter lines, beginning in line $i
683            last;
684        }
685    }
686
687    return \@removed_lines;
688}
689
690##########################################################
691# If this is an installation set without language packs
692# the language pack module can be removed
693##########################################################
694
695sub remove_languagepack_from_xmlfile
696{
697    my ($xmlfile) = @_;
698
699    # Component begins with "<component selected="true" name='module_languagepacks' componentVersion="${PRODUCTVERSION}">"
700    # and ends with "</component>" (the second "</component>" !)
701
702    remove_component($xmlfile, "languagepack_DEFAULT");
703    remove_component($xmlfile, "languagepack_ONELANGUAGE");
704    remove_component($xmlfile, "module_languagepacks");
705}
706
707##########################################################
708# Duplicating a component
709##########################################################
710
711sub duplicate_component
712{
713    my ( $arrayref ) = @_;
714
715    @newarray = ();
716
717    for ( my $i = 0; $i <= $#{$arrayref}; $i++ )
718    {
719        push(@newarray, ${$arrayref}[$i]);
720    }
721
722    return \@newarray;
723}
724
725##########################################################
726# Including a component into the xml file
727# at a specified line
728##########################################################
729
730sub include_component_at_specific_line
731{
732    my ($xmlfile, $unit, $line) = @_;
733
734    splice(@{$xmlfile},$line, 0, @{$unit});
735}
736
737##########################################################
738# Font packages do not exist for all languages.
739##########################################################
740
741sub remove_font_package_from_unit
742{
743    my ( $unitcopy, $onelanguage ) = @_;
744
745    my $searchstring = "-fonts";
746
747    my $packagestring = "";
748    my $namestring = "";
749
750    if ( $installer::globals::issolarispkgbuild )
751    {
752        $packagestring = "\<pkgunit";
753        $namestring = "pkgName";
754    }
755    elsif ( $installer::globals::islinuxrpmbuild )
756    {
757        $packagestring = "\<rpmunit";
758        $namestring = "rpmUniqueName";
759    }
760
761    for ( my $i = 0; $i <= $#{$unitcopy}; $i++ )
762    {
763        if ( ${$unitcopy}[$i] =~ /^\s*\Q$packagestring\E/ )
764        {
765            # this is a package, but is it the correct one?
766
767            my $do_delete = 0;
768            my $linecounter = 1;
769            my $startline = $i+1;
770            my $line = ${$unitcopy}[$startline];
771            if (($line =~ /^\s*\Q$namestring\E\s*\=/) && ($line =~ /\Q$searchstring\E/)) { $do_delete = 1; }
772
773            my $endcounter = 0;
774
775            while ((!( $line =~ /\/\>/ )) && ( $startline <= $#{$unitcopy} ))
776            {
777                $linecounter++;
778                $startline++;
779                $line = ${$unitcopy}[$startline];
780                if (($line =~ /^\s*\Q$namestring\E\s*\=/) && ($line =~ /\Q$searchstring\E/)) { $do_delete = 1; }
781            }
782
783            $linecounter = $linecounter + 1;
784
785            if ( $do_delete )
786            {
787                splice(@{$unitcopy},$i, $linecounter);  # removing $linecounter lines, beginning in line $i
788                last;
789            }
790        }
791    }
792}
793
794##########################################################
795# If this is an installation set with language packs,
796# modules for each language pack have to be created
797# dynamically
798##########################################################
799
800sub duplicate_languagepack_in_xmlfile
801{
802    my ($xmlfile, $languagesarrayref) = @_;
803
804    my $unit = remove_component($xmlfile, "languagepack_ONELANGUAGE");
805    my $startline = find_component_line($xmlfile, "module_languagepacks");
806    my $infoline = "";
807    $startline = $startline + 1;
808
809    for ( my $i = 0; $i <= $#{$languagesarrayref}; $i++ )
810    {
811        my $onelanguage = ${$languagesarrayref}[$i];
812        my $unitcopy = duplicate_component($unit);
813
814        # replacing string ONELANGUAGE in the unit copy
815        for ( my $j = 0; $j <= $#{$unitcopy}; $j++ ) { ${$unitcopy}[$j] =~ s/ONELANGUAGE/$onelanguage/g; }
816
817        # including the unitcopy into the xml file
818        include_component_at_specific_line($xmlfile, $unitcopy, $startline);
819        $startline = $startline + $#{$unitcopy} + 1;
820    }
821
822    # adding the default language as language pack, too
823    $unit = remove_component($xmlfile, "languagepack_DEFAULT");
824    $startline = find_component_line($xmlfile, "module_languagepacks");
825    $startline = $startline + 1;
826
827    $onelanguage = ${$languagesarrayref}[0];
828    $unitcopy = duplicate_component($unit);
829
830    # replacing string DEFAULT in the unit copy
831    for ( my $j = 0; $j <= $#{$unitcopy}; $j++ ) { ${$unitcopy}[$j] =~ s/DEFAULT/$onelanguage/g; }
832
833    # including the unitcopy into the xml file
834    include_component_at_specific_line($xmlfile, $unitcopy, $startline);
835    $startline = $startline + $#{$unitcopy} + 1;
836}
837
838#######################################################
839# Removing empty packages from xml file. The names
840# are stored in @installer::globals::emptypackages
841#######################################################
842
843sub remove_empty_packages_in_xmlfile
844{
845    my ($xmlfile) = @_;
846
847    for ( my $i = 0; $i <= $#installer::globals::emptypackages; $i++ )
848    {
849        my $packagename = $installer::globals::emptypackages[$i];
850        my $infoline = "Try to remove package $packagename from xml file.\n";
851        push( @installer::globals::logfileinfo, $infoline);
852        remove_package($xmlfile, $packagename);
853    }
854}
855
856#######################################################
857# Preparing the language packs in the xml file
858#######################################################
859
860sub prepare_language_pack_in_xmlfile
861{
862    my ($xmlfile, $languagesarrayref) = @_;
863
864    # if ( ! $installer::globals::is_unix_multi )
865    # {
866    #   remove_languagepack_from_xmlfile($xmlfile);
867    # }
868    # else
869    # {
870        duplicate_languagepack_in_xmlfile($xmlfile, $languagesarrayref);
871    # }
872
873}
874
875#######################################################
876# Returning a rpm unit from a xml file
877#######################################################
878
879sub get_rpm_unit_from_xmlfile
880{
881    my ($rpmname, $xmlfile) = @_;
882
883    my $infoline = "Searching for $rpmname in xml file.\n";
884    push( @installer::globals::logfileinfo, $infoline);
885
886    my @rpmunit = ();
887    my $includeline = 0;
888    my $record = 0;
889    my $foundrpm = 0;
890
891    for ( my $i = 0; $i <= $#{$xmlfile}; $i++ )
892    {
893        my $oneline = ${$xmlfile}[$i];
894
895        if ( $oneline =~ /^\s*\<rpmunit/ ) { $record = 1; }
896
897        if ( $record ) { push(@rpmunit, $oneline); }
898
899        if ( $oneline =~ /^\s*rpmUniqueName\s*=\s*\"\Q$rpmname\E\"\s*$/ ) { $foundrpm = 1; }
900
901        if (( $record ) && ( $oneline =~ /\/\>\s*$/ )) { $record = 0; }
902
903        if (( ! $foundrpm ) && ( ! $record )) { @rpmunit = (); }
904
905        if (( $foundrpm ) && ( ! $record )) { $includeline = $i + 1; }
906
907        if (( $foundrpm ) && ( ! $record )) { last; }
908    }
909
910    if ( ! $foundrpm ) { installer::exiter::exit_program("ERROR: Did not find rpmunit $rpmname in xml file!", "get_rpm_unit_from_xmlfile"); }
911
912    $infoline = "Found $rpmname in xml file. Returning block lines: $#rpmunit + 1. Includeline: $includeline \n";
913    push( @installer::globals::logfileinfo, $infoline);
914
915    return (\@rpmunit, $includeline);
916}
917
918#######################################################
919# Exchanging package names in xml file
920#######################################################
921
922sub exchange_name_in_rpmunit
923{
924    my ($rpmunit, $oldpackagename, $newpackagename) = @_;
925
926    for ( my $i = 0; $i <= $#{$rpmunit}; $i++ )
927    {
928        ${$rpmunit}[$i] =~ s/$oldpackagename/$newpackagename/;
929    }
930}
931
932#######################################################
933# Preparing link RPMs in the xml file
934#######################################################
935
936sub prepare_linkrpm_in_xmlfile
937{
938    my ($xmlfile, $rpmlist) = @_;
939
940    for ( my $i = 0; $i <= $#{$rpmlist}; $i++ )
941    {
942        my $oldpackagename = "";
943        my $newpackagename = "";
944
945        my $rpmline = ${$rpmlist}[$i];
946
947        my $infoline = "Preparing link/patch RPM: $rpmline\n";
948        push( @installer::globals::logfileinfo, $infoline);
949
950        if ( $rpmline =~ /^\s*(\S.*?\S)\s+(\S.*?\S)\s*$/ )
951        {
952            $oldpackagename = $1;
953            $newpackagename = $2;
954        }
955
956        my ($rpmunit, $includeline) = get_rpm_unit_from_xmlfile($oldpackagename, $xmlfile);
957        exchange_name_in_rpmunit($rpmunit, $oldpackagename, $newpackagename);
958        include_component_at_specific_line($xmlfile, $rpmunit, $includeline);
959    }
960}
961
962#######################################################################
963# Removing w4w filter module from xml file for Solaris x86 and Linux
964#######################################################################
965
966sub remove_w4w_from_xmlfile
967{
968    my ($xmlfile) = @_;
969
970    # Component begins with "<component selected='true' name='gid_Module_Prg_Wrt_Flt_W4w' componentVersion="8">"
971    # and ends with "</component>"
972
973    for ( my $i = 0; $i <= $#{$xmlfile}; $i++ )
974    {
975        if ( ${$xmlfile}[$i] =~ /name\s*\=\'\s*gid_Module_Prg_Wrt_Flt_W4w/ )
976        {
977            # Counting the lines till "</component>"
978
979            my $linecounter = 1;
980            my $startline = $i+1;
981            my $line = ${$xmlfile}[$startline];
982
983            while ((!( $line =~ /^\s*\<\/component\>\s*$/ )) && ( $startline <= $#{$xmlfile} ))
984            {
985                $linecounter++;
986                $startline++;
987                $line = ${$xmlfile}[$startline];
988            }
989
990            $linecounter = $linecounter + 2;     # last line and following empty line
991
992            splice(@{$xmlfile},$i, $linecounter);   # removing $linecounter lines, beginning in line $i
993            last;
994        }
995    }
996}
997
998#######################################################################
999# Removing module from xml file, if not defined in scp
1000#######################################################################
1001
1002sub remove_scpgid_from_xmlfile
1003{
1004    my ($xmlfile, $scpgid) = @_;
1005
1006    # Component begins with "<component selected='true' name='$scpgid' componentVersion="8">"
1007    # and ends with "</component>"
1008
1009    my $successfully_removed = 0;
1010
1011    for ( my $i = 0; $i <= $#{$xmlfile}; $i++ )
1012    {
1013        if ( ${$xmlfile}[$i] =~ /name\s*\=\'\s*\Q$scpgid\E/ )
1014        {
1015            # Counting the lines till "</component>"
1016
1017            my $linecounter = 1;
1018            my $startline = $i+1;
1019            my $line = ${$xmlfile}[$startline];
1020
1021            while ((!( $line =~ /^\s*\<\/component\>\s*$/ )) && ( $startline <= $#{$xmlfile} ))
1022            {
1023                $linecounter++;
1024                $startline++;
1025                $line = ${$xmlfile}[$startline];
1026            }
1027
1028            $linecounter = $linecounter + 2;     # last line and following empty line
1029
1030            splice(@{$xmlfile},$i, $linecounter);   # removing $linecounter lines, beginning in line $i
1031            $successfully_removed = 1;
1032            last;
1033        }
1034    }
1035
1036    my $infoline = "";
1037    if ($successfully_removed)
1038    {
1039        $infoline = "Module $scpgid successfully removed from xml file.\n";
1040        push( @installer::globals::logfileinfo, $infoline);
1041    }
1042    else
1043    {
1044        $infoline = "Module $scpgid not found in xml file (no problem).\n";
1045        push( @installer::globals::logfileinfo, $infoline);
1046    }
1047}
1048
1049#######################################################################
1050# Special mechanism for removing modules for xml file, if they are
1051# not defined in scp (introduced for onlineupdate module).
1052#######################################################################
1053
1054sub remove_module_if_not_defined
1055{
1056    my ($xmlfile, $modulesarrayref, $scpgid) = @_;
1057
1058    my $infoline = "Checking existence of $scpgid in scp definition\n";
1059    push( @installer::globals::logfileinfo, $infoline);
1060
1061    my $found = 0;
1062
1063    for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ )
1064    {
1065        my $onemodule = ${$modulesarrayref}[$i];
1066        if ( $onemodule->{'gid'} eq $scpgid ) { $found = 1; }
1067        if ( $found ) { last; }
1068    }
1069
1070    if ( ! $found )
1071    {
1072        $infoline = "Module $scpgid not found -> Removing from xml file.\n";
1073        push( @installer::globals::logfileinfo, $infoline);
1074        remove_scpgid_from_xmlfile($xmlfile, $scpgid);
1075    }
1076}
1077
1078###########################################################
1079# Preparing the package subdirectory
1080###########################################################
1081
1082sub create_empty_packages
1083{
1084    my ( $xmlfile ) = @_;
1085
1086    if ( $installer::globals::issolarispkgbuild )
1087    {
1088        my $path = "";
1089
1090        for ( my $i = 0; $i <= $#{$xmlfile}; $i++ )
1091        {
1092            if ( ${$xmlfile}[$i] =~ /pkgRelativePath\s*\=\s*\'(.*?)\'\s*$/ )
1093            {
1094                $path = $1;
1095                installer::systemactions::create_directory_structure($path);
1096                last;   # only creating one path
1097            }
1098        }
1099
1100        for ( my $i = 0; $i <= $#{$xmlfile}; $i++ )
1101        {
1102            if ( ${$xmlfile}[$i] =~ /pkgName\s*\=\s*\'(.*?)\'\s*$/ )
1103            {
1104                my $pkgname = $1;
1105                if ( $path ne "" ) { $pkgname = $path . $installer::globals::separator . $pkgname; }
1106                installer::systemactions::create_directory_structure($pkgname);
1107            }
1108        }
1109    }
1110
1111    # "-novalidate" does not work for Linux RPMs
1112
1113    if ( $installer::globals::islinuxrpmbuild )
1114    {
1115        for ( my $i = 0; $i <= $#{$xmlfile}; $i++ )
1116        {
1117            if ( ${$xmlfile}[$i] =~ /rpmPath\s*\=\s*\"(.*?)\"\s*$/ )
1118            {
1119                my $rpmpath = $1;
1120                my $path = "";
1121
1122                if ( $rpmpath =~ /^\s*(.*)\/(.*?)\s*$/ )
1123                {
1124                    $path = $1;
1125                }
1126
1127                if ( $path ne "" ) { installer::systemactions::create_directory_structure($path); }
1128
1129                my $systemcall = "touch $rpmpath";  # creating empty rpm
1130                system($systemcall);
1131            }
1132        }
1133    }
1134}
1135
1136###########################################################
1137# Reading the archive file name from the xml file
1138###########################################################
1139
1140sub get_archivefilename
1141{
1142    my ( $xmlfile ) = @_;
1143
1144    my $archivefilename = "";
1145
1146    for ( my $j = 0; $j <= $#{$xmlfile}; $j++ )
1147    {
1148        if ( ${$xmlfile}[$j] =~ /archiveFileName\s*=\s*\'(.*?)\'/ )
1149        {
1150            $archivefilename = $1;
1151            last;
1152        }
1153    }
1154
1155    return $archivefilename;
1156}
1157
1158#######################################################
1159# Copying the loader locally
1160#######################################################
1161
1162sub copy_setup_locally
1163{
1164    my ($includepatharrayref, $loadername, $newname) = @_;
1165
1166    my $loadernameref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$loadername, $includepatharrayref, 0);
1167
1168    if ($$loadernameref eq "") { installer::exiter::exit_program("ERROR: Could not find Java loader $loadername!", "copy_setup_locally"); }
1169
1170    installer::systemactions::copy_one_file($$loadernameref, $newname);
1171    my $localcall = "chmod 775 $newname \>\/dev\/null 2\>\&1";
1172    system($localcall);
1173}
1174
1175
1176#######################################################
1177# Copying the loader into the installation set
1178#######################################################
1179
1180sub put_loader_into_installset
1181{
1182    my ($installdir, $filename) = @_;
1183
1184    my $installname = $installdir . $installer::globals::separator . $filename;
1185
1186    installer::systemactions::copy_one_file($filename, $installname);
1187
1188    my $localcall = "chmod 775 $installname \>\/dev\/null 2\>\&1";
1189    system($localcall);
1190}
1191
1192#################################################################
1193# Setting for Solaris the package names in the Java translation
1194# file. The name is used for the
1195# This name is displayed tools like prodreg.
1196# Unfortunately this name in the component is also used
1197# in the translation template file for the module name
1198# and module description translations.
1199#################################################################
1200
1201sub replace_component_name_in_java_file
1202{
1203    my ($alljavafiles, $oldname, $newname) = @_;
1204
1205    # The new name must not contain white spaces
1206
1207    $newname =~ s/ /\_/g;
1208
1209    for ( my $i = 0; $i <= $#{$alljavafiles}; $i++ )
1210    {
1211        my $javafilename = ${$alljavafiles}[$i];
1212        my $javafile = installer::files::read_file($javafilename);
1213
1214        my $oldstring = "ComponentDescription-" . $oldname;
1215        my $newstring = "ComponentDescription-" . $newname;
1216
1217        for ( my $j = 0; $j <= $#{$javafile}; $j++ ) { ${$javafile}[$j] =~ s/\b$oldstring\b/$newstring/; }
1218
1219        $oldstring = $oldname . "-install-DisplayName";
1220        $newstring = $newname . "-install-DisplayName";
1221
1222        for ( my $j = 0; $j <= $#{$javafile}; $j++ ) { ${$javafile}[$j] =~ s/\b$oldstring\b/$newstring/; }
1223
1224        $oldstring = $oldname . "-uninstall-DisplayName";
1225        $newstring = $newname . "-uninstall-DisplayName";
1226
1227        for ( my $j = 0; $j <= $#{$javafile}; $j++ ) { ${$javafile}[$j] =~ s/\b$oldstring\b/$newstring/; }
1228
1229        installer::files::save_file($javafilename, $javafile);
1230        $infoline = "Changes in Java file: $javafilename : $oldname \-\> $newname\n";
1231        push( @installer::globals::logfileinfo, $infoline);
1232    }
1233}
1234
1235#################################################################
1236# Some module names are not defined in the scp project.
1237# The names for this modules are searched in the base Java
1238# translation file.
1239#################################################################
1240
1241sub get_module_name_from_basejavafile
1242{
1243    my ($componentname, $javatemplateorigfile, $ulffile) = @_;
1244
1245    my $searchname = $componentname . "-install-DisplayName";
1246    my $modulename = "";
1247    my $replacename = "";
1248
1249    # line content: { "coremodule-install-DisplayName", "OOO_INSTALLSDK_117" },
1250
1251    for ( my $i = 0; $i <= $#{$javatemplateorigfile}; $i++ )
1252    {
1253        if ( ${$javatemplateorigfile}[$i] =~ /\"\s*\Q$searchname\E\s*\"\s*\,\s*\"\s*(.*?)\s*\"\s*\}\s*\,\s*$/ )
1254        {
1255            $replacename = $1;
1256            last;
1257        }
1258    }
1259
1260    if ( $replacename ne "" )
1261    {
1262        my $language_block = get_language_block_from_language_file($replacename, $ulffile);
1263        $modulename = get_language_string_from_language_block($language_block, "en-US", $replacename);
1264    }
1265
1266    return $modulename;
1267}
1268
1269#################################################################
1270# Setting for Solaris the package names in the xml file.
1271# This name is displayed tools like prodreg.
1272# Unfortunately this name in the component is also used
1273# in the translation template file for the module name
1274# and module description translations.
1275#################################################################
1276
1277sub replace_component_names
1278{
1279    my ($xmlfile, $templatefilename, $modulesarrayref, $javatemplateorigfile, $ulffile) = @_;
1280
1281    # path in which all java languages files are located
1282
1283    my $javafilesdir = $templatefilename;
1284    installer::pathanalyzer::get_path_from_fullqualifiedname(\$javafilesdir);
1285    my $alljavafiles = installer::systemactions::find_file_with_file_extension("java", $javafilesdir);
1286    for ( my $i = 0; $i <= $#{$alljavafiles}; $i++ ) { ${$alljavafiles}[$i] = $javafilesdir . ${$alljavafiles}[$i]; }
1287
1288    # analyzing the xml file
1289
1290    for ( my $i = 0; $i <= $#{$xmlfile}; $i++ )
1291    {
1292        my $newstring = "";
1293        my $componentname = "";
1294
1295        if ( ${$xmlfile}[$i] =~ /\bcomponent\b.*\bname\s*\=\'\s*(.*?)\s*\'/ )
1296        {
1297            $componentname = $1;
1298
1299            # Getting module name from the scp files in $modulesarrayref
1300
1301            my $onelanguage = "en-US";
1302            my $gid = $componentname;
1303            my $type = "Name";
1304
1305            my $modulename = "";
1306            $modulename = get_module_name_description($modulesarrayref, $onelanguage, $gid, $type);
1307
1308            if ( $modulename eq "" )
1309            {
1310                $infoline = "Info: Modulename for $gid not defined in modules collector. Looking in Java ulf file.\n";
1311                push( @installer::globals::logfileinfo, $infoline);
1312            }
1313
1314            if ( $modulename eq "" ) # the modulename can also be set in the Java ulf file
1315            {
1316                $modulename = get_module_name_from_basejavafile($componentname, $javatemplateorigfile, $ulffile);
1317            }
1318
1319            if ( $modulename ne "" )    # only do something, if the modulename was found
1320            {
1321                ${$xmlfile}[$i] =~ s/$componentname/$modulename/;
1322
1323                $infoline = "Replacement in xml file (Solaris): $componentname \-\> $modulename\n";
1324                push( @installer::globals::logfileinfo, $infoline);
1325
1326                # Replacement has to be done in all Java language files
1327                replace_component_name_in_java_file($alljavafiles, $componentname, $modulename);
1328            }
1329
1330            if ( $modulename eq "" ) # the modulename can also be set in the Java ulf file
1331            {
1332                $infoline = "WARNING: No replacement in xml file for component: $componentname\n";
1333                push( @installer::globals::logfileinfo, $infoline);
1334            }
1335        }
1336    }
1337}
1338
1339#############################################################################
1340# Collecting all packages or rpms located in the installation directory
1341#############################################################################
1342
1343sub get_all_packages_in_installdir
1344{
1345    my ($installdir, $subdir) = @_;
1346
1347    my $infoline = "";
1348
1349    my @allrpms = ();   # not needed for Solaris at the moment
1350    my $allrpms = \@allrpms;
1351
1352    $installdir =~ s/\Q$installer::globals::separator\E\s*$//;
1353    my $directory = $installdir . $installer::globals::separator . $subdir;
1354    $directory =~ s/\Q$installer::globals::separator\E\s*$//;
1355
1356    if ( $installer::globals::islinuxrpmbuild )
1357    {
1358        $allrpms = installer::systemactions::find_file_with_file_extension("rpm", $directory);
1359
1360        # collecting rpms with the complete path
1361
1362        for ( my $i = 0; $i <= $#{$allrpms}; $i++ )
1363        {
1364            ${$allrpms}[$i] = $directory . $installer::globals::separator . ${$allrpms}[$i];
1365            $infoline = "Found RPM: ${$allrpms}[$i]\n";
1366            push( @installer::globals::logfileinfo, $infoline);
1367        }
1368    }
1369
1370    return $allrpms;
1371}
1372
1373#######################################################
1374# Adding the values of the array
1375#######################################################
1376
1377sub do_sum
1378{
1379    my ( $allnumbers ) = @_;
1380
1381    my $sum = 0;
1382
1383    for ( my $i = 0; $i <= $#{$allnumbers}; $i++ )
1384    {
1385        $sum = $sum + ${$allnumbers}[$i];
1386    }
1387
1388    return $sum;
1389}
1390
1391#######################################################
1392# Setting the filesize for the RPMs in the xml file
1393#######################################################
1394
1395sub set_filesize_in_xmlfile
1396{
1397    my ($filesize, $rpmname, $xmlfile) = @_;
1398
1399    my $infoline = "";
1400    my $foundrpm = 0;
1401    my $filesizeset = 0;
1402
1403    for ( my $i = 0; $i <= $#{$xmlfile}; $i++ )
1404    {
1405        my $line = ${$xmlfile}[$i];
1406
1407        # searching for "rpmPath="RPMS/${UNIXPRODUCTNAME}-core01-${PACKAGEVERSION}-${PACKAGEREVISION}.i586.rpm""
1408
1409        if (( $line =~ /rpmPath\s*=/ ) && ( $line =~ /\Q$rpmname\E\"\s*$/ ))
1410        {
1411            $foundrpm = 1;
1412
1413            my $number = $i;
1414            $number++;
1415
1416            while ( ! ( ${$xmlfile}[$number] =~ /\/\>\s*$/ ))
1417            {
1418                if ( ${$xmlfile}[$number] =~ /FILESIZEPLACEHOLDER/ )
1419                {
1420                    ${$xmlfile}[$number] =~ s/FILESIZEPLACEHOLDER/$filesize/;
1421                    $filesizeset = 1;
1422                    $infoline = "Setting filesize for $rpmname : $filesize\n";
1423                    push( @installer::globals::logfileinfo, $infoline);
1424                    last;
1425                }
1426
1427                $number++;
1428            }
1429
1430            last;
1431        }
1432    }
1433
1434    if ( ! $foundrpm )
1435    {
1436        $infoline = "ERROR: Did not find $rpmname in xml file !\n";
1437        push( @installer::globals::logfileinfo, $infoline);
1438    }
1439
1440    if ( ! $filesizeset )
1441    {
1442        $infoline = "ERROR: Did not set filesize for $rpmname in xml file !\n";
1443        push( @installer::globals::logfileinfo, $infoline);
1444    }
1445}
1446
1447############################################################
1448# Collecting all rpmUniqueName in xml file.
1449############################################################
1450
1451sub collect_uniquenames_in_xmlfile
1452{
1453    my ($xmlfile) = @_;
1454
1455    my @rpmuniquenames = ();
1456
1457    for ( my $i = 0; $i <= $#{$xmlfile}; $i++ )
1458    {
1459        my $oneline = ${$xmlfile}[$i];
1460
1461        if ( $oneline =~ /^\s*rpmUniqueName\s*\=\s*\"(.*)\"\s*$/ )
1462        {
1463            my $rpmuniquename = $1;
1464            push(@rpmuniquenames, $rpmuniquename)
1465        }
1466    }
1467
1468    return \@rpmuniquenames;
1469}
1470
1471############################################################
1472# Searching for the corresponding rpm, that fits to
1473# the unique rpm name.
1474# Simple mechanism: The name of the rpm starts with the
1475# unique rpm name followed by a "-".
1476############################################################
1477
1478sub find_rpmname_to_uniquename
1479{
1480    my ($uniquename, $listofpackages) = @_;
1481
1482    my @all_correct_rpms = ();
1483    my $infoline = "";
1484
1485    # special handling for java RPMs, which have a very strange naming schema
1486    my $localuniquename = $uniquename;
1487    if ( $uniquename =~ /^\s*jre\-/ ) { $localuniquename = "jre"; }
1488
1489    for ( my $i = 0; $i <= $#{$listofpackages}; $i++ )
1490    {
1491        my $completerpmname = ${$listofpackages}[$i];
1492        my $rpmname = $completerpmname;
1493        installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$rpmname);
1494
1495        if ( $rpmname =~ /^\s*\Q$localuniquename\E\-\d/ ) { push(@all_correct_rpms, $rpmname); }
1496    }
1497
1498    # @all_correct_rpms has to contain exactly one value
1499
1500    if ( $#all_correct_rpms > 0 )
1501    {
1502        my $number = $#all_correct_rpms + 1;
1503        $infoline = "There are $number RPMs for the unique name \"$uniquename\" :\n";
1504        push( @installer::globals::logfileinfo, $infoline);
1505        my $allrpmstring = "";
1506        for ( my $i = 0; $i <= $#all_correct_rpms; $i++ ) { $allrpmstring = $allrpmstring . $all_correct_rpms[$i] . "\n"; }
1507        push( @installer::globals::logfileinfo, $allrpmstring);
1508        installer::exiter::exit_program("ERROR: Found $number RPMs that start with unique name \"$uniquename\". Only one allowed!", "find_rpmname_to_uniquename");
1509    }
1510
1511    if ( $#all_correct_rpms < 0 )
1512    {
1513        $infoline = "There is no rpm for the unique name \"$uniquename\"\n";
1514        push( @installer::globals::logfileinfo, $infoline);
1515        installer::exiter::exit_program("ERROR: There is no RPM that start with unique name \"$uniquename\"!", "find_rpmname_to_uniquename");
1516    }
1517
1518    if ( $#all_correct_rpms == 0 )
1519    {
1520        $infoline = "Found one rpm for the unique name \"$uniquename\" : $all_correct_rpms[0]\n";
1521        push( @installer::globals::logfileinfo, $infoline);
1522    }
1523
1524    return $all_correct_rpms[0];
1525}
1526
1527#######################################################
1528# Including the complete RPM name into the xml file
1529#######################################################
1530
1531sub set_rpmname_into_xmlfile
1532{
1533    my ($rpmname, $uniquename, $xmlfile) = @_;
1534
1535    my $foundrpm = 0;
1536    my $rpmnameset = 0;
1537
1538    for ( my $i = 0; $i <= $#{$xmlfile}; $i++ )
1539    {
1540        my $oneline = ${$xmlfile}[$i];
1541
1542        if ( $oneline =~ /^\s*rpmUniqueName\s*\=\s*\"\Q$uniquename\E\"\s*$/ )
1543        {
1544            $foundrpm = 1;
1545
1546            my $number = $i;
1547            $number++;
1548
1549            while ( ! ( ${$xmlfile}[$number] =~ /\/\>\s*$/ ))
1550            {
1551                if ( ${$xmlfile}[$number] =~ /RPMFILENAMEPLACEHOLDER/ )
1552                {
1553                    ${$xmlfile}[$number] =~ s/RPMFILENAMEPLACEHOLDER/$rpmname/;
1554                    $rpmnameset = 1;
1555                    $infoline = "Setting RPM name for $uniquename : $rpmname\n";
1556                    push( @installer::globals::logfileinfo, $infoline);
1557                    last;
1558                }
1559
1560                $number++;
1561            }
1562
1563            last;
1564        }
1565    }
1566
1567    if ( ! $foundrpm )
1568    {
1569        $infoline = "ERROR: Did not find $rpmname in xml file !\n";
1570        push( @installer::globals::logfileinfo, $infoline);
1571    }
1572
1573    if ( ! $rpmnameset )
1574    {
1575        $infoline = "ERROR: Did not set rpm name for $uniquename in xml file !\n";
1576        push( @installer::globals::logfileinfo, $infoline);
1577    }
1578
1579}
1580
1581############################################################
1582# Including the rpm path dynamically into the xml file.
1583# This is introduced, because system integration has
1584# variable PackageVersion and PackageRevision in xml file.
1585############################################################
1586
1587sub put_rpmpath_into_xmlfile
1588{
1589    my ($xmlfile, $listofpackages) = @_;
1590
1591    my $infoline = "";
1592
1593    my $alluniquenames = collect_uniquenames_in_xmlfile($xmlfile);
1594
1595    my $number = $#{$listofpackages} + 1;
1596    $infoline = "Number of packages in installation set: $number\n";
1597    push( @installer::globals::logfileinfo, $infoline);
1598    $number = $#{$alluniquenames} + 1;
1599    $infoline = "Number of unique RPM names in xml file: $number\n";
1600    push( @installer::globals::logfileinfo, $infoline);
1601
1602    $infoline = "\nPackages in installation set:\n";
1603    push( @installer::globals::logfileinfo, $infoline);
1604    for ( my $i = 0; $i <= $#{$listofpackages}; $i++ )
1605    {
1606        $infoline = "${$listofpackages}[$i]\n";
1607        push( @installer::globals::logfileinfo, $infoline);
1608    }
1609
1610    $infoline = "\nUnique RPM names in xml file:\n";
1611    push( @installer::globals::logfileinfo, $infoline);
1612    for ( my $i = 0; $i <= $#{$alluniquenames}; $i++ )
1613    {
1614        $infoline = "${$alluniquenames}[$i]\n";
1615        push( @installer::globals::logfileinfo, $infoline);
1616    }
1617
1618    if ( $#{$alluniquenames} != $#{$listofpackages} ) { installer::exiter::exit_program("ERROR: xml file contains $#{$alluniquenames} unique names, but there are $#{$listofpackages} packages in installation set!", "put_rpmpath_into_xmlfile"); }
1619
1620    for ( my $i = 0; $i <= $#{$alluniquenames}; $i++ )
1621    {
1622        my $uniquename = ${$alluniquenames}[$i];
1623        my $rpmname = find_rpmname_to_uniquename($uniquename, $listofpackages);
1624        set_rpmname_into_xmlfile($rpmname, $uniquename, $xmlfile);
1625    }
1626}
1627
1628#######################################################
1629# Including the file size of the rpms into the
1630# xml file
1631#######################################################
1632
1633sub put_filesize_into_xmlfile
1634{
1635    my ($xmlfile, $listofpackages) = @_;
1636
1637    my $infoline = "";
1638
1639    for ( my $i = 0; $i <= $#{$listofpackages}; $i++ )
1640    {
1641        my $completerpmname = ${$listofpackages}[$i];
1642        my $rpmname = $completerpmname;
1643        installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$rpmname);
1644
1645        if ( ! $installer::globals::rpmquerycommand ) { installer::exiter::exit_program("ERROR: rpm not found for querying packages!", "put_filesize_into_xmlfile"); }
1646        my $systemcall = "$installer::globals::rpmquerycommand -qp --queryformat \"\[\%\{FILESIZES\}\\n\]\" $completerpmname 2\>\&1 |";
1647        my $rpmout = make_systemcall($systemcall, 0);
1648        my $filesize = do_sum($rpmout);
1649
1650        $infoline = "Filesize $rpmname : $filesize\n";
1651        push( @installer::globals::logfileinfo, $infoline);
1652
1653        set_filesize_in_xmlfile($filesize, $rpmname, $xmlfile);
1654    }
1655}
1656
1657#######################################################
1658# Creating the java installer class file dynamically
1659#######################################################
1660
1661sub create_java_installer
1662{
1663    my ( $installdir, $newdir, $languagestringref, $languagesarrayref, $allvariableshashref, $includepatharrayref, $modulesarrayref ) = @_;
1664
1665    installer::logger::include_header_into_logfile("Creating Java installer:");
1666
1667    my $infoline = "";
1668
1669    # collecting all packages or rpms located in the installation directory
1670    my $listofpackages = get_all_packages_in_installdir($installdir, $newdir);
1671
1672    # creating the directory
1673    my $javadir = installer::systemactions::create_directories("javainstaller", $languagestringref);
1674    $javadir =~ s/\/\s*$//;
1675#   push(@installer::globals::removedirs, $javadir);
1676
1677    # copying the content from directory install_sdk into the java directory
1678
1679    my $projectroot = "";
1680    if ( $ENV{'PRJ'} ) { $projectroot = $ENV{'PRJ'}; }
1681    else { installer::exiter::exit_program("ERROR: Environment variable PRJ not set", "create_java_installer"); }
1682
1683    $projectroot =~ s/\/\s*$//;
1684    my $sourcedir = "$projectroot/inc_global/unix/install_sdk";
1685    installer::systemactions::copy_complete_directory_without_cvs($sourcedir, $javadir);
1686
1687    # determining the java template file
1688
1689    my $templatefilename = $javadir . $installer::globals::separator . "locale/resources/MyResources_template.java";
1690
1691    # Saving the content of the template file. It is used in the xml files
1692
1693    my $javatemplateorigfile = installer::files::read_file($templatefilename);
1694
1695    # determining the ulf language file
1696
1697    # my $ulffilename = "installsdk.ulf";
1698    my $ulffilename = "installsdk.jlf";
1699    $ulffilename = $installer::globals::javalanguagepath . $installer::globals::separator . $ulffilename;
1700    my $ulffile = installer::files::read_file($ulffilename);
1701
1702    $infoline = "\nReading ulf file: $ulffilename\n";
1703    push( @installer::globals::logfileinfo, $infoline);
1704
1705    $infoline = "Translating the Java template file\n";
1706    push( @installer::globals::logfileinfo, $infoline);
1707
1708    for ( my $i = 0; $i <= $#{$languagesarrayref}; $i++ )
1709    {
1710        my $onelanguage = ${$languagesarrayref}[$i];
1711
1712        # replacing all strings in the Java file with content of ulf files
1713
1714        my $templatefile = installer::files::read_file($templatefilename);
1715
1716        set_component_name_and_description($templatefile, $modulesarrayref, $onelanguage);
1717        translate_javafile($templatefile, $ulffile, $onelanguage);
1718
1719        # adding the license file into the Java file
1720
1721        my $licensefilesource = get_licensefilesource($onelanguage, $includepatharrayref);
1722        my $licensefile = installer::files::read_file($licensefilesource);
1723        add_license_file_into_javafile($templatefile, $licensefile, $includepatharrayref, $javadir, $onelanguage);
1724
1725        # setting productname and productversion
1726
1727        set_productname_and_productversion($templatefile, $allvariableshashref);
1728
1729        # setting the class name in the java file ( "MyResources_TEMPLATE" -> "MyResources_en" )
1730
1731        # if ( $onelanguage =~ /^\s*(\w+)\-(\w+)\s*$/ ) { $onelanguage = $1; }
1732        $onelanguage =~ s/en-US/en/;    # java file name and class name contain only "_en"
1733        $onelanguage =~ s/\-/\_/;       # "pt-BR" -> "pt_BR"
1734        my $classfilename = "MyResources_" . $onelanguage;
1735        set_classfilename($templatefile, $classfilename, "MyResources_TEMPLATE");
1736
1737        # saving the new file
1738
1739        my $newfilename = $templatefilename;
1740        $newfilename =~ s/_template\.java\s*$/_$onelanguage\.java/;
1741
1742        installer::files::save_file($newfilename, $templatefile);
1743
1744        $infoline = "Saving Java file: $newfilename\n";
1745        push( @installer::globals::logfileinfo, $infoline);
1746    }
1747
1748    # renaming one language java file to "MyResources.java"
1749
1750    my $baselanguage = installer::languages::get_default_language($languagesarrayref);
1751    $baselanguage =~ s/\-/\_/;      # "pt-BR" -> "pt_BR"
1752    $baselanguage =~ s/en_US/en/;   # java file name and class name contain only "_en"
1753    # if ( $baselanguage =~ /^\s*(\w+)\-(\w+)\s*$/ ) { $baselanguage = $1; }     # java file name and class name contain only "_en"
1754    # $baselanguage =~ s/en-US/en/;  # java file name and class name contain only "_en"
1755    my $baselanguagefilename = $javadir . $installer::globals::separator . "locale/resources/MyResources_" . $baselanguage . "\.java";
1756    my $basedestfilename = $javadir . $installer::globals::separator . "locale/resources/MyResources.java";
1757    installer::systemactions::copy_one_file($baselanguagefilename, $basedestfilename);
1758
1759    # setting the class file name also for the base class
1760
1761    my $basetemplatefile = installer::files::read_file($basedestfilename);
1762    my $oldclassfilename = $baselanguagefilename;
1763    installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$oldclassfilename);
1764    $oldclassfilename =~ s/\.java//;
1765    my $newclassfilename = $basedestfilename;
1766    installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$newclassfilename);
1767    $newclassfilename =~ s/\.java//;
1768
1769    set_classfilename($basetemplatefile, $newclassfilename, $oldclassfilename);
1770
1771    installer::files::save_file($basedestfilename, $basetemplatefile);
1772
1773    $infoline = "Created base Java file: $basedestfilename\n";
1774    push( @installer::globals::logfileinfo, $infoline);
1775
1776    # deleting the template file
1777
1778    unlink($templatefilename);
1779
1780    $infoline = "Deleted template Java resource file: $templatefilename\n";
1781    push( @installer::globals::logfileinfo, $infoline);
1782
1783    # changing into Java directory
1784
1785    my $from = cwd();
1786
1787    chdir($javadir);
1788
1789    $infoline = "Changing into directory: $javadir\n";
1790    push( @installer::globals::logfileinfo, $infoline);
1791
1792    # preparing the xml file
1793
1794    my $xmlfilename = "";
1795    my $subdir = "";
1796
1797    if ( $installer::globals::issolarispkgbuild )
1798    {
1799        $xmlfilename = "pkgUnit.xml";
1800    }
1801    elsif ( $installer::globals::islinuxrpmbuild )
1802    {
1803        $xmlfilename = "rpmUnit.xml";
1804    }
1805    else
1806    {
1807        installer::exiter::exit_program("ERROR: No platform for Install SDK", "create_java_installer");
1808    }
1809
1810    # reading, editing and saving the xmlfile
1811
1812    my $xmlfile = installer::files::read_file($xmlfilename);
1813    prepare_language_pack_in_xmlfile($xmlfile, $languagesarrayref);
1814    my $xmlfilename2 = $xmlfilename . ".test2";
1815    installer::files::save_file($xmlfilename2, $xmlfile);
1816    remove_empty_packages_in_xmlfile($xmlfile);
1817    my $xmlfilename3 = $xmlfilename . ".test3";
1818    installer::files::save_file($xmlfilename3, $xmlfile);
1819    substitute_variables($xmlfile, $allvariableshashref);
1820    if (( $installer::globals::islinuxrpmbuild ) && ( $#installer::globals::linkrpms > -1 )) { prepare_linkrpm_in_xmlfile($xmlfile,\@installer::globals::linkrpms); }
1821    if ( $installer::globals::issolarisx86build || $installer::globals::islinuxbuild ) { remove_w4w_from_xmlfile($xmlfile); }
1822    remove_module_if_not_defined($xmlfile, $modulesarrayref, "gid_Module_Optional_Onlineupdate");
1823    replace_component_names($xmlfile, $templatefilename, $modulesarrayref, $javatemplateorigfile, $ulffile);
1824    my $xmlfilename4 = $xmlfilename . ".test4";
1825    installer::files::save_file($xmlfilename4, $xmlfile);
1826    if ( $installer::globals::islinuxrpmbuild ) { put_rpmpath_into_xmlfile($xmlfile, $listofpackages); }
1827    if ( $installer::globals::islinuxrpmbuild ) { put_filesize_into_xmlfile($xmlfile, $listofpackages); }
1828    installer::files::save_file($xmlfilename, $xmlfile);
1829    $infoline = "Saving xml file: $xmlfilename\n";
1830    push( @installer::globals::logfileinfo, $infoline);
1831
1832    # Setting the classpath and starting compiler
1833
1834    set_classpath_for_install_sdk($javadir);
1835
1836    # creating class files:
1837    # language class file, dialog class files, installer class file
1838
1839    my $jdkpath = "";
1840    if ( $ENV{'JDKPATH'} ) { $jdkpath = $ENV{'JDKPATH'}; }
1841
1842    my $javac = "javac";
1843    if ( $jdkpath ) { $javac = $jdkpath . $installer::globals::separator . $javac; }
1844
1845    my $systemcall = "$javac locale\/resources\/\*\.java 2\>\&1 |";
1846    make_systemcall($systemcall, 1);
1847
1848    $systemcall = "$javac com\/sun\/staroffice\/install\/\*\.java 2\>\&1 |";
1849    make_systemcall($systemcall, 1);
1850
1851    # making subdirectory creating empty packages
1852    create_empty_packages($xmlfile);
1853
1854    # Copy "jresetup" from solver locally to include it into the classfile
1855    # Copy "jresetup" from solver to installdir
1856
1857    my $setupname = "jresetup";
1858    my $newname = "setup";
1859    copy_setup_locally($includepatharrayref, $setupname, $newname);
1860
1861    my $java = "java";
1862    if ( $jdkpath ) { $java = $jdkpath . $installer::globals::separator . $java; }
1863
1864    $systemcall = "$java com.sun.setup.builder.InstallBuilder $xmlfilename -novalidate 2\>\&1 |";
1865    make_systemcall($systemcall, 1);
1866
1867    # copying the newly created classfile into the installation set
1868
1869    my $archivefilename = get_archivefilename($xmlfile);
1870    $archivefilename = $archivefilename . ".class";
1871
1872    if ( ! -f $archivefilename ) { installer::exiter::exit_program("ERROR: Could not find Java class file $archivefilename!", "create_java_installer"); }
1873
1874    installer::systemactions::copy_one_file($archivefilename, $installdir);
1875
1876    # Adding the loader into the installation set. The name of the loader is setup.
1877    put_loader_into_installset($installdir, $newname);
1878
1879    chdir($from);
1880
1881    $infoline = "Changing into directory: $from\n";
1882    push( @installer::globals::logfileinfo, $infoline);
1883}
1884
18851;
1886