Same Debian/Ubuntu dists as YAZ
[simpleserver-moved-to-github.git] / GRS1.pm
diff --git a/GRS1.pm b/GRS1.pm
index 1561136..2946fc0 100644 (file)
--- 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.
-#
-