/[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.4 by joko, Sat Feb 22 16:51:21 2003 UTC
# Line 2  Line 2 
2  ##  $Id$  ##  $Id$
3  ## ----------------------------------------------------------------------  ## ----------------------------------------------------------------------
4  ##  $Log$  ##  $Log$
5    ##  Revision 1.4  2003/02/22 16:51:21  joko
6    ##  + enhanced run_executable
7    ##  modified logging output
8    ##
9    ##  Revision 1.3  2003/02/21 01:46:17  joko
10    ##  renamed core function
11    ##
12    ##  Revision 1.2  2003/02/20 19:46:33  joko
13    ##  renamed and revamped some of modules
14    ##  renamed methods
15    ##  + sub run_executable
16    ##
17  ##  Revision 1.1  2003/02/18 15:35:25  joko  ##  Revision 1.1  2003/02/18 15:35:25  joko
18  ##  + initial commit  ##  + initial commit
19  ##  ##
# Line 15  use warnings; Line 27  use warnings;
27    
28    
29  use Data::Dumper;  use Data::Dumper;
 use Data::Transform::Deep qw( refexpr2perlref );  
 use Iterate;  
30  use Hash::Merge qw( merge );  use Hash::Merge qw( merge );
31    use Iterate;
32    
33    use shortcuts qw( run_cmd );
34    use Data::Code::Ref qw( ref_slot );
35    use Data::Transform::Deep qw( expand );
36    
37    
38  sub performTarget {  sub performTarget {
39    my $self = shift;    my $self = shift;
40    my $targetname = shift;    my $targetname = shift;
41    my $target = $self->getTargetMetadata($targetname);    $self->perform_target($targetname);
42    }
43    
44    sub perform_target {
45      my $self = shift;
46      my $targetname = shift;
47    
48      my $header = ("- " x 12) . "   " . $targetname . "   " . ("- " x 6);
49      
50      #$self->log("- " x 35, 'notice');
51      #$self->log("Performing Target '$targetname'.", 'notice');
52    
53      $self->log($header, 'notice');
54    
55      #exit;
56    
57      my $target = $self->getTargetDetails($targetname);
58    
59    # trace    # trace
60      #print Dumper($target);      #print Dumper($target);
61      #exit;      #exit;
62            
63      $self->perform_dependencies($target);
64      $self->perform_details($target);
65    
66    }
67    
68    sub perform_dependencies {
69      my $self = shift;
70      my $target = shift;
71    # resolve dependencies (just run prior)    # resolve dependencies (just run prior)
72    if (my $targetname_dep = $target->{attrib}->{depends}) {    if (my $targetname_dep = $target->{attrib}->{depends}) {
73      $self->performTarget($targetname_dep);      my @targets = split(/,\s|,/, $targetname_dep);
74        #print Dumper(@targets);
75        #$self->perform($targetname_dep);
76        #delete $target->{attrib}->{depends};
77        foreach (@targets) {
78          if (!$self->{__rap}->{dependencies}->{resolved}->{$_}++) {
79            $self->perform_target($_);
80          }
81        }
82      delete $target->{attrib}->{depends};      delete $target->{attrib}->{depends};
83    }    }
84    }
85    
86    sub perform_details {
87      my $self = shift;
88      my $target = shift;
89      
90      #print Dumper($target);
91      #exit;
92      
93    foreach my $entry (@{$target->{content}}) {    foreach my $entry (@{$target->{content}}) {
94      my $command = $entry->{name};      my $command = $entry->{name};
95      my $args = $entry->{attrib};      my $args = $entry->{attrib};
96      $self->run_command($command, $args);      $self->perform_command($command, $args);
97        # check recursiveness
98        if ($entry->{content} && ref $entry->{content}) {
99          $self->perform_details($entry);
100        }
101    }    }
102  }  }
103    
104  sub rc {  sub rc {
105    my $self = shift;    my $self = shift;
106    return $self->run_command(@_);    return $self->perform_command(@_);
107  }  }
108    
109  sub run_command {  sub perform_command {
110    my $self = shift;    my $self = shift;
111    my $command = shift;    my $command = shift;
112      
113    if (!$command) {    if (!$command) {
114      $self->log("Command was empty!", 'warning');      $self->log("Command was empty!", 'debug');
115      return;      return;
116    }    }
117    
118      # FIXME: make '__PACKAGE__' go one level deeper properly!
119      $self->log( __PACKAGE__ . "->perform_command: " . $command, 'debug');
120        
121    my $args_list = shift;    my $args_list = shift;
122    my $args = {};    my $args = {};
# Line 69  sub run_command { Line 131  sub run_command {
131      }      }
132    }    }
133    $command = '_' . $command;    $command = '_' . $command;
134    if ($self->can($command)) {    
135      $self->$command($args);    
136      # determine container
137      my $container; # = $self->getInstance();
138      $container ||= $self;
139      
140      if ($container->can($command)) {
141        $container->$command($args);
142    } else {    } else {
143      $self->log("Command \"$command\" not implemented.", "warning");      $self->log("Command '$command' not implemented.", "warning");
144    }    }
145      
146  }  }
147    
 sub set_property {  
   my $self = shift;  
   my $args = shift;  
148    
149    my $name;  sub merge_properties {
150    my $value;    my $self = shift;
151        my $name = shift;
152    if (ref $args) {    my $data = shift;
     $self->interpolate($args) ;  
     $name = $args->{name};  
     $value = $args->{value};  
153    
154    } else {    $self->log("merge-name: $name");
155      $name = $args;    #print "name: $name", "\n";
156      $value = shift;    #print Dumper($data);
157    }    #exit;
158    
159    # check if slot (or childs of it) is/are already occupied    # check if slot (or childs of it) is/are already occupied
160    if (my $oldvalue = refexpr2perlref($self, $name, undef, '.')) {    #if (my $data_old = ref_slot($self, $name, undef, '.')) {
161      if (my $data_old = $self->get_property($name)) {
162        #print "old:", "\n";
163        #print Dumper($data_old);
164        
165      # FIXME: review - any options for 'merge' here?      # FIXME: review - any options for 'merge' here?
166      $value = merge($oldvalue, $value);      my $data_new = merge($data_old, $data);
167        #print "DATA NEE! - MERGE!", "\n";
168        #print Dumper($data_new);
169        #exit;
170        #merge_to($self, $data_new);
171        $self->set_property( { name => $name, value => $data_new } );
172        
173      } else {
174    
175    =pod    
176        # make up a dummy hash matching the structure of the destination one
177          my $dummy = {};
178          ref_slot($dummy, $name, $data, '.');
179          print Dumper($dummy);
180        
181        # mix into destination
182          mixin($self, $dummy, { init => 1 });
183    =cut
184    
185          ref_slot($self, $name, $data, '.');
186    
187    }    }
188      
189      
190      #print Dumper($self);
191      #exit;
192      #$self->
193    
194    }
195    
196    sub set_property {
197      my $self = shift;
198      my $args = shift;
199    
200      $self->interpolate($args) ;
201      my $name = $args->{name};
202      my $value = $args->{value};
203      $name = '__rap.properties.' . $name;
204    
205      $self->log("set-name: $name");
206    
207    # fill property slot with given value    # fill property slot with given value
208    if ($value) {    if ($value) {
209      refexpr2perlref($self, $name, $value, '.');      ref_slot($self, $name, $value, '.');
210    }    }
211        
212      #print Dumper($self);
213      
214    # FIXME!!!    # FIXME!!!
215    return if ! ref $args;    #return if ! ref $args;
216    
217    # 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
218    if (my $file = $args->{file}) {    if (my $file = $args->{file}) {
# Line 123  sub set_property { Line 230  sub set_property {
230      }      }
231    
232    } elsif (my $command = $args->{command}) {    } elsif (my $command = $args->{command}) {
233      $self->run_command($command, $args);      $self->perform_command($command, $args);
234        
235    }    }
236    
# Line 137  sub get_property { Line 244  sub get_property {
244    #$self->interpolate($args);    #$self->interpolate($args);
245    
246    #my $name = $args->{name};    #my $name = $args->{name};
247      my $result;
248    
249      if (!$name) {
250        $self->log( __PACKAGE__ . ": no name!", 'critical');
251        
252      } elsif ($name eq '/') {
253        $result = expand($self);
254    
255    # get property slot and return value    } elsif ($name eq '.') {
256    return refexpr2perlref($self, $name, undef, '.');      if (my $instance = $self->getInstance()) {
257          $result = expand($instance);
258        } else {
259          $result = ref_slot($self, '__rap.properties', undef, '.');
260          
261        }
262    
263      } else {
264    
265        $name = '__rap.properties.' . $name;
266        
267        $self->log("get-name: $name");
268        
269        # get property slot and return value
270        $result = ref_slot($self, $name, undef, '.');
271        
272        # FIXME: Is this okay? It's provided for now in order not
273        # to deliver an 'undef' to the regex below inside 'interpolate'.
274        # revamp this, maybe!
275        #$result ||= '';    # NO!!!
276      }
277        
278      return $result;
279  }  }
280    
281  sub interpolate {  sub interpolate {
# Line 152  sub interpolate { Line 287  sub interpolate {
287    }    }
288  }  }
289    
290    sub run_executable {
291      my $self = shift;
292      my $opts = shift;
293    
294      if ($opts->{executable}) {
295    
296        my $program = $opts->{executable};
297        delete $opts->{executable};
298    
299        my @buf;
300        foreach (keys %$opts) {
301          my $value = $opts->{$_};
302          if (m/^_/) {
303            if ($_ eq '_switches') {
304              my @switches = split(/,\s|,/, $value);
305              foreach my $switch (@switches) {
306                push @buf, '--' . $switch;
307              }
308            }
309            next;
310          }
311          
312          if ($value =~ /\s/) {
313            $value = "\"$value\"";
314          }
315          push @buf, "--$_=$value";
316        }
317      
318        my $cmd = $program . ' ' . join(' ', @buf);
319        
320        # trace
321          #print "command: $cmd", "\n";
322        
323        # start process
324          # V1: via shortcut
325          #$ENV{PERL5LIB} = join(' ', @INC);
326          
327          # FIXME!!! what about the other slots of @INC?
328          $ENV{PERL5LIB} = $INC[0];
329          
330          #print Dumper(%ENV);
331          run_cmd($cmd);
332          # V2: via IPC::Run
333          # ....  (TODO)
334        
335        
336      }
337      
338    }
339    
340    
341  1;  1;
342  __END__  __END__

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

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