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