NAME

MojoX::Dispatcher::Qooxdoo::Jsonrpc - Dispatcher for Qooxdoo Json Rpc Calls

SYNOPSIS

# lib/your-application.pm
sub startup {
   my $self = shift;

   # choose your directory for services:
   use lib ('qooxdoo-services'); 
   
   # use all services you want to use
   # (and omit everything you don't want to expose)
   use Test;
   
   # instantiate all services
   my $services= {
       Test => new Test(),
       
   };
   
   
   # add a route to the Qooxdoo dispatcher and route to it
   my $r = $self->routes;
   $r->route('/qooxdoo') ->
           to('
               Jsonrpc#handle_request', 
               services => $services, 
               namespace => 'MojoX::Dispatcher::Qooxdoo'
           );
       
}

   

DESCRIPTION

MojoX::Dispatcher::Qooxdoo::Jsonrpc dispatches incoming rpc requests from a qooxdoo application to your services and renders a (hopefully) valid json reply.

EXAMPLE

This example exposes a service named "Test" in a folder "qooxdoo-services". The Mojo application is named "qooxdooserver". First create this application using "mojolicious generate app qooxdooserver".

Then, lets write the service:

Change to the root directory "qooxdooserver" of your fresh Mojo-Application and make a dir named 'qooxdoo-services' for the services you want to expose.

Our "Test"-service could look like:

package Test;

sub new{
   my $class = shift;
   
   my $object = {
       
   };
   bless $object, $class;
   return $object;
}

sub add{
   my $self = shift;
   my @params = @_;
   
   # Debug message on Mojo-server console (or log)
   print "Debug: $params[0] + $params[1]\n";
   
   # uncomment if you want to die without further handling
   # die;
   
   # uncomment if you want to die with a message in a hash
   # die {code => 20, message => "Test died on purpose :-)"};
   
   
   # uncomment if you want to die with your homemade error object 
   # (simple example see below)
   # better use your elaborate error handling instead!
   
   # require Error;
   # my $error = new Error();
   # die $error;
   
   my $result =  $params[0] + $params[1]
   return $result;
   
}

1;


# Example of simple and stupid Error class:

package Error;

sub new{
   my $class = shift;
   
   my $error = {};
   
   bless $error, $class;
   return $error;
}

sub message{
   return "stupid error message";
}

sub code{
   return "934857"; # no real error code here
}

1;

Please create a constructor (like "new" here) which instantiates an object because we are going to use this in our 'lib/qooxdooserver.pm' below.

Notice the exception handling: You can die without or with a message (see example above). MojoX::Dispatcher::Qooxdoo::Jsonrpc will catch the "die" like an exception an send a message to the client. Happy dying! :-)

Now, lets write our application. Almost everything should have been prepared by Mojo when you invoked "mojolicious generate app qooxdooserver" (see above).

Change to "lib/" and open "qooxdooserver.pm" in your favourite editor. Then add some lines to make it look like this:

package qooxdooserver;

# perhaps this is wise for a server..
use strict;
use warnings;

use base 'Mojolicious';

# This method will run once at server start
sub startup {
   my $self = shift;
   
   # use your services' directory
   use lib ('qooxdoo-services');
   
   # use our Test service
   use Test;
   
   # instantiate objects
   my $services= {
       Test => new Test(),
       
       # add more constructors of services here..
   };
   
   # tell Mojo about your services:
  
   my $r = $self->routes;
   
   # this sends all requests for "/qooxdoo" in your Mojo server to our little dispatcher
   # change this at your own taste.
   $r->route('/qooxdoo')->to('
       jsonrpc#handle_request', 
       services => $services, 
       namespace => 'MojoX::Dispatcher::Qooxdoo'
   );
}

1;

AUTHOR

Matthias Bloch, <lt>matthias at puffin ch<gt> This Module is sponsored by OETIKER+PARTNER AG

COPYRIGHT AND LICENSE

Copyright (C) 2010 by :m)

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.8 or, at your option, any later version of Perl 5 you may have available.