diff options
Diffstat (limited to 'lib/WebCoso/Config')
-rw-r--r-- | lib/WebCoso/Config/Collection.pm | 28 | ||||
-rw-r--r-- | lib/WebCoso/Config/Resource.pm | 33 |
2 files changed, 58 insertions, 3 deletions
diff --git a/lib/WebCoso/Config/Collection.pm b/lib/WebCoso/Config/Collection.pm index c4b6347..6108623 100644 --- a/lib/WebCoso/Config/Collection.pm +++ b/lib/WebCoso/Config/Collection.pm @@ -28,7 +28,11 @@ sub BUILD { $children_of{$ident}=$children; $_->add_parent($self) for @$children; + $resources_of{$ident}=[]; + WebCoso::Config->add_collection($self); + + return; } sub axes { @@ -74,6 +78,8 @@ sub add_child { push @{ $self->get_children_ref() },$child; $child->add_parent($self); + + return; } sub add_parent { my ($self,$parent)=@_; @@ -85,6 +91,28 @@ sub add_parent { push @{ $self->get_parents_ref() },$weak_parent; $parent->add_child($self); + + return; +} +sub add_res { + my ($self, @resources)=@_; + + # creo una tabellina di look-up per evitare i duplicati + # NOTA: le chiavi sono stringhe, non ref, non si può usare per + # pescare gli oggetti + my %res_key; + @res_key{ @{ $self->get_resources_ref() } } = (); + + RESOURCES: + for my $res (@resources) { + next RESOURCES if exists $res_key{$res}; + + push @{ $self->get_resources_ref() }, $res; + $res_key{$res}=undef; + $res->add_coll($self); + } + + return; } sub get_parents { diff --git a/lib/WebCoso/Config/Resource.pm b/lib/WebCoso/Config/Resource.pm index 4b5cd60..fc80d41 100644 --- a/lib/WebCoso/Config/Resource.pm +++ b/lib/WebCoso/Config/Resource.pm @@ -2,16 +2,23 @@ package WebCoso::Config::Resource; use strict; use warnings; use Class::Std; +use Scalar::Util 'weaken'; +use List::MoreUtils 'any'; use WebCoso::Config; +use WebCoso::X; { -my %sources_of :ATTR( :init_arg<source> :get<sources>); +my %sources_of :ATTR( :init_arg<sources> :get<sources>); my %pipelines_of :ATTR( :init_arg<pipeline> :get<pipeline>); my %dest_of :ATTR( :init_arg<destination> :get<destination>); +my %collections_of :ATTR( :get<collections_ref> ); sub BUILD { my ($self,$ident,$args_ref)=@_; + + $collections_of{$ident}=[]; + WebCoso::Config->add_resource($self); } @@ -48,14 +55,34 @@ sub properties { } sub collections { - return (); + my ($self)=@_; + + return @{ $self->get_collections_ref() }; +} + +sub add_coll { + my ($self, $collection)=@_; + + return if any { $_ eq $collection } @{ $self->get_collections_ref() }; + + my $weak_collection = $collection; + weaken $weak_collection; + + push @{ $self->get_collections_ref() }, $weak_collection; + + $collection->add_res($self); + + return; } sub _read_file :PRIVATE { my ($filename)=@_; local $/; - open my $fh,'<:raw',$filename or die "Can't open $filename: $!\n"; + open my $fh,'<:raw',$filename + or WebCoso::X::OpenError->throw( + filename => $filename, + error => $!); return scalar <$fh>; } |