diff options
author | jeff <jeff> | 2008-03-14 04:38:48 +0000 |
---|---|---|
committer | jeff <jeff> | 2008-03-14 04:38:48 +0000 |
commit | 51ad08a8b780c50aa69f28cee3b1fd674c59c5de (patch) | |
tree | 91e0cdf8ec7f8409bb390e88206a8272a4050306 /lib/Net/Prizm.pm |
Initial import of Net-Prizmrelease
Diffstat (limited to 'lib/Net/Prizm.pm')
-rw-r--r-- | lib/Net/Prizm.pm | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/lib/Net/Prizm.pm b/lib/Net/Prizm.pm new file mode 100644 index 0000000..b2f109d --- /dev/null +++ b/lib/Net/Prizm.pm @@ -0,0 +1,260 @@ +package Net::Prizm; + +use strict; +use vars qw($DEBUG $VERSION @uris %services $AUTOLOAD %schemas); +use SOAP::Lite; + +$VERSION = '0.04'; + +$DEBUG = 0; + +@uris = qw(CustomerIfService NetworkIfService LogEventIfService); + +=head1 NAME + +Net::Prizm - Perl client interface to Motorola Canopy Prizm + +=head1 SYNOPSIS + +use Net::Prizm; +use Net::Prizm qw(CustomerInfo LogEventInfo + ClientDevice ConfigurationTemplate ElementLinkInfo + Network PerformanceData); + +$prizm = new Net::Prizm { url => 'https://prizm.example.net:8443/prizm/nbi', + namespace => 'CustomerIfService', + username => 'prizmuser', + password => 'associatedpassword', + } + +$err_or_som = $prizm->getCustomers(['import_id'], ['50'], ['<']); + +if (ref($err_or_som)){ + my $result = $err_or_som->result; + foreach my $customer (@$result) { + print $customer->contact, "\n"; + } +}else{ + print "$err_or_som\n"; +} + +=head1 DESCRIPTION + +Net::Prizm is a module implementing a Perl interface to Motorola's Canopy +Prizm SOAP interface. It is compatible with version 2.1 of that software +and requires the WSDL from Motorola. + +Net::Prizm enables you to simply access the SOAP interface of your Prizm +server. + +=head1 BASIC USAGE + +Import the Net::Prizm module with + +use Net::Prizm (@list_of_classes); + +Net::Prizm will create any of the following classes for you + +CustomerInfo LogEventInfo PrizmElement ClientDevice ConfigurationTemplate +ElementLinkInfo Network PerformanceData + +=cut + +sub import { + my $class = shift; + my @classes = @_; + my $me = __PACKAGE__; + my (%EXPORT_OK) = map { $_ => 1 } qw( CustomerInfo LogEventInfo PrizmElement + ClientDevice ConfigurationTemplate + ElementLinkInfo Network + PerformanceData ); + + foreach $class (grep { exists( $EXPORT_OK{$_} ) + or die "$_ is not exported by module $me" + } @classes) { + no strict 'refs'; + + *{"$class\::NEW"} = sub { + my $proto = shift; + my $class = ref($proto) || $proto; + my $self = { @_ }; + return bless($self, $class); + }; + *{"$class\::AUTOLOAD"} = sub { + my $field = $AUTOLOAD; + $field =~ s/.*://; + return if $field eq 'DESTROY'; + if ( defined($_[1]) ) { + $_[0]->{$field} = $_[1]; + } else { + $_[0]->{$field}; + } + }; + } + + $me =~ s/::/\//g; + $INC{"$me.pm"} =~ /^(.*)\.pm$/; + $me = $1; + for (@uris){ + $schemas{$_} = SOAP::Schema + ->schema_url("file:$me/wsdls/$_.wsdl") + ->parse->services->{$_}; + } + +} + +=head1 CONSTRUCTOR + +=over 4 + +=item new HASHREF + +Creates a new Prizm object. HASHREF should contain the keys url, namespace, +username, and password for the URL of the Prizm SOAP proxy, the namespace +of the methods you would like to call, and the username and password for +basic authentication. + +=cut + +sub new { + my $proto = shift; + my $class = ref($proto) || $proto; + my $self = { @_ }; + return bless($self, $class); +} + +=head1 METHODS + +All Prizm methods may be invoked as methods of the Net::Prizm object. +The return value is either the fault string in the event of an error +or a SOAP::SOM object. + +=cut + +sub AUTOLOAD { + my $self = shift; #hmmm... test this? + + my $method = $AUTOLOAD; + $method =~ s/.*://; + return if $method eq 'DESTROY'; + + my $soap = SOAP::Lite + -> autotype(0) + -> readable(1) + -> uri($self->{namespace}) + -> proxy($self->{url}); + + local *SOAP::Transport::HTTP::Client::get_basic_credentials = sub { + return $self->{user} => $self->{password}; + }; + + local *SOAP::Serializer::as_ArrayOf_xsd_string = sub { + my ($self, $value, $name, $type, $attr) = @_; + + $name ||= $self->gen_name; + $self->encode_object(\SOAP::Data->value( + SOAP::Data->name('string' => @{$value})->type('string') + ), $name, $type); + + }; + + local *SOAP::Serializer::as_ArrayOf_xsd_int = sub { + my ($self, $value, $name, $type, $attr) = @_; + + $name ||= $self->gen_name; + $self->encode_object(\SOAP::Data->value( + SOAP::Data->name('int' => @{$value})->type('int') + ), $name, $type); + }; + + local *SOAP::Serializer::as_CustomerInfo = sub { + my ($self, $value, $name, $type, $attr) = @_; + + my $schema = { + 'importId' => 'string', + 'customerId' => 'int', + 'customerName' => 'string', + 'customerType' => 'string', + 'address1' => 'string', + 'address2' => 'string', + 'city' => 'string', + 'state' => 'string', + 'zipCode' => 'string', + 'workPhone' => 'string', + 'homePhone' => 'string', + 'mobilePhone' => 'string', + 'pager' => 'string', + 'email' => 'string', + 'extraFieldNames' => 'impl:ArrayOf_xsd_string', + 'extraFieldValues' => 'impl:ArrayOf_xsd_string', + 'elementIds' => 'impl:ArrayOf_xsd_int', + }; + + my (@result) = (); + foreach my $key (keys %$value){ + my $to_encode = $value->{$key}; + push @result, SOAP::Data->name($key => $to_encode)->type($schema->{$key}); + } + + return $self->encode_object(\SOAP::Data->value( + SOAP::Data->name($name => @result)), $name, + $type, + {'xsi:type' => 'impl:CustomerInfo', %$attr}); + }; + + my $param = 0; + my $som = + $soap->$method( map { + my $paramdata = + $schemas{$self->{namespace}}{$method}{'parameters'}[$param++]; + SOAP::Data->name($paramdata->name => $_ ) + ->type(${[SOAP::Utils::splitqname($paramdata->type)]}[1]) } @_ + ); + + if ($som) { + if ($som->fault){ + return $som->faultstring; + }else{ + return $som; + } + } + + "Net::Prizm failed to $method for $self->{namespace} at " . $self->{url}; +} + + +=back + +=head1 SEE ALSO + + SOAP::Lite, SOAP::SOM + + http://motorola.canopywireless.com/ for information about Canopy and +Prizm. + + http://www.sisd.com/freeside/ for the ISP billing and provisioning system + which provoked the need for this module. + +=head1 BUGS + +No explicit handling of types other than CustomerInfo. +Namespace promiscuous. +Lax handling of arguments and return values. + +Quite probably others. Use at your own risk. + +=head1 AUTHOR AND COPYRIGHT + +Copyright (c) 2006 Jeff Finucane jeff-net-prizm@weasellips.com + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +WDSL files copyright Motorola Inc. which reserves all rights. + +This software is neither authorized, sponsored, endorsed, nor supported +by Motorola Inc. + +=cut + +1; |