diff options
author | mkanat%bugzilla.org <> | 2007-10-19 14:58:48 +0200 |
---|---|---|
committer | mkanat%bugzilla.org <> | 2007-10-19 14:58:48 +0200 |
commit | 77761cd6861490775d0d617f962ad213019517d9 (patch) | |
tree | dd220626d75c0c22afb2c2bd25c5d06a53f5d260 | |
parent | 415e32d463bbb881d991d886ddba6f859669c098 (diff) | |
download | bugzilla-77761cd6861490775d0d617f962ad213019517d9.tar.gz bugzilla-77761cd6861490775d0d617f962ad213019517d9.tar.xz |
Bug 396243: Allow extensions (aka plugins) to extend the WebService interface
This also includes the first checkin of the example plugin.
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=ghendricks, a=mkanat
-rw-r--r-- | .cvsignore | 1 | ||||
-rw-r--r-- | Bugzilla/Hook.pm | 35 | ||||
-rw-r--r-- | extensions/example/code/webservice.pl | 5 | ||||
-rw-r--r-- | extensions/example/disabled | 0 | ||||
-rw-r--r-- | extensions/example/lib/WSExample.pm | 10 | ||||
-rwxr-xr-x | xmlrpc.cgi | 6 |
6 files changed, 55 insertions, 2 deletions
diff --git a/.cvsignore b/.cvsignore index 1d378db06..cba381bab 100644 --- a/.cvsignore +++ b/.cvsignore @@ -4,4 +4,3 @@ data localconfig index.html old-params.txt -extensions diff --git a/Bugzilla/Hook.pm b/Bugzilla/Hook.pm index a9cfc649c..9d65fbe69 100644 --- a/Bugzilla/Hook.pm +++ b/Bugzilla/Hook.pm @@ -62,7 +62,7 @@ __END__ =head1 NAME -Bugzilla::Hook - Extendible extension hooks for Bugzilla code +Bugzilla::Hook - Extendable extension hooks for Bugzilla code =head1 SYNOPSIS @@ -193,3 +193,36 @@ definitions. F<checksetup.pl> will automatically add these tables to the database when run. =back + +=head2 webservice + +This hook allows you to add your own modules to the WebService. (See +L<Bugzilla::WebService>.) + +Params: + +=over + +=item C<dispatch> + +A hashref that you can specify the names of your modules and what Perl +module handles the functions for that module. (This is actually sent to +L<SOAP::Lite/dispatch_with>. You can see how that's used in F<xmlrpc.cgi>.) + +The Perl module name must start with C<extensions::yourextension::lib::> +(replace C<yourextension> with the name of your extension). The C<package> +declaration inside that module must also start with +C<extensions::yourextension::lib::> in that module's code. + +Example: + + $dispatch->{Example} = "extensions::example::lib::Example"; + +And then you'd have a module F<extensions/example/lib/Example.pm> + +It's recommended that all the keys you put in C<dispatch> start with the +name of your extension, so that you don't conflict with the standard Bugzilla +WebService functions (and so that you also don't conflict with other +plugins). + +=back diff --git a/extensions/example/code/webservice.pl b/extensions/example/code/webservice.pl new file mode 100644 index 000000000..cf608c0e2 --- /dev/null +++ b/extensions/example/code/webservice.pl @@ -0,0 +1,5 @@ +use strict; +use warnings; +use Bugzilla; +my $dispatch = Bugzilla->hook_args->{dispatch}; +$dispatch->{Example} = "extensions::example::lib::WSExample"; diff --git a/extensions/example/disabled b/extensions/example/disabled new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/extensions/example/disabled diff --git a/extensions/example/lib/WSExample.pm b/extensions/example/lib/WSExample.pm new file mode 100644 index 000000000..05975b874 --- /dev/null +++ b/extensions/example/lib/WSExample.pm @@ -0,0 +1,10 @@ +package extensions::example::lib::WSExample; +use strict; +use warnings; + +use base qw(Bugzilla::WebService); + +# This can be called as Example.hello() from XML-RPC. +sub hello { return 'Hello!'; } + +1; diff --git a/xmlrpc.cgi b/xmlrpc.cgi index 227815d26..2ac34e675 100755 --- a/xmlrpc.cgi +++ b/xmlrpc.cgi @@ -20,6 +20,7 @@ use lib qw(. lib); use Bugzilla; use Bugzilla::Constants; +use Bugzilla::Hook; # Use an eval here so that runtests.pl accepts this script even if SOAP-Lite # is not installed. @@ -29,11 +30,16 @@ $@ && ThrowCodeError('soap_not_installed'); Bugzilla->usage_mode(Bugzilla::Constants::USAGE_MODE_WEBSERVICE); +my %hook_dispatch; +Bugzilla::Hook::process('webservice', { dispatch => \%hook_dispatch }); +local @INC = (bz_locations()->{extensionsdir}, @INC); + my $response = Bugzilla::WebService::XMLRPC::Transport::HTTP::CGI ->dispatch_with({'Bugzilla' => 'Bugzilla::WebService::Bugzilla', 'Bug' => 'Bugzilla::WebService::Bug', 'User' => 'Bugzilla::WebService::User', 'Product' => 'Bugzilla::WebService::Product', + %hook_dispatch }) ->on_action(\&Bugzilla::WebService::handle_login) ->handle; |