HTTP::OAI::Record - Encapsulates an OAI record


HTTP-OAI documentation Contained in the HTTP-OAI distribution.

Index


Code Index:

NAME

Top

HTTP::OAI::Record - Encapsulates an OAI record

SYNOPSIS

Top

	use HTTP::OAI::Record;

	# Create a new HTTP::OAI Record
	my $r = new HTTP::OAI::Record();

	$r->header->identifier('oai:myarchive.org:oid-233');
	$r->header->datestamp('2002-04-01');
	$r->header->setSpec('all:novels');
	$r->header->setSpec('all:books');

	$r->metadata(new HTTP::OAI::Metadata(dom=>$md));
	$r->about(new HTTP::OAI::Metadata(dom=>$ab));

METHODS

Top

$r = new HTTP::OAI::Record( %opts )

This constructor method returns a new HTTP::OAI::Record object.

Options (see methods below):

	header => $header
	metadata => $metadata
	about => [$about]

$r->header([HTTP::OAI::Header])

Returns and optionally sets the record header (an HTTP::OAI::Header object).

$r->metadata([HTTP::OAI::Metadata])

Returns and optionally sets the record metadata (an HTTP::OAI::Metadata object).

$r->about([HTTP::OAI::Metadata])

Optionally adds a new About record (an HTTP::OAI::Metadata object) and returns an array of objects (may be empty).

Header Accessor Methods

These methods are equivalent to $rec->header->$method([$value]).

$r->identifier([$identifier])

Get and optionally set the record OAI identifier.

$r->datestamp([$datestamp])

Get and optionally set the record datestamp.

$r->status([$status])

Get and optionally set the record status (valid values are 'deleted' or undef).

$r->is_deleted()

Returns whether this record's status is deleted.


HTTP-OAI documentation Contained in the HTTP-OAI distribution.

package HTTP::OAI::Record;

use strict;
use warnings;

use vars qw(@ISA);

use HTTP::OAI::SAXHandler qw/ :SAX /;

@ISA = qw(HTTP::OAI::Encapsulation);

sub new {
	my ($class,%args) = @_;
	my $self = $class->SUPER::new(%args);

	$self->{handlers} = $args{handlers};

	$self->header($args{header}) unless defined($self->header);
	$self->metadata($args{metadata}) unless defined($self->metadata);
	$self->{about} = $args{about} || [] unless defined($self->{about});

	$self->header(new HTTP::OAI::Header(%args)) unless defined $self->header;

	$self;
}

sub header { shift->_elem('header',@_) }
sub metadata { shift->_elem('metadata',@_) }
sub about {
	my $self = shift;
	push @{$self->{about}}, @_ if @_;
	return @{$self->{about}};
}

sub identifier { shift->header->identifier(@_) }
sub datestamp { shift->header->datestamp(@_) }
sub status { shift->header->status(@_) }
sub is_deleted { shift->header->is_deleted(@_) }

sub generate {
	my ($self) = @_;
	return unless defined(my $handler = $self->get_handler);

	g_start_element($handler,'http://www.openarchives.org/OAI/2.0/','record',{});
	$self->header->set_handler($handler);
	$self->header->generate;
	g_data_element($handler,'http://www.openarchives.org/OAI/2.0/','metadata',{},$self->metadata) if defined($self->metadata);
	g_data_element($handler,'http://www.openarchives.org/OAI/2.0/','about',{},$_) for $self->about;
	g_end_element($handler,'http://www.openarchives.org/OAI/2.0/','record');
}

sub start_element {
	my ($self,$hash) = @_;
	my $elem = lc($hash->{LocalName});
	die "Internal Error" unless $self->version;
	if( defined($self->get_handler) ) {
		if( exists($self->{"in_$elem"}) ) {
			$self->{"in_$elem"}++;
		}
	} elsif( $elem eq 'record' && $self->version eq '1.1' ) {
		$self->status($hash->{Attributes}->{'{}status'}->{Value});
	} elsif( $elem =~ /^header|metadata|about$/ ) {
		my $handler = $self->{handlers}->{$elem}->new() or
			die sprintf("Error getting handler for <%s> (failed to create new %s)", $elem, $self->{handlers}->{$elem});
		$self->set_handler($handler);
		$self->$elem($handler);
		$self->{"in_$elem"} = $hash->{Depth};
		g_start_document( $handler );
	}
	$self->SUPER::start_element($hash);
}

sub end_element {
	my ($self,$hash) = @_;
	my $elem = lc($hash->{LocalName});
	$self->SUPER::end_element($hash);
	if( exists($self->{"in_$elem"}) ) {
		if( $self->{"in_$elem"} == $hash->{Depth} ) {
			$self->SUPER::end_document();
			$self->set_handler(undef);
			delete $self->{"in_$elem"};
		} else {
			$self->{"in_$elem"}--;
		}
	}
}

1;

__END__