package perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime;
{
##use lib qw(/home/netadmin/LHCOPN/perfSONAR-PS/branches/pinger/perfSONAR-PS-PingER-1.0/lib/perfSONAR_PS);
=head1 NAME
perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime - A base class, implements 'commonTime' element from the perfSONAR_PS RelaxNG schema
=head1 DESCRIPTION
Object representation of the commonTime element.
Object fields are:
Scalar: timeType,
Scalar: ttl,
Scalar: numBytes,
Scalar: value,
Scalar: name,
Scalar: valueUnits,
Scalar: timeValue,
Scalar: seqNum,
The constructor accepts only single parameter, it could be a hashref to parameters hash or DOM with 'commonTime' element
=head1 SYNOPSIS
use perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime;
my $el = perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime->new($DOM_Obj);
=head1 METHODS
=cut
use strict;
use warnings;
use XML::LibXML;
use Scalar::Util qw(blessed);
use Log::Log4perl qw(get_logger);
use perfSONAR_PS::Datatypes::Element qw(getElement);
use perfSONAR_PS::Datatypes::Namespace;
use perfSONAR_PS::Datatypes::NSMap;
use Class::Accessor;
use Class::Fields;
use base qw(Class::Accessor Class::Fields);
use fields qw(nsmap idmap refidmap timeType ttl numBytes value name valueUnits timeValue seqNum );
perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime->mk_accessors(perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime->show_fields('Public'));
=head2 new( )
creates object, accepts DOM with element tree or hashref to the list of
keyd parameters
timeType => undef,
ttl => undef,
numBytes => undef,
value => undef,
name => undef,
valueUnits => undef,
timeValue => undef,
seqNum => undef,
=cut
use constant CLASSPATH => 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime';
use constant LOCALNAME => 'commonTime';
sub new {
my $that = shift;
my $param = shift;
my $logger = get_logger( CLASSPATH );
my $class = ref($that) || $that;
my $self = fields::new($class );
$self->nsmap(perfSONAR_PS::Datatypes::NSMap->new());
$self->nsmap->mapname( LOCALNAME, 'pinger');
if($param) {
if(blessed $param && $param->can('getName') && ($param->getName =~ m/(${\LOCALNAME})$/x) ) {
return $self->fromDOM($param);
} elsif(ref($param) ne 'HASH') {
$logger->error("ONLY hash ref accepted as param " . $param );
return undef;
}
if($param->{xml}) {
my $parser = XML::LibXML->new();
my $dom;
eval {
my $doc = $parser->parse_string( $param->{xml});
$dom = $doc->getDocumentElement;
};
if($@) {
$logger->error(" Failed to parse XML :" . $param->{xml} . " \n ERROR: \n" . $@);
return undef;
}
return $self->fromDOM( $dom );
}
$logger->debug("Parsing parameters: " . (join " : ", keys %{$param}));
no strict 'refs';
map { $self->$_ ( $param->{$_} ) if $self->can($_)} keys %{$param}; ###
use strict;
$logger->debug("Done ");
}
return $self;
}
#
# no shortcuts !
#
sub AUTOLOAD {}
sub DESTROY {
my $self = shift;
$self->SUPER::DESTROY if $self->can("SUPER::DESTROY");
}
=head2 getDOM ($)
accept parent DOM
return commonTime object DOM, generated from object contents
=cut
sub getDOM {
my $self = shift;
my $parent = shift;
my $logger = get_logger( CLASSPATH );
my $commonTime = getElement({name => LOCALNAME, parent => $parent , ns => [$self->nsmap->mapname( LOCALNAME )],
attributes => [
['timeType' => $self->timeType],
['ttl' => $self->ttl],
['numBytes' => $self->numBytes],
['value' => $self->value],
['name' => (($self->name =~ m/(minRtt|maxRtt|meanRtt|medianRtt|lossPercent|clp|minIpd|maxIpd|iqrIpd|meanIpd|duplicates|outOfOrder)$/)?$self->name:undef)],
['valueUnits' => $self->valueUnits],
['timeValue' => $self->timeValue],
['seqNum' => $self->seqNum],
],
});
return $commonTime;
}
=head2 querySQL ()
depending on config it will return some hash ref to the initialized fields
for example querySQL ()
accepts one optional prameter - query hashref
will return:
{ ip_name_src => 'hepnrc1.hep.net' },}
=cut
sub querySQL {
my $self = shift;
my $query = shift; ### undef at first and then will be hash ref
my $logger = get_logger( CLASSPATH );
my %defined_table = ( 'data' => [ 'minRtt', 'ttl', 'numBytes', 'outOfOrder', 'maxRtt', 'rtts', 'clp', 'medianRtt', 'meanRtt', 'duplicates', 'maxIpd', 'meanIpd', 'minIpd', 'seqNums', 'lossPercent', 'iqrIpd', ], );
$query->{data}{numBytes}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{numBytes}) || ref($query->{data}{numBytes});
$query->{data}{ttl}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{ttl}) || ref($query->{data}{ttl});
$query->{data}{minRtt}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{minRtt}) || ref($query->{data}{minRtt});
$query->{data}{maxRtt}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{maxRtt}) || ref($query->{data}{maxRtt});
$query->{data}{outOfOrder}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{outOfOrder}) || ref($query->{data}{outOfOrder});
$query->{data}{medianRtt}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{medianRtt}) || ref($query->{data}{medianRtt});
$query->{data}{clp}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{clp}) || ref($query->{data}{clp});
$query->{data}{meanRtt}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{meanRtt}) || ref($query->{data}{meanRtt});
$query->{data}{duplicates}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{duplicates}) || ref($query->{data}{duplicates});
$query->{data}{maxIpd}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{maxIpd}) || ref($query->{data}{maxIpd});
$query->{data}{minIpd}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{minIpd}) || ref($query->{data}{minIpd});
$query->{data}{meanIpd}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{meanIpd}) || ref($query->{data}{meanIpd});
$query->{data}{iqrIpd}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{iqrIpd}) || ref($query->{data}{iqrIpd});
$query->{data}{lossPercent}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{lossPercent}) || ref($query->{data}{lossPercent});
$query->{data}{minRtt}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{minRtt}) || ref($query->{data}{minRtt});
$query->{data}{maxRtt}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{maxRtt}) || ref($query->{data}{maxRtt});
$query->{data}{outOfOrder}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{outOfOrder}) || ref($query->{data}{outOfOrder});
$query->{data}{rtts}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{rtts}) || ref($query->{data}{rtts});
$query->{data}{medianRtt}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{medianRtt}) || ref($query->{data}{medianRtt});
$query->{data}{clp}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{clp}) || ref($query->{data}{clp});
$query->{data}{meanRtt}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{meanRtt}) || ref($query->{data}{meanRtt});
$query->{data}{maxIpd}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{maxIpd}) || ref($query->{data}{maxIpd});
$query->{data}{duplicates}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{duplicates}) || ref($query->{data}{duplicates});
$query->{data}{minIpd}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{minIpd}) || ref($query->{data}{minIpd});
$query->{data}{meanIpd}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{meanIpd}) || ref($query->{data}{meanIpd});
$query->{data}{iqrIpd}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{iqrIpd}) || ref($query->{data}{iqrIpd});
$query->{data}{lossPercent}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{lossPercent}) || ref($query->{data}{lossPercent});
$query->{data}{seqNums}= [ 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ] if!(defined $query->{data}{seqNums}) || ref($query->{data}{seqNums});
eval {
foreach my $table ( keys %defined_table) {
foreach my $entry (@{$defined_table{$table}}) {
if(ref($query->{$table}{$entry}) eq 'ARRAY') {
foreach my $classes (@{$query->{$table}{$entry}}) {
if($classes && $classes eq 'perfSONAR_PS::Datatypes::v2_0::pinger::Message::Data::CommonTime' ) {
if ($self->ttl && ( ( ($entry eq 'ttl')) )) {
$query->{$table}{$entry} = $self->ttl;
$logger->debug(" Got value for SQL query $table.$entry: " . $self->ttl);
last;
}
elsif ($self->numBytes && ( ( ($entry eq 'numBytes')) )) {
$query->{$table}{$entry} = $self->numBytes;
$logger->debug(" Got value for SQL query $table.$entry: " . $self->numBytes);
last;
}
elsif ($self->value && ( ( ( ($self->name eq 'minRtt') && $entry eq 'minRtt') or ( ($self->name eq 'maxRtt') && $entry eq 'maxRtt') or ( ($self->name eq 'outOfOrder') && $entry eq 'outOfOrder') or ($entry eq 'rtts') or ( ($self->name eq 'medianRtt') && $entry eq 'medianRtt') or ( ($self->name eq 'clp') && $entry eq 'clp') or ( ($self->name eq 'meanRtt') && $entry eq 'meanRtt') or ( ($self->name eq 'maxIpd') && $entry eq 'maxIpd') or ( ($self->name eq 'duplicates') && $entry eq 'duplicates') or ( ($self->name eq 'minIpd') && $entry eq 'minIpd') or ( ($self->name eq 'meanIpd') && $entry eq 'meanIpd') or ( ($self->name eq 'iqrIpd') && $entry eq 'iqrIpd') or ( ($self->name eq 'lossPercent') && $entry eq 'lossPercent')) )) {
$query->{$table}{$entry} = $self->value;
$logger->debug(" Got value for SQL query $table.$entry: " . $self->value);
last;
}
elsif ($self->seqNum && ( ( ($entry eq 'seqNums')) )) {
$query->{$table}{$entry} = $self->seqNum;
$logger->debug(" Got value for SQL query $table.$entry: " . $self->seqNum);
last;
}
elsif ($self->text && ( ( ( ($self->name eq 'minRtt') && $entry eq 'minRtt') or ( ($self->name eq 'maxRtt') && $entry eq 'maxRtt') or ( ($self->name eq 'outOfOrder') && $entry eq 'outOfOrder') or ( ($self->name eq 'medianRtt') && $entry eq 'medianRtt') or ( ($self->name eq 'clp') && $entry eq 'clp') or ( ($self->name eq 'meanRtt') && $entry eq 'meanRtt') or ( ($self->name eq 'duplicates') && $entry eq 'duplicates') or ( ($self->name eq 'maxIpd') && $entry eq 'maxIpd') or ( ($self->name eq 'minIpd') && $entry eq 'minIpd') or ( ($self->name eq 'meanIpd') && $entry eq 'meanIpd') or ( ($self->name eq 'iqrIpd') && $entry eq 'iqrIpd') or ( ($self->name eq 'lossPercent') && $entry eq 'lossPercent')) )) {
$query->{$table}{$entry} = $self->text;
$logger->debug(" Got value for SQL query $table.$entry: " . $self->text);
last;
}
}
}
}
}
}
};
if ($@) { $logger->logcroak(" SQL query building is failed here " . $@)};
return $query;
}
=head2 merge
merge with another commonTime ( append + overwrite if exists )
we can do it differently
method #1:
convert to dom both objects and then get resulted object from combined dom
method #2 default:
through the introspection of the object
=cut
sub merge {
my $self = shift;
my $new_commonTime = shift;
my $logger = get_logger( CLASSPATH );
unless($new_commonTime && blessed $new_commonTime && $new_commonTime->can("getDOM")) {
$logger->error(" Please supply defined object of commonTime ");
return undef;
}
foreach my $member ($new_commonTime->show_fields) {
if($self->can($member)) {
my $mergeList = $self->{$member};
$mergeList = [ $self->{$member} ] unless(ref($mergeList) eq 'ARRAY');
foreach my $mem (@{ $mergeList }) {
if(blessed $mem && $mem->can("merge")) {
$mem->merge($new_commonTime->{$member}); ## recursively merge it
} else {
$mem = $new_commonTime->{$member};
}
}
} else {
$logger->error(" This field $member, found in supplied metadata is not supported by MetaData class");
return undef;
}
}
return $self;
}
=head2 buildIdMap()
if any of subelements has id then get a map of it in form of
hashref to { element}{id} = index in array and store in the idmap field
=cut
sub buildIdMap {
my $self = shift;
my %map = ();
my $logger = get_logger( CLASSPATH );
return undef;
}
=head2 buildrefIdMap ()
if any of subelements has metadataIdRef then get a map of it in form of
hashref to { element}{ metadataIdRef } = index in array and store in the idmap field
=cut
sub buildRefIdMap {
my $self = shift;
my %map = ();
my $logger = get_logger( CLASSPATH );
return undef;
}
=head2 asString()
shortcut to get DOM and convert into the XML string
returns XML string representation of the commonTime object
=cut
sub asString {
my $self = shift;
my $dom = $self->getDOM();
return $dom->toString();
}
=head2 registerNamespaces ()
will parse all subelements and register all namepspaces within the commonTime namespace
=cut
sub registerNamespaces {
my $self = shift;
my $logger = get_logger( CLASSPATH );
my $nsids = shift;
my $local_nss = {reverse %{$self->nsmap->mapname}};
unless($nsids) {
$nsids = $local_nss;
} else {
%{$nsids} = ( %{$local_nss}, %{$nsids});
}
return $nsids;
}
=head2 fromDOM ($)
accepts parent XML DOM element tree as parameter
returns commonTime object
=cut
sub fromDOM {
my $self = shift;
my $logger = get_logger( CLASSPATH );
my $dom = shift;
$self->timeType($dom->getAttribute('timeType')) if($dom->getAttribute('timeType'));
$logger->debug(" Attribute timeType= ". $self->timeType) if $self->timeType;
$self->ttl($dom->getAttribute('ttl')) if($dom->getAttribute('ttl'));
$logger->debug(" Attribute ttl= ". $self->ttl) if $self->ttl;
$self->numBytes($dom->getAttribute('numBytes')) if($dom->getAttribute('numBytes'));
$logger->debug(" Attribute numBytes= ". $self->numBytes) if $self->numBytes;
$self->value($dom->getAttribute('value')) if($dom->getAttribute('value'));
$logger->debug(" Attribute value= ". $self->value) if $self->value;
$self->name($dom->getAttribute('name')) if($dom->getAttribute('name') && ($dom->getAttribute('name') =~ m/(minRtt|maxRtt|meanRtt|medianRtt|lossPercent|clp|minIpd|maxIpd|iqrIpd|meanIpd|duplicates|outOfOrder)$/));
$logger->debug(" Attribute name= ". $self->name) if $self->name;
$self->valueUnits($dom->getAttribute('valueUnits')) if($dom->getAttribute('valueUnits'));
$logger->debug(" Attribute valueUnits= ". $self->valueUnits) if $self->valueUnits;
$self->timeValue($dom->getAttribute('timeValue')) if($dom->getAttribute('timeValue'));
$logger->debug(" Attribute timeValue= ". $self->timeValue) if $self->timeValue;
$self->seqNum($dom->getAttribute('seqNum')) if($dom->getAttribute('seqNum'));
$logger->debug(" Attribute seqNum= ". $self->seqNum) if $self->seqNum;
return $self;
}
1;
}
__END__
=head1 AUTHORS
Maxim Grigoriev (FNAL) 2007, maxim@fnal.gov
=cut