X-Git-Url: http://git.indexdata.com/?p=simpleserver-moved-to-github.git;a=blobdiff_plain;f=GRS1.pm;h=2946fc076853d0fef70756578fac1c856f36bbc1;hp=15611366b7115cc721b1c732f98c27e80dd53735;hb=a48f5eb3db599938e2077b582ade3e1161837d44;hpb=ed627e79a3daaca57c8652b426e21fef544e1992 diff --git a/GRS1.pm b/GRS1.pm index 1561136..2946fc0 100644 --- a/GRS1.pm +++ b/GRS1.pm @@ -1,11 +1,35 @@ +## This file is part of simpleserver +## Copyright (C) 2000-2014 Index Data. +## All rights reserved. +## Redistribution and use in source and binary forms, with or without +## modification, are permitted provided that the following conditions are met: +## +## * Redistributions of source code must retain the above copyright +## notice, this list of conditions and the following disclaimer. +## * Redistributions in binary form must reproduce the above copyright +## notice, this list of conditions and the following disclaimer in the +## documentation and/or other materials provided with the distribution. +## * Neither the name of Index Data nor the names of its contributors +## may be used to endorse or promote products derived from this +## software without specific prior written permission. +## +## THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY +## EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +## DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY +## DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +## THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + package Net::Z3950::GRS1; use strict; use IO::Handle; use Carp; - - sub new { my ($class, $href, $map) = @_; my $self = {}; @@ -16,9 +40,9 @@ sub new { bless $self, $class; if (defined($href) && ref($href) eq 'HASH') { if (!defined($map)) { - croak "Usage: new Net::Z3950::GRS1($href, $map);"; - } - $self->Hash2grs($href); + croak 'Usage: new Net::Z3950::GRS1($href, $map);'; + } + $self->Hash2grs($href, $map); } return $self; @@ -30,25 +54,37 @@ sub Hash2grs { my $key; my $content; my $aref; + my $issue; $mapping = defined($mapping) ? $mapping : $self->{MAP}; + $self->{MAP} = $mapping; foreach $key (keys %$href) { $content = $href->{$key}; + next unless defined($content); if (!defined($aref = $mapping->{$key})) { print STDERR "Hash2grs: Unmapped key: '$key'\n"; next; } if (ref($content) eq 'HASH') { ## Subtree? - my $subtree = new Net::Z3950::GRS1($content); + my $subtree = new Net::Z3950::GRS1($content, $mapping); $self->AddElement($aref->[0], $aref->[1], &Net::Z3950::GRS1::ElementData::Subtree, $subtree); - } elsif (ref($content) eq '') { ## Regular string? + } elsif (!ref($content)) { ## Regular string? $self->AddElement($aref->[0], $aref->[1], &Net::Z3950::GRS1::ElementData::String, $content); + } elsif (ref($content) eq 'ARRAY') { + my $issues = new Net::Z3950::GRS1; + foreach $issue (@$content) { + my $entry = new Net::Z3950::GRS1($issue, $mapping); + $issues->AddElement(5, 1, &Net::Z3950::GRS1::ElementData::Subtree, $entry); + } + $self->AddElement($aref->[0], $aref->[1], &Net::Z3950::GRS1::ElementData::Subtree, $issues); } else { print STDERR "Hash2grs: Unsupported content type\n"; next; } } } + + sub GetElementList { my $self = shift; @@ -116,7 +152,7 @@ sub CreateElementData { return $ElementData; } - + sub AddElement { my ($self, $type, $value, $which, $content) = @_; @@ -156,7 +192,7 @@ sub Render { my $self = shift; my %args = ( FORMAT => &Net::Z3950::GRS1::Render::Plain, - FILE => '/dev/null', + FILE => '/dev/null', LEVEL => 0, HANDLE => undef, POOL => undef, @@ -186,10 +222,10 @@ sub Render { } if ($level == 1) { $self->_RecordLine($level, $ref, "(0,0)\n"); - } -} + } +} + - package Net::Z3950::GRS1::ElementData; ## Define some constants according to the GRS-1 specification @@ -342,18 +378,3 @@ Index Data ApS, Copenhagen, Denmark. Specification of the GRS-1 standard, for instance in the Z39.50 protocol specification. =cut - -#$Log: GRS1.pm,v $ -#Revision 1.4 2001-05-17 14:07:06 sondberg -#Added some documentation. -# -#Revision 1.3 2001/05/17 13:43:04 sondberg -#Added method Hash2grs into GRS1 module. -# -#Revision 1.2 2001/03/13 14:53:15 sondberg -#Added a few lines of documentation into GRS1.pm. -# -#Revision 1.1 2001/03/13 14:17:15 sondberg -#Added support for GRS-1. -# -