Here is my own first attempt at a (useful) plugin: A region plugin that displays up-to-date flight information for airports in Norway, based on public flight data provided by Avinor, the company that operates the Norwegian airport network.
Avinor has a simple web service that provides flight information in XML format.
I am sure there are similar (web) services for flight information in other countries (feel free to leave a comment below if you know of any).
Here is the PL/SQL code behind the plugin:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | procedure render_my_plugin ( p_region in apex_plugin.t_region, p_plugin in apex_plugin.t_plugin, p_is_printer_friendly in boolean ) as l_clob clob; l_airport_code varchar2(20) := p_region.attribute_01; l_direction varchar2(20) := p_region.attribute_02; begin l_clob := apex_web_service.make_rest_request( p_http_method => 'GET' , p_parm_name => apex_util.string_to_table( 'airport:direction' ), p_parm_value => apex_util.string_to_table(l_airport_code || ':' || l_direction ) ); if l_direction = 'D' then htp.p( '<p><b>Departures from ' || l_airport_code || '</b></p>' ); else htp.p( '<p><b>Arrivals to ' || l_airport_code || '</b></p>' ); end if; htp.p( '<table width="100%">' ); htp.p( '<tr><td>AIRLINE</td><td>FLIGHT</td><td>AIRPORT</td><td>TIME</td><td>GATE</td></tr>' ); for l_rec in ( SELECT * FROM XMLTABLE ( '//airport/flights/flight' PASSING XMLTYPE(l_clob) COLUMNS unique_id varchar2(100) path '@uniqueID' , airline varchar2(10) path 'airline' , flight_id varchar2(20) path 'flight_id' , airport varchar2(20) path 'airport' , schedule_time varchar2(100) path 'schedule_time' , gate varchar2(100) path 'gate' ) ORDER BY airline, flight_id) loop htp.p( '<tr><td>' || l_rec.airline || '</td><td>' || l_rec.flight_id || '</td><td>' || l_rec.airport || '</td><td>' || l_rec.schedule_time || '</td><td>' || l_rec.gate || '</td></tr>' ); end loop; htp.p( '</table>' ); htp.p( '<a href="http://www.avinor.no">Flight data from Avinor.</a> Last updated: ' || to_char(sysdate, 'dd.mm.yyyy hh24:mi:ss' )); end render_my_plugin; |
The code illustrates several concepts:
- How to render a region plugin using the PL/SQL Web Toolkit (HTP.P) calls
- How to retrieve values from the attributes defined for the plugin
- Using the new APEX_WEB_SERVICE.MAKE_REST_REQUEST function to retrieve a web page as a CLOB
- Using the XMLTABLE function to transform XML into a recordset that can be used in a SELECT
An export of my plugin can be downloaded here, and installed into your own Apex 4 application.
After the plugin has been installed, using the plugin is as simple as adding a Region (of type Plugin) to the page, and configuring the values for Airport and Direction (the plugin attributes) in the region definition.

You can see a live demo of the plugin here (public page, does not require authentication):
http://tryapexnow.com/apex/f?p=test4ea:plugin_demo:0
Note that for this page, I've also taken advantage of the built-in region caching feature of Apex. The region cache duration is set to 10 minutes, which prevents us from hitting the remote web service for every page view. I really like that you can switch on region caching in Apex without writing a single line of code.
Conclusion: Apex 4 plugins rock!
4 comments:
Nice demo Morten!, thank you for sharing your work
jon.
Hi Morten,
I think this plug-in will make a perfect example for a "Process" type plug-in which will be possible with EA2.
The plug-in could do the web service call and write the result of the different columns into an APEX collection. (The collection name should be an attribute of the plug-in) That will give the user a great flexibility how he wants to display the data and he can again use all the components APEX provides.
What do you think?
Patrick
@Patrick: The concept of a "process" type plugin sounds good. I assume that the normal "Conditions" section would apply to the process, so that the developer (ie. plugin user) can use this to control when the plugin/process fires... ?
Yes, these process type plug-ins do have conditions, authorization and build config support as well.
You can already try it out on tryapexnow.com. We just have refreshed it to EA2.
Regards
Patrick
Post a Comment