package Net::OAI::Identify; use strict; use base qw( XML::SAX::Base ); use base qw( Net::OAI::Base ); =head1 NAME Net::OAI::Identify - Results of the Identify OAI-PMH verb. =head1 SYNOPSIS =head1 DESCRIPTION =head1 METHODS =head2 new() =cut my $xmlns_oai = "http://www.openarchives.org/OAI/2.0/"; sub new { my ( $class, %opts ) = @_; my $self = bless \%opts, ref( $class ) || $class; $self->{ repositoryName } = ''; $self->{ baseUrl } = ''; $self->{ protocolVersion } = ''; $self->{ earliestDatestamp } = ''; $self->{ deletedRecord } = ''; $self->{ granularity } = ''; $self->{ adminEmail } = ''; $self->{ adminEmails } = []; $self->{ compression } = ''; $self->{ compressions } = []; $self->{ insideDescription } = 0; return( $self ); } =head1 repositoryName() Returns the name of the repostiory. =cut sub repositoryName { my $self = shift; return( $self->{ repositoryName } ); } =head1 baseURL() Returns the base URL used by the repository. =cut sub baseURL { my $self = shift; return( $self->{ baseURL } ); } =head1 protocolVersion() Returns the version of the OAI-PMH used by the repository. =cut sub protocolVersion { my $self = shift; return( $self->{ protocolVersion } ); } =head1 earliestDatestamp() Returns the earlies datestamp for records available in the repository. =cut sub earliestDatestamp { my $self = shift; return( $self->{ earliestDatestamp } ); } =head1 deletedRecord() Indicates the way the repository works with deleted records. Should return I, I or I. =cut sub deletedRecord { my $self = shift; return( $self->{ deletedRecord } ); } =head1 granularity() Returns the granularity used by the repository. =cut sub granularity { my $self = shift; return( $self->{ granularity } ); } =head1 adminEmail() Returns the administrative email address for the repository. Since the adminEmail elelemnt is allowed to repeat you will get all the emails (if more than one are specified) by using adminEmail in a list context. $email = $identity->adminEmail(); @emails = $identity->adminEmails(); =cut sub adminEmail { my $self = shift; if ( wantarray() ) { return( @{ $self->{ adminEmails } } ); } return( $self->{ adminEmails }[ 0 ] ); } =head1 compression() Returns the types of compression that the archive supports. Since the compression element may repeat you may get all the values by using compression() in a list context. $compression = $identity->compression(); @compressions = $identity->compressions(); =cut sub compression { my $self = shift; if ( wantarray() ) { return( @{ $self->{ compressions } } ); } return( $self->{ compressions }[ 0 ] ); } ## SAX Handlers sub start_element { my ( $self, $element ) = @_; return $self->SUPER::start_element($element) unless $element->{NamespaceURI} eq $xmlns_oai; # should be error? push( @{ $self->{ tagStack } }, $element->{ LocalName } ); $self->{ insideDescription } = 1 if $element->{ LocalName } eq 'description'; } sub end_element { my ( $self, $element ) = @_; return $self->SUPER::end_element($element) unless $element->{NamespaceURI} eq $xmlns_oai; # should be error? ## store and reset elements that can have multiple values if ( $element->{ LocalName } eq 'adminEmail' ) { Net::OAI::Harvester::debug( "got adminEmail in Identify" ); push( @{ $self->{ adminEmails } }, $self->{ adminEmail } ); $self->{ adminEmail } = ''; } elsif ( $element->{ LocalName } eq 'compression' ) { Net::OAI::Harvester::debug( "got compression in Identify" ); push( @{ $self->{ compressions } }, $self->{ compression } ); $self->{ compression } = ''; } pop( @{ $self->{ tagStack } } ); $self->{ insideDescription } = 0 if $element->{ LocalName } eq 'description'; } sub characters { my ( $self, $characters ) = @_; $self->{ $self->{ tagStack }[-1] } .= $characters->{ Data } unless $self->{ insideDescription }; } 1;