#!/usr/bin/perl -w
use Aw;
require Aw::Adapter;
require Aw::Client;
require Aw::Event;
require HelloWorld;
my $EXIT_FAILURE = 1;
my ($false, $true) = (0,1);
sub MyDumper
{
$_ = Dumper ( $_[0] );
s/^(.*?)bless/bless/;
$_;
}
sub getResponse
{
my $c = shift;
my $e = $c->getEvent ( AW_INFINITE );
unless ( $e ) {
printf STDERR "%s\n", $c->errmsg;
exit ( $EXIT_FAILURE );
}
my $eventName = $e->getTypeName;
print STDERR "Received an $eventName event\n";
if ( $eventName eq "Adapter::ack" ) {
#
# awGetFieldNames used in the toHash method does not
# get the _env field (not that we normally want it),
# but we can still extract it like so:
#
my %eventData = $e->getField ( "_env" );
foreach my $key (sort keys %eventData) {
if ( ref($eventData{$key}) eq "Aw::Date" ) {
print STDERR " $key => ", $eventData{$key}->toString, "\n";
}
else {
print STDERR " $key => $eventData{$key}\n";
}
}
} else {
print STDERR $e->toString;
}
}
main:
{
my %Config =(
# Adapter configuration structure.
brokerName => 'test_broker', # Name of the broker.
brokerHost => 'localhost:6449', # FQDN of the broker host.
clientGroup => 'PerlDemoClient', # Client group we're in.
clientName => 'PerlDemo', # Name of client, for queueing.
application => 'PerlDemo', # The application's name.
adapterName => 'Perl Demo Adapter' # The application's name.
);
my @arrayData = ( 'A', 'B', 'C' );
my %hashData = ( structInt => 11, structString => "Hello From Struct B" );
my %FieldData =(
booleanDemo => $false,
charDemo => 'Z',
# dateDemo => '2000-1-10',
floatDemo, => 123.456,
intDemo, => 123456,
stringDemo => "Hello World",
stringSeqDemo => [ "One", "Two", "Three" ],
intSeqDemo => [10,20,30,40,50],
charSeqDemo => \@arrayData,
structADemo => { structInt => 99, structString => "Hello From Struct A" },
structBDemo => \%hashData,
structCDemo => {
# charSeqDemo => \@arrayData
# charSeqDemo => [ 'X', 'Y', 'Z' ]
intSeqDemo => [ 1, 2, 3, 4, 5 ]
# structInt => 33,
# structString => "Hello From Struct C"
},
structDDemo => {
structInt => 55,
structADemo => {
structInt => 11,
structString => "Hello From StructD:A"
}
}
);
%MoreData =(
intA => 11,
structA => {
intB => 22,
structB => {
intC => 33,
stringC => "Hello From StructB"
}
}
);
my $eventName = "PerlDevKit::PerlDemo";
my $world = new HelloWorld;
$world->store(5);
$MoreData{structA}{structB}{stringC} = MyDumper ( $world );
undef ( $world );
my $eventTime = new Aw::Date;
$eventTime->setDateCtime ( time );
$FieldData{dateDemo} = $eventTime;
$FieldData{moreData} = \%MoreData;
# Create the client object, and check if we can publish to the
# supplied event.
#
# my $c = connect Aw::Client ( \%Config );
my $c = Aw::Client::connect ( \%Config );
unless ( $c->canPublish ( $eventName ) ) {
printf STDERR "Cannot publish to %s: %s\n", $eventName, $c->errmsg;
exit ( $EXIT_FAILURE );
}
# Create a new broker Event.
#
my $e = new Aw::Event ( $c, $eventName, \%FieldData );
# my $e = new Aw::Event ( $c, $eventName ); # two step approach
unless ( $e ) {
print STDERR $e->errmsg, "\n";
exit ( $EXIT_FAILURE );
}
# or if event is created in two steps:
#
# $e->init ( \%FieldData );
# Now that all event strings are set, publish the event to
# the broker.
# Then display the event as text once published.
#
if ( $c->deliver ( $Config{adapterName}, $e ) ) {
print STDERR $c->errmsg;
exit ( $EXIT_FAILURE );
} else {
print "Published a $eventName event.\n";
print $e->toString, "\n";
}
getResponse ( $c );
exit ( 0 );
}
__END__
=head1 NAME
demo_client.pl - An Aw Package Demonstration Adapter.
=head1 SYNOPSIS
./demo_client.pl
=head1 DESCRIPTION
Client to submit the PerlDevKit::PerlDemo event, goes with
the demo_adapter.pl script. The adapter simply prints the event it
receives as a string. The script demonstrates client and event
creation for a modestly complex event. The script will also create,
dump (serialize) and embed a HelloWorld object that the adapter will revive.
The HelloWorld.pm must be installed where both the demo_client.pl
and demo_adapter.pl scripts are executed from.
=head1 AUTHOR
Daniel Yacob Mekonnen, L<Yacob@wMUsers.Com|mailto:Yacob@wMUsers.Com>
=head1 SEE ALSO
S<perl(1). ActiveWorks Supplied Documentation>
=cut