Tuesday, 31 August 2010

New OTN article: Adapting Oracle Application Development Framework and Subversion to Your Enterprise's Needs

I'm happy to say a long labour has finally born a series of articles on OTN entitled Adapting Oracle Application Development Framework and Subversion to Your Enterprise's Needs.

This article series goes beyond simply explaining how to use SVN with Oracle JDeveloper 11g. It is intended to give development teams, managers, and change-control officers a heads-up on the complete end-to-end process of building, extending, and maintaining Oracle ADF applications through typical enterprise Development, Test, and Production environments.

Happy reading.

And to think when I originally started that "article" I thought I could keep it under 2000 words. Sheesh!

Sunday, 22 August 2010

Update: ADF EMG Oracle Open World 2010 Unconference Sessions

I teased in a previous post that I'd reserve publishing details about the ADF EMG Oracle Open World 2010 Unconference sessions till later. Well later is now, and I'm (you guessed it) excited to announce we have another full schedule at the Unconference. Read below for more details:

Where and when?

Location: Hotel Parc 55, 3rd Floor, Mason Room
Map: http://www.parc55hotel.com/map-and-directions
Date/time: Wednesday 22nd Sept 10:00-12:00
Duration: 120min

Topics and Speakers

Oracle ADF 11g and Oracle WebCenter 11g Production Demo

Andrejus Baranovskis - Red Samurai Consulting

During his session Andrejus will demonstrate two production systems, the first a retail system, and the second for the education sector. Both systems are based on a standard Oracle development architecture - utilising ADF BC, ADF Task Flows, ADF Libraries and Oracle's ADF UI Shell. The second system in addition implements Oracle WebCenter Services - Composer, Discussions, Document Management and RSS feeds, providing a Web 2.0 platform.

ADF BC 10g and ADF Faces 10g to ADF BC 11g and Trinidad, Live!

John Flack – Information Engineer Synectics for Management Decisions, Inc.

John will run a live lets-get-down-and-dirty demonstration of migrating a small ADF BC 10g/ADF Faces 10g application to ADF BC 11g and Apache MyFaces Trinidad. This will include steps to make the migration easier, the migration wizard, and how to clean up the application after migration, as well some differences between ADF Faces 10g and Trinidad. John will also show some steps needed which aren't documented, from some hard-earned real-life experience.

Demonstration of UW-Madison's Scholarship Application

Todd Hill & Ed O'Connor-Giles – Development Services Specialist and Technical Leader at the University of Wisconsin

University of Wisconsin-Madison automates management, evaluation, and awarding of scholarships -- and the online application experience for students -- with an application built on Oracle ADF. In this session Todd and Ed from the university will demonstrate the application and their technical approach, discuss the many real-world technical challenges faced, and lessons learned in the course of the project.

Integrating 3rd party tools/frameworks into ADF

Gert Leenders - Product Manager at Axi Nv

Gert will discuss their latest ADF project resulting in a real Java technology mash-up showing how ADF can be integrated with several different product. The core remains ADF but for the management of the business processes his team integrated JBoss jBPM, JBoss Drools as a business rule engine, and last but not least Alfresco & UCM as a content repository through the use of CMIS.

ADF - How much do you really need to know?

Sten Vesterli

How much knowledge is enough? You could spend months or even years learning to master all aspects of ADF Business Components and ADF Faces, but you already know that you don't need to know everything. This presentations proposes a set of ADF skill levels and a way to classify application complexity - and a way to map these, so you know what skill levels you need in order to build a given application.

Don't forget...

Don't forget that the ADF EMG also has an on-schedule session on Sunday 19th:

Session ID: S313445
Location: Moscone West, Level 3, Room 3012
Date/time: Sunday 19th Sept 14:00-15:00

...with the following well respected ADF and JSF speakers:

• Frank Nimphius
• Kito Mann
• Aino Andriessen
• Sten Vesterli

We look forward to seeing you in San Francisco!

Monday, 16 August 2010

Installing JDeveloper 11g v11.1.1.2.0 under Windows

To save me time in the future, rather than having to write it again and again for clients, this blog entry documents how to install JDeveloper 11g Studio Edition v11.1.1.2.0 build 5536 under Windows. I'll admit it's not the most exciting blog post, for sure Oracle's already done it (without my witty dialogue of course), and hey, it's not even the latest release, but sometimes we just gotta-do-documentation-for-documentation's-sake.

