Thursday Aug 23, 2012

The Year After the Year of the ADF Developer - the ADF EMG at OOW 2012

I'm happy to announce that the ADF EMG will be continuing on from its success in 2011, and will be running "The Year After the Year of the ADF Developer" at Oracle Open World 2012

On the user group Sunday 30th of September the ADF EMG has a full day of sessions for anybody interested in ADF.  The collective sessions are designed to have something for everyone, ADF beginners, ADF experts, all.  All sessions will be held in Moscone South room 305.

To start out with for OOW attendees coming from a Forms background, Gert Poel and Pieter Gillis from iAdvise will give us the lowdown on ADF for Forms programmers.  This is a very important presentation for the beginners in the ADF community who are coming from a Forms background: 

1) UGF3783 - Oracle ADF Immersion: How an Oracle Forms Developer Immersed Himself in the Oracle ADF World - 9am-10am Moscone South room 305 

At the other end of the spectrum for EMG members who are looking to expand their ADF skills beyond the basics, Aino Andriessen from AMIS will be looking at using Hudson for building ADF applications.  Surprisingly via the EMG new member's survey around 25% of new members have no idea about CI tools so I think Aino's presentation is a great addition to the ADF EMG line up: 

2) UGF4945 - Deploy with Joy: Using Hudson to Build and Deploy Your Oracle ADF Applications - 10:15am-11:15am Moscone South room 305 

The 3rd presentation is one ADF EMG members have been asking for such a long time: 

3) UGF10463 - A Peek into the Oracle ADF Architecture of Oracle Fusion Applications - 11:30am-12:30am Moscone South room 305 

In this presentation Simon Haslam will be discussing the actual Fusion Apps "ADF" architecture.  In other words forgot the high level "yes ADF was used to build Fusion Apps" bullet points, Simon is going for a deep dive into the nitty gritty details of how ADF was used to build Fusion Apps.  For ADF EMG members remember all those times you posted to the EMG wishing to know more details about how ADF was used in Fusion Apps? This is the session for you to learn and bring your own questions.

But the fun doesn't stop here.  The final presentation is a muti-slot presentation, where a team of FMW programmers, including ADF programmers, SOA programmers and more will build an end-to-end application, live in front of your very eyes: 

4) UGF10464 - Oracle Fusion Middleware Live Application Development Demo - 12:45-3:45pm Moscone South room 305 

Why this presentation rocks, is rather than a single presentation on ADF here, then a separate presentation on SOA there, the goal of this presentation is to bring it altogether so you can see an end-to-end Fusion Middleware application being built at once.  I've seen this before, this is a great session, and I highly recommend it. 

I hope you'll take the opportunity to attend and support the ADF EMG this year, I'm especially keen to see new faces and meet old friends and to continue supporting it's members.

Of course note rooms and times may change, so ensure to check the schedule builder closer to the event. 

See you at Oracle Open World!

Friday Aug 17, 2012

Meet ojdeploy's big brother ojserver

Just over a year ago Oracle released the 11gR2 branch of JDeveloper starting at version  The primary reason for that release was giving customer's JSF2.0 support in ADF, though our 11gR1 branch remains for various reasons.

While JSF2.0 is the primary reason to check out 11gR2, there are some minor other benefits including that of ojserver, which is ojdeploy's big brother.

I first became aware of ojserver when Oracle ACE John Stegeman mentioned it when he spotted in, it's come up on the ADF EMG a number of times, and I've been curious about it ever since.  Part of that curiosity is peaked by the fact that ojdeploy is one of Oracle's, let's say, least loved products.  I'm not utterly convinced by the naysayers' arguments about ojdeploy, but putting that aside, it does leave us wondering what ojserver does and what problem it attempts to rectify for ojdeploy.

Why ojserver was invented was to address an issue with the Fusion Applications build.  To date the statistics for the size and number of libraries in Fusion Apps is rather impressive.  And it is ojdeploy's task to build all those libraries and the resulting application.  At one stage it was observed the Fusion Apps build times were becoming rather long, and with a bit of analysis it was determined that the start and stopping of ojdeploy for each build component was a large time sink.

Why was this?  ojdeploy is ultimately a "headless" JDeveloper which requires it's own JVM to start, run and stop.  As you can appreciate that lifecycle takes time.  If you call it seven hundred times, that's seven hundred times ojdeploy needs to be start, run and stop.  There's not much we can do about the run bit, that's the bit when ojdeploy is actually doing it's real job, but is there anything Oracle could do to fix the start and stop cycle?

Enter odeploy's big brother ojserver.

ojserver is essentially a server version of ojdeploy, in the sense that once started it stays alive and can be asked to, well serve stuff ;-)  As such what you can ask ojdeploy to do is rather than build each library itself, just hand the request off to ojserver instead, which has already been started.  Brilliant.  We no longer have to start and stop the ojdeploy process for each build item, we just start it once at the beginning, and stop it once at the end.

To start ojserver you simply execute the following from the jdeveloper/jdev/bin directory:

ojserver -start

This will start the service on localhost port 2010 by default.  You can override this by specifying the address after the -start flag.  On starting the server you will eventually see:

INFO: Server ready.

We're now ready to rock n roll with ojdeploy.  The following shows you an example of how to call ojserver from ojdeploy from a separate command line, note the additional -ojserver and -address flags: 

ojdeploy -workspace /Users/chris/jdev/mywork/Demo/Demo.jws -project ViewController -profile DemoVCProfile -ojserver -address localhost:2010

In context of ojdeploy you will not see much activity in the logs.  Rather all activity include build output, errors and more will come from the ojserver logs.

One thing to keep in mind is if you're accessing ojserver remotely from ojdeploy remotely, for the given paths for the ojdeploy -workspace flag and more, ojserver must have access to those paths and the source code.  Remember ojserver is just a server version of ojdeploy, there's no magic copying of files between ojserver and ojdeploy, so in terms of building applications and the files it needs, it's the same as ojdeploy.

Note there is currently one known limitation with using ojserver and ojdeploy via Ant (as separate to the command line call above).  At the moment the OJDeployAnt taskDef that you define in Ant to call ojdeploy currently does not support parameters for calling ojserver.  ER 14464838 has been raised to address this limitation.

Reference: ojserver documentation


In addressing the last comment about OJDeployAnt, there is a known workaround to add <arg> elements to the taskDef as follows:

<ora:ojdeploy xmlns:ora="oraclelib:OJDeployAntTask"
  <arg value="-ojserver"/>
  <arg value="-address "/>
  <arg value="localhost:2010"/>
    <ora:parameter name="workspace" value="${oracle.jdev.workspace.path}"/>
    <ora:parameter name="profile" value="${}"/>
    <ora:parameter name="nocompile" value="false"/>
    <ora:parameter name="outputfile" value="${oracle.jdev.deploy.outputfile}"/>

In the above example I've truncated some of the Ant property names using "jdev" rather than "jdeveloper" so the code will fit in the width of the blog.  Ensure to double check these with your own Ant property names.

Thursday Aug 02, 2012

New recording on using JMeter to test ADF applications

Before joining Oracle I maintained an older ADF blog where I covered using Apache JMeter to load test ADF.  That post has been picked up by a number of people over the years and it's nice to see it was useful.

Unfortunately one of the problems in using JMeter to test ADF is there's an extreme amount of fussy configuration to get right.  As a result to this day I continue to get hit with questions - why don't our tests work?  From my own investigation 99% of the time it's a configuration error on the developer's part.  Like I said, there's lots of fussy configuration you must get exactly right otherwise ADF gets confused by the messed up HTTP requests it receives from JMeter (more rightly ADF says the user session has expired, which is just ADF's way of saying it doesn't know who the current session is because the ADF HTTP state parameters JMeter is sending to the ADF server are not what it expected).

While the original blog post was useful in teaching people the technique of using JMeter, it really could do with a recorded demonstration to show all the steps involved in a live test.  Lucky for you as I'm now an ADF product manager with far too much time on my hands, I've taken time out to record such a demo as part of our ever expanding ADF Insider series.

At the conclusion of the demo you may decide it all sounds like too much effort.  Without a doubt this is why you should look at Oracle's Application Test Suite (OATS).  OATS has ADF intelligence built in, there's far less fussy configuration required, so you can focus on the job of testing rather than configuring the test tool.  I hope to publish some demos on using OATS soo.

One final caveat, I don't expect the existing JMeter configurations to survive for every future version of ADF.  So if you do find your old JMeter tests stop working on adopting a future ADF version, time to look under the covers, discover how we need to change the JMeter tests, and most importantly please share your knowledge by blogging about it or post it on the ADF EMG and leaving a comment here for people to find.

Post edit 12th March 2013: Jan Vervecken has provided a very useful update for JMeter, check out the following OTN forums post.

Post edit 2nd September 2013: Ray Tindall has provided the following updates for using this under The following changes need to be made to the JMeter solution:

Previously afrLoop was extracted from:
query = query.replace(/_afrLoop=[^&]*/__,"_afrLoop=21441675777790");
query = query += "_afrLoop=21441675777790";

Under it should be extracted from:
query = _addParam(query, "_afrLoop", "21137373554065");

As such afrLoop should now be extracted using:
_afrLoop", "([-_0-9A-Za-z]{13,16})

Thanks to both Jan and Ray for these updates.


Not a selfie
Chris Muir
Oracle Mobility and Development Tools Product Manager

The views expressed on this blog are my own and do not necessarily reflect the views of Oracle.



« August 2012 »