#!/usr/bin/perl -w

#use lib "/projects/clipart/share/perl/5.8.3/";
#use lib "/projects/clipart/lib/perl/5.8.3/";
#use lib "/projects/clipart/share/perl/5.8.4/";
#use lib "/projects/clipart/lib/perl/5.8.4/";

use Pod::Usage;
use Getopt::Long;
use SOAP::Lite;
use strict;

# Global options
our $opt_version;
our $opt_help;
our $opt_man;
our $opt_resource = 'http://www.openclipart.org/Document/Manager';
our $opt_server   = 'http://localhost:8012/';
our $opt_debug = 5;

# Handle commandline options
Getopt::Long::Configure ('bundling', 'no_ignore_case');
GetOptions(
           'version|V'    => \$opt_version,
           'help|h'       => \$opt_help,
           'man'          => \$opt_man,
           'server|s=s'   => \$opt_server,
           'resource|r=s' => \$opt_resource,
           );

my $doc_id = shift @ARGV or pod2usage(-verbose => 1, -exitstatus => -1);

# Handle -V or --version
if ($opt_version) {
    print '$0: $Revision: 1.1 $', "\n";
    exit 0;
}

# Usage
pod2usage(-verbose => 2, -exitstatus => 0) if ($opt_man);
pod2usage(-verbose => 1, -exitstatus => 0) if ($opt_help);
pod2usage(-verbose => 1, -exitstatus => 0) if ($doc_id !~ /^\d+$/);

exit main();


sub main {
    # Connect to the server
    warn "Connecting to server...\n";
    my $soap = create_soap_instance($opt_resource, $opt_server);

    # Create the test service object
    my $response = $soap->call(new => 1);
    soap_assert($response);
    my $dms = $response->result;

    if (! $dms) {
	die "Could not create dms object\n";
    }

    my %properties = ();
    while (<>) {
	next unless ($_ =~ /&\s*(\w+)\s*[\:\=\t]\s*(.*)$/);
	my ($key, $value) = ($1, $2);
	$property{$key} = $value;
    }
    $response = $soap->properties($dms, $doc_id, %properties);
    soap_assert($response);

    if (! $response->result) {
	warn "No response received\n";
	return -1;
    }

    my $properties = $response->result;
    if (! $properties ) {
	$response = $soap->get_error($dms);
	if (! $response or ! $response->result) {
	    warn "Unknown error retrieving document properties\n";
	} else {
	    warn $response->result, "\n";
	}
	next;
    }
    foreach my $key (sort keys %{$properties}) {
	my $value = $properties->{$key};
	print "$key = $value\n";
    }
    return 0;
}


# Convenience function to create the soap instance
sub create_soap_instance {
    my $resource = shift || return undef;
    my $server = shift || return undef;

    my $soap = SOAP::Lite
        -> uri($resource)
        -> proxy($server,
                 options => {compress_threshold => 10000});
    return $soap;
};

# Convenience function to print out any errors encountered in a soap call
# and exit.
sub soap_assert {
    my $response = shift;
    if ($response->fault) {
        print join ', ',
        $response->faultcode,
        $response->faultstring;
        return undef;
    }
    return 1;
}


__END__

=head1 NAME

doc_prop - display or update properties for a given document

=head1 SYNOPSIS

doc_prop <doc_id> [options]

=head1 DESCRIPTION

This script displays or changes the properties for a given document.

=head1 OPTIONS

=over 8

=item B<-V>, B<--version>

Displays the version number of the script and exits.

=item B<-h>, B<--help>

Displays a brief usage message

=item B<--man>

Displays the man page

=item B<-s> I<server_url>, B<--server>=I<server_url>

The URL of the Document::Manager server to connect to.  By default,
it uses 'http://localhost:8012'.

=item B<-r> I<resource_uri>, B<--resource>=I<resource_uri>

The URI of the service provided by the server.  By default, it uses
'http://www.openclipart.org/Document/Manager'.  Users should not typically
need to alter this setting.

=back

=head1 PREREQUISITES

B<SOAP::Lite>,
B<Pod::Usage>,
B<Getopt::Long>

=head1 AUTHOR

Bryce Harrington E<lt>bryce@bryceharrington.orgE<gt>

=head1 COPYRIGHT

Copyright (C) 2005 Bryce Harrington.com.  All Rights Reserved.
This module is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.

=head1 REVISION

Revision: $Revision: 1.1 $

=cut



