office-gobmx/solenv/bin/modules/installer/javainstaller.pm
2010-11-09 08:39:35 +01:00

1869 lines
60 KiB
Perl
Raw Blame History

#*************************************************************************
#
# 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)
${$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*\<5C>\<5C>\<5C>//; }
$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::isrpmbuild )
{
$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::isrpmbuild )
{
$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) = @_;
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::isrpmbuild )
{
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);
chmod 0775, $newname;
}
#######################################################
# 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);
chmod 0775, $installname;
}
#################################################################
# 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::isrpmbuild )
{
$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*$//;
# 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.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" )
$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"
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::isrpmbuild )
{
$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::isrpmbuild ) && ( $#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::isrpmbuild ) { put_rpmpath_into_xmlfile($xmlfile, $listofpackages); }
if ( $installer::globals::isrpmbuild ) { 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;