package DirNode; use file_node qw(:all); use link_node qw(:all); sub new { my ($class,$node_name,$node_type) = @_; my $self = { "nodes" => {}, "type" => $node_type, "name" => $node_name }; bless $self, $class; return $self; } sub get_child_node_by_name { my ($self,$node_name) = @_; if (defined($self->{"nodes"}{$node_name})) { return $self->{"nodes"}{$node_name}; } return undef; } sub add_child_node { my ($self,$node_name,$node_type) = @_; if ($node_type eq "dir") { my $new_node = new DirNode($node_name); $self->{"nodes"}{$node_name} = $new_node; return $new_node; } elsif ($node_type eq "file") { my $new_node = new FileNode($node_name); $self->{"nodes"}{$node_name} = $new_node; return $new_node; } return undef; } sub add_child_link_node { my ($self,$node_name,$node_target,$node_type) = @_; my $new_node = new LinkNode($node_name,$node_target,$node_type); $self->{"nodes"}{$node_name} = $new_node; return $new_node; } sub get_dirs { my ($self) = @_; my $path = $self->{"name"}; my %paths; foreach my $current_node (values(%{$self->{"nodes"}})) { if ($current_node->isa('DirNode')) { my %subpaths = $current_node->get_dirs(); foreach my $subpath (keys(%subpaths)) { my $updated_path = catdir($path,$subpath); $paths{$updated_path} += 1; } } } if (scalar(keys(%paths)) == 0) { $paths{$path} += 1; } return %paths; } sub get_files { my ($self) = @_; my $path = $self->{"name"}; my %paths; foreach my $current_node (values(%{$self->{"nodes"}})) { if ($current_node->isa('DirNode')) { my %subpaths = $current_node->get_files(); foreach my $subpath (keys(%subpaths)) { my $updated_path = catdir($path,$subpath); $paths{$updated_path} += 1; } } elsif ($current_node->isa('FileNode')) { my $updated_path = catdir($path,$current_node->{"name"}); $paths{$updated_path} += 1; } } return %paths; } sub get_links { my ($self) = @_; my $path = $self->{"name"}; my %paths; foreach my $current_node (values(%{$self->{"nodes"}})) { if ($current_node->isa('DirNode')) { my %subpaths = $current_node->get_links(); foreach my $subpath (keys(%subpaths)) { my $updated_path = catdir($path,$subpath); $paths{$updated_path} = $subpaths{$subpath}; } } elsif ($current_node->isa('LinkNode')) { my $target_path = $current_node->{"target"}; my $updated_path = catdir($path,$current_node->{"name"}); $paths{$updated_path} = $target_path; } } return %paths; } sub display_tree { my ($self,$prefix) = @_; print($prefix." ".$self->{"name"}."\n"); foreach my $current_node (values(%{$self->{"nodes"}})) { $current_node->display_tree($prefix."-"); } } 1;