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