diff options
Diffstat (limited to 'solenv/bin/modules/installer/javainstaller.pm')
-rw-r--r-- | solenv/bin/modules/installer/javainstaller.pm | 1885 |
1 files changed, 1885 insertions, 0 deletions
diff --git a/solenv/bin/modules/installer/javainstaller.pm b/solenv/bin/modules/installer/javainstaller.pm new file mode 100644 index 000000000000..f68346bdcce2 --- /dev/null +++ b/solenv/bin/modules/installer/javainstaller.pm @@ -0,0 +1,1885 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* +package installer::javainstaller; + +use Cwd; +use installer::exiter; +use installer::files; +use installer::globals; +use installer::languages; +use installer::pathanalyzer; +use installer::scriptitems; +use installer::systemactions; +use installer::worker; +use installer::logger; + +############################################################## +# Returning a specific language string from the block +# of all translations +############################################################## + +sub get_language_string_from_language_block +{ + my ($language_block, $language, $oldstring) = @_; + + my $newstring = ""; + + for ( my $i = 0; $i <= $#{$language_block}; $i++ ) + { + if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ ) + { + $newstring = $1; + last; + } + } + + if ( $newstring eq "" ) + { + $language = "en-US"; # defaulting to english + + for ( my $i = 0; $i <= $#{$language_block}; $i++ ) + { + if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ ) + { + $newstring = $1; + last; + } + } + } + + return $newstring; +} + +############################################################## +# Returning the complete block in all languages +# for a specified string +############################################################## + +sub get_language_block_from_language_file +{ + my ($searchstring, $languagefile) = @_; + + my @language_block = (); + + for ( my $i = 0; $i <= $#{$languagefile}; $i++ ) + { + if ( ${$languagefile}[$i] =~ /^\s*\[\s*$searchstring\s*\]\s*$/ ) + { + my $counter = $i; + + push(@language_block, ${$languagefile}[$counter]); + $counter++; + + while (( $counter <= $#{$languagefile} ) && (!( ${$languagefile}[$counter] =~ /^\s*\[/ ))) + { + push(@language_block, ${$languagefile}[$counter]); + $counter++; + } + + last; + } + } + + return \@language_block; +} + +####################################################### +# Searching for the module name and description in the +# modules collector +####################################################### + +sub get_module_name_description +{ + my ($modulesarrayref, $onelanguage, $gid, $type) = @_; + + my $found = 0; + + my $newstring = ""; + + for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ ) + { + my $onemodule = ${$modulesarrayref}[$i]; + + if ( $onemodule->{'gid'} eq $gid ) + { + my $typestring = $type . " " . "(" . $onelanguage . ")"; + if ( $onemodule->{$typestring} ) { $newstring = $onemodule->{$typestring}; } + $found = 1; + } + + if ( $found ) { last; } + } + + # defaulting to english + + if ( ! $found ) + { + my $defaultlanguage = "en-US"; + + for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ ) + { + my $onemodule = ${$modulesarrayref}[$i]; + + if ( $onemodule->{'gid'} eq $gid ) + { + my $typestring = $type . " " . "(" . $defaultlanguage . ")"; + if ( $onemodule->{$typestring} ) { $newstring = $onemodule->{$typestring}; } + $found = 1; + } + + if ( $found ) { last; } + } + } + + return $newstring; +} + +####################################################### +# Setting the productname and productversion +####################################################### + +sub set_productname_and_productversion +{ + my ($templatefile, $variableshashref) = @_; + + my $infoline = "\nSetting product name and product version in Java template file\n"; + push( @installer::globals::logfileinfo, $infoline); + + my $productname = $variableshashref->{'PRODUCTNAME'}; + my $productversion = $variableshashref->{'PRODUCTVERSION'}; + + for ( my $i = 0; $i <= $#{$templatefile}; $i++ ) + { + ${$templatefile}[$i] =~ s/\{PRODUCTNAME\}/$productname/g; + ${$templatefile}[$i] =~ s/\{PRODUCTVERSION\}/$productversion/g; + } + + $infoline = "End of: Setting product name and product version in Java template file\n\n"; + push( @installer::globals::logfileinfo, $infoline); +} + +####################################################### +# Setting the localized Module name and description +####################################################### + +sub set_component_name_and_description +{ + my ($templatefile, $modulesarrayref, $onelanguage) = @_; + + my $infoline = "\nSetting component names and description in Java template file\n"; + push( @installer::globals::logfileinfo, $infoline); + + for ( my $i = 0; $i <= $#{$templatefile}; $i++ ) + { + # OOO_gid_Module_Prg_Wrt_Name + # OOO_gid_Module_Prg_Wrt_Description + + my $oneline = ${$templatefile}[$i]; + my $oldstring = ""; + my $gid = ""; + my $type = ""; + + if ( $oneline =~ /\b(OOO_gid_\w+)\b/ ) + { + $oldstring = $1; + + $infoline = "Found: $oldstring\n"; + push( @installer::globals::logfileinfo, $infoline); + + if ( $oldstring =~ /^\s*OOO_(gid_\w+)_(\w+?)\s*$/ ) + { + $gid = $1; + $type = $2; + } + + my $newstring = get_module_name_description($modulesarrayref, $onelanguage, $gid, $type); + + $infoline = "\tReplacing (language $onelanguage): OLDSTRING: $oldstring NEWSTRING $newstring\n"; + push( @installer::globals::logfileinfo, $infoline); + + ${$templatefile}[$i] =~ s/$oldstring/$newstring/; # always substitute, even if $newstring eq "" + } + } + + $infoline = "End of: Setting component names and description in Java template file\n\n"; + push( @installer::globals::logfileinfo, $infoline); +} + +####################################################### +# Translating the Java file +####################################################### + +sub translate_javafile +{ + my ($templatefile, $languagefile, $onelanguage) = @_; + + for ( my $i = 0; $i <= $#{$templatefile}; $i++ ) + { + my @allstrings = (); + + my $oneline = ${$templatefile}[$i]; + + while ( $oneline =~ /\b(OOO_\w+)\b/ ) + { + my $replacestring = $1; + push(@allstrings, $replacestring); + $oneline =~ s/$replacestring//; + } + + my $oldstring; + + foreach $oldstring (@allstrings) + { + my $language_block = get_language_block_from_language_file($oldstring, $languagefile); + my $newstring = get_language_string_from_language_block($language_block, $onelanguage, $oldstring); + + $newstring =~ s/\"/\\\"/g; # masquerading the " + $newstring =~ s/\\\\\"/\\\"/g; # unmasquerading if \" was converted to \\" (because " was already masked) + + # if (!( $newstring eq "" )) { ${$idtfile}[$i] =~ s/$oldstring/$newstring/; } + ${$templatefile}[$i] =~ s/$oldstring/$newstring/; # always substitute, even if $newstring eq "" + } + } +} + +########################################################### +# Returning the license file name for a defined language +########################################################### + +sub get_licensefilesource +{ + my ($language, $includepatharrayref) = @_; + + my $licensefilename = "LICENSE_" . $language; + + my $licenseref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, $includepatharrayref, 0); + if ($$licenseref eq "") { installer::exiter::exit_program("ERROR: Could not find License file $licensefilename!", "get_licensefilesource"); } + + my $infoline = "Found licensefile $licensefilename: $$licenseref \n"; + push( @installer::globals::logfileinfo, $infoline); + + return $$licenseref; +} + +####################################################### +# Converting the license string into the +# Java specific encoding. +####################################################### + +sub convert_licenstring +{ + my ($licensefile, $includepatharrayref, $javadir, $onelanguage) = @_; + + my $licensedir = $javadir . $installer::globals::separator . "license"; + installer::systemactions::create_directory($licensedir); + + # saving the original license file + + my $licensefilename = $licensedir . $installer::globals::separator . "licensefile.txt"; + installer::files::save_file($licensefilename, $licensefile); + + # creating the ulf file from the license file + + $licensefilename = $licensedir . $installer::globals::separator . "licensefile.ulf"; + my @licensearray = (); + + my $section = "\[TRANSLATE\]\n"; + push(@licensearray, $section); + + for ( my $i = 0; $i <= $#{$licensefile}; $i++ ) + { + my $oneline = ${$licensefile}[$i]; + + if ($i == 0) { $oneline =~ s/^\s*\ï\»\¿//; } + + $oneline =~ s/\s*$//; + $oneline =~ s/\"/\\\"/g; # masquerading the " + $oneline =~ s/\'/\\\'/g; # masquerading the ' + + $oneline =~ s/\$\{/\{/g; # replacement of variables, only {PRODUCTNAME}, not ${PRODUCTNAME} + + my $ulfstring = $onelanguage . " = " . "\"" . $oneline . "\"\n"; + push(@licensearray, $ulfstring); + } + + installer::files::save_file($licensefilename, \@licensearray); + + # converting the ulf file to the jlf file with ulfconv + + @licensearray = (); + + my $converter = "ulfconv"; + + my $converterref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$converter, $includepatharrayref, 0); + if ($$converterref eq "") { installer::exiter::exit_program("ERROR: Could not find converter $converter!", "convert_licenstring"); } + + my $infoline = "Found converter file $converter: $$converterref \n"; + push( @installer::globals::logfileinfo, $infoline); + + my $systemcall = "$$converterref $licensefilename |"; + open (CONV, "$systemcall"); + @licensearray = <CONV>; + close (CONV); + + $licensefilename = $licensedir . $installer::globals::separator . "licensefile.jlf"; + installer::files::save_file($licensefilename, \@licensearray); + + # creating the license string from the jlf file + + $licensestring = ""; + + for ( my $i = 1; $i <= $#licensearray; $i++ ) # not the first line! + { + my $oneline = $licensearray[$i]; + $oneline =~ s/^\s*$onelanguage\s*\=\s*\"//; + $oneline =~ s/\"\s*$//; + $licensestring = $licensestring . $oneline . "\\n"; + } + + $infoline = "Systemcall: $systemcall\n"; + push( @installer::globals::logfileinfo, $infoline); + + if ( $licensestring eq "" ) + { + $infoline = "ERROR: Could not convert $licensefilename !\n"; + push( @installer::globals::logfileinfo, $infoline); + } + + return $licensestring; +} + +####################################################### +# Adding the license file into the java file +# In the template java file there are two +# occurences of INSTALLSDK_GUI_LICENSE +# and INSTALLSDK_CONSOLE_LICENSE +####################################################### + +sub add_license_file_into_javafile +{ + my ( $templatefile, $licensefile, $includepatharrayref, $javadir, $onelanguage ) = @_; + + my $licensestring = convert_licenstring($licensefile, $includepatharrayref, $javadir, $onelanguage); + + # saving the licensestring in an ulf file + # converting the file using "ulfconv license.ulf" + # including the new string into the java file + + for ( my $i = 0; $i <= $#{$templatefile}; $i++ ) + { + ${$templatefile}[$i] =~ s/INSTALLSDK_GUI_LICENSE/$licensestring/; + ${$templatefile}[$i] =~ s/INSTALLSDK_CONSOLE_LICENSE/$licensestring/; + } +} + +####################################################### +# Executing one system call +####################################################### + +sub make_systemcall +{ + my ( $systemcall, $logreturn ) = @_; + + my @returns = (); + + installer::logger::print_message( "... $systemcall ...\n" ); + + open (REG, "$systemcall"); + while (<REG>) {push(@returns, $_); } + close (REG); + + my $returnvalue = $?; # $? contains the return value of the systemcall + + my $infoline = "Systemcall: $systemcall\n"; + push( @installer::globals::logfileinfo, $infoline); + + if ( $logreturn ) + { + for ( my $j = 0; $j <= $#returns; $j++ ) { push( @installer::globals::logfileinfo, "$returns[$j]"); } + } + + if ($returnvalue) + { + $infoline = "ERROR: $systemcall\n"; + push( @installer::globals::logfileinfo, $infoline); + $error_occured = 1; + } + else + { + $infoline = "SUCCESS: $systemcall\n"; + push( @installer::globals::logfileinfo, $infoline); + } + + return \@returns; +} + +####################################################### +# Setting the class path for the Installer SDK +####################################################### + +sub set_classpath_for_install_sdk +{ + my ( $directory ) = @_; + + my $installsdk = ""; + my $solarVersion = ""; + my $inPath = ""; + my $updMinorExt = ""; + + if ( defined( $ENV{ 'SOLARVERSION' } ) ) { $solarVersion = $ENV{'SOLARVERSION'}; } + else { installer::exiter::exit_program("ERROR: Environment variable \"SOLARVERSION\" not set!", "set_classpath_for_install_sdk"); } + + if ( defined( $ENV{ 'INPATH' } ) ) { $inPath = $ENV{'INPATH'}; } + else { installer::exiter::exit_program("ERROR: Environment variable \"INPATH\" not set!", "set_classpath_for_install_sdk"); } + + if ( defined( $ENV{ 'UPDMINOREXT' } ) ) { $updMinorExt = $ENV{'UPDMINOREXT'}; } + + $installsdk = $solarVersion . $installer::globals::separator . $inPath . $installer::globals::separator . "bin" . $updMinorExt; + $installsdk = $installsdk . $installer::globals::separator . "javainstaller"; + + if ( $ENV{'INSTALLSDK_SOURCE'} ) { $installsdk = $ENV{'INSTALLSDK_SOURCE'}; } # overriding the Install SDK with INSTALLSDK_SOURCE + + # The variable CLASSPATH has to contain: + # $installsdk/classes:$installsdk/classes/setupsdk.jar: + # $installsdk/classes/parser.jar:$installsdk/classes/jaxp.jar: + # $installsdk/classes/ldapjdk.jar:$directory + + my @additional_classpath = (); + push(@additional_classpath, "$installsdk\/classes"); + push(@additional_classpath, "$installsdk\/installsdk.jar"); + push(@additional_classpath, "$installsdk\/classes\/parser.jar"); + push(@additional_classpath, "$installsdk\/classes\/jaxp.jar"); + push(@additional_classpath, "$directory"); + + my $newclasspathstring = ""; + my $oldclasspathstring = ""; + if ( $ENV{'CLASSPATH'} ) { $oldclasspathstring = $ENV{'CLASSPATH'}; } + else { $oldclasspathstring = "\."; } + + for ( my $i = 0; $i <= $#additional_classpath; $i++ ) + { + $newclasspathstring = $newclasspathstring . $additional_classpath[$i] . ":"; + } + + $newclasspathstring = $newclasspathstring . $oldclasspathstring; + + $ENV{'CLASSPATH'} = $newclasspathstring; + + my $infoline = "Setting CLASSPATH to $ENV{'CLASSPATH'}\n"; + push( @installer::globals::logfileinfo, $infoline); +} + +####################################################### +# Setting the class file name in the Java locale file +####################################################### + +sub set_classfilename +{ + my ($templatefile, $classfilename, $searchstring) = @_; + + for ( my $j = 0; $j <= $#{$templatefile}; $j++ ) + { + if ( ${$templatefile}[$j] =~ /\Q$searchstring\E/ ) + { + ${$templatefile}[$j] =~ s/$searchstring/$classfilename/; + last; + } + } +} + +####################################################### +# Substituting one variable in the xml file +####################################################### + +sub replace_one_variable +{ + my ($xmlfile, $variable, $searchstring) = @_; + + for ( my $i = 0; $i <= $#{$xmlfile}; $i++ ) + { + ${$xmlfile}[$i] =~ s/\$\{$searchstring\}/$variable/g; + } +} + +####################################################### +# Substituting the variables in the xml file +####################################################### + +sub substitute_variables +{ + my ($xmlfile, $variableshashref) = @_; + + my $key; + + foreach $key (keys %{$variableshashref}) + { + my $value = $variableshashref->{$key}; + replace_one_variable($xmlfile, $value, $key); + } +} + +########################################################## +# Finding the line number in xml file of a special +# component +########################################################## + +sub find_component_line +{ + my ($xmlfile, $componentname) = @_; + + my $linenumber = 0; + + for ( my $i = 0; $i <= $#{$xmlfile}; $i++ ) + { + if ( ${$xmlfile}[$i] =~ /name\s*\=\'\s*$componentname/ ) + { + $linenumber = $i; + last; + } + } + + return $linenumber; +} + +########################################################## +# Removing one package from the xml file +########################################################## + +sub remove_package +{ + my ($xmlfile, $packagename) = @_; + + my $searchstring = $packagename; + if ( $searchstring =~ /\-(\S+?)\s*$/ ) { $searchstring = $1; } # "SUNW%PRODUCTNAME-mailcap" -> "mailcap" + + my $packagestring = ""; + my $namestring = ""; + my $infoline = ""; + + if ( $installer::globals::issolarispkgbuild ) + { + $packagestring = "\<pkgunit"; + $namestring = "pkgName"; + } + elsif ( $installer::globals::islinuxrpmbuild ) + { + $packagestring = "\<rpmunit"; + $namestring = "rpmUniqueName"; + } + + my $removed_packge = 0; + + for ( my $i = 0; $i <= $#{$xmlfile}; $i++ ) + { + if ( ${$xmlfile}[$i] =~ /^\s*\Q$packagestring\E/ ) + { + # this is a package, but is it the correct one? + + my $do_delete = 0; + my $linecounter = 1; + my $startline = $i+1; + my $line = ${$xmlfile}[$startline]; + if (($line =~ /^\s*\Q$namestring\E\s*\=/) && ($line =~ /\-\Q$searchstring\E/)) { $do_delete = 1; } + + # but not deleting fonts package in language packs + if ( $line =~ /-ONELANGUAGE-/ ) { $do_delete = 0; } + + my $endcounter = 0; + + while ((!( $line =~ /\/\>/ )) && ( $startline <= $#{$xmlfile} )) + { + $linecounter++; + $startline++; + $line = ${$xmlfile}[$startline]; + if (($line =~ /^\s*\Q$namestring\E\s*\=/) && ($line =~ /\-\Q$searchstring\E/)) { $do_delete = 1; } + } + + $linecounter = $linecounter + 1; + + if ( $do_delete ) + { + my $infoline = "\tReally removing package $packagename from xml file.\n"; + push( @installer::globals::logfileinfo, $infoline); + splice(@{$xmlfile},$i, $linecounter); # removing $linecounter lines, beginning in line $i + $removed_packge = 1; + last; + } + } + } + + if ( $removed_packge ) + { + $infoline = "Package $packagename successfully removed from xml file.\n"; + push( @installer::globals::logfileinfo, $infoline); + } + else + { + $infoline = "Did not find package $packagename in xml file.\n"; + push( @installer::globals::logfileinfo, $infoline); + } + +} + +########################################################## +# Removing one component from the xml file +########################################################## + +sub remove_component +{ + my ($xmlfile, $componentname) = @_; + + my @removed_lines = (); + + push(@removed_lines, "\n"); + + for ( my $i = 0; $i <= $#{$xmlfile}; $i++ ) + { + if ( ${$xmlfile}[$i] =~ /name\s*\=\'\s*$componentname/ ) + { + # Counting the lines till the second "</component>" + + push(@removed_lines, ${$xmlfile}[$i]); + my $linecounter = 1; + my $startline = $i+1; + my $line = ${$xmlfile}[$startline]; + push(@removed_lines, $line); + my $endcounter = 0; + + while ((!( $line =~ /^\s*\<\/component\>\s*$/ )) && ( $startline <= $#{$xmlfile} )) + { + $linecounter++; + $startline++; + $line = ${$xmlfile}[$startline]; + push(@removed_lines, $line); + } + + $linecounter = $linecounter + 2; # last line and following empty line + + splice(@{$xmlfile},$i, $linecounter); # removing $linecounter lines, beginning in line $i + last; + } + } + + return \@removed_lines; +} + +########################################################## +# If this is an installation set without language packs +# the language pack module can be removed +########################################################## + +sub remove_languagepack_from_xmlfile +{ + my ($xmlfile) = @_; + + # Component begins with "<component selected="true" name='module_languagepacks' componentVersion="${PRODUCTVERSION}">" + # and ends with "</component>" (the second "</component>" !) + + remove_component($xmlfile, "languagepack_DEFAULT"); + remove_component($xmlfile, "languagepack_ONELANGUAGE"); + remove_component($xmlfile, "module_languagepacks"); +} + +########################################################## +# Duplicating a component +########################################################## + +sub duplicate_component +{ + my ( $arrayref ) = @_; + + @newarray = (); + + for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) + { + push(@newarray, ${$arrayref}[$i]); + } + + return \@newarray; +} + +########################################################## +# Including a component into the xml file +# at a specified line +########################################################## + +sub include_component_at_specific_line +{ + my ($xmlfile, $unit, $line) = @_; + + splice(@{$xmlfile},$line, 0, @{$unit}); +} + +########################################################## +# Font packages do not exist for all languages. +########################################################## + +sub remove_font_package_from_unit +{ + my ( $unitcopy, $onelanguage ) = @_; + + my $searchstring = "-fonts"; + + my $packagestring = ""; + my $namestring = ""; + + if ( $installer::globals::issolarispkgbuild ) + { + $packagestring = "\<pkgunit"; + $namestring = "pkgName"; + } + elsif ( $installer::globals::islinuxrpmbuild ) + { + $packagestring = "\<rpmunit"; + $namestring = "rpmUniqueName"; + } + + for ( my $i = 0; $i <= $#{$unitcopy}; $i++ ) + { + if ( ${$unitcopy}[$i] =~ /^\s*\Q$packagestring\E/ ) + { + # this is a package, but is it the correct one? + + my $do_delete = 0; + my $linecounter = 1; + my $startline = $i+1; + my $line = ${$unitcopy}[$startline]; + if (($line =~ /^\s*\Q$namestring\E\s*\=/) && ($line =~ /\Q$searchstring\E/)) { $do_delete = 1; } + + my $endcounter = 0; + + while ((!( $line =~ /\/\>/ )) && ( $startline <= $#{$unitcopy} )) + { + $linecounter++; + $startline++; + $line = ${$unitcopy}[$startline]; + if (($line =~ /^\s*\Q$namestring\E\s*\=/) && ($line =~ /\Q$searchstring\E/)) { $do_delete = 1; } + } + + $linecounter = $linecounter + 1; + + if ( $do_delete ) + { + splice(@{$unitcopy},$i, $linecounter); # removing $linecounter lines, beginning in line $i + last; + } + } + } +} + +########################################################## +# If this is an installation set with language packs, +# modules for each language pack have to be created +# dynamically +########################################################## + +sub duplicate_languagepack_in_xmlfile +{ + my ($xmlfile, $languagesarrayref) = @_; + + my $unit = remove_component($xmlfile, "languagepack_ONELANGUAGE"); + my $startline = find_component_line($xmlfile, "module_languagepacks"); + my $infoline = ""; + $startline = $startline + 1; + + for ( my $i = 0; $i <= $#{$languagesarrayref}; $i++ ) + { + my $onelanguage = ${$languagesarrayref}[$i]; + my $unitcopy = duplicate_component($unit); + + # replacing string ONELANGUAGE in the unit copy + for ( my $j = 0; $j <= $#{$unitcopy}; $j++ ) { ${$unitcopy}[$j] =~ s/ONELANGUAGE/$onelanguage/g; } + + # including the unitcopy into the xml file + include_component_at_specific_line($xmlfile, $unitcopy, $startline); + $startline = $startline + $#{$unitcopy} + 1; + } + + # adding the default language as language pack, too + $unit = remove_component($xmlfile, "languagepack_DEFAULT"); + $startline = find_component_line($xmlfile, "module_languagepacks"); + $startline = $startline + 1; + + $onelanguage = ${$languagesarrayref}[0]; + $unitcopy = duplicate_component($unit); + + # replacing string DEFAULT in the unit copy + for ( my $j = 0; $j <= $#{$unitcopy}; $j++ ) { ${$unitcopy}[$j] =~ s/DEFAULT/$onelanguage/g; } + + # including the unitcopy into the xml file + include_component_at_specific_line($xmlfile, $unitcopy, $startline); + $startline = $startline + $#{$unitcopy} + 1; +} + +####################################################### +# Removing empty packages from xml file. The names +# are stored in @installer::globals::emptypackages +####################################################### + +sub remove_empty_packages_in_xmlfile +{ + my ($xmlfile) = @_; + + for ( my $i = 0; $i <= $#installer::globals::emptypackages; $i++ ) + { + my $packagename = $installer::globals::emptypackages[$i]; + my $infoline = "Try to remove package $packagename from xml file.\n"; + push( @installer::globals::logfileinfo, $infoline); + remove_package($xmlfile, $packagename); + } +} + +####################################################### +# Preparing the language packs in the xml file +####################################################### + +sub prepare_language_pack_in_xmlfile +{ + my ($xmlfile, $languagesarrayref) = @_; + + # if ( ! $installer::globals::is_unix_multi ) + # { + # remove_languagepack_from_xmlfile($xmlfile); + # } + # else + # { + duplicate_languagepack_in_xmlfile($xmlfile, $languagesarrayref); + # } + +} + +####################################################### +# Returning a rpm unit from a xml file +####################################################### + +sub get_rpm_unit_from_xmlfile +{ + my ($rpmname, $xmlfile) = @_; + + my $infoline = "Searching for $rpmname in xml file.\n"; + push( @installer::globals::logfileinfo, $infoline); + + my @rpmunit = (); + my $includeline = 0; + my $record = 0; + my $foundrpm = 0; + + for ( my $i = 0; $i <= $#{$xmlfile}; $i++ ) + { + my $oneline = ${$xmlfile}[$i]; + + if ( $oneline =~ /^\s*\<rpmunit/ ) { $record = 1; } + + if ( $record ) { push(@rpmunit, $oneline); } + + if ( $oneline =~ /^\s*rpmUniqueName\s*=\s*\"\Q$rpmname\E\"\s*$/ ) { $foundrpm = 1; } + + if (( $record ) && ( $oneline =~ /\/\>\s*$/ )) { $record = 0; } + + if (( ! $foundrpm ) && ( ! $record )) { @rpmunit = (); } + + if (( $foundrpm ) && ( ! $record )) { $includeline = $i + 1; } + + if (( $foundrpm ) && ( ! $record )) { last; } + } + + if ( ! $foundrpm ) { installer::exiter::exit_program("ERROR: Did not find rpmunit $rpmname in xml file!", "get_rpm_unit_from_xmlfile"); } + + $infoline = "Found $rpmname in xml file. Returning block lines: $#rpmunit + 1. Includeline: $includeline \n"; + push( @installer::globals::logfileinfo, $infoline); + + return (\@rpmunit, $includeline); +} + +####################################################### +# Exchanging package names in xml file +####################################################### + +sub exchange_name_in_rpmunit +{ + my ($rpmunit, $oldpackagename, $newpackagename) = @_; + + for ( my $i = 0; $i <= $#{$rpmunit}; $i++ ) + { + ${$rpmunit}[$i] =~ s/$oldpackagename/$newpackagename/; + } +} + +####################################################### +# Preparing link RPMs in the xml file +####################################################### + +sub prepare_linkrpm_in_xmlfile +{ + my ($xmlfile, $rpmlist) = @_; + + for ( my $i = 0; $i <= $#{$rpmlist}; $i++ ) + { + my $oldpackagename = ""; + my $newpackagename = ""; + + my $rpmline = ${$rpmlist}[$i]; + + my $infoline = "Preparing link/patch RPM: $rpmline\n"; + push( @installer::globals::logfileinfo, $infoline); + + if ( $rpmline =~ /^\s*(\S.*?\S)\s+(\S.*?\S)\s*$/ ) + { + $oldpackagename = $1; + $newpackagename = $2; + } + + my ($rpmunit, $includeline) = get_rpm_unit_from_xmlfile($oldpackagename, $xmlfile); + exchange_name_in_rpmunit($rpmunit, $oldpackagename, $newpackagename); + include_component_at_specific_line($xmlfile, $rpmunit, $includeline); + } +} + +####################################################################### +# Removing w4w filter module from xml file for Solaris x86 and Linux +####################################################################### + +sub remove_w4w_from_xmlfile +{ + my ($xmlfile) = @_; + + # Component begins with "<component selected='true' name='gid_Module_Prg_Wrt_Flt_W4w' componentVersion="8">" + # and ends with "</component>" + + for ( my $i = 0; $i <= $#{$xmlfile}; $i++ ) + { + if ( ${$xmlfile}[$i] =~ /name\s*\=\'\s*gid_Module_Prg_Wrt_Flt_W4w/ ) + { + # Counting the lines till "</component>" + + my $linecounter = 1; + my $startline = $i+1; + my $line = ${$xmlfile}[$startline]; + + while ((!( $line =~ /^\s*\<\/component\>\s*$/ )) && ( $startline <= $#{$xmlfile} )) + { + $linecounter++; + $startline++; + $line = ${$xmlfile}[$startline]; + } + + $linecounter = $linecounter + 2; # last line and following empty line + + splice(@{$xmlfile},$i, $linecounter); # removing $linecounter lines, beginning in line $i + last; + } + } +} + +####################################################################### +# Removing module from xml file, if not defined in scp +####################################################################### + +sub remove_scpgid_from_xmlfile +{ + my ($xmlfile, $scpgid) = @_; + + # Component begins with "<component selected='true' name='$scpgid' componentVersion="8">" + # and ends with "</component>" + + my $successfully_removed = 0; + + for ( my $i = 0; $i <= $#{$xmlfile}; $i++ ) + { + if ( ${$xmlfile}[$i] =~ /name\s*\=\'\s*\Q$scpgid\E/ ) + { + # Counting the lines till "</component>" + + my $linecounter = 1; + my $startline = $i+1; + my $line = ${$xmlfile}[$startline]; + + while ((!( $line =~ /^\s*\<\/component\>\s*$/ )) && ( $startline <= $#{$xmlfile} )) + { + $linecounter++; + $startline++; + $line = ${$xmlfile}[$startline]; + } + + $linecounter = $linecounter + 2; # last line and following empty line + + splice(@{$xmlfile},$i, $linecounter); # removing $linecounter lines, beginning in line $i + $successfully_removed = 1; + last; + } + } + + my $infoline = ""; + if ($successfully_removed) + { + $infoline = "Module $scpgid successfully removed from xml file.\n"; + push( @installer::globals::logfileinfo, $infoline); + } + else + { + $infoline = "Module $scpgid not found in xml file (no problem).\n"; + push( @installer::globals::logfileinfo, $infoline); + } +} + +####################################################################### +# Special mechanism for removing modules for xml file, if they are +# not defined in scp (introduced for onlineupdate module). +####################################################################### + +sub remove_module_if_not_defined +{ + my ($xmlfile, $modulesarrayref, $scpgid) = @_; + + my $infoline = "Checking existence of $scpgid in scp definition\n"; + push( @installer::globals::logfileinfo, $infoline); + + my $found = 0; + + for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ ) + { + my $onemodule = ${$modulesarrayref}[$i]; + if ( $onemodule->{'gid'} eq $scpgid ) { $found = 1; } + if ( $found ) { last; } + } + + if ( ! $found ) + { + $infoline = "Module $scpgid not found -> Removing from xml file.\n"; + push( @installer::globals::logfileinfo, $infoline); + remove_scpgid_from_xmlfile($xmlfile, $scpgid); + } +} + +########################################################### +# Preparing the package subdirectory +########################################################### + +sub create_empty_packages +{ + my ( $xmlfile ) = @_; + + if ( $installer::globals::issolarispkgbuild ) + { + my $path = ""; + + for ( my $i = 0; $i <= $#{$xmlfile}; $i++ ) + { + if ( ${$xmlfile}[$i] =~ /pkgRelativePath\s*\=\s*\'(.*?)\'\s*$/ ) + { + $path = $1; + installer::systemactions::create_directory_structure($path); + last; # only creating one path + } + } + + for ( my $i = 0; $i <= $#{$xmlfile}; $i++ ) + { + if ( ${$xmlfile}[$i] =~ /pkgName\s*\=\s*\'(.*?)\'\s*$/ ) + { + my $pkgname = $1; + if ( $path ne "" ) { $pkgname = $path . $installer::globals::separator . $pkgname; } + installer::systemactions::create_directory_structure($pkgname); + } + } + } + + # "-novalidate" does not work for Linux RPMs + + if ( $installer::globals::islinuxrpmbuild ) + { + for ( my $i = 0; $i <= $#{$xmlfile}; $i++ ) + { + if ( ${$xmlfile}[$i] =~ /rpmPath\s*\=\s*\"(.*?)\"\s*$/ ) + { + my $rpmpath = $1; + my $path = ""; + + if ( $rpmpath =~ /^\s*(.*)\/(.*?)\s*$/ ) + { + $path = $1; + } + + if ( $path ne "" ) { installer::systemactions::create_directory_structure($path); } + + my $systemcall = "touch $rpmpath"; # creating empty rpm + system($systemcall); + } + } + } +} + +########################################################### +# Reading the archive file name from the xml file +########################################################### + +sub get_archivefilename +{ + my ( $xmlfile ) = @_; + + my $archivefilename = ""; + + for ( my $j = 0; $j <= $#{$xmlfile}; $j++ ) + { + if ( ${$xmlfile}[$j] =~ /archiveFileName\s*=\s*\'(.*?)\'/ ) + { + $archivefilename = $1; + last; + } + } + + return $archivefilename; +} + +####################################################### +# Copying the loader locally +####################################################### + +sub copy_setup_locally +{ + my ($includepatharrayref, $loadername, $newname) = @_; + + my $loadernameref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$loadername, $includepatharrayref, 0); + + if ($$loadernameref eq "") { installer::exiter::exit_program("ERROR: Could not find Java loader $loadername!", "copy_setup_locally"); } + + installer::systemactions::copy_one_file($$loadernameref, $newname); + my $localcall = "chmod 775 $newname \>\/dev\/null 2\>\&1"; + system($localcall); +} + + +####################################################### +# Copying the loader into the installation set +####################################################### + +sub put_loader_into_installset +{ + my ($installdir, $filename) = @_; + + my $installname = $installdir . $installer::globals::separator . $filename; + + installer::systemactions::copy_one_file($filename, $installname); + + my $localcall = "chmod 775 $installname \>\/dev\/null 2\>\&1"; + system($localcall); +} + +################################################################# +# Setting for Solaris the package names in the Java translation +# file. The name is used for the +# This name is displayed tools like prodreg. +# Unfortunately this name in the component is also used +# in the translation template file for the module name +# and module description translations. +################################################################# + +sub replace_component_name_in_java_file +{ + my ($alljavafiles, $oldname, $newname) = @_; + + # The new name must not contain white spaces + + $newname =~ s/ /\_/g; + + for ( my $i = 0; $i <= $#{$alljavafiles}; $i++ ) + { + my $javafilename = ${$alljavafiles}[$i]; + my $javafile = installer::files::read_file($javafilename); + + my $oldstring = "ComponentDescription-" . $oldname; + my $newstring = "ComponentDescription-" . $newname; + + for ( my $j = 0; $j <= $#{$javafile}; $j++ ) { ${$javafile}[$j] =~ s/\b$oldstring\b/$newstring/; } + + $oldstring = $oldname . "-install-DisplayName"; + $newstring = $newname . "-install-DisplayName"; + + for ( my $j = 0; $j <= $#{$javafile}; $j++ ) { ${$javafile}[$j] =~ s/\b$oldstring\b/$newstring/; } + + $oldstring = $oldname . "-uninstall-DisplayName"; + $newstring = $newname . "-uninstall-DisplayName"; + + for ( my $j = 0; $j <= $#{$javafile}; $j++ ) { ${$javafile}[$j] =~ s/\b$oldstring\b/$newstring/; } + + installer::files::save_file($javafilename, $javafile); + $infoline = "Changes in Java file: $javafilename : $oldname \-\> $newname\n"; + push( @installer::globals::logfileinfo, $infoline); + } +} + +################################################################# +# Some module names are not defined in the scp project. +# The names for this modules are searched in the base Java +# translation file. +################################################################# + +sub get_module_name_from_basejavafile +{ + my ($componentname, $javatemplateorigfile, $ulffile) = @_; + + my $searchname = $componentname . "-install-DisplayName"; + my $modulename = ""; + my $replacename = ""; + + # line content: { "coremodule-install-DisplayName", "OOO_INSTALLSDK_117" }, + + for ( my $i = 0; $i <= $#{$javatemplateorigfile}; $i++ ) + { + if ( ${$javatemplateorigfile}[$i] =~ /\"\s*\Q$searchname\E\s*\"\s*\,\s*\"\s*(.*?)\s*\"\s*\}\s*\,\s*$/ ) + { + $replacename = $1; + last; + } + } + + if ( $replacename ne "" ) + { + my $language_block = get_language_block_from_language_file($replacename, $ulffile); + $modulename = get_language_string_from_language_block($language_block, "en-US", $replacename); + } + + return $modulename; +} + +################################################################# +# Setting for Solaris the package names in the xml file. +# This name is displayed tools like prodreg. +# Unfortunately this name in the component is also used +# in the translation template file for the module name +# and module description translations. +################################################################# + +sub replace_component_names +{ + my ($xmlfile, $templatefilename, $modulesarrayref, $javatemplateorigfile, $ulffile) = @_; + + # path in which all java languages files are located + + my $javafilesdir = $templatefilename; + installer::pathanalyzer::get_path_from_fullqualifiedname(\$javafilesdir); + my $alljavafiles = installer::systemactions::find_file_with_file_extension("java", $javafilesdir); + for ( my $i = 0; $i <= $#{$alljavafiles}; $i++ ) { ${$alljavafiles}[$i] = $javafilesdir . ${$alljavafiles}[$i]; } + + # analyzing the xml file + + for ( my $i = 0; $i <= $#{$xmlfile}; $i++ ) + { + my $newstring = ""; + my $componentname = ""; + + if ( ${$xmlfile}[$i] =~ /\bcomponent\b.*\bname\s*\=\'\s*(.*?)\s*\'/ ) + { + $componentname = $1; + + # Getting module name from the scp files in $modulesarrayref + + my $onelanguage = "en-US"; + my $gid = $componentname; + my $type = "Name"; + + my $modulename = ""; + $modulename = get_module_name_description($modulesarrayref, $onelanguage, $gid, $type); + + if ( $modulename eq "" ) + { + $infoline = "Info: Modulename for $gid not defined in modules collector. Looking in Java ulf file.\n"; + push( @installer::globals::logfileinfo, $infoline); + } + + if ( $modulename eq "" ) # the modulename can also be set in the Java ulf file + { + $modulename = get_module_name_from_basejavafile($componentname, $javatemplateorigfile, $ulffile); + } + + if ( $modulename ne "" ) # only do something, if the modulename was found + { + ${$xmlfile}[$i] =~ s/$componentname/$modulename/; + + $infoline = "Replacement in xml file (Solaris): $componentname \-\> $modulename\n"; + push( @installer::globals::logfileinfo, $infoline); + + # Replacement has to be done in all Java language files + replace_component_name_in_java_file($alljavafiles, $componentname, $modulename); + } + + if ( $modulename eq "" ) # the modulename can also be set in the Java ulf file + { + $infoline = "WARNING: No replacement in xml file for component: $componentname\n"; + push( @installer::globals::logfileinfo, $infoline); + } + } + } +} + +############################################################################# +# Collecting all packages or rpms located in the installation directory +############################################################################# + +sub get_all_packages_in_installdir +{ + my ($installdir, $subdir) = @_; + + my $infoline = ""; + + my @allrpms = (); # not needed for Solaris at the moment + my $allrpms = \@allrpms; + + $installdir =~ s/\Q$installer::globals::separator\E\s*$//; + my $directory = $installdir . $installer::globals::separator . $subdir; + $directory =~ s/\Q$installer::globals::separator\E\s*$//; + + if ( $installer::globals::islinuxrpmbuild ) + { + $allrpms = installer::systemactions::find_file_with_file_extension("rpm", $directory); + + # collecting rpms with the complete path + + for ( my $i = 0; $i <= $#{$allrpms}; $i++ ) + { + ${$allrpms}[$i] = $directory . $installer::globals::separator . ${$allrpms}[$i]; + $infoline = "Found RPM: ${$allrpms}[$i]\n"; + push( @installer::globals::logfileinfo, $infoline); + } + } + + return $allrpms; +} + +####################################################### +# Adding the values of the array +####################################################### + +sub do_sum +{ + my ( $allnumbers ) = @_; + + my $sum = 0; + + for ( my $i = 0; $i <= $#{$allnumbers}; $i++ ) + { + $sum = $sum + ${$allnumbers}[$i]; + } + + return $sum; +} + +####################################################### +# Setting the filesize for the RPMs in the xml file +####################################################### + +sub set_filesize_in_xmlfile +{ + my ($filesize, $rpmname, $xmlfile) = @_; + + my $infoline = ""; + my $foundrpm = 0; + my $filesizeset = 0; + + for ( my $i = 0; $i <= $#{$xmlfile}; $i++ ) + { + my $line = ${$xmlfile}[$i]; + + # searching for "rpmPath="RPMS/${UNIXPRODUCTNAME}-core01-${PACKAGEVERSION}-${PACKAGEREVISION}.i586.rpm"" + + if (( $line =~ /rpmPath\s*=/ ) && ( $line =~ /\Q$rpmname\E\"\s*$/ )) + { + $foundrpm = 1; + + my $number = $i; + $number++; + + while ( ! ( ${$xmlfile}[$number] =~ /\/\>\s*$/ )) + { + if ( ${$xmlfile}[$number] =~ /FILESIZEPLACEHOLDER/ ) + { + ${$xmlfile}[$number] =~ s/FILESIZEPLACEHOLDER/$filesize/; + $filesizeset = 1; + $infoline = "Setting filesize for $rpmname : $filesize\n"; + push( @installer::globals::logfileinfo, $infoline); + last; + } + + $number++; + } + + last; + } + } + + if ( ! $foundrpm ) + { + $infoline = "ERROR: Did not find $rpmname in xml file !\n"; + push( @installer::globals::logfileinfo, $infoline); + } + + if ( ! $filesizeset ) + { + $infoline = "ERROR: Did not set filesize for $rpmname in xml file !\n"; + push( @installer::globals::logfileinfo, $infoline); + } +} + +############################################################ +# Collecting all rpmUniqueName in xml file. +############################################################ + +sub collect_uniquenames_in_xmlfile +{ + my ($xmlfile) = @_; + + my @rpmuniquenames = (); + + for ( my $i = 0; $i <= $#{$xmlfile}; $i++ ) + { + my $oneline = ${$xmlfile}[$i]; + + if ( $oneline =~ /^\s*rpmUniqueName\s*\=\s*\"(.*)\"\s*$/ ) + { + my $rpmuniquename = $1; + push(@rpmuniquenames, $rpmuniquename) + } + } + + return \@rpmuniquenames; +} + +############################################################ +# Searching for the corresponding rpm, that fits to +# the unique rpm name. +# Simple mechanism: The name of the rpm starts with the +# unique rpm name followed by a "-". +############################################################ + +sub find_rpmname_to_uniquename +{ + my ($uniquename, $listofpackages) = @_; + + my @all_correct_rpms = (); + my $infoline = ""; + + # special handling for java RPMs, which have a very strange naming schema + my $localuniquename = $uniquename; + if ( $uniquename =~ /^\s*jre\-/ ) { $localuniquename = "jre"; } + + for ( my $i = 0; $i <= $#{$listofpackages}; $i++ ) + { + my $completerpmname = ${$listofpackages}[$i]; + my $rpmname = $completerpmname; + installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$rpmname); + + if ( $rpmname =~ /^\s*\Q$localuniquename\E\-\d/ ) { push(@all_correct_rpms, $rpmname); } + } + + # @all_correct_rpms has to contain exactly one value + + if ( $#all_correct_rpms > 0 ) + { + my $number = $#all_correct_rpms + 1; + $infoline = "There are $number RPMs for the unique name \"$uniquename\" :\n"; + push( @installer::globals::logfileinfo, $infoline); + my $allrpmstring = ""; + for ( my $i = 0; $i <= $#all_correct_rpms; $i++ ) { $allrpmstring = $allrpmstring . $all_correct_rpms[$i] . "\n"; } + push( @installer::globals::logfileinfo, $allrpmstring); + installer::exiter::exit_program("ERROR: Found $number RPMs that start with unique name \"$uniquename\". Only one allowed!", "find_rpmname_to_uniquename"); + } + + if ( $#all_correct_rpms < 0 ) + { + $infoline = "There is no rpm for the unique name \"$uniquename\"\n"; + push( @installer::globals::logfileinfo, $infoline); + installer::exiter::exit_program("ERROR: There is no RPM that start with unique name \"$uniquename\"!", "find_rpmname_to_uniquename"); + } + + if ( $#all_correct_rpms == 0 ) + { + $infoline = "Found one rpm for the unique name \"$uniquename\" : $all_correct_rpms[0]\n"; + push( @installer::globals::logfileinfo, $infoline); + } + + return $all_correct_rpms[0]; +} + +####################################################### +# Including the complete RPM name into the xml file +####################################################### + +sub set_rpmname_into_xmlfile +{ + my ($rpmname, $uniquename, $xmlfile) = @_; + + my $foundrpm = 0; + my $rpmnameset = 0; + + for ( my $i = 0; $i <= $#{$xmlfile}; $i++ ) + { + my $oneline = ${$xmlfile}[$i]; + + if ( $oneline =~ /^\s*rpmUniqueName\s*\=\s*\"\Q$uniquename\E\"\s*$/ ) + { + $foundrpm = 1; + + my $number = $i; + $number++; + + while ( ! ( ${$xmlfile}[$number] =~ /\/\>\s*$/ )) + { + if ( ${$xmlfile}[$number] =~ /RPMFILENAMEPLACEHOLDER/ ) + { + ${$xmlfile}[$number] =~ s/RPMFILENAMEPLACEHOLDER/$rpmname/; + $rpmnameset = 1; + $infoline = "Setting RPM name for $uniquename : $rpmname\n"; + push( @installer::globals::logfileinfo, $infoline); + last; + } + + $number++; + } + + last; + } + } + + if ( ! $foundrpm ) + { + $infoline = "ERROR: Did not find $rpmname in xml file !\n"; + push( @installer::globals::logfileinfo, $infoline); + } + + if ( ! $rpmnameset ) + { + $infoline = "ERROR: Did not set rpm name for $uniquename in xml file !\n"; + push( @installer::globals::logfileinfo, $infoline); + } + +} + +############################################################ +# Including the rpm path dynamically into the xml file. +# This is introduced, because system integration has +# variable PackageVersion and PackageRevision in xml file. +############################################################ + +sub put_rpmpath_into_xmlfile +{ + my ($xmlfile, $listofpackages) = @_; + + my $infoline = ""; + + my $alluniquenames = collect_uniquenames_in_xmlfile($xmlfile); + + my $number = $#{$listofpackages} + 1; + $infoline = "Number of packages in installation set: $number\n"; + push( @installer::globals::logfileinfo, $infoline); + $number = $#{$alluniquenames} + 1; + $infoline = "Number of unique RPM names in xml file: $number\n"; + push( @installer::globals::logfileinfo, $infoline); + + $infoline = "\nPackages in installation set:\n"; + push( @installer::globals::logfileinfo, $infoline); + for ( my $i = 0; $i <= $#{$listofpackages}; $i++ ) + { + $infoline = "${$listofpackages}[$i]\n"; + push( @installer::globals::logfileinfo, $infoline); + } + + $infoline = "\nUnique RPM names in xml file:\n"; + push( @installer::globals::logfileinfo, $infoline); + for ( my $i = 0; $i <= $#{$alluniquenames}; $i++ ) + { + $infoline = "${$alluniquenames}[$i]\n"; + push( @installer::globals::logfileinfo, $infoline); + } + + 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"); } + + for ( my $i = 0; $i <= $#{$alluniquenames}; $i++ ) + { + my $uniquename = ${$alluniquenames}[$i]; + my $rpmname = find_rpmname_to_uniquename($uniquename, $listofpackages); + set_rpmname_into_xmlfile($rpmname, $uniquename, $xmlfile); + } +} + +####################################################### +# Including the file size of the rpms into the +# xml file +####################################################### + +sub put_filesize_into_xmlfile +{ + my ($xmlfile, $listofpackages) = @_; + + my $infoline = ""; + + for ( my $i = 0; $i <= $#{$listofpackages}; $i++ ) + { + my $completerpmname = ${$listofpackages}[$i]; + my $rpmname = $completerpmname; + installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$rpmname); + + if ( ! $installer::globals::rpmquerycommand ) { installer::exiter::exit_program("ERROR: rpm not found for querying packages!", "put_filesize_into_xmlfile"); } + my $systemcall = "$installer::globals::rpmquerycommand -qp --queryformat \"\[\%\{FILESIZES\}\\n\]\" $completerpmname 2\>\&1 |"; + my $rpmout = make_systemcall($systemcall, 0); + my $filesize = do_sum($rpmout); + + $infoline = "Filesize $rpmname : $filesize\n"; + push( @installer::globals::logfileinfo, $infoline); + + set_filesize_in_xmlfile($filesize, $rpmname, $xmlfile); + } +} + +####################################################### +# Creating the java installer class file dynamically +####################################################### + +sub create_java_installer +{ + my ( $installdir, $newdir, $languagestringref, $languagesarrayref, $allvariableshashref, $includepatharrayref, $modulesarrayref ) = @_; + + installer::logger::include_header_into_logfile("Creating Java installer:"); + + my $infoline = ""; + + # collecting all packages or rpms located in the installation directory + my $listofpackages = get_all_packages_in_installdir($installdir, $newdir); + + # creating the directory + my $javadir = installer::systemactions::create_directories("javainstaller", $languagestringref); + $javadir =~ s/\/\s*$//; +# push(@installer::globals::removedirs, $javadir); + + # copying the content from directory install_sdk into the java directory + + my $projectroot = ""; + if ( $ENV{'PRJ'} ) { $projectroot = $ENV{'PRJ'}; } + else { installer::exiter::exit_program("ERROR: Environment variable PRJ not set", "create_java_installer"); } + + $projectroot =~ s/\/\s*$//; + my $sourcedir = "$projectroot/inc_global/unix/install_sdk"; + installer::systemactions::copy_complete_directory_without_cvs($sourcedir, $javadir); + + # determining the java template file + + my $templatefilename = $javadir . $installer::globals::separator . "locale/resources/MyResources_template.java"; + + # Saving the content of the template file. It is used in the xml files + + my $javatemplateorigfile = installer::files::read_file($templatefilename); + + # determining the ulf language file + + # my $ulffilename = "installsdk.ulf"; + my $ulffilename = "installsdk.jlf"; + $ulffilename = $installer::globals::javalanguagepath . $installer::globals::separator . $ulffilename; + my $ulffile = installer::files::read_file($ulffilename); + + $infoline = "\nReading ulf file: $ulffilename\n"; + push( @installer::globals::logfileinfo, $infoline); + + $infoline = "Translating the Java template file\n"; + push( @installer::globals::logfileinfo, $infoline); + + for ( my $i = 0; $i <= $#{$languagesarrayref}; $i++ ) + { + my $onelanguage = ${$languagesarrayref}[$i]; + + # replacing all strings in the Java file with content of ulf files + + my $templatefile = installer::files::read_file($templatefilename); + + set_component_name_and_description($templatefile, $modulesarrayref, $onelanguage); + translate_javafile($templatefile, $ulffile, $onelanguage); + + # adding the license file into the Java file + + my $licensefilesource = get_licensefilesource($onelanguage, $includepatharrayref); + my $licensefile = installer::files::read_file($licensefilesource); + add_license_file_into_javafile($templatefile, $licensefile, $includepatharrayref, $javadir, $onelanguage); + + # setting productname and productversion + + set_productname_and_productversion($templatefile, $allvariableshashref); + + # setting the class name in the java file ( "MyResources_TEMPLATE" -> "MyResources_en" ) + + # if ( $onelanguage =~ /^\s*(\w+)\-(\w+)\s*$/ ) { $onelanguage = $1; } + $onelanguage =~ s/en-US/en/; # java file name and class name contain only "_en" + $onelanguage =~ s/\-/\_/; # "pt-BR" -> "pt_BR" + my $classfilename = "MyResources_" . $onelanguage; + set_classfilename($templatefile, $classfilename, "MyResources_TEMPLATE"); + + # saving the new file + + my $newfilename = $templatefilename; + $newfilename =~ s/_template\.java\s*$/_$onelanguage\.java/; + + installer::files::save_file($newfilename, $templatefile); + + $infoline = "Saving Java file: $newfilename\n"; + push( @installer::globals::logfileinfo, $infoline); + } + + # renaming one language java file to "MyResources.java" + + my $baselanguage = installer::languages::get_default_language($languagesarrayref); + $baselanguage =~ s/\-/\_/; # "pt-BR" -> "pt_BR" + $baselanguage =~ s/en_US/en/; # java file name and class name contain only "_en" + # if ( $baselanguage =~ /^\s*(\w+)\-(\w+)\s*$/ ) { $baselanguage = $1; } # java file name and class name contain only "_en" + # $baselanguage =~ s/en-US/en/; # java file name and class name contain only "_en" + my $baselanguagefilename = $javadir . $installer::globals::separator . "locale/resources/MyResources_" . $baselanguage . "\.java"; + my $basedestfilename = $javadir . $installer::globals::separator . "locale/resources/MyResources.java"; + installer::systemactions::copy_one_file($baselanguagefilename, $basedestfilename); + + # setting the class file name also for the base class + + my $basetemplatefile = installer::files::read_file($basedestfilename); + my $oldclassfilename = $baselanguagefilename; + installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$oldclassfilename); + $oldclassfilename =~ s/\.java//; + my $newclassfilename = $basedestfilename; + installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$newclassfilename); + $newclassfilename =~ s/\.java//; + + set_classfilename($basetemplatefile, $newclassfilename, $oldclassfilename); + + installer::files::save_file($basedestfilename, $basetemplatefile); + + $infoline = "Created base Java file: $basedestfilename\n"; + push( @installer::globals::logfileinfo, $infoline); + + # deleting the template file + + unlink($templatefilename); + + $infoline = "Deleted template Java resource file: $templatefilename\n"; + push( @installer::globals::logfileinfo, $infoline); + + # changing into Java directory + + my $from = cwd(); + + chdir($javadir); + + $infoline = "Changing into directory: $javadir\n"; + push( @installer::globals::logfileinfo, $infoline); + + # preparing the xml file + + my $xmlfilename = ""; + my $subdir = ""; + + if ( $installer::globals::issolarispkgbuild ) + { + $xmlfilename = "pkgUnit.xml"; + } + elsif ( $installer::globals::islinuxrpmbuild ) + { + $xmlfilename = "rpmUnit.xml"; + } + else + { + installer::exiter::exit_program("ERROR: No platform for Install SDK", "create_java_installer"); + } + + # reading, editing and saving the xmlfile + + my $xmlfile = installer::files::read_file($xmlfilename); + prepare_language_pack_in_xmlfile($xmlfile, $languagesarrayref); + my $xmlfilename2 = $xmlfilename . ".test2"; + installer::files::save_file($xmlfilename2, $xmlfile); + remove_empty_packages_in_xmlfile($xmlfile); + my $xmlfilename3 = $xmlfilename . ".test3"; + installer::files::save_file($xmlfilename3, $xmlfile); + substitute_variables($xmlfile, $allvariableshashref); + if (( $installer::globals::islinuxrpmbuild ) && ( $#installer::globals::linkrpms > -1 )) { prepare_linkrpm_in_xmlfile($xmlfile,\@installer::globals::linkrpms); } + if ( $installer::globals::issolarisx86build || $installer::globals::islinuxbuild ) { remove_w4w_from_xmlfile($xmlfile); } + remove_module_if_not_defined($xmlfile, $modulesarrayref, "gid_Module_Optional_Onlineupdate"); + replace_component_names($xmlfile, $templatefilename, $modulesarrayref, $javatemplateorigfile, $ulffile); + my $xmlfilename4 = $xmlfilename . ".test4"; + installer::files::save_file($xmlfilename4, $xmlfile); + if ( $installer::globals::islinuxrpmbuild ) { put_rpmpath_into_xmlfile($xmlfile, $listofpackages); } + if ( $installer::globals::islinuxrpmbuild ) { put_filesize_into_xmlfile($xmlfile, $listofpackages); } + installer::files::save_file($xmlfilename, $xmlfile); + $infoline = "Saving xml file: $xmlfilename\n"; + push( @installer::globals::logfileinfo, $infoline); + + # Setting the classpath and starting compiler + + set_classpath_for_install_sdk($javadir); + + # creating class files: + # language class file, dialog class files, installer class file + + my $jdkpath = ""; + if ( $ENV{'JDKPATH'} ) { $jdkpath = $ENV{'JDKPATH'}; } + + my $javac = "javac"; + if ( $jdkpath ) { $javac = $jdkpath . $installer::globals::separator . $javac; } + + my $systemcall = "$javac locale\/resources\/\*\.java 2\>\&1 |"; + make_systemcall($systemcall, 1); + + $systemcall = "$javac com\/sun\/staroffice\/install\/\*\.java 2\>\&1 |"; + make_systemcall($systemcall, 1); + + # making subdirectory creating empty packages + create_empty_packages($xmlfile); + + # Copy "jresetup" from solver locally to include it into the classfile + # Copy "jresetup" from solver to installdir + + my $setupname = "jresetup"; + my $newname = "setup"; + copy_setup_locally($includepatharrayref, $setupname, $newname); + + my $java = "java"; + if ( $jdkpath ) { $java = $jdkpath . $installer::globals::separator . $java; } + + $systemcall = "$java com.sun.setup.builder.InstallBuilder $xmlfilename -novalidate 2\>\&1 |"; + make_systemcall($systemcall, 1); + + # copying the newly created classfile into the installation set + + my $archivefilename = get_archivefilename($xmlfile); + $archivefilename = $archivefilename . ".class"; + + if ( ! -f $archivefilename ) { installer::exiter::exit_program("ERROR: Could not find Java class file $archivefilename!", "create_java_installer"); } + + installer::systemactions::copy_one_file($archivefilename, $installdir); + + # Adding the loader into the installation set. The name of the loader is setup. + put_loader_into_installset($installdir, $newname); + + chdir($from); + + $infoline = "Changing into directory: $from\n"; + push( @installer::globals::logfileinfo, $infoline); +} + +1; |