Software

The JDeveloper software can be obtained from here ... then selecting the Downloads tab -> Archived Downloads -> Oracle JDeveloper 11g 11.1.1.2.0 -> Accept License Agreement -> jdevstudio11112install.exe (that constitutes the Studio Edition for Windows including JDK 6.

Prerequisites

Disable virus scanners - to make your life easier, disable any virus scanners during the installation as this will slow the install process down if the virus scanner scans each Java archive. This has from experience been a particular problem with McAfee's products, and I recommend an alternative virus scanner.

Administrative access – you'll require privileges to install software onto the local PC.

Installation

1) On the local Windows PC execute the jdevstudio11112.install.exe. This will display the Oracle Installer Welcome dialog:

2) Selecting Next presents the Choose Middleware Home Directory dialog where you can select an existing Fusion Middleware Home directory or create a new one. It's recommended you always install each JDeveloper installation in it's own directory, so create a new directory either by typing the directory in the text box or using the Browse button.

If you have multiple developers setting up JDeveloper on their local PCs, it's recommended you standardize the installation directories, and cater for multiple JDeveloper versions. In the picture above C:\java\jdeveloper\JDev11gBuild5536 reflects a separate directory for JDeveloper 11g v11.1.1.2.0 build 5536. As alternative a later version JDeveloper 11g v11.1.1.3.0 build 5560 could be installed under C:\java\jdeveloper\JDev11gBuild5560. Note to avoid cross-platform issues in the future it's recommended you standardize the capitalization of the directories too.

3) Selecting Next presents the Choose Install Type dialog, allowing you a choice between installing the full package or customising the install and dropping off components:

As it's unknown what future parts of JDeveloper will be required for development purposes it's recommended the Complete installation option is chosen. If you do choose the Custom option you'll be presented with the Choose Products and Components dialog:

.....where you need to make you're own informed choices.

4) Next presents the Confirm Product Installation Directories dialog. Of note are the base Middleware Home Directory, and the two separate directories for the actual JDeveloper software and the separate integrated WebLogic Server:

5) The Choose Shortcut Location dialog displayed next gives you options to create the JDeveloper Windows group either for the current user or all users on the local PC. As multiple developers may use the same PC, giving access to all users may be the preferred option:

If you do choose to create the JDeveloper Windows group in all users accounts, assuming you have administrative rights on the local PC for installing JDeveloper, install at the end of this process that the installed JDeveloper files can also be run by other users on the same PC.

6) The Installation Summary dialog on selecting Next displays what will be installed, how much disk space will be consumed:

Select Next starts the installation process:

7) On successful completion the Installation Complete dialog will show:

Leaving the Run Quickstart checkbox checked and selecting the Done button will close the installer and open the Quickstart program (explained in the next section). We'll assume you uncheck the checkbox and start JDeveloper separately below.

Your JDeveloper installation is now complete.

What was Installed

Post installation JDeveloper will have installed the following:

1) Under the specified installation directory the JDeveloper and integrated WebLogic Server files will exist:

2) A new directory C:\bea will have been created if this is your first Fusion Middleware install with the file beahomelist. This text file when open reveals the installation home directory for each product installed.

3) Within the Windows Start menu a new group Oracle Fusion Middleware 11.1.1.2.0 will exist:

4) When you run JDeveloper for the first time it will create two sets of files under the Windows user directories for the current user. Where these are found depends on which version of Windows you're using. Older versions including Windows XP stores the files under:

a) C:\Documents and Settings\<username>\Application Data\JDeveloper\

...in that directory you'll notice a subdirectory like "system11.1.1.2.36.55.36" where the system directory numbering scheme references the version of JDeveloper and build number (e.g. version 11.1.1.2.0 and build 5536 from the example above) you've installed. Multiple versions of JDeveloper will see additional system directories created here.

b) C:\Documents and Settings\<username>\Oracle\oradiag_

....I'm not entirely sure what this directory is used for presumably capturing diagnostic information. Maybe it's enabled by selecting the "Allow automated usage reporting to Oracle" option in the following section.

If you're using a modern version of Windows the likely location for these files are:

a) C:\Users\<username>\AppData\Roaming\JDeveloper
b) C:\Users\<username>\Oracle

