xref: /AOO41X/main/solenv/bin/modules/par2script/module.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::module;
25
26use par2script::converter;
27use par2script::exiter;
28
29###########################################
30# Removing undefined gids
31# from modules
32###########################################
33
34sub remove_from_modules
35{
36    my ($gid, $item) = @_;
37
38    my $counter = 0;
39
40    if ( ! exists($par2script::globals::searchkeys{$item}) ) { par2script::exiter::exit_program("ERROR: Unknown type \"$item\" at modules.", "remove_from_modules"); }
41    my $searchkey = $par2script::globals::searchkeys{$item};
42
43    my $allmodules = $par2script::globals::definitions{'Module'};
44
45    my $onemodule;
46    foreach $onemodule (keys %{$allmodules})
47    {
48        if (( exists($allmodules->{$onemodule}->{$searchkey}) ) && ( $allmodules->{$onemodule}->{$searchkey} =~ /\b$gid\b/ ))
49        {
50            my $infoline = "WARNING: Removing $gid because of missing definition\n";
51            # print $infoline;
52            push(@par2script::globals::logfileinfo, $infoline);
53
54            $allmodules->{$onemodule}->{$searchkey} =~ s/\b$gid\b//;
55            $allmodules->{$onemodule}->{$searchkey} =~ s/\,\s*\,/\,/;
56            $allmodules->{$onemodule}->{$searchkey} =~ s/\(\s*\,\s*/\(/;
57            $allmodules->{$onemodule}->{$searchkey} =~ s/\s*\,\s*\)/\)/;
58
59            if (( $allmodules->{$onemodule}->{$searchkey} =~ /\(\s*\,\s*\)/ ) ||
60                ( $allmodules->{$onemodule}->{$searchkey} =~ /\(\s*\)/ ))
61            {
62                delete($allmodules->{$onemodule}->{$searchkey});
63            }
64
65            $counter++;
66        }
67    }
68
69    return $counter;
70}
71
72###########################################
73# Removing undefined gids automatically
74# from modules
75###########################################
76
77sub remove_undefined_gids_from_modules
78{
79    # If assigned gids for "File", "Directory" or "Unixlink" are not defined,
80    # they are automatically removed from the module
81
82    foreach $item ( @par2script::globals::items_assigned_at_modules )
83    {
84        my $assignedgids = $par2script::globals::assignedgids{$item};
85        my $definedgids = $par2script::globals::definitions{$item};
86
87        my $gid;
88        foreach $gid ( keys %{$assignedgids} )
89        {
90            if ( ! exists( $definedgids->{$gid} ))
91            {
92                # deleting entry in module definition
93                my $number_of_removals = remove_from_modules($gid, $item);
94                # decreasing counter in assignments
95                if ( $assignedgids->{$gid} > $number_of_removals ) { $assignedgids->{$gid} = $assignedgids->{$gid} - $number_of_removals; }
96                else { delete($assignedgids->{$gid}); }
97            }
98        }
99    }
100}
101
102############################################
103# Getting the gid of the root module. The
104# root module has no ParentID or an empty
105# ParentID.
106############################################
107
108sub get_rootmodule_gid
109{
110    my $rootgid = "";
111    my $foundroot = 0;
112
113    my $allmodules = $par2script::globals::definitions{'Module'};
114
115    my $modulegid = "";
116    foreach $modulegid (keys %{$allmodules} )
117    {
118        # print "Module $modulegid\n";
119        # my $content = "";
120        # foreach $content (sort keys %{$allmodules->{$modulegid}}) { print "\t$content = $allmodules->{$modulegid}->{$content};\n"; }
121        # print "End\n";
122        # print "\n";
123
124        if (( ! exists($allmodules->{$modulegid}->{'ParentID'})) || ( $allmodules->{$modulegid}->{'ParentID'} eq "" ))
125        {
126            if ( $foundroot ) { par2script::exiter::exit_program("ERROR: More than one Root module. Only one module without ParentID or with empty ParentID allowed ($rootgid and $modulegid).", "get_rootmodule_gid"); }
127            $rootgid = $modulegid;
128            $foundroot = 1;
129        }
130    }
131
132    if ( ! $foundroot ) { par2script::exiter::exit_program("ERROR: Could not find Root module. Did not find module without ParentID or with empty ParentID.", "get_rootmodule_gid"); }
133
134    return $rootgid;
135}
136
137####################################
138# Adding defined items without
139# assignment to the root module.
140####################################
141
142sub add_to_root_module
143{
144    # If defined gids for "File", "Directory" or "Unixlink" are not assigned,
145    # they are automatically assigned to the root module
146
147    my $rootmodulegid = get_rootmodule_gid();
148
149    my $item;
150    foreach $item ( @par2script::globals::items_assigned_at_modules )
151    {
152        my $assignedgids = $par2script::globals::assignedgids{$item};
153        my $definedgids = $par2script::globals::definitions{$item};
154
155        my $gidstring = "";
156
157        # Perhaps there are already items assigned to the root
158        if ( ! exists($par2script::globals::searchkeys{$item}) ) { par2script::exiter::exit_program("ERROR: Unknown type \"$item\" at modules.", "remove_from_modules"); }
159        my $modulekey = $par2script::globals::searchkeys{$item};
160        if ( exists($par2script::globals::definitions{'Module'}->{$rootmodulegid}->{$modulekey}) )
161        {
162            $gidstring = $par2script::globals::definitions{'Module'}->{$rootmodulegid}->{$modulekey};
163            $gidstring =~ s/\(//;
164            $gidstring =~ s/\)//;
165        }
166
167        my $gid;
168        foreach $gid ( keys %{$definedgids} )
169        {
170            if ( ! exists( $assignedgids->{$gid} ))
171            {
172                if ( $gidstring eq "" )
173                {
174                    $gidstring = $gid;
175                }
176                else
177                {
178                    $gidstring = "$gidstring,$gid";
179                }
180
181                $assignedgids->{$gid} = 1;
182            }
183        }
184
185        if ( $gidstring ne "" )
186        {
187            $gidstring = "\($gidstring\)";
188            $par2script::globals::definitions{'Module'}->{$rootmodulegid}->{$modulekey} = $gidstring;
189        }
190    }
191}
192
193###################################################
194# Including \n in a very long string
195###################################################
196
197sub include_linebreaks
198{
199    my ($allgidstring) = @_;
200
201    my $newline = "";
202    my $newlength = 0;
203
204    $allgidstring =~ s/\(//;
205    $allgidstring =~ s/\)//;
206
207    my $allgids = par2script::converter::convert_stringlist_into_array_2($allgidstring, ",");
208
209    if ( $#{$allgids} > -1 )
210    {
211        my $onegid;
212        foreach $onegid ( @{$allgids} )
213        {
214            $newline = "$newline$onegid,";
215            $newlength = $newlength + length($onegid) + 1; # +1 for the comma
216
217            if ( $newlength > 80 )
218            {
219                $newline = $newline . "\n\t\t\t\t";
220                $newlength = 0;
221            }
222        }
223    }
224
225    $newline =~ s/,\s*$//;
226    $newline = "($newline)";
227
228    return $newline;
229}
230
231###################################################
232# Shorten the lines that belong to modules, if
233# the length of the line is greater 100
234###################################################
235
236sub shorten_lines_at_modules
237{
238    my $item;
239    foreach $item ( @par2script::globals::items_assigned_at_modules )
240    {
241        if ( ! exists($par2script::globals::searchkeys{$item}) ) { par2script::exiter::exit_program("ERROR: Unknown type \"$item\" at modules.", "shorten_lines_at_modules"); }
242        my $searchkey = $par2script::globals::searchkeys{$item};
243
244        my $allmodules = $par2script::globals::definitions{'Module'};
245
246        my $onemodule;
247        foreach $onemodule (keys %{$allmodules})
248        {
249            if (( exists($allmodules->{$onemodule}->{$searchkey}) ) &&
250                ( length($allmodules->{$onemodule}->{$searchkey}) > 100 ))
251            {
252                # including "\n\t\t\t\t"
253                my $newstring = include_linebreaks($allmodules->{$onemodule}->{$searchkey});
254                $allmodules->{$onemodule}->{$searchkey} = $newstring;
255            }
256        }
257    }
258}
259
2601;
261