#*************************************************************************
#
# 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;