Running JDeveloper

You can open JDeveloper via the Windows group Oracle Fusion Middleware 11.1.1.2.0 – JDeveloper Studio 11.1.1.2.0 option. The first dialog you'll see is the loading window:

At certain points during the load JDeveloper will prompt you for more information, including:

1) The Select Role dialog will display:

This allows you to select different developer modes for the IDE which influence which features run. As typically it's unknown what the developer will be doing in thee future, selecting the Default Role option and unselecting the Always prompt for role selection on startup checkbox are recommended.

If you wish to turn this dialog back on at a later date, it's preference is accessible via the JDeveloper menu option Tools -> Preferences -> Roles, then selecting the Always prompt for role selection on startup checkbox.

2) The first time you run a newly installed JDeveloper version, if you have previous versions of JDeveloper installed on the same machine, the installer will prompt you to migrate the user's settings from the previous JDeveloper install into the new JDeveloper install:


3) On the IDE opening for the first time it will prompt you to associate certain file types under Windows with the IDE:

This is a personal preference left up to the reader.

4) On the IDE opening for the first time it will prompt you to report back IDE errors and crashes to Oracle Corporation:

Assuming Oracle is actually gathering and using these statistics, this can be useful for improving the quality of the IDE in the future. However it may be against your organization's security policy to enable this. In addition if JDeveloper has connectivity problems in reaching Oracle's website this could also slow JDeveloper down.

5) On the IDE opening for the first time it will display a Tip of the Day:

Enabling or disabling this is a personal preference left up to the reader.

JDeveloper is now running for the first time.

After sometime you might see the following "Updates are available" blue popup in the bottom right of the IDE:


JDeveloper periodically scans external plug in servers to see if there are updates available to various parts of the JDeveloper install. Blindly accepting the choices provided can result in developers having inconsistent installations, and code that will work on one developer's PC but not anothers as the wrong updates are installed. Thought needs to be given on standardizing the patches installed and if the update feature should be used at all.

Priming the Integrated WebLogic Server (WLS)

To speed up further development in JDeveloper it's useful to run and stop the integrated WebLogic Server (WLS) such that it is initialized for the first time. To do this:

1) Select the Run -> Start Server Instance (IntegratedWebLogicServer) option:

2) As a result in the Log window under the Running: IntegratedWebLogicServer child tab, you'll see the WLS server initialize and start for the first time:

Of particular note you're looking for the <Server started in RUNNING mode> message that shows a successful initialization.

3) To stop the WLS server, in the Log window select the red box icon, then the IntegratedWebLogicServer option:

4) In the resulting Log window under the Running: IntegratedWebLogicServer child tab, you'll the WLS messages as it shuts down:

This completes the initialization of the integrated WebLogic Server.

Thursday, 12 August 2010

A new EMG chapter - SOA-BPM EMG

Frequent readers of this blog will be familiar with the ADF EMG, a place for ADF enthusiasts to discuss ideas in the ADF space beyond the technical issues posted on the OTN Forums. In March this year the EMG moderators were happy to announce the opening of a new EMG chapter, the OBIEE EMG. We're now....

.... excited to announce that a 3rd EMG chapter has opened initiated by Lonneke Dikmans and her team of volunteers, entitled the SOA-BPM EMG. You guessed it, this is the place to go to discuss concepts around SOA and BPM offerings from Oracle, including issues around design, methodology, architecture and much more.

I encourage anybody interested to join the SOA-BPM EMG today.

I wish Lonneke and her team good luck in setting up this new group.

Sunday, 8 August 2010

JDev 11g: Programmatic Contextual Events

This post is yet another Contextual Event blog description with a slight programmatic twist. It was inspired by Lucas Jellema's OTN forum post on how to raise programmatic Contextual Events, and in addition uses techniques as demonstrated by Pino and Frank described below.

Readers might be interested in a thread on the ADF EMG about the design of Contextual Events in the ADF framework, and the idea of Implicit Contextual Events - The Rise and Rise of Contextual Events (or the birth of Implicit Contextual Events).

In that ADF EMG thread I allude to a near "million blogs" that already describe Contextual Events as supporting collateral for Oracle's documentation. If you're interested in other posts check out Pino Jeddah's or Frank Nimphius's screencasts.

