#!/usr/bin/perl -s -Ilib use warnings; use strict; our $png; use Data::Dumper; use CROSS::DMOSS; use GraphViz; my $file = shift; $file = 'dmoss.data' unless $file; my $dmoss = CROSS::DMOSS::load($file); my $g = GraphViz->new(name=>'dmoss', rankdir=>1); my $root = $dmoss->{tree}; proc_node($root,$dmoss->{meta}->{dist}); # XXX my $target = $dmoss->{meta}->{dist}; my $res = $dmoss->{res}->{__PACKAGE__}; if (%$res) { foreach (keys %$res) { my $value = $res->{$_}->{__value}; if (ref($value) eq 'HASH') { my @tmp; foreach my $i (keys %$value) { push @tmp, "$i = $value->{$i}"; } $value = join('; ', @tmp); } if (ref($value) eq 'ARRAY') { $value = join('; ', @$value); } #print STDERR "$target -- $_ --> $value\n"; $g->add_edge($target => $value, label => $_ ); } } # /XXX if ($png) { open my $fh, '>', 'dmoss.png'; print $fh $g->as_png; close $fh; print STDERR "Png saved as dmoss.png\n"; } else { print $g->as_dot; } sub proc_node { my ($root, $source) = @_; foreach my $k (keys %$root) { if (ref($root->{$k}) eq 'HASH') { proc_node($root->{$k}, $k); } } foreach my $k (keys %$root) { my $target = $k; $target = $dmoss->{files}->{$k}->{basename} if ($dmoss->{files}->{$k}); $g->add_node($source, style=>'filled', fillcolor=>'gray'); $g->add_node($target, style=>'filled', fillcolor=>'gray'); $g->add_edge($source => $target); my $typeof = ''; $typeof = $dmoss->{typeof}->{$k} if ($dmoss->{typeof}->{$k}); if ($typeof) { $g->add_node("T_$typeof", label=>$typeof, shape=>'trapezium'); $g->add_edge($target => "T_$typeof", label => 'typeof' ) if $typeof; } my $res = {}; $res = $dmoss->{res}->{$k} if $dmoss->{res}->{$k}; if (%$res) { foreach (keys %$res) { my $value = $res->{$_}->{__value}; if (ref($value) eq 'HASH') { my @tmp; foreach my $i (keys %$value) { push @tmp, "$i = $value->{$i}"; } $value = join('; ', @tmp); } if (ref($value) eq 'ARRAY') { $value = join('; ', @$value); } #print STDERR "$target -- $_ --> $value\n"; $g->add_edge($target => $value, label => $_ ); } } } }