1#*************************************************************************
2#
3# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4#
5# Copyright 2000, 2010 Oracle and/or its affiliates.
6#
7# OpenOffice.org - a multi-platform office productivity suite
8#
9# This file is part of OpenOffice.org.
10#
11# OpenOffice.org is free software: you can redistribute it and/or modify
12# it under the terms of the GNU Lesser General Public License version 3
13# only, as published by the Free Software Foundation.
14#
15# OpenOffice.org is distributed in the hope that it will be useful,
16# but WITHOUT ANY WARRANTY; without even the implied warranty of
17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18# GNU Lesser General Public License version 3 for more details
19# (a copy is included in the LICENSE file that accompanied this code).
20#
21# You should have received a copy of the GNU Lesser General Public License
22# version 3 along with OpenOffice.org.  If not, see
23# <http://www.openoffice.org/license.html>
24# for a copy of the LGPLv3 License.
25#
26#*************************************************************************
27
28package par2script::check;
29
30use par2script::globals;
31
32################################
33# Checks of the setup script
34################################
35
36########################################################
37# Checking if all defined directories are needed
38########################################################
39
40sub check_needed_directories
41{
42	my $allfiles = $par2script::globals::definitions{'File'};
43	my $alldirs = $par2script::globals::definitions{'Directory'};
44
45	# checking if all defined directories are needed
46
47	my $dir;
48	foreach $dir ( keys %{$alldirs} )
49	{
50		# I. directory has create flag
51		if (( exists($alldirs->{$dir}->{'Styles'}) ) && ( $alldirs->{$dir}->{'Styles'} =~ /\bCREATE\b/ )) { next; }
52
53		# II. there is at least one file in the directory
54		my $fileinside = 0;
55		my $file;
56		foreach $file ( keys %{$allfiles} )
57		{
58			if (( $allfiles->{$file}->{'Dir'} eq $dir ) || ( $allfiles->{$file}->{'NetDir'} eq $dir ))
59			{
60				$fileinside = 1;
61				last;
62			}
63		}
64		if ( $fileinside ) { next; }
65
66		# III. the directory is parent for another directory
67		my $isparent = 0;
68		my $onedir;
69		foreach $onedir ( keys %{$alldirs} )
70		{
71			if ( $alldirs->{$onedir}->{'ParentID'} eq $dir )
72			{
73				$isparent = 1;
74				last;
75			}
76		}
77		if ( $isparent ) { next; }
78
79		# no condition is true -> directory definition is superfluous
80		my $infoline = "\tINFO: Directory definition $dir is superfluous\n";
81		# print $infoline;
82		push(@par2script::globals::logfileinfo, $infoline);
83	}
84}
85
86##################################################
87# Checking if the directories in the item
88# definitions are defined.
89##################################################
90
91sub check_directories_in_item_definitions
92{
93	my $item;
94	foreach $item ( @par2script::globals::items_with_directories )
95	{
96		my $allitems = $par2script::globals::definitions{$item};
97
98		my $onegid;
99		foreach $onegid ( keys %{$allitems} )
100		{
101			if ( ! exists($allitems->{$onegid}->{'Dir'}) ) { die "\nERROR: No directory defined for item: $onegid!\n\n"; }
102			my $dir = $allitems->{$onegid}->{'Dir'};
103			if (( $dir eq "PD_PROGDIR" ) || ( $dir =~ /PREDEFINED_/ )) { next; }
104
105			# checking if this directoryid is defined
106			if ( ! exists($par2script::globals::definitions{'Directory'}->{$dir}) )
107			{
108				die "\nERROR: Directory $dir in item $onegid not defined!\n\n";
109			}
110		}
111	}
112}
113
114########################################################
115# Checking for all Items, that know their modules,
116# whether these modules exist.
117########################################################
118
119sub check_module_existence
120{
121	my $item;
122	foreach $item ( @par2script::globals::items_with_moduleid )
123	{
124		my $allitems = $par2script::globals::definitions{$item};
125
126		my $onegid;
127		foreach $onegid ( keys %{$allitems} )
128		{
129			if ( ! exists($allitems->{$onegid}->{'ModuleID'}) ) { die "\nERROR: No ModuleID defined for item: $onegid!\n\n"; }
130			my $moduleid = $allitems->{$onegid}->{'ModuleID'};
131
132			# checking if this directoryid is defined
133			if ( ! exists($par2script::globals::definitions{'Module'}->{$moduleid}) )
134			{
135				die "\nERROR: ModuleID $moduleid in item $onegid not defined!\n\n";
136			}
137		}
138	}
139}
140
141########################################################
142# Every script has to contain exactly one root module.
143# This module has no ParentID or an empty ParentID.
144########################################################
145
146sub check_rootmodule
147{
148	my $rootgid = "";
149	my $foundroot = 0;
150
151	my $allmodules = $par2script::globals::definitions{'Module'};
152
153	my $modulegid = "";
154	foreach $modulegid (keys %{$allmodules} )
155	{
156		if (( ! exists($allmodules->{$modulegid}->{'ParentID'}) ) || ( $allmodules->{$modulegid}->{'ParentID'} eq "" ))
157		{
158			if ( $foundroot )
159			{
160				die "\nERROR: More than one Root module. Only one module without ParentID or with empty ParentID allowed ($rootgid and $modulegid).\n";
161			}
162			$rootgid = $modulegid;
163			$foundroot = 1;
164		}
165	}
166
167	if ( ! $foundroot )
168	{
169		die "\nERROR: Could not find Root module. Did not find module without ParentID or with empty ParentID.\n";
170	}
171
172	print " $rootgid\n";
173
174}
175
176########################################################
177# File, Shortcut, Directory, Unixlink must not
178# contain a ModuleID
179########################################################
180
181sub check_moduleid_at_items
182{
183	my $item;
184	foreach $item ( @par2script::globals::items_without_moduleid )
185	{
186		my $allitems = $par2script::globals::definitions{$item};
187
188		my $onegid;
189		foreach $onegid ( keys %{$allitems} )
190		{
191			if ( exists($allitems->{$onegid}->{'ModuleID'}) )
192			{
193				die "\nERROR: ModuleID assigned to $onegid! No module assignment to $item!\n\n";
194			}
195		}
196	}
197}
198
199########################################################
200# Controlling existence of multi assignments
201########################################################
202
203sub check_multiple_assignments
204{
205	my @multiassignments = ();
206	my $error;
207
208	my $topitem;
209	foreach $topitem ( keys %par2script::globals::assignedgids )
210	{
211		my $item;
212		foreach $item ( keys %{$par2script::globals::assignedgids{$topitem}} )
213		{
214			if ( $par2script::globals::assignedgids{$topitem}->{$item} > 1 )
215			{
216				$error = 1;
217				my $string = "\tGID: $item Assignments: $par2script::globals::assignedgids{$topitem}->{$item}";
218				push(@multiassignments, $string);
219			}
220		}
221	}
222
223	if ( $error ) { par2script::exiter::multiassignmenterror(\@multiassignments); }
224}
225
226########################################################
227# Check, if a defined directory has a flag CREATE
228########################################################
229
230sub contains_create_flag
231{
232	my ($gid) = @_;
233
234	my $createflag = 0;
235
236	if (( exists($par2script::globals::definitions{'Directory'}->{$gid}->{'Styles'}) ) &&
237		( $par2script::globals::definitions{'Directory'}->{$gid}->{'Styles'} =~ /\bCREATE\b/ ))
238	{
239		$createflag = 1;
240	}
241
242	return $createflag;
243}
244
245########################################################
246# Controlling existence of definitions without
247# any assignment
248########################################################
249
250sub check_missing_assignments
251{
252	# If defined gids for "File", "Directory" or "Unixlink" are not assigned,
253	# this causes an error.
254	# Directories only have to be assigned, if they have the flag "CREATE".
255
256	my @missingassignments = ();
257	$error = 0;
258
259	my $item;
260	foreach $item ( @par2script::globals::items_assigned_at_modules )
261	{
262		my $assignedgids = $par2script::globals::assignedgids{$item};
263		my $definedgids = $par2script::globals::definitions{$item};
264
265		my $gid;
266		foreach $gid ( keys %{$definedgids} )
267		{
268			if ( $item eq "Directory" ) { if ( ! contains_create_flag($gid) ) { next; }	}
269
270			if ( ! exists( $assignedgids->{$gid} ))
271			{
272				$error = 1;
273				push(@missingassignments, $gid);
274			}
275		}
276	}
277
278	if ( $error ) { par2script::exiter::missingassignmenterror(\@missingassignments); }
279}
280
281#############################################################
282# Controlling if for all shortcuts with file assignment
283# the file is defined. And for all shortcuts with
284# shortcut assignment the shortcut has to be defined.
285#############################################################
286
287sub check_shortcut_assignments
288{
289	my $allshortcuts = $par2script::globals::definitions{'Shortcut'};
290	my $allfiles = $par2script::globals::definitions{'File'};
291
292	my $shortcut;
293	foreach $shortcut ( keys %{$allshortcuts} )
294	{
295		if (( exists($allshortcuts->{$shortcut}->{'FileID'}) ) &&
296			( ! exists($allfiles->{$allshortcuts->{$shortcut}->{'FileID'}}) ))
297		{
298			# die "\nERROR: FileID $allshortcuts->{$shortcut}->{'FileID'} has no definition at shortcut $shortcut !\n";
299			print "\n\tWARNING: FileID $allshortcuts->{$shortcut}->{'FileID'} has no definition at shortcut $shortcut !\n";
300		}
301
302		if (( exists($allshortcuts->{$shortcut}->{'ShortcutID'}) ) &&
303			( ! exists($allshortcuts->{$allshortcuts->{$shortcut}->{'ShortcutID'}}) ))
304		{
305			die "\nERROR: ShortcutID $allshortcuts->{$shortcut}->{'ShortcutID'} has no definition at shortcut $shortcut !\n";
306		}
307
308		if (( ! exists($allshortcuts->{$shortcut}->{'ShortcutID'}) ) &&
309			( ! exists($allshortcuts->{$shortcut}->{'FileID'}) ))
310		{
311			die "\nERROR: Shortcut requires assignment to \"ShortcutID\" or \"FileID\". Missing at shortcut $shortcut !\n";
312		}
313	}
314}
315
316#############################################################
317# Controlling if for Modules and Directories, the parents
318# are defined. If not, this can lead to a problem during
319# script creation, because only recursively added
320# Modules or Directories are added to the script.
321#############################################################
322
323sub check_missing_parents
324{
325	my @parentitems = ("Module", "Directory");
326	my %rootparents = ("PREDEFINED_PROGDIR" => "1");
327
328	my $oneitem;
329	foreach $oneitem ( @parentitems )
330	{
331		my $alldefinitions = $par2script::globals::definitions{$oneitem};
332
333		my $onegid;
334		foreach $onegid ( keys %{$alldefinitions} )
335		{
336			# If there is a ParentID used, it must be defined
337			if (( exists($alldefinitions->{$onegid}->{'ParentID'}) ) &&
338				( ! exists($alldefinitions->{$alldefinitions->{$onegid}->{'ParentID'}}) ) &&
339				( ! exists($rootparents{$alldefinitions->{$onegid}->{'ParentID'}}) ))
340			{
341				die "\nERROR: Parent \"$alldefinitions->{$onegid}->{'ParentID'}\" at $oneitem \"$onegid\" is not defined!\n";
342			}
343		}
344	}
345}
346
3471;
348