While I certainly find the screencasts informative, for my own documentation purposes this blog lists out the whole set of steps 1 by 1. Once again readers hopefully will find it useful.

The point of the programmatic Contextual Event solution is to move away from a declarative approach which isn't ideal in all cases. In our specific use case we wanted programmatic control over the payloads between the publisher and consumer. In turn as of JDev 11.1.1.2.0 I'm not yet satisfied with the IDE's support for Contextual Events and payloads via the pageDef binding design editor; a code solution provides a level of transparency when coupled with the debugger.

It's worth pointing out from Lucas's OTN forum post this programmatic solution is only a half way house, it still requires an "event" binding in the relating pageDef files, however the event payloads themselves are dynamic and fully configurable in code.

Contextual Event Definitions

For the purposes of this blog entry, I'll be describing the 2 players in the Contextual Event scenario as the "Publisher" and the "Consumer".

The Contextual Event "Publisher" will be a standalone Bounded Task Flow (BTF) comprised of page fragments, that has been JARed as an ADF Library. We'll refer to this as the PublisherBTF. The PublisherBTF will be comprised of a single BTF with a single page fragment "PublisherPageFragment" containing a single button to raise events – very simple.

The Contextual Event "Consumer" will be a master ADF application, or in other words an application that calls the "PublisherBTF" and embeds it in a region within a page. We'll refer to this as the ConsumerMasterApp.

Goal

The goal for this blog is to demonstrate when a button is pressed in the PublisherBTF, a programmatic Contextual Event is raised via the button's ActionListener, with some coded payload, that the event is captured and handled by the ConsumerMasterApp. At the result of this blog, the payload itself is immaterial, it's the technique that's important.

Preparing the PublisherBTF

In this section I describe the setup of the PublisherBTF before we address configuring the solution for Contextual Events. As such I wont go through step by step setup instructions, I assume readers are familiar with the basics described here.

The PublisherBTF is a standard ADF Application, comprised of a Model & ViewController project. In turn the ViewController contains a single BTF "PublisherBTF.xml" containing a single fragment "PublisherPageFragment".


The BTF has only the fragment:


The fragment is comprised of the following code:




As can be seen the button via it's ActionListener refers a JSF bean "publisher" configured as follows:


The PublisherBean's doAction() method is where we'll raise the Contextual Event programmatically as described in the next section. Currently the method does nothing:

package view;

import javax.faces.event.ActionEvent;

public class PublisherBean {
public PublisherBean() {
}

public void doAction(ActionEvent actionEvent) {
// Add event code here...
}
}
Finally the PublisherPageFragment requires a relating pageDef bindings file, created by right clicking the open fragment in the design or editor mode, and selecting Go to Page Definition using the resulting dialog to generate the empty bindings file:


Raising the Contextual Event Programmatically from the PublisherBTF

Our goal is to raise the Contextual Event via the commandButton's doAction method() programmatically. A requirement for the code is that we have an Event binding published in the relating page fragment's pageDef file.

The easiest way to do this is to select the commandButton in the page fragment, then via the Property Inspector locate the subsection entitled Contextual Events, and select the green plus button, opening the Publish Contextual Event dialog:


From here we enter a name "publisherEvent". In the JDev 11.1.1.2.0 and 11.1.1.3.0 releases this dialog appears to have a fault in that it doesn't populate the Type field. Implicitly it should know if we're creating events from commandButtons the Type should be "Action Event" (or "Value Change Event" for fields). This may work in later releases, here I've just entered the text.

The result of this operation is a little hard to see in the pageDef designer. Instead the Structure Windows shows a "eventBinding" containing an "events" binding with one "event" binding called "publisherEvent" are created on your behalf:


For the record the relating pageDef XML code:


Package="view.pageDefs">











Note the ActionListener class in the eventBinding; we'll be raising the event from a commandButton so this configuration is important. In the example above I've also changed the eventBindings id from the default value "eventBinding" to "publisherEventBinding". This will make it easier to understand what's happening in our upcoming programmatic code.

From creating the eventBinding, the actionListener property of the commandButton will have been modified to call the eventBinding directly. We don't want this as we want to programatically raise the event. As such restore the original EL expression to call the PublisherBean's doAction method:

