Teach Fieldmapper how to turn FM objects into simple XML
authorMike Rylander <mrylander@gmail.com>
Tue, 10 Apr 2012 20:28:40 +0000 (16:28 -0400)
committerLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Wed, 1 Aug 2012 18:52:33 +0000 (14:52 -0400)
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Signed-off-by: Bill Erickson <berick@esilibrary.com>
Signed-off-by: Lebbeous Fogle-Weekley <lebbeous@esilibrary.com>

Open-ILS/src/perlmods/lib/OpenILS/Utils/Fieldmapper.pm

index eddb944..c7e7a25 100644 (file)
@@ -6,6 +6,7 @@ use OpenSRF::Utils::Logger;
 use OpenSRF::Utils::SettingsClient;
 use OpenSRF::System;
 use XML::LibXML;
+use Scalar::Util 'blessed';
 
 my $log = 'OpenSRF::Utils::Logger';
 
@@ -332,6 +333,46 @@ sub RequiredField {
        return $$fieldmap{$self->class_name}{fields}{$f}{required};
 }
 
+sub toXML {
+    my $self = shift;
+    return undef unless (ref $self);
+
+    my $dom = XML::LibXML::Document->new;
+    my $root = $dom->createElement( $self->class_name );
+    $dom->setDocumentElement( $root );
+
+    for my $f ($self->properties) {
+        next if ($f eq 'isnew');
+        next if ($f eq 'ischanged');
+        next if ($f eq 'isdeleted');
+
+        my $value = $self->$f();
+        my $element = $dom->createElement( $f );
+
+        $value = [$value] if (blessed($value)); # fm object
+
+        if (ref($value)) { # array
+            for my $k (@$value) {
+                if (blessed($k)) {
+                    my $subdoc = $k->toXML;
+                    next unless $subdoc;
+                    my $subnode = $subdoc->documentElement;
+                    $dom->adoptNode($subnode);
+                    $element->appendChild($subnode);
+                } elsif (ref $k) { # not sure what to do here
+                    $element->appendText($k);
+                } else { # meh .. just append, I guess
+                    $element->appendText($k);
+                }
+            }
+        } else {
+            $element->appendText($value);
+        }
+    }
+
+    return $dom;
+}
+
 sub ValidateField {
        my $self = shift;
        my $f = shift;