Wednesday Feb 05, 2014

How to solve "apapt.exe file missing" error when uprading ADF Mobile

Investigating the issue in which a missing aapt.exe file is reported by JDeveloper after upgrading to the latest ADF Mobile patch I found a bug that fixes a previous problem which was that Google moved the executable file. As a response ADF Mobile now looks in the Android build path for the executable and also allows you to select the build tools location in the ADF Mobile preferences if the executable cannot be found by JDeveloper. If you are on an old version of the Android SDK that does have the aapt.exe file in its original location (the one before Google moved it) you will see the error mentioned in the title of this post.

 You can then use the ADF Mobile preferences to search for the build tool, or in addition, use it as a reminder to launch the Android SDK Manager and upgrade to a recent version of the SDK.


Monday Feb 03, 2014

Setting-up ADF Mobile for Android using JDeveloper with the latest ADF Mobile patch

Installing the latest ADF Mobile patch for JDeveloper prevented deployment of mobile applications with some weird error messages. I concluded that its probably my Android SDK that needed renewal. To go for a clean approach, I deleted my Android SDK and downloaded the latest and greatest from the Web. Since my last SDK installation, Google has changed the Android directory structure quite a bit. For those struggling, here is what I configured in the Android SDK and JDeveloper.

 First observation, to install the gcm.jar file (Google Cloud Messaging) you have to check the "Obsolete" checkbox in the SDK Manager.


In the JDeveloper preferences, I provided the following entries


Adroid SDK location

Android Platform Location

Android Build Tools Location
<drive>:\android-home\sdk\build-tools\19.0.1  (I installed v. 19 of the SDK)

The "<drive>" in my case was D:\ on Windows (funny that on the Apple Mac, which I use for writing this blog the backslash is shift+alt+7)


Friday Dec 20, 2013

To German Customers: Get Trainined on ADF Mobile

To all German Customers! Oracle Germany runs two free-of-charge ADF Mobile single day workshops in Munich (Feb. 4th) and Frankfurt (Feb. 6th)


09:30    Registrierung          
10:00    Beginn: Vorstellung Agenda und Workshop   
11:00    Übungen Teil 1 - ADF Anwendung erstellen und deployen          
12:00    Mittagspause mit Mittagessen          
13:00    Übungen Teil 2 - ADF Mobile Anwendung erweitern, deployen, testen          
15:00    Kaffeepause          
15:30    Übungen Teil 3 - ADF Mobile - Webservice konsumieren          
16:30    Wrap up          
17:00    Ende Workshop

 Presenter: Jürgen Menge    Bernhard Fischer-Wasels

Registration for Frankfurt:,P111_KATEGORIE,P111_URL:1401,ADFMOBILE,

Registration for Munich,P111_KATEGORIE,P111_URL:1421,ADFMOBILE,

Please register today. There is no better way to get mobile than ADF Mobile. 


Monday Sep 09, 2013

ADF Mobile Deployment Problem to Google Play

Joe Huang from ADF Mobile Product Management answered a question on OTN regarding changes in Google Play that cause ADF mobile applications to fail deployment if accessed from a tablet. The OTN question and answer is referenced from this link:

However, Joe went the extra mile and wrote  a blog summary of what happened at Google Play and how you can fix this for current ADF Mobile applications (up to version, as I expect a fix to be added to any future versions of ADF Mobile):


Thursday Sep 05, 2013

JDeveloper 11g R2 and 12c: How-to "virtually" press a button on page load

A frequent asked question is about how to press a command button upon load of a page or view. If you are on JDeveloper 11g R2 or JDeveloper 12c, then the solution to this programming challenge is the use of JavaServer Faces (JSF) 2 system events (If you are on JDeveloper 11g R1 then you are on JSF 1.2 and this JSF functionality doesn't exist).

System events are phase listeners that you  associate with a component instead of a view or page as a whole. In the use case mentioned above, the system event would be added to the command button you want to pres on initial page load, e.g.

<af:commandButton text="Press on Page Load" id="cb1"
   <f:event listener="#{viewScope.OnLoadHandler.pressButton}" type="postAddToView"/>

 As you can see the f:event tag is added as a child tag to the af:commandButton (You find the event tag in the JDeveloper component palette under JSF -> Core) pointing to a listener defined in a managed bean that listens for the "postAddToView" phase. The managed bean is configured in viewScope to ensure the button in the use case is only "virtually pressed" once and not upon PPR of the button area. Using a managed bean in view scope, a flag can be kept that determines whether or not the button has been invoked already.

The event handler uses JavaScript to "virtually press" the button after the page or view is loaded:


boolean initialPageLoad = false;


public void pressButton(ComponentSystemEvent componentSystemEvent) {
 //only execute button once and not on PPR is used
 if (initialPageLoad == false) {
  //get access to the command button to execute "click"
  RichCommandButton rc = (RichCommandButton)componentSystemEvent.getComponent();
  String clientId = rc.getClientId();

  //compose the JavaSCript to invvoke from the server. The button client ID allows 
  //us to locate the button even if it is saved in a naming container (e.g. a region) 
  //so the absolute component access will do
  String javaScript = "var button = AdfPage.PAGE.findComponentByAbsoluteId('"+clientId+"');
  //invoke the JS
  FacesContext facesContext = FacesContext.getCurrentInstance();
  ExtendedRenderKitService service = Service.getRenderKitService(facesContext, 
  service.addScript(facesContext, javaScript);

  //change flag   
  initialPageLoad = true;

 This way, whatever is configured for the command button press is executed upon page / view load.

A valid question is: "why don't you execute the Java method associated with a command button directly instead of  using JavaScript?" The answer to this is that using JavaScript, associated behavior tags (e.g. for printable behavior or to show a popup) are executed too as it "mimic" a user behavior.

Of course, if there is no client side behavior associated with a command button, its better to not use JavaScript but call the Java method associated with the button directly.


Tuesday Jul 23, 2013

New: Check-out the ADF Architecture TV Channel on Youtube

The new Oracle ADF TV channel - or ADF Architecture TV channel - on YouTube is a direct outcome of the "Real World ADF Design & Architecture Principles" training Oracle Product Management built over the last year and a half.

This channel is free and publishes, week by week, episode by episode, a huge array of short, distinct topics as relating to all parts of the ADF development lifecycle, from planning, to design, to development, deployment and delivery.  All in all we have current plans for near 100 episodes.

The complete set of topics to be covered is currently indexed on the ADF Architecture Square for you to check out.  We’ve already published episodes on the YouTube channel so you can get a taste of what's to come, which you can enjoy from either work with a small time investment each week, or even from your iPad/Android tablet at home.

Important to mention to you that this channel is all about stuff and no fluff. This said, its not an ADF overview or sales pitch to Oracle ADF, nor is it a beginner training to start learning ADF.

The goal of this training is to accelerate your skills and understanding of ADF beyond drag and drop and thus teaches to think ADF.

Personally I wished we had such a training from the early days on. But in this case late is better than never and I am sure what we produced will turn out to be a great help for you. Check it out and also make sure you subscribe to the channel to receive updates whenever we upload a new episode.


Thursday Jul 18, 2013

Free EMEA ADF and ADF Mobile 2-day workshop for beginners

We offer free 2 days hands-on ADF & ADF mobile workshops for Oracle partners who want to become ADF Specialized.

Oracle Application Development Framework (ADF) is the standards based, strategic framework powering Oracle Fusion Middleware and Oracle Fusion Applications. From desktop, to Web, to mobile, we′ll introduce you to the development platform Oracle is using for its Fusion enterprise applications, discuss its architecture and offer hands-on experience on how to get up to speed with it.

Highlights of the Workshop

  • Oracle Fusion Middleware Development Platform
  • Developing Reusable Business Service
  • Developing Rich Web User Interface and Portals
  • Developing Mobile Apps for iOS and Android with Oracle ADF Mobile

Target Audience

  • Developers, Project Managers,Architects
  • ADF beginners
Quotes from previous Bootcamps
  • ″Oracle trainings are the best″
    Pedro Neto Novabas
  • ″Excellent training, well organized″
    Pedro Antunh, Capgemini
  • ″This course dives you into Oracle WebLogic giving you a quick start on benefiting from Fusion Apps″
    Leonardo Fernandes, Outsystems

Read more and register!

Tuesday Jun 04, 2013

How-to highlight input field content when accessed from auto-tab

A question on the OTN forum has been how to highlight the content of an input field when navigation to it occurs using the auto tab functionality. As a reminder, the "autotab" property of an input field, if set to "true", tabs out of the field that you currently edit when the maximum length of the field entry is reached.

The problem reported on OTN for JDeveloper (and I am sure its the same on other versions of JDeveloper) is that manual tabbing into a next field will highlight the fields content (value) whereas autotab doesn't. To enforce consistent highlighting behavior, you can use JavaScript as shown in the page sample below:

<f:view xmlns:f="" xmlns:af="">
    <af:document title="AutoTab.jsf" id="d1">
    <af:resource type="javascript">
      function onFocusHandler(inputEvent){
         var textfield = 
      <af:form id="f1">
        <af:panelFormLayout id="pfl1">
            <f:facet name="footer"/>
             <af:inputText label="First Name" id="it1" 
                           maximumLength="5" autoTab="true"/>
             <af:inputText label="Last Name" id="it2" 
                <af:clientListener method="onFocusHandler" type="focus"/>

The af:clientListener is attached to the input field for which you want to show content highlighting on autotab. Attach the same client listener definition to  all field that should have the content highlighting. Instead of adding the JavaScript to the page, you want to create an external JS library file and link it from the page as the JS code above is reusable.

Note that the use of "'::content" in the JavaScript uses knowledge about the way component IDs are rendered at runtime in ADF Faces. If component rendering changes in a future release (you never know) then your code will break at this point and needs to be corrected. So heads-up on this risk (though should be a small one). To the time of writing this lines there is no other API (option) available to get to the HTML field handle in ADF Faces.

Also note the use of AdfAgent.AGENT.getElementById, which is a performant wrapper API in ADF Faces around the document.findElementById function of the Browser DOM. As a rule of thumb you should always work with ADF Faces JS APIs and don't directly reach out to the DOM yourself.

Wednesday May 15, 2013

Table Pagination with JDeveloper

One of the new features listed for JDeveloper is pagination for tables, a frequently requested and long awaited feature ( The tag documentation about this feature states that to switch pagination on you simply set the scrollPolicy property to page.Truth to be told, there is a little bit more for you to do.

1. You need to set the autoHeightRows property to 0

2. You need to make sure the surrounding container provides a floating layout and doe not stretch (e.g. using a panelGroupLayout)

3. To bring the table into shape (full width) you then set styleClass="AFStretchWidth"

All changes at a glance:

scrollPolicy="page"  autoHeightRows="0" styleClass="AFStretchWidth"

Once you did this, the table renders as shown in the image below.

ADF table

Tuesday Feb 26, 2013

Heads up! ADF News Session - Thursday March 7th, 8.30 - 9:00 AM (CET) - Topic: ADF - Q & A

The German ADF Partner Community organizes a webcast with Duncan Mills. This session is in English and thus suitable for everyone to attend (as far as timezone differences allow it).

To quote from the official announcement:

Duncan Mills is a senior director of product management.for Oracle´s application development tools. In recent years responsible for the Oracle Application Development Framework (ADF). With a strong background as well in Forms<<<

You are invited to join the next ADF News Session, that is going to take place March 7th.

speaker:  Duncan Mills / Oracle
time:         8.30 AM (CET)
duration:  30 minutes
topic:        ADF - Q & A

dial-in webconf:
meeting-number:            257 666 519
meeting-password:        123456
(topic:                            ADF)

When dialing in you are asked to enter your name and your mail address. The name will be shown in the participants list. The mail address will not be visible.

if using WebEx for the first time there will be some minutes needed before you can join the webcast

dial-in telco:

          +49 (0)69 2222 16 106 or +49 (0)800 66 485 15
          ConfCode: 208 503 9
          SecurityPasscode: 112233

to request international dial-in numbers please contact prior to the webcast


Wednesday Feb 20, 2013

Book Review: SOA Made Simple by L. Dikmans and R.v.Luttikhuizen

Just finished reading "SOA Made Simple" by Lonneke Dikmans and Ronald van Luttikhuizen, published in 12/2012 by Packt Publishing and use this summary to share my thoughts. 

"SOA Made Simple" is a very good book that - beside of helping readers to do SOA right - will have an impact to how you look at going out for breakfast. The "breakfast example" is one of the great samples that the authors consistently use throughout the book.In addition, this book is well written and covers really no fluff but just stuff. Reading this book you learn what SOA is, the benefit it brings to IT, as well as how you design and model your SOA and services.

 Whenever Packt asks me to review and write about a new book, I ask for a printed copy so I can annotate the page with comments and questions. My copy of this 257 page book has a lot of annotations, mostly about information I want to share in my review.Too many annotations, which clearly indicates I liked the book, though I am not directly involved in SOA (which probably makes me the perfect candidate for reading this book). According to the Preface, yes I read this too, the book is "for anyone (architect, designer, developer, administrator, team lead) who is implementing or is about to implement SOA in anIT-related environmenet". Well, I would call this mission accomplished and recommend you to buy this book for your learning and career.

So lets have a look what this book covers and what I liked so much:

Chapter 1: Understanding the Problem

This chapter is a well structured introduction to the current state of IT that leads to a problem statement that demands for SOA to come for the rescue. However, though A SOA book, the authors don't make it too obvious that SOA is the answer. The chapter also gives you some questions by hand you should ask before starting a SOA project so you ensure your decision is right before starting a SOA project. This chapter also introduces the examples (I already mentioned the diner for breakfast, but there also is an insurance business and others).

Chapter 2: The Solution

This chapter introduces services and the SOA term. It does so not from a pure technical perspective and without calling WS* services too soon. Or would you have considered the waiter service in a diner to be a service? In fact it is and therefore services don't need to be SOAP or REST to be called a service. SOAP and REST come into play later, when the talk is about standards and SOA.

Chapter 3: Service Identification and Design

This chapter introduces various concepts around the design of services  like top-down, bottom-up and meet-in-the-middle. Walking towards WS services, this chapter summarizes and explains service characteristics. Unless you are a WS expert already, this is one of the chapters that really help you to understand what a service should be, how isolated and de-coupled it must/can be and how complex IT architectures can be mapped to a sensible service oriented architecture.Here you get a good analogy of services to lasagna (really good examples that stick as pictures)

Ps.: As a note to the publisher, I think the images on page 73 and 74 are in the wrong order. Too late though, the ink has dried.

Chapter 4: Classification of Services

This chapter allows you to organize services into elementary services, composite services and process services.  It also covers the difference between service composition (BPM/BPEL) and aggregation (ESB, client). Other concepts for organizing services in this book are: granularity, actor (who works with a service), channel of access, security requirements and many more.

Chapter 5: The SOA Platform

This chapter switches gear for a moment and uses SOA terminology that hasn't been introduced until here but is getting explained in the following. The chapter also talks about REST and SOAP services as first class citizen technologies in a SOA. This chapter thus is where you learn about ESB, BPM, Case Management, Events, Business rules and user interfaces to SOA (which is also where Oracle ADF gets its mentioning). A lot of pages are dedicated to service security, design and develpment tools.

Chapter 6: Solution Architectures

Chapter 6 is one of my favorites and compares SOA offerings and suites provided by Oracle, IBM and Microsoft, allowing readers to understand what each of these vendors has to offer and how products could integrate. The chapter doesn't announce a winner, which I think would be a bad move for a generic SOA book, but really saves you from investigating this yourself. As the authors stress it, it is important to understand what is best in breed for a project and where you shop this best looking at the full package.

Chapter 7: Creating a Roadmap, How to Spend Your Money and When

This chapter discusses what it takes to implement SOA in a company: stake holders, requirements, wrong and right expectations, benefits and money gains. Personally I think the graph on page 1999 is a great idea for showing what you can expect on each of the stages involved when implementing SOA. Its really well done.

Chapter 8: Life Cycle Management

What you build today is what you maintain tomorrow and throw away the day after tomorrow. This basically is what the authors call the the lifecycle of SOA solutions. and in fact its all about change management and the conflict that exists between developer and administration personnel that both have a different agenda. Governance plays into this as well. Basically you learn that you need to keep the "eye on the bal" during the realization of SOA architectures. 

Chapter 9: Pick your Battles

This chapter is all about how to get people to buy in to a SOA architecture and how to ensure that the implementation - especially when implemented in distributed teams and by different departments - follows defined rules and definitions without being prohibitive to change.

Chapter 10: Methodologies and SOA

This chapter discusses the impact SOA has to different aspects of software development and provides methodologies to use.

In case you did not order the book while reading my review, here's a dense list for why you should:

- Clear story line

- Chapters that make sense and float

- No fluff just stuff

- Explaining complex concepts simple in real life examples

- Back / Forward references

- External document references

- Good SOA coverage from a project perspective looking at SOA as a whole and not just services

 The one thing I wanted to have immediately when reading this book was a second book that closely follows this book's chapters and that  - by example - shows how to implement various SOA components for people to have example code and instructions. This could be using the Oracle stack (preferred) but also would be valuable for any of the other introduced vendors. However, code and implementation samples was not in focus for this book and this is good the way it is.


Wednesday Jan 23, 2013

How-to programmatically display a popup message

For an ADF mobile sample I needed to display a confirmation message upon successful upload of an image. Because I could not see how to do this from Java using the ADF Mobile popup dialog, I used JavaScript. The JavaScript function I called is part of PhoneGap, which is neat because this ensures I don't have to maintain custom JavaSCript code in my AMX page.  To call the PhoneGap notification dialog, I  added

20-October 2013: important. Since I've written this sample, the libraries have been changed from PhoneGap to Cordova. Make sure the script below is changed to the Cordova JS (!!!)

Script sample

to the AMX page. I added this script tag to the body section of  the amx:panelPage component tag. Note that the relative addressing /../.../.../ in the JS reference is for AMX pages that are in the public_html folder. If your page is in a sub folder, you will need to add an extra "/.." for each folder

In my Java bean, which I called from a method binding, I used the ADF Mobile AdfmfContainerUtilities.invokeContainerJavaScriptFunction(...) call to invoke the PhoneGap "navigator.notification.alert" function

navigator.notification.alert(message, alertCallback, [title], [buttonName])


The Java call is shown below:

            new Object[] {"Image uploaded: \n " +
            "File Name: "+fileName+"\n File Type: "+fileType,"",
            "Image Uploaded to Server", "Ok"});

Note the use of the object array to pass multiple arguments to the JavaScript function. The "" string is the ADF Mobile feature Id of the feature that contains the AMX page with the JavaScript reference.

The result is shown in the image below:

PhoneGap dialog displayed in ADF Mobile

Using the same technique you can call any other PhoneGap JavaScript function from ADF Mobile (and your custom JavaScripts as well)
See also:

Friday Jan 04, 2013

JavaScript function to intercept or listen for tab remove event

The af:panelTabbed component allows you to remove tabs from display using the tabRemoval property

tabRemoval Valid Values: none, all, allExceptLast

determines if tab removal is enabled.

This attribute supports these tabRemoval types:

  • none - tab removal is not enabled.
  • all - tab removal is enabled on all tabs, regardless if they are disclosed. The last tab in the panelTabbed can be removed.
  • allExceptLast - tab removal is enabled on all tabs, regardless if they are disclosed. The last tab in the panelTabbed cannot be removed.


Because tab removal is not automatic in ADF Faces, developers configure an item listener on the af:showDetailItem component that make the tabs within a panel tab


itemListener javax.el.MethodExpression Only EL a method reference to an item listener


"Choosing to remove a tab will cause an ItemEvent of type 'remove' to be launched. This event can be listened for on a showDetailItem using the itemListener attribute. It is up to the developer to handle this event and code the actual removal of the tab. This is because of the dynamic nature of the panelTabbed component, which may have dynamic children. This also allows a finer level of control by the developer, who can then choose a custom implementation that may (for example) include warning dialogs, and control of which tab gains focus after a tab is removed."


This apparently works with logic written in Java saved on the server. A question on OTN was how to handle or intercept this remove event on the client side using JavaScript. This information - unfortunately - is a bit hidden in our documentation and you have to look into the JavaScript documentation for this.


If there is an AdfItemEvent that fires on the ADF Faces client side, then there also must be a configuration available on the af:clientListener to listen for such an event. And there is (just not obvious)

 <af:panelTabbed id="pt1" tabRemoval="all">  
    <af:showDetailItem text="TAB 1" id="sdi1" stretchChildren="first" clientComponent="false">
         <af:clientListener method="alertTabClose" type="item"/>

The JavaScript function to this looks similar to

function alertTabClose (closureEvent){
     var tab = closureEvent.getSource();  

This allows you to handle (and suppress) the tab remove event on the client using JavaScript in ADF Faces

Monday Dec 17, 2012

Accessing ADF Faces components that are read-only from JavaScript

Almost as a note to myself and to justify the time I spent on analyzing aproblem, a quick note on what to watch out for when working trying to access read-only ADF Faces components from JavaScript. 

Those who tried JavaScript in ADF Faces probably know that you need to ensure the ADF Faces component  is represented by a JavaScript object on the client. You do this either implicitly by adding an af:clientListener component (in case you want to listen for a component event) or explicitly by setting the ADF Faces component clientComponent property to true.

For the use case I looked at in JDeveloper 11g R1 ( I needed to make an output text component clickable to call a JavaScript function in response. Though I added the af:clientListener tag to the component I recognized that it also needed the clientComponent property set to true.

Though I remember this as not being required in, I like the new behavior as it helps preventing read-only components from firing client side events unless you tell it to do so by setting the clientComponent property to true.

Note: As the time of writing, JDeveloper is not publicly available and I put the note in this blog as a reminder in case you ever hit a similar challenge so you know what to do.


A blog on Oracle JDeveloper, ADF, MAF, MCS and other mobile and web topics inspired by questions and answers posted on the OTN forums.

Frank Nimphius


« July 2016