package Lire::ReportSection;
use strict;
use Carp;
use Lire::Report::Section;
use Lire::DlfSchema;
use Lire::Utils qw/check_object_param check_param/;
use Lire::I18N qw/dgettext/;
use Locale::TextDomain 'lire';
=pod
=head1 NAME
Lire::ReportSection - API to report configuration's section
=head1 SYNOPSIS
use Lire::ReportConfig;
use Lire::ReportSection;
my $report_cfg = new Lire::ReportConfig( "www" );
my $section = new Lire::ReportSection( "www", "General" );
$report_cfg->add_section( $section );
=head1 DESCRIPTION
This class offers an object oriented API to report configuration's
section. It offers methods to access and modify the section's
attribute.
=head1 CONSTRUCTOR
=head2 new( $superservice, [$title] )
Creates a new Lire::Section object which will contains report
specifications of the $superservice superservice. The section's title
will be set to the value of $title.
=cut
sub new {
my ( $class, $super, $title ) = @_;
check_param( $super, 'superservice',
sub { Lire::DlfSchema->has_superservice( $_[0] ) },
'invalid superservice' );
return bless { '_superservice' => $super,
'_filters' => [],
'_title' => $title || "Section",
'_reports' => [],
}, $class;
}
=pod
=head1 OBJECT METHODS
=head2 superservice()
Returns this section's superservice.
=cut
sub superservice {
my ( $self ) = @_;
return $self->{'_superservice'};
}
=pod
=head2 title([$title])
Return's the current section's title.
When the $title parameter is used, it will set the section's title to
a new value.
=cut
sub title {
my ( $self, $title ) = @_;
if ( defined $title ) {
$self->{'_title'} = $title;
}
return dgettext( "lire-$self->{'_superservice'}", $self->{'_title'} );
}
=pod
=head2 filters()
Returns this section's filter specifications as an array of
Lire::FilterSpec objects. Those filter specifications will be used by
all of this section's report specifications in addition to the filter
specification they may already be using.
=cut
sub filters {
my ( $self ) = @_;
return @{ $self->{'_filters'} };
}
=pod
=head2 add_filter($filter_spec)
Adds the $filter_spec filter specification to this section's list. The
$filter_spec parameter must be an instance of Lire::FilterSpec or one
of its descendants.
This method will die if the filter specification's schema isn't
compatible with this section's superservice.
=cut
sub add_filter {
my ( $self, $filter_spec ) = @_;
check_object_param( $filter_spec, 'filter_spec', 'Lire::FilterSpec' );
# Make sure all the report's schema are compatible
# with with this filter
my $schema = $filter_spec->schema()->id();
foreach my $r ( $self->reports() ) {
croak "filter ", $filter_spec->id(), "'s schema is incompatible ",
"with report ", $r->id(), "\n"
unless $r->schema()->is_schema_compatible( $schema );
}
push @{$self->{'_filters'}},$filter_spec;
return;
}
=pod
=head2 reports()
Returns this section's report specifications as an array of
Lire::ReportSpec objects.
=cut
sub reports {
my ( $self ) = @_;
return @{ $self->{'_reports'} };
}
=pod
=head2 add_report( $report_spec )
Adds the $report_spec report specification to this section. This
method will die if the report specification's schema isn't compatible
with this section's superservice.
=cut
sub add_report {
my ( $self, $report ) = @_;
check_object_param( $report, 'report', 'Lire::ReportSpec' );
croak "can't add a ReportSpec without a subreport_id"
unless $report->subreport_id();
croak ( "report is of wrong superservice: ", $report->superservice() ,
" != ", $self->superservice() )
if $self->superservice() ne $report->superservice();
# Make sure the report's schema is compatible
# with all the filters' schema
my $schema = $report->schema();
foreach my $f ( $self->filters() ) {
croak "report ", $report->id(), "'s schema is incompatible with filter ",
$f->id(), "\n"
unless $schema->is_schema_compatible( $f->schema()->id() );
}
push @{$self->{'_reports'}},$report;
return;
}
# create_report_section
# called by Lire::ReportConfig::create_report()
sub create_report_section {
my ( $self, $report ) = @_;
check_object_param( $report, 'report', 'Lire::Report' );
my $section = new Lire::Report::Section( $self->title() );
$report->add_section( $section );
if ( $self->filters() ) {
my @filters = map { $_->expanded_display_title() } $self->filters();
my $desc = "" . __n( "Applied filter in this section: ",
"Filters applied in this section:",
scalar @filters );
$desc .= "\n" if @filters > 1;
if ( @filters == 1 ) {
$desc .= $filters[0];
} else {
$desc .= " \n";
foreach my $filter ( @filters ) {
$desc .= " \n $filter\n \n";
}
$desc .= " \n";
}
$desc .= "\n";
$section->description( $desc );
}
foreach my $spec ( $self->reports() ) {
my $subreport = $spec->create_subreport();
$section->add_subreport( $subreport );
}
return $section;
}
# Factory method for the Configuration API.
sub new_from_config {
my ( $self, $value ) = @_;
my $def = $value->Lire::Config::Dictionary::as_value();
my $section = new Lire::ReportSection( $def->{'superservice'},
$def->{'title'} );
foreach my $filter ( @{$def->{'filters'}} ) {
$section->add_filter( $filter );
}
foreach my $spec ( @{$def->{'specs'}} ) {
$section->add_report( $spec );
}
return $section;
}
# keep perl happy
1;
__END__
=pod
=head1 SEE ALSO
Lire::ReportConfig(3pm), Lire::ReportSpec(3pm), Lire::FilterSpec(3pm)
Lire::Report::Section(3pm), Lire::Config::ReportSectionSpec(3pm)
=head1 AUTHOR
Francis J. Lacoste
=head1 VERSION
$Id: ReportSection.pm,v 1.25 2006/07/23 13:16:29 vanbaal Exp $
=head1 COPYRIGHT
Copyright (C) 2002, 2004 Stichting LogReport Foundation LogReport@LogReport.org
This file is part of Lire.
Lire is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program (see COPYING); if not, check with
http://www.gnu.org/copyleft/gpl.html.
=cut