diff options
author | dakkar <dakkar@luxion> | 2005-11-05 10:57:58 +0000 |
---|---|---|
committer | dakkar <dakkar@luxion> | 2005-11-05 10:57:58 +0000 |
commit | c8e73a5e1f75b6f6ceff09e088c0f69861b6c448 (patch) | |
tree | e050275e3ad19c0c306a3072c1212b5627222eaf /lib/WebCoso | |
parent | creato contenitore collezioni, migliorata gestione lingue (diff) | |
download | WebCoso-c8e73a5e1f75b6f6ceff09e088c0f69861b6c448.tar.gz WebCoso-c8e73a5e1f75b6f6ceff09e088c0f69861b6c448.tar.bz2 WebCoso-c8e73a5e1f75b6f6ceff09e088c0f69861b6c448.zip |
spostata eccezione di file not found, cambiati i 'die' con Exception::Class, inizio di aggancio c-r
git-svn-id: svn://luxion/repos/WebCoso/trunk@19 fcb26f47-9200-0410-b104-b98ab5b095f3
Diffstat (limited to 'lib/WebCoso')
-rw-r--r-- | lib/WebCoso/Config.pm | 20 | ||||
-rw-r--r-- | lib/WebCoso/Config/Collection.pm | 28 | ||||
-rw-r--r-- | lib/WebCoso/Config/Resource.pm | 33 | ||||
-rw-r--r-- | lib/WebCoso/X.pm | 25 |
4 files changed, 98 insertions, 8 deletions
diff --git a/lib/WebCoso/Config.pm b/lib/WebCoso/Config.pm index 9cef6a3..f8dee5a 100644 --- a/lib/WebCoso/Config.pm +++ b/lib/WebCoso/Config.pm @@ -2,6 +2,7 @@ package WebCoso::Config; use strict; use warnings; use WebCoso::Config::Collections; +use WebCoso::X; my @resources; my $collections=WebCoso::Config::Collections->new(); @@ -16,7 +17,9 @@ WebCoso::Config::Helpers->import(); EOF eval $content; if ($@) { - die("Error reading configuration from $filename: $@\n"); + WebCoso::X::ConfigError->throw( + filename => $filename, + error => $@); } else { return 1; @@ -63,12 +66,19 @@ sub res { my $config_dir=file($FILENAME)->parent->absolute; $dest_filename=file($dest_filename)->absolute($config_dir); - for (@source_files) { - $_=file($_)->absolute($config_dir); - } + + my @abs_source_files = map { + my $abs_name=file($_)->absolute($config_dir); + if (!-e $abs_name) { + WebCoso::X::FileNotFound->throw( + filename => $_, + abs_filename => $abs_name); + }; + $abs_name; + } @source_files; WebCoso::Config::Resource->new({ - source=>[@source_files], + sources=>[@abs_source_files], pipeline=>$pipeline_name, destination=>$dest_filename }); 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>; } diff --git a/lib/WebCoso/X.pm b/lib/WebCoso/X.pm new file mode 100644 index 0000000..9376d73 --- /dev/null +++ b/lib/WebCoso/X.pm @@ -0,0 +1,25 @@ +package WebCoso::X; +use utf8; + +use Exception::Class + ( + 'WebCoso::X::FileError' => { + fields => [ 'filename' ], + description => 'classe base per errori relativi a file', + }, + 'WebCoso::X::ConfigError' => { + isa => 'WebCoso::X::FileError', + description => 'errore nel file di configurazione', + }, + 'WebCoso::X::FileNotFound' => { + isa => 'WebCoso::X::FileError', + fields => [ 'abs_filename' ], + description => 'un file di una risorsa non è presente', + }, + 'WebCoso::X::OpenError' => { + isa => 'WebCoso::X::FileError', + description => ' non è stato possibile aprire un file', + }, + ); + +1; |