At this point this establishes the bindings required for raising the event. On returning to the PublisherBean's doAction() method, the following custom code demonstrates retrieving the eventBinding, setting up a payload and raising the event programmatically:

package view;

import java.util.Map;

import javax.faces.component.UIComponent;
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;
import oracle.adf.model.BindingContext;
import oracle.binding.BindingContainer;
import oracle.jbo.uicli.binding.JUEventBinding;

public class PublisherBean {
public PublisherBean() {
}

public void doAction(ActionEvent actionEvent) {

UIComponent component = actionEvent.getComponent();
Map; attributes = component.getAttributes();

attributes.put("someParameter", "A String Value");
attributes.put("anotherParameter", Integer.valueOf(1234));

BindingContainer bindingContainer = BindingContext.getCurrent().getCurrentBindingsEntry();
JUEventBinding eventBinding = (JUEventBinding)bindingContainer.get("publisherEventBinding");

ActionListener actionListener = (ActionListener)eventBinding.getListener();
actionListener.processAction(actionEvent);
}
}
(Post edit: the syntax highlighter Javascript I'm using to display the above code is unfortunately introducing a syntax error at the bottom. Ignore the </string,> annotation after the last ellipse bracket closing the PublisherBean class. Thanks to Zeeshan for pointing this out)

In this code the technique to raise the event and pass a variable payload is:

a) Retrieve the commandButton that raised the actionEvent as an UIComponent
b) Retrieve the UIComponent's attributes
c) Add 2 arbitrary attributes, in this case a String and Integer

This establishes the payload to send. What you send in terms of attribute names and data types is your choice. You could augment this code to fetch data from other value bindings, call Java code, whatever you need to do to get the data.

On completing this we move onto raising the event programmatically:

d) Fetch the page fragment's BindingContainer
e) Retrieve the eventBinding by it's id "publisherEventBinding" – note this maps back to the eventBinding id we changed in the pageDef file
f) Retrieve the eventBinding's ActionListener – this was also configured in the eventBinding in the pageDef file
g) Execute/process the action

This concludes the configuration of the PublisherBTF for raising events.

Preparing the ConsumerMasterApp

Similar to the PublisherBTF, in this section I'll describe the required skeleton of the consuming master ADF application. I'll assume readers are familiar with the basics without describing everything step by step.

The ConsumerMasterApp contains a standard Model/ViewController project setup with a single JSF page in the ViewController called ConsumerPage.jspx.

The PublisherBTF ADF Library JAR will be attached to the ConsumerMasterApp's ViewController project.

The ConsumerPage.jspx will have the PublisherBTF embedded in the page as a region as follows:


xmlns:h="http://java.sun.com/jsf/html" xmlns:af="http://xmlns.oracle.com/adf/faces/rich">








Consuming the Contextual Event Programmatically in the ConsumerMasterApp

To configure the ConsumerPage to receive the event, we need:

a) a binding to receive the event and pass it to the handler method
b) a handler, essentially a Java class method to receive the event from the binding

To do this we create the handler first, then the binding to call the handler, then we back fill the handler's method code to retrieve the data.

To create the Handler, in the ConsumerMasterApp we create a bean ConsumerBean as follows:

package consumer.view;

public class ConsumerBean {

public void handleEvent(Object payload) {
// Add handler code here....
}
}
Note the handleEvent() method we've also added, this will eventually be called via the binding to allow us to programmatically handle the event.

The event binding requires that the handler be exposed as a Data Control. This is done by right clicking the ConsumerBean in the Application Navigator and selecting the Create Data Control option:


From this operation an xml file is created for the relating Data Control, and under the Data Control accordion in the Application Navigator, you will now see the ConsumerBean exposed (if you don't, click the refresh button in the Data Control accordion):


Finally to configure the handler, on the consuming page we create a methodAction binding in the resulting pageDef. This is done by selecting the Bindings and Executables tab, then the green plus button invoking the Insert item dialog where we select methodAction:


In the resulting Create Action Binding dialog, select the ConsumerBean Data Control, then the handleEvent() operation, leaving all else as default:


Selecting ok creates the associated methodAction binding:


Given we now have a handler to receive the event, we configure the ConsumerPage's bindings to subscribe to the PublisherBTF's event. To do this we open the ConsumerPage's pageDef file, selecting the Contextual Events tab, followed by the Subscribes tab and the green plus button. This opens the Subscribe to Contextual Event dialog where we will select the event to subscribe to, and the handler to action the received event:


Selecting the Looking Glass button on the Event field allows us via the resulting Select Contextual Event dialog to select the event "publisherEvent" from the PublisherBTF. Note it's possible to select the event from both the embedded PublisherBTF within the region of the ConsumerPage, or the event from the ADF Library. As the BTF has already been configured in the ConsumerPage, use the former:


On returning to the Subscribe to Contextual Event dialog the Type field will now map to an Action Event. As the "publisherEvent" name might not be unique across all BTFs you consume, you can filter the event by specifically specifying the BTF that raised it via the Publisher poplist:


If you select "Any", by design regardless of the BTF that raises the "publisherEvent", your handler will be called. We'll take the Any option for this simple example.

Next selecting the Handler button, from the Select Handler dialog we can select the handleEvent method we exposed as a methodAction binding:


Returning to the Subscribe to Contextual Event dialog, under the Parameters tab we create the following entry:


What this entry does is map the generic incoming data payload to the parameters of the handler method. Note the Name of the parameter is lowercase "payload" that matches to the ConsumerBean handleEvent() method's input parameter name. The IDE gives you no support in getting this correct, so it's up to you to make them match. In addition note the EL expression "#{payLoad}". Again notice the words are lowercase but there is a capital "L". Again the IDE gives you no support in getting this correct. I had a bit of whine about this in a previous blog post. Note if you get these wrong, the runtime behaviour is the event will still be called, yet no payload will be passed, which is a bit of a pain to debug.

For reference what you'll see in the pageDef designer:


And the resulting pageDef code:


Package="consumer.view.pageDefs">



xmlns="http://xmlns.oracle.com/adf/controller/binding"/>


RequiresUpdateModel="true" Action="invokeMethod" MethodName="handleEvent" IsViewObjectMethod="false">














At this point we've the handler configured, we've subscribed to the event, and on the event being called the handler will be called on our behalf. What's left is for us to add our code to the ConsumerBean handleEvent() method:

package consumer.view;

import javax.faces.component.UIComponent;
import javax.faces.event.ActionEvent;

public class ConsumerBean {

public void handleEvent(Object payload) {

ActionEvent actionEvent = (ActionEvent)payload;
UIComponent component = (UIComponent)actionEvent.getSource();

String someParameter = (String)component.getAttributes().get("someParameter");
Integer anotherParameter = (Integer)component.getAttributes().get("anotherParameter");

// Do something with the data
}
}
Of interest in the code, the payload itself is the actual ActionEvent raised via the PublisherBTF. From the ActionEvent it's possible to grab the UIComponent that raised the event, who in turn carries the data payload via its attributes. Note how we can cast the parameters/attributes back to the source class, which implies we can use sophisticated Java class constructs as parameters if required.

This concludes what needs to be setup. From here in your handleEvent() bean you're free to do whatever you need to with the data, possible write it to a binding, or pass it to another Java method and so on. In turn of course you don't even have to pass a payload, simply raising the event maybe all you require for the consuming application to do something.

Samples

The example PublisherBTF and ConsumerMasterApp ADF applications are available as a single zip. Note the ConsumerMasterApp is dependent on the ADF Library JAR generated via the PublisherBTF. You'll need to generate/deploy your own PublisherBTF ADF Library JAR, then remap the ConsumerMasterApp's ViewController ADF Library mapping to wherever the dependent JAR is located.

Conclusion

What may appear to be a lot of steps for configuring Contextual Events then handling them programmatically, actually becomes second nature after a couple of trials. Basically in the publisher you need to:

1) Create an eventBinding
2) Via a commandButton actionListener grab the eventBinding in code, attach a payload, and execute the event

From the consumer we need to:

1) Create a handler method
2) Publish the handler class as a Data Control
3) Create a methodAction binding for the Data Control
4) Subscribe to the publisher event, mapping the event and its payload to the method and its parameters
5) Returning to handler method, retrieve the parameters via the ActionEvent UIComponent

The benefit of the programmatic approach is you're now free to pass around any data payload with the flexibility of Java code. Without a doubt this doesn't replace the declarative solution to Contextual Events, but it's certainly good to know, and is much easier to debug as there's real code to place breakpoints.

Addendum

This blog entry was written against JDev 11.1.1.2.0.

Wednesday, 4 August 2010

Perth Oracle Fusion Boardroom Briefings

...Here goes, hopefully I've a few Perth readers... If you do live in Perth and know somebody who would be interested in the following events, please forward them this post...


Penny Cookson and I are happy to announce we'll be presenting at a series of presentations coming out of Oracle's Perth offices entitled Fusion Boardroom Briefings. These briefings are open to everyone and provide a good opportunity to learn from presentation-by-presentation a wide array of Fusion topics, issues and solutions.

As readers who are familiar with SAGE Computing Services already know, Penny and I take great effort to present Oracle technologies warts and all, to give people a serious handle on both the opportunities and challenges in adopting Oracle's technologies. The briefings therefore present a unique IT event series that don't shy away from the gritty details, but strive to give you all the details so you're well armed to make your Oracle IT projects succeed.

My first presentation 3pm Thursday 12th of August "SOA Lite: A taste of SOA with a Smidgen of Web Services" is one of my favourite presentations talking about the ins and outs of using web services in your organisation, from my own personal IT experience.

Abstract: Attempting to gorge yourself on the five-course SOA meal may result in a stomach ache and a bill you can least afford at the moment. Instead, a quick and easy recipe with some simple ingredients of Web services will give your systems that little taste of SOA you so crave. Chris will describe why Web services may be a better fit for you than SOA, qualities of contemporary Web services, what skills to focus on when starting out with Web services, and a few hints and tips from the Web service trenches.

Given the presentation will finish at 4:15pm, if anybody would like to hang around and ask questions I welcome the chance for an informal chat. My favourite part of presenting is the questions I get at the end where I get a better idea of what other real IT practitioners are doing out there, namely you.

You can register for the event here, along with a number of other events.

On the registration page note some of the other sessions you can vote for in the future. Of particular note is "A Path to the Future for Dinosaur Nerds: JDeveloper ADF - A Mind Map for Forms Developers" which is Penny's first presentation, followed by another one of mine "Oracle JDeveloper 11g JAX-WS Web Services: As easy as 1-2-3: XSD, WSDL, Generate!" If you're keen to see these topics please don't forget to vote.

Penny and I look forward to seeing you at these events soon.

JDev Contextual Events: PayLoad, payload, ah, payLoad

Another blog post along the lines of "this caught me out, cost 2hours of debugging, hopefully you'll learn from my mistakes".

JDev 11g readers will be familiar with the concept of contextual events, a powerful addition that allows task flows embedded in regions to communicate with each other, passing data payloads back and forwards.

Oh, did I say payloads? I meant pay-loads, or is that pay loads? Let's try Pay Loads. Geez what's the difference?

What am I on about?

Within the contextual event framework, effectively there is a "producer" task flow and a "consumer" task flow. The producer publishes a contextual event, and the consumer subscribes to the contextual event. It's all rather handily described in Section 28.7.1 of the Fusion Guide How to Create Contextual Events Declaratively

The publisher can pass a data payload (payLoad, PayLoad, um, pay load?) to the consumer. The publisher users an EL expression to extract data from their local bindings to do this, maybe something like #{bindings.employeeNo.inputValue}, which would be familiar to ADF programmers. The consumer however needs to use an EL expression #{payLoad} to capture the data from the published event.

Now to be specific here the EL expression is "pay" all lowercase, then "Load" with a capital "L" lowercase "oad", not "payload" all in lowercase.

What's the big deal? Well if you do anything else like #{payload} or #{PayLoad}, while the consumer will receive the published contextual event, unfortunately no data gets passed. Of course that's expected behaviour because EL is case sensitive and for whatever ADF internal code is calling behind the scenes, it can't resolve the Java routine name to lookup.

However the problem for developers is, in the English language if you search numerous dictionaries, you'll find the term is "payload", not two words "pay" and "load". It's therefore not intuitive for developers, something people I think will make a mistake on particularly when you read the examples where capital L looks very similar to a lowercase l anyway, and unfortunately, in JDev 11.1.1.2.0 (at least where I tested this) the IDE gives you no warning that you've got it wrong at design time.

So hopefully for readers, forewarned is forearmed (or is that forewarned is forearmed?), and you wont waste an afternoon trying to get something that is in essence very simple to work.