/[cvs]/nfo/perl/libs/Data/Rap/Engine.pm
ViewVC logotype

Diff of /nfo/perl/libs/Data/Rap/Engine.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1 by joko, Tue Feb 18 15:35:25 2003 UTC revision 1.7 by joko, Fri Mar 28 07:02:56 2003 UTC
# Line 2  Line 2 
2  ##  $Id$  ##  $Id$
3  ## ----------------------------------------------------------------------  ## ----------------------------------------------------------------------
4  ##  $Log$  ##  $Log$
5    ##  Revision 1.7  2003/03/28 07:02:56  joko
6    ##  modified structure around '$wrapper_program'
7    ##
8    ##  Revision 1.6  2003/03/27 15:31:05  joko
9    ##  fixes to modules regarding new namespace(s) below Data::Mungle::*
10    ##
11    ##  Revision 1.5  2003/03/27 15:03:03  joko
12    ##  enhanced 'sub run_executable'
13    ##
14    ##  Revision 1.4  2003/02/22 16:51:21  joko
15    ##  + enhanced run_executable
16    ##  modified logging output
17    ##
18    ##  Revision 1.3  2003/02/21 01:46:17  joko
19    ##  renamed core function
20    ##
21    ##  Revision 1.2  2003/02/20 19:46:33  joko
22    ##  renamed and revamped some of modules
23    ##  renamed methods
24    ##  + sub run_executable
25    ##
26  ##  Revision 1.1  2003/02/18 15:35:25  joko  ##  Revision 1.1  2003/02/18 15:35:25  joko
27  ##  + initial commit  ##  + initial commit
28  ##  ##
# Line 15  use warnings; Line 36  use warnings;
36    
37    
38  use Data::Dumper;  use Data::Dumper;
 use Data::Transform::Deep qw( refexpr2perlref );  
 use Iterate;  
39  use Hash::Merge qw( merge );  use Hash::Merge qw( merge );
40    use Iterate;
41    
42    use shortcuts qw( run_cmd );
43    use Data::Mungle::Code::Ref qw( ref_slot );
44    use Data::Mungle::Transform::Deep qw( expand );
45    
46    
47  sub performTarget {  sub performTarget {
48    my $self = shift;    my $self = shift;
49    my $targetname = shift;    my $targetname = shift;
50    my $target = $self->getTargetMetadata($targetname);    $self->perform_target($targetname);
51    }
52    
53    sub perform_target {
54      my $self = shift;
55      my $targetname = shift;
56    
57      my $header = ("- " x 12) . "   " . $targetname . "   " . ("- " x 6);
58      
59      #$self->log("- " x 35, 'notice');
60      #$self->log("Performing Target '$targetname'.", 'notice');
61    
62      $self->log($header, 'notice');
63    
64      #exit;
65    
66      my $target = $self->getTargetDetails($targetname);
67    
68    # trace    # trace
69      #print Dumper($target);      #print Dumper($target);
70      #exit;      #exit;
71            
72      $self->perform_dependencies($target);
73      $self->perform_details($target);
74    
75    }
76    
77    sub perform_dependencies {
78      my $self = shift;
79      my $target = shift;
80    # resolve dependencies (just run prior)    # resolve dependencies (just run prior)
81    if (my $targetname_dep = $target->{attrib}->{depends}) {    if (my $targetname_dep = $target->{attrib}->{depends}) {
82      $self->performTarget($targetname_dep);      my @targets = split(/,\s|,/, $targetname_dep);
83        #print Dumper(@targets);
84        #$self->perform($targetname_dep);
85        #delete $target->{attrib}->{depends};
86        foreach (@targets) {
87          if (!$self->{__rap}->{dependencies}->{resolved}->{$_}++) {
88            $self->perform_target($_);
89          }
90        }
91      delete $target->{attrib}->{depends};      delete $target->{attrib}->{depends};
92    }    }
93    }
94    
95    sub perform_details {
96      my $self = shift;
97      my $target = shift;
98      
99      #print Dumper($target);
100      #exit;
101      
102    foreach my $entry (@{$target->{content}}) {    foreach my $entry (@{$target->{content}}) {
103      my $command = $entry->{name};      my $command = $entry->{name};
104      my $args = $entry->{attrib};      my $args = $entry->{attrib};
105      $self->run_command($command, $args);      $self->perform_command($command, $args);
106        # check recursiveness
107        if ($entry->{content} && ref $entry->{content}) {
108          $self->perform_details($entry);
109        }
110    }    }
111  }  }
112    
113  sub rc {  sub rc {
114    my $self = shift;    my $self = shift;
115    return $self->run_command(@_);    return $self->perform_command(@_);
116  }  }
117    
118  sub run_command {  sub perform_command {
119    my $self = shift;    my $self = shift;
120    my $command = shift;    my $command = shift;
121      
122    if (!$command) {    if (!$command) {
123      $self->log("Command was empty!", 'warning');      $self->log("Command was empty!", 'debug');
124      return;      return;
125    }    }
126    
127      # FIXME: make '__PACKAGE__' go one level deeper properly!
128      $self->log( __PACKAGE__ . "->perform_command: " . $command, 'debug');
129        
130    my $args_list = shift;    my $args_list = shift;
131    my $args = {};    my $args = {};
# Line 69  sub run_command { Line 140  sub run_command {
140      }      }
141    }    }
142    $command = '_' . $command;    $command = '_' . $command;
143    if ($self->can($command)) {    
144      $self->$command($args);    
145      # determine container
146      my $container; # = $self->getInstance();
147      $container ||= $self;
148      
149      if ($container->can($command)) {
150        $container->$command($args);
151    } else {    } else {
152      $self->log("Command \"$command\" not implemented.", "warning");      $self->log("Command '$command' not implemented.", "warning");
153    }    }
154      
155  }  }
156    
 sub set_property {  
   my $self = shift;  
   my $args = shift;  
157    
158    my $name;  sub merge_properties {
159    my $value;    my $self = shift;
160        my $name = shift;
161    if (ref $args) {    my $data = shift;
     $self->interpolate($args) ;  
     $name = $args->{name};  
     $value = $args->{value};  
162    
163    } else {    $self->log("merge-name: $name");
164      $name = $args;    #print "name: $name", "\n";
165      $value = shift;    #print Dumper($data);
166    }    #exit;
167    
168    # check if slot (or childs of it) is/are already occupied    # check if slot (or childs of it) is/are already occupied
169    if (my $oldvalue = refexpr2perlref($self, $name, undef, '.')) {    #if (my $data_old = ref_slot($self, $name, undef, '.')) {
170      if (my $data_old = $self->get_property($name)) {
171        #print "old:", "\n";
172        #print Dumper($data_old);
173        
174      # FIXME: review - any options for 'merge' here?      # FIXME: review - any options for 'merge' here?
175      $value = merge($oldvalue, $value);      my $data_new = merge($data_old, $data);
176        #print "DATA NEE! - MERGE!", "\n";
177        #print Dumper($data_new);
178        #exit;
179        #merge_to($self, $data_new);
180        $self->set_property( { name => $name, value => $data_new } );
181        
182      } else {
183    
184    =pod    
185        # make up a dummy hash matching the structure of the destination one
186          my $dummy = {};
187          ref_slot($dummy, $name, $data, '.');
188          print Dumper($dummy);
189        
190        # mix into destination
191          mixin($self, $dummy, { init => 1 });
192    =cut
193    
194          ref_slot($self, $name, $data, '.');
195    
196    }    }
197      
198      
199      #print Dumper($self);
200      #exit;
201      #$self->
202    
203    }
204    
205    sub set_property {
206      my $self = shift;
207      my $args = shift;
208    
209      $self->interpolate($args) ;
210      my $name = $args->{name};
211      my $value = $args->{value};
212      $name = '__rap.properties.' . $name;
213    
214      $self->log("set-name: $name");
215    
216    # fill property slot with given value    # fill property slot with given value
217    if ($value) {    if ($value) {
218      refexpr2perlref($self, $name, $value, '.');      ref_slot($self, $name, $value, '.');
219    }    }
220        
221      #print Dumper($self);
222      
223    # FIXME!!!    # FIXME!!!
224    return if ! ref $args;    #return if ! ref $args;
225    
226    # fill property slot with (probably bigger) data structure from property-/configuration-style - file    # fill property slot with (probably bigger) data structure from property-/configuration-style - file
227    if (my $file = $args->{file}) {    if (my $file = $args->{file}) {
# Line 123  sub set_property { Line 239  sub set_property {
239      }      }
240    
241    } elsif (my $command = $args->{command}) {    } elsif (my $command = $args->{command}) {
242      $self->run_command($command, $args);      $self->perform_command($command, $args);
243        
244    }    }
245    
# Line 137  sub get_property { Line 253  sub get_property {
253    #$self->interpolate($args);    #$self->interpolate($args);
254    
255    #my $name = $args->{name};    #my $name = $args->{name};
256      my $result;
257    
258      if (!$name) {
259        $self->log( __PACKAGE__ . ": no name!", 'critical');
260        
261      } elsif ($name eq '/') {
262        $result = expand($self);
263    
264    # get property slot and return value    } elsif ($name eq '.') {
265    return refexpr2perlref($self, $name, undef, '.');      if (my $instance = $self->getInstance()) {
266          $result = expand($instance);
267        } else {
268          $result = ref_slot($self, '__rap.properties', undef, '.');
269          
270        }
271    
272      } else {
273    
274        $name = '__rap.properties.' . $name;
275        
276        $self->log("get-name: $name");
277        
278        # get property slot and return value
279        $result = ref_slot($self, $name, undef, '.');
280        
281        # FIXME: Is this okay? It's provided for now in order not
282        # to deliver an 'undef' to the regex below inside 'interpolate'.
283        # revamp this, maybe!
284        #$result ||= '';    # NO!!!
285      }
286        
287      return $result;
288  }  }
289    
290  sub interpolate {  sub interpolate {
# Line 152  sub interpolate { Line 296  sub interpolate {
296    }    }
297  }  }
298    
299    sub run_executable {
300      my $self = shift;
301      my $opts = shift;
302    
303      if ($opts->{executable}) {
304    
305        my $program = $opts->{executable};
306        delete $opts->{executable};
307    
308        # determine execution method
309        my $wrapper_program = '';
310        
311        # check if program is a namespace-string (contains '::') - use 'do' in this case!
312        if ($program =~ /::/) {
313          #$wrapper_program = 'rap.pl';
314          $wrapper_program = $0;
315        }
316    
317        # prepare arguments
318        my @buf;
319        foreach (keys %$opts) {
320          my $value = $opts->{$_};
321          if (m/^_/) {
322            if ($_ eq '_switches') {
323              my @switches = split(/,\s|,/, $value);
324              foreach my $switch (@switches) {
325                push @buf, '--' . $switch;
326              }
327            }
328            next;
329          }
330          
331          if ($value =~ /\s/) {
332            $value = "\"$value\"";
333          }
334          push @buf, "--$_=$value";
335        }
336    
337        # build {program} & {arguments}  
338        my $cmd = ($wrapper_program ? $wrapper_program . ' ' : '') . $program . ' ' . join(' ', @buf);
339        
340        # trace
341          #print "command: $cmd", "\n";
342        
343        # start process
344          # V1: via shortcut
345          #$ENV{PERL5LIB} = join(' ', @INC);
346          
347          # FIXME!!! what about the other slots of @INC?
348          $ENV{PERL5LIB} = $INC[0];
349          
350          #print Dumper(%ENV);
351          
352          #print "command: '$cmd'", "\n";
353    
354          # V1 - basic
355          #run_cmd($cmd);
356    
357          # V1.b - enhanced: variable local method
358          my $evalstr = "run_cmd('$cmd', 'Some task...', { async => 1 });";
359          eval($evalstr);
360          #my $res = do "$cmd";
361          #print $res, "\n" if $res;
362    
363          #$self->log("run_executable: $evalstr", 'info');
364          $self->raiseException("run_executable: $evalstr\n$@") if $@;
365    
366          # V2: via IPC::Run
367          # ....  (TODO)
368          
369        
370      }
371      
372    }
373    
374    
375  1;  1;
376  __END__  __END__

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.7

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed