[%# A template for a service base code.
===================================
Expected/recognized parameters:
obj ... a service definition, type SADI::Service::Instance
module_name ... the name of the module (scalar string)
-%]
#-----------------------------------------------------------------
# Authority: [% obj.Authority %]
# Service name: [% obj.ServiceName %]
# Generated: [% USE Date (format = '%d-%b-%Y %H:%M:%S %Z') %][% Date.format %]
# Contact: Edward Kawas <edward.kawas@gmail.com>
#-----------------------------------------------------------------
package [% module_name %];
use FindBin qw( $Bin );
use lib $Bin;
use SADI::Base;
use SADI::Service::ServiceBase;
use SADI::RDF::Core;
use SADI::Service::Instance;
use RDF::Notation3::RDFCore;
no strict;
use vars qw( @ISA );
@ISA = qw( SADI::Service::ServiceBase );
use strict;
#-----------------------------------------------------------------
# [% obj.ServiceName %]
# the main method; corresponds to the name of this SADI web service
#-----------------------------------------------------------------
sub [% obj.ServiceName %] {
my ($self, $data) = @_;
# instantiate a new SADI::RDF::Core object
my $core = SADI::RDF::Core->new;
# set the incoming content type
$core->ContentType($self->get_request_content_type());
# set the Instance for $core
$core->Signature($self->get_service_signature('[% obj.ServiceName %]'));
Log::Log4perl::NDC->push ($$);
$LOG->info ('*** REQUEST START *** ' . "\n" . $self->log_request);
no warnings 'newline';
my $in_testing_mode = (-f $data);
use warnings 'newline';
if ($in_testing_mode) {
open (RAWXML, "<$data") or $LOG->logdie ("Cannot open $data: $!\n");
$data = join ('', <RAWXML>);
close RAWXML;
$LOG->debug ("Input raw data:\n$data\n") if ($LOG->is_debug);
} else {
$LOG->debug ("Input raw data (first 1000 characters):\n" . substr ($data, 0, 1000)) if $LOG->is_debug;
}
$self->default_throw_with_stack (0) unless $in_testing_mode;
# get/parse the incoming RDF
eval {
$core->Prepare($data)
or $self->throw("Error parsing the input RDF. Couldn't create a model!");
};
# set the content type that the client wants us to return
$core->ContentType($self->get_response_content_type());
# error in creating parser, or parsing input
if ($@) {
$LOG->logdie ($@) if $in_testing_mode;
# construct an outgoing message
my $stack = $self->format_stack ($@);
$core->_add_error($@, 'Error parsing input message for sadi service!', $stack);
$LOG->error ($stack);
$LOG->info ('*** FATAL ERROR RESPONSE BACK ***');
Log::Log4perl::NDC->pop();
return $core->serializeOutputModel();
}
# do something (this service main task)
eval {
my @inputs = $core->getInputNodes();
$self->process_it (\@inputs, $core);
};
# error thrown by the implementation class
if ($@) {
$LOG->logdie ($@) if $in_testing_mode;
# TODO how to report errors?
my $stack = $self->format_stack ($@);
$core->_add_error($@, 'Error running sadi service!', $stack);
$LOG->error ($stack);
$LOG->info ('*** REQUEST TERMINATED RESPONSE BACK ***');
Log::Log4perl::NDC->pop();
return $core->serializeOutputModel ();
}
# return result
$LOG->info ('*** RESPONSE READY *** ');
if ($in_testing_mode) {
Log::Log4perl::NDC->pop();
return $core->serializeOutputModel();
} else {
if ($LOG->is_debug) {
my $xml_output = $core->serializeOutputModel();
$LOG->debug ("Output raw data (first 1000 characters): " .
substr ($xml_output,0,1000));
Log::Log4perl::NDC->pop();
return $xml_output;
} else {
Log::Log4perl::NDC->pop();
return $core->serializeOutputModel();
}
}
}
1;