bless $self, $class;
if (defined($href) && ref($href) eq 'HASH') {
if (!defined($map)) {
- croak "Usage: new Net::Z3950::GRS1($href, $map);";
+ croak 'Usage: new Net::Z3950::GRS1($href, $map);';
}
- $self->Hash2grs($href);
+ $self->Hash2grs($href, $map);
}
return $self;
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;
$content should be a GRS1 object.
-=head3 Render
+=head2 Render
This method digs through the GRS-1 data structure and renders the record. You call it
this way,
$grs1->Render(HANDLE => *STDERR); ## or
$grs1->Render(HANDLE => *MY_HANDLE);
+=head2 Hash2grs
+
+This method converts a hash into a GRS-1 object. Scalar entries within the hash are converted
+into GRS-1 string elements. A hash entry can itself be a reference to another hash. In this case,
+the new referenced hash will be converted into a GRS-1 subtree. The method is called this way,
+
+ $grs1->Hash2grs($href, $mapping);
+
+where $href is the hash to be converted and $mapping is referenced hash specifying the mapping
+between keys in $href and (type, value) pairs in the $grs1 object. The $mapping hash could
+for instance look like this,
+
+ my $mapping = {
+ title => [2, 1],
+ author => [1, 1],
+ issn => [3, 1]
+ };
+
+If the $grs1 object contains data prior to the invocation of Hash2grs, the new data represented
+by the hash is simply added.
+
+
=head1 APPENDIX A
These element data types are specified in the Z39.50 protocol:
=cut
#$Log: GRS1.pm,v $
-#Revision 1.3 2001-05-17 13:43:04 sondberg
+#Revision 1.5 2001-05-21 11:07:02 sondberg
+#Extended maximum numbers of GRS-1 elements. Should be done dynamically.
+#
+#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