Wednesday, December 16, 2015

WebLogic 12.2.1 on Docker

Probably everybody in IT has noticed the rising of Docker in last 2 years. Since March 2015 Oracle has certified WebLogic Server on Docker. This is good news. Beyond all buzz around containerization and Docker in particular there is great use for it. Especially during development or testing of an application for WebLogic you can benefit without too much investment (time, skills). Further, since the first day of WebLogic 12.2.1 release it is certified on Docker.

In preparation for one of my last talks lately I decided to checkout this new version. Subsequently are my experiences so far.

Using the following Environment: WebLogic 12.2.1, Mac OS 10.11 , Docker 1.9, Docker Compose 1.5 . I will not go into Docker details here. There is a lot of introductorily Docker content available on the web.

WebLogic on Docker Overview

There are no prepackaged WebLogic Docker images available (basically because of user licence agreements) so the images must be build manually from Dockerfiles (provided at GitHub). The following figure shows the needed layers of images to actually start running containers.
  • oraclelinux image - officially available from Docker Hub
  • weblogic binaries image - must be build from Dockerfile (Available on GitHub)
  • weblogic (empty) domain image - must be build from Dockerfile (Available on GitHub)
  • application image - must be build from custom Dockerfile (its your turn)

Prerequisites

  1. Learn some Docker basic skills (if it is new to you)
  2. Download Docker Toolbox 1.9. It exists for Linux / Windows / Mac. It makes you getting started "to docker"  in seconds. (On Win / Mac it installs VirtualBox if needed)
  3. Git Clone https://github.com/oracle/docker/tree/master/OracleWebLogic (Update 12/20/15: it has been updated to https://github.com/oracle/docker-images/tree/master/OracleWebLogic
  4. Download JDK 8u60 http://download.oracle.com/otn/java/jdk/8u60-b27/jdk-8u60-linux-x64.rpm
  5. Download WebLogic 12.2.1 Binaries (I am building the DEV/QUICK Version here. So it is: fmw_12.2.1.0.0_wls_quick.jar)
  6. Copy the JDK / WLS Binaries into the cloned workspace /OracleWebLogic/dockerfiles/12.2.1

How To: Build WebLogic 12.2.1 Developer Image

dockerfiles ak$ sh buildDockerImage.sh -v 12.2.1 -d

Building image 'oracle/weblogic:12.2.1-dev' based on 'developer' distribution...
Sending build context to Docker daemon 1.204 GB
Step 1 : FROM oraclelinux:7.0
7.0: Pulling from library/oraclelinux
f359075ce4d8: Pull complete
..
..
Successfully built 251b87118c43

WebLogic Docker Image for 'developer' 12.2.1 is ready to be extended: oracle/weblogic:12.2.1-dev
dockerfiles ak$ docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
oracle/weblogic               12.2.1-dev          234ea4e45bc7        44 hours ago        1.738 GB
oraclelinux                   7.0                 707f44423637        7 weeks ago         197.2 MB


How To: Build WebLogic 12.2.1 Sample (Empty Domain) Image

This is pretty straightforward. Just change into the sample directory and kick off the docker build.

samples/1221-domain$ docker build -t enpit/samplewls:12.2.1-dev .
...
akmac2:1221-domain ak$ docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
enpit/samplewls               12.2.1-dev          3861d745a0bc        44 hours ago        1.739 GB
oracle/weblogic               12.2.1-dev          234ea4e45bc7        44 hours ago        1.738 GB
oraclelinux                   7.0                 707f44423637        7 weeks ago         197.2 MB

At this point you have an image from that you can run weblogic containers. Having some Shell scripts included the image supports different types of containers to run. This is because of WebLogic Domain concept. See next Fig.




Run WebLogic AdminServer Container (the "Docker-Way")

Nothing easier then that:
akmac2:1221-domain ak$ docker run -d -p 8001:8001 --name=wlsadmin enpit/samplewls:12.2.1-dev
545cc33b8703586b1cc9098bbffe5d48ae6810c031c5104a8828b6718eb9fd03
akmac2:1221-domain ak$

The container starts the default command from the Dockerfile which in this case is "startWebLogic.sh"
(Providing a name is optional but it helps to better identify the running container)

The easiest way to get the right IP / URL to access the Admin Console is looking at the Kitematic UI in the "Ports" Tab

So in my case I access the WebLogic Admin Console http://192.168.99.100:8001/console . Logging in with defaults weblogic / welcome1. With the above command you can now start as many AdminServers (in its own WebLogic Domain) as you want.

Extend WebLogic Domain with Managed Servers (Classical WebLogic Topology) 

Starting Managed Server Containers is also straightforward (if the Dockerfile is working for you. I had to make some modifications. See later)
akmac2:1221-domain ak$ docker run -d --name=wlsms1 --link wlsadmin:wlsadmin -p 7001:7001 enpit/samplewls:12.2.1-dev createServer.sh
bd8d53209781ea52096fba166fa6190b336366f3c0673b0a7452822a0e6d7a44
akmac2:1221-domain ak$

To add another managed server just run with different name parameter and map the container 7001 port to a different host (docker machine) port if you want to access the managed server directly
akmac2:1221-domain ak$ docker run -d --name=wlsms2 --link wlsadmin:wlsadmin -p 7003:7001 enpit/samplewls:12.2.1-dev createServer.sh
7389bfa89ffe0e07a286a9a88e3b0a3f30a77a33f464af4f8264efdc00ae7313
akmac2:1221-domain ak$
..

The createServer.sh Skript connects to the admin server, extends the domain by a machine (the container) and a managed server entry. Further it starts the NodeManager.

In the Admin Console you should notice the new machines and Managed Servers. (The managed server must be started manually; the createServer.sh Script is not doing it (Update 12/20/15: the scripts has been updated so managed server starts automatically)). In my sample I then have the following configuration

(Update 12/20/15: the following two issues might have been fixed in GitHub Repo)
Note: In order to make the above "createServer.sh" work for me I had to do the following modifications (and rebuilding the image of course)
(1) Issue: createServer.sh file not found ....
Adjust the sample 1221-domain/ Dockerfile.emptydomain.

Fix: I added the following underneath the statement "USER root"
RUN chmod +x /u01/oracle/*.sh && chown oracle:oracle -R /u01/oracle

(2) Issue: When the "createServer.sh-container" started and I try to start the managed server through Admin Console (that actually is done through the NodeManager) the process just hangs after a while... To fix that I modified the file
1221-domain/container-scripts/add-server.py:
Change the arguments for starting the managed server with additional argument.
..
arguments = '-Djava.security.egd=file:/dev/./urandom -
..
(It is a known "issue" on headless systems because of missing keyboard/mouse input entropy for random device)

Note: After making those changes and rebuild the "empty wls domain image" the "createServer.sh"-script worked as expected for me. But I noticed an increase in the image size from 1.7GB to 2.3GB. Not sure where it comes from. Maybe because I tried some other changes to make the Dockerfile work for me.  I need to investigate more and/or file an issue on that. 

Building an Java EE Application Image

Well, that's pretty straightforward. I took some existing WAR file from a tutorial (shoppingcart.war) and dockerized that app by creating a WLST Deploy script and of course a Dockerfile (that extends the WebLogic 12.2.1 Dev Domain Image)

Here is the Dockerfile:

And here the sample deploy WLST script:


Notice that the Admin Server is started during the build time in order to deploy to the AdminServer.
To build the sample Java EE application you need to run:
docker build -t enpit/shoppingcart:1.0-dev .

Now you have a dockerized simple Java EE application that you can run with

docker run -d -p 8001:8001 enpit/shoppingcart:1.0-dev

Composing and Running Multi-Container Applications

Well this should be a post for itself.  But to give you an impression for more complex scenarios: Typically you will run a database or more services that you WebLogic application is based on. Sure it is possible to link containers as shown in the previous sections but with more services it becomes a tedious task. Docker Compose helps to configure a multi-container environment that can simply be started with a single command: docker-compose up

The following docker-compose.yml file configures and links an oracle database-xe container and a weblogic container.

Here is the sample output docker compose provides (if running without -d option)
akmac2:1221-testds-app ak$ docker-compose up
Creating 1221testdsapp_oracledb_1
Creating 1221testdsapp_wlsadmin_1
Attaching to 1221testdsapp_oracledb_1, 1221testdsapp_wlsadmin_1
oracledb_1 | Starting Oracle Net Listener.

wlsadmin_1 | ..
wlsadmin_1 | ..
oracledb_1 | Starting Oracle Database 11g Express Edition instance.
wlsadmin_1 | ..
wlsadmin_1 | ..
wlsadmin_1 | Dec 16, 2015 10:19:14 PM GMT Notice WebLogicServer BEA-000360 The server started in RUNNING mode.

This should just give you an idea that simple Docker containers are just the beginning. With Docker Compose (and Docker Swarm) there is more to come.

Summary and Conclusion

Docker is fun and fast. It is easy to get started. The official provided WebLogic Dockerfiles on Github from Oracle help a lot to get started quickly. But be aware of that the Dockerfiles not meant to be perfect. Its an example how to get started and build your own WebLogic Docker images. The sample domain had to be adjusted otherwise the WebLogic JVM process did not start for me. But since the Dockerfiles are shared on GitHub it's easy to contribute. Bruno Borges and Monica Riccelli from Oracle are doing a great job in making all that to work and being certified by Oracle. Thank you guys!

For a long time WebLogic user it is untypical why port 8001 is used as default HTTP AdminServer Port. Why not running it on 7001 and use 8001 for Managed Server? or 7003, 7005 etc for managed server. ? (Note to me: Open an discussion on GitHub and fix that)

When running the ManagedServer (MS) type of container the MS is not started automatically. With some WLST scripting it could be improved I think.

Using docker-compose it should be possible to set up a cluster configuration and easily run it with: docker-compose up.

With Docker 1.9 Networking / Persistent storage capabilities and accordingly Docker Compose and Swarm has been greatly improved. This is great news. As it is going to allow Multi-Host WebLogic Cluster Containers. (Update 12/20/15: Multi-Host WebLogic Cluster Sample has been added in the corresponding GitHub Repo. Kudos to Bruno; great work!)

So there is still changes going on but in terms of simplification and improvement. I hope to see Docker Compose And Swarm for WebLogic working soon. But it will need some time because compose/swarm is sill experimental. There might be some networking issues at the moment of this writing.

Further information


Check out the presentation from DOAG 2015 (GER)

Tuesday, November 3, 2015

Consume JSON based ADF REST Services in ADF 12.2.1 (with REST DataControl)

In ADF 12.2.1 the capabilities for handling with REST services has been greatly improved. You can now expose ADF BC (ViewObjects) as  REST service in JSON format.  On the other hand there are improvements in the REST DataControl.

In this blog post I am going to show how to consume this REST Service and create a basic ADF Table.

So here is a basic REST Service for employees


REST DataControl with JSON Support

From „New Gallery“ open the following wizard


The create web service data control wizard launches. Choose REST option.


Next you can decide whether you consume a REST service, that has been exposed through ADF BC Application Module or a generic REST service. The difference here is that the ADF based REST service exposes additional meta data that describes the structure and types of the return JSON structure. This makes it possible to automatically get a type-aware DataControl on REST/JSON service which is generically not the case. See next screenshot to get a feel of the feature of an ADF REST Service and this particular describe feature.



So lets add an ADF REST Connection


Important note: Do include the version name and resource name, but do not include any URL parameters.

Next it is possible to choose from Security Policies

Since in this example we do not use any security just skip this page.

Next you can choose to add all resources or specific one. in this case I have only one resource exposed


Click Next and Finish.

=> The DataControl will be created. Every attribute type is correctly derived from the rest metadata (ADF REST service specific).



(Interesting to note, that EmployeeId is not marked as the primary key. Although it is in the ADF BC ViewObject definition from which the service has been previously created. Well it is because of the REST nature of this Collection. Resources typically must not match every attribute of an ADF ViewObject. It could be a subset. Therefore the canonical attribute represents the primary key which is typically the URL to the canonical resource. In our case the canonical resource is the resource itself :))

Next steps are as easy as with any other DataControl. Just create an ADF table via drag and drop

Run the page.


Table is displayed. Filtering works BTW too. Nice.

Since we are consuming an ADF REST Service lets see if we can update a record. Therefore Drag and Drop the „Commit“ Operation from the Data Control. Create a button and name it „Save changes“. For a simple testcase we change the salary from initially 10000 to 5000. Press „Save changes"


Looking into the database you will notice the change


Pretty cool.

Issues

Removing the Filter results in an NullPointerException. Hhhm that is disappointing. Looks like nobody has tested this so far ;).


Refreshing the page the table keeps empty (Not data to display). Looks like a bug. It would not surprise me. Anyone feel free to file a SR to Oracle.

Sample applications

Provider: enpit.sample.adf1221.restprovider.zip
Consumer: enpit.sample.adf1221.restconsumer.zip

Further information

ADF 12.2.1 Developers Guide:

16.3.1 How to Expose Canonical Resources in the ADF REST Resource
22 Consuming RESTful Web Services Using the ADF REST Framework

Wednesday, October 28, 2015

Oracle JET is here - for JavaScript lovers

Oracle makes a big move towards client side HTML5 enterprise application development - based on a collection of proven open source JavaScript tools: Oracle JET - the JavaScript Extension Toolkit. After 3 years of active development and internal usage for its Cloud products at Open World 2015 it has been made publicly available.

To get a feel of an Oracle JET application check out the "WorkBetter" JET Demo:
 Oracle JET Demo Application

Oracle JET provides a rich set of Oracle JET UI components that you can use out of the box (based on Alta UI). The documentation contains code snippets which can be used to integrate the desired UI controls in your application. (If you are a business user (with a certain affinity and love for IT) you will be able to use Oracle JET components inside "Oracle Application Build Cloud Service" )
 Oracle JET UI Components

For data visualization it is almost the complete set you may know from ADF. This is pretty cool.

Oracle JET (Enterprise) Features

Comparing to other UI Toolkits it is great to see that important aspects of every enterprise application has been addressed.

  • Support for localization & internationalization
  • UI Components are implementing the latest WCAG 2.0 / WAI-ARIA accessibility guidelines
  • Theming support - Default is Alta UI
  • Security - Oracle JET API provides the oj.OAuth authorization plugin which supports the OAuth 2.0 open protocol

Oracle JET Technical Base

Obviously the core of Oracle JETs stack is based on HTML5 / JavaScript / CSS3. For certain aspects it uses proven JavaScript Libraries for Binding, Templating and Modularization.



How does it compare to ADF

Well,
Oracle ADF Faces - for Java developers looking for a set of JSF components implementing Alta UI
Oracle JET - for JavaScript developers looking for a set of components implementing Alta UI

In the Javascript ecosystem there are a lot of changes. If you do not want to deal with all of that ADF is the right choice. If you love Javascript and want to embrace every new JavaScript libraries then Oracle JET is for you.

Further Information on Oracle JET

I have put together most of the interesting things to get started on Oracle JET. BTW, For next year it is announced that it is going to be available open source on GitHub!

Oracle JET - Getting Started
http://www.oracle.com/webfolder/technetwork/jet/globalGetStarted.html

Oracle JET Quickstart Basics
http://www.oracle.com/webfolder/technetwork/jet/public_samples/OracleJET_QuickStartBasic/public_html/index.html

Oracle JET UI Controls Overview
http://www.oracle.com/webfolder/technetwork/jet/uiComponents-formControls.html

Oracle JET Hands On Lab
http://www.oracle.com/webfolder/technetwork/jet/globalExamples-HOL.html

Oracle JET Developers Guide
http://docs.oracle.com/middleware/jet112/jet/developer/toc.htm

Oracle JET Community
https://community.oracle.com/community/development_tools/oracle-jet

Oracle JET Quick Demo on Youtube
https://www.youtube.com/embed/Qf7s-VVVpwo

Oracle Alta UI
http://www.oracle.com/webfolder/ux/middleware/alta/index.html


Keep up to date with Oracle JET

Oracle JET YouTube Channel
https://www.youtube.com/channel/UCcPYy1QhTNyR6fPAGLEsSTw/feed

Oracle JET on Twitter
https://twitter.com/OracleJET

Oracle JET on Google+
https://plus.google.com/111856587728259117930

Saturday, October 24, 2015

ADF 12cR2 (12.2.1) with lots of new features available - as part of Fusion Middleware 12.2.1 release, including WebLogic, SOA, WebCenter and Forms/Reports

Just before Open World 2015 & JavaOne open its doors for Oracles annual conference in San Francisco the long awaited ADF / WebLogic 12.2.1 has been released as part of Fusion Middleware 12.2.1.


The most interesting Updates to JDeveloper & ADF & WebLogic in terms of platform are

  • It runs on JDK 1.8. JDeveloper supports 1.8 features
  • Full Java EE 7 Support
  • Integration with Java Cloud Service (not only SaaS Extention and Developer Cloud Service, git etc)
  • Better Maven integration
On the feature list of ADF 12.2.1 there are mainly these cool things available
  • REST Service DataControl + REST from ApplicationModules
  • Responsive Layout features (af:matchMediaBehavior) and new Responsive Template (Masonry layout)
  • Remote Regions - Consume Taskflows remotely
  • Improved Data Visualization components

I am really looking forward to try out the many new features.

Further Information




Sunday, October 11, 2015

Designing Custom APIs for Oracle Mobile Cloud Service (MCS) right from the Browser

One of the powerful and cool new features in Oracle Mobile Cloud Service is the hub for Custom APIs. From the architectural perspective Custom APIs are consisting of two parts: The „Design“ and „Implementation“ Part. In this post I am going to focus on the first part.

Within MCS it is possible to create the API interface right in the browser or by uploading a so called RAML document that describes the API resources. Having done this you can provide some sample data being able to test and implement against the newly created API.

Focus of this post is to show how to design an API right in MCS UI and test it.

How to do it

Goto Development > APIs

Click „New API"


If you have a RAML document at this point in time you can upload it to define the Resources for your API. If not it is possible to create it on the fly (as shown in this post).

Next: Click „Create“. It will take you to the „Designer“ View. You will see the general configuration of your Custom API.

Next Step is to create a new REST Resource which is done in the „Endpoints“ section

Clicking on „New Resources“ creates a new form entry to fill in the „path“ and a Resource „Display Name".

Having done this the desired methods (GET, PUT, POST, etc) should be defined. Click „Methods“ for that and take action form the select list of possible methods.

-

As seen from the screenshot above you can further refine the GET method with parameters etc.
In order to get a specific employee record you may want to create a „sub-resource“ wich is also supported by the MCS API Designer. Click on the ‚+‘ therefore

The nested resource is dynamic (employee_id in this case)

And of course same procedure to add methods to a nested resource

See result after adding the GET method to a nested resource.

Because the app developer might want to be able to implement against the new API early in development (without fully functional API service backend) you can provide some testdata in the „Responses“ tab.

Choose „Add Media Type“ -  application/json - and paste your example/test response.

Save your work. Click on the „Test“ Button on top-right.

Choose the desired resource to test. You will be prompted to fill in a sample id for „employee id“ - path parameter and associate with some mobile backend. Provide Username/Password except you configured the API for anonymous access (security tab, not covered here)

Click on „Test Endpoint“ to see the HTTP Status code + body result.


That concludes the basic steps needed to design and test a Custom API in MCS. 
Cool stuff!

Further Information


Sunday, October 4, 2015

Setting up a Mobile Backend in Oracle Mobile Cloud Service (MCS)

A mobile app typically needs to access some services from the outer world. That might be some generic services for user management, storage/database, notifications, etc. (so called Platform APIs) or some business domain/app specific APIs - called Custom APIs.



In Oracle Mobile Cloud Service all services are exposed through a mobile backend. The mobile backend can be versioned and is associated with a User Realm. To access services from a mobile backend the app needs to know the unique ‚mobile-backend-id‘ and the app must be registered with the mobile backend. That registration is done in the settings of the mobile backend from within the MCS UI. So in short: the mobile backend acts as a secure container for APIs.

Creating and Configuring a Mobile Backend

Step 1: (Prerequisite) Setup User Realm with Users And Roles. Checkout the Getting Started on User Management or  the MCS Video on "Defining Users and Properties in Realms". It is pretty straight forward. The focus in this post is on mobile backend.

Step 2: In MCS goto „Development“ > Mobile Backends
Click „New Mobile Backend“ to open the wizard

Enter a name for your backend and click „Create“.
Next you will be navigated to the „Settings“-Tab of the newly created Backend.


In the settings the information is displayed which is needed in order to connect an app through this mobile backend:  Base URL, Backend ID, Anonymous Key (for anonymous access) and Application Key. For each registered application a new application id is generated.

Step 3: Associated Mobile Backend with a user realm
By default every newly created mobile backend is associated with the Default Realm. To change this open your mobile backend in MCS and goto „Users“ and Choose „Change User Realm"


Step 4: Add Custom APIs
Open your mobile backend and goto APIs

Now you can select an existing custom API or create a new API on the fly.
„Select APIs“ takes you to the API Catalog to select an API


Click on the „+“ to add the API to your mobile backend. In this sample the HR API will be associated with my HR Mobile Backend.

That’s all for a basic mobile backend.

Test the mobile backend

(1) Right from within MCS it is possible to make a first test on the API


(2) Because everything in MCS mobile backend is exposed as REST service you can simply use cURL for quick tests, e.g.

$ curl -i -u username:password -H „oracle-mobile-backend-id: c3a65860-f3a8-XYZ2-af44-061b8dc6143c" -H "Content-Type: application/json;" --request GET http://:7201/mobile/custom/hr/employees

HTTP/1.1 200 OK
Date: Fri, 24 Jul 2015 16:45:53 GMT
Transfer-Encoding: chunked
Content-Type: application/json
Oracle-Mobile-Test: Response Generated from RAML
oracle-mobile-runtime-version: 15.3.3-201507070814
X-ORACLE-DMS-ECID: 155856d5d1d09189:53b26884:14ebd8aed21:-8000-000000000000d67e
X-Powered-By: Servlet/2.5 JSP/2.1
Set-Cookie: JSESSIONID=BnjQVyrB6vhWKQhsR1pYsrkbQnQXwR2ZRD5NJ5QlTWNKPhQ4hXjn!15090744; path=/; HttpOnly


Connect to the mobile backend

Next you can go in your mobile app development environment to code against the mobile backend. For iOS and Android there are MCS SKDs available. You can download them right from the MCS Portal. Check out the user guide how to connect with the specific SDKs (see links below).

Interesting to note: For Oracle MAF no special MCS SDK is available. But stay tuned - there will be some MAF MCS Utilities available shortly with support for MCS. Further more there is an MCS SDK for Xamarin which is great news. Checkout the Xamarin Oracle Mobile Cloud Service SDK 1.0. It shows the MCS might have a bright future for enterprise mobile backends. I hope to see it!

What's next? Design and Implementation of Custom APIs for the "mobile service developer" and consuming the Services for the "mobile app developer".

Further information




Thursday, July 23, 2015

Getting Started with Oracle Mobile Cloud Service (MCS)

Mobile Application Development is often reduced to the tasks needed for implementing an app using some mobile framework like iOS, Android, Oracle MAF or some other hybrid framework. In reality there is a lot more work to do for making a mobile to work: manage user access, creating services, handle push notifications, monitor usage, etc etc.

Oracle Mobile Cloud Service (MCS) provides a central cloud service for developing, deploying, maintaining, monitoring, and analyzing your mobile apps. From the architecture perspective it looks like the following


To get started check out the MCS Introduction video from the Oracle Mobile Youtube Channel.

In the next posts I am going to show some of the features and how to work with Oracle Mobile Cloud Service. Stay tuned!

To get started smoothly I have put together the most useful content around Mobile Cloud Service.

Useful Learning Resources



Documentation



Tutorial



Friday, May 15, 2015

ADF DVT NBox visualisation component in ADF 11.1.1.9

With the arrival of ADF 11.1.1.9 a new visualisation component is included. The NBox.
"The ADF NBox is an interactive data visualization tool that allows users to view data displayed in a grid across two dimensions, each dimension representing a range of data. Customizable nodes representing data items are displayed in the cells formed by the intersection of the two dimensions." (Source: Oracle Documentation)
I never heard of the NBox before so I had to give it a try. I am quite impressive so far! Take a look

Use Case Description

In my sample for the NBox component I would like to display Employees on the dimensions „Origin“ (Country) and „Income“ (Salary).

How To

Step 1: Create a Read-Only ViewObject on the HR.EMP_DETAILS_VIEW Database View. That View includes all needed data for the use case. Nothing special here. So I am not going into details.

Step 2: Create a transient attribute to calculate the salaryLevel (lower, middle, upper - so that’s just my simple idea to divide Employees into 3 Salary-Groups so to say). I am doing this by a groovy expression: "Salary < 5000.0 ? 'lower' : (Salary < 10000.0 ? 'middle' : 'upper‘)"



Step 3: Create transient attribute to calculate an CountryDiscriminator. My idea here is to categorize every employee by the following Country-groups: US, UK and „Others“. To achieve that I am using the following groovy expression: "CountryId in ['US', 'UK']?CountryId:’OTHER'"


That’s all you need on the model side. The rest is done on the UI Layer.

Step 4: Open the „Data Controls“ palette and drag&drop the Collection „EmpDetailsView1“ onto the view (JSPX). Choose NBox from contextual menu.



Dialog opens to configure the Rows und Columns. Enter the column und row numbers, assign values and labels. In this example there are exactly 3 rows and 3 columns. The values should exactly match your values from the transient attributes.



Click: Next

The NBoxes nodes are going to be „Employee Names“ Each node will be stamped by the SalaryLevel (for income dimension) and CountryDiscriminator (for origin dimension)

In the Node-tab define the grouping by „JobTitle“. Choose color as Node classifier.


Click Tab: Indicator
Define the grouping by ‚DepartmentId“. Choose „Shape“ as indicator. (color is already used for the Job title classification)


Click: Finish-Button

The generated JSPX code will look like the following snippet. The data is bound against a tree binding.



Conclusion

The NBox component is quite rich. With some basic understanding it is very easy to transform data into meaningful and easy to read information! Beyond the given use case there are a lot more ways to visualize data. It’s worth to take a look into the documentation. Have fun!

Download Sourcecode

https://github.com/enpit/enpit.sample.adf.nbox

Further Information

From ADF Web UI Guide 11.1.1.9
- 23.2.3 NBox Use  Cases and Examples
- 26  Using NBox Components

From ADF Fusion Developer Guide 11.1.1.9
-  26.5 Creating Databound NBoxes

Issues

(1) As you can see from the screenshot of the „Create NBox“ dialog the „Next“-Button is disabled although everything required is filled in. The Button gets enabled once you click in some of the cells.
(2) In the second step of the „Create NBox“ sample the „Back“-Button is disabled although there is no reason. Workaround: fill in both required fields Row/ Column. Then the Back-Button gets enabled.