Friday 26 April 2013

Insert Rows in ADF View Object Programatically

I will illustrate how to insert new rows in view object programatically.

ٍSuppose that I have EmpVO view object which have below attributes
a-EmpId
b-FirstName
c-LastName

We can do inserting rows by two ways in data model layer (Application Model or ViewObject classes)
I will write my code in ApplicationModuleImpl class



1-createRow() method
2-createAndInitRow() method

  
I prefer using second method createAndInitRow because it sets default values of attributes in view object but first method insertRow doesn't do this.

ADF : Redirect to another View Programatically

You can use the below method to redirect to another view in ADF programatically.

public static void redirectToView(String viewId) 

FacesContext fCtx = FacesContext.getCurrentInstance();
ExternalContext eCtx = fCtx.getExternalContext(); String activityUrl = ControllerContext.getInstance().getGlobalViewActivityURL(viewId); 
 try { 
 eCtx.redirect(activityUrl); 
 } 
catch (IOException e) { 
e.printStackTrace(); JSFUtils.addFacesErrorMessage("Exception when redirect to " + viewId); 
 } 
 }

Custom Exception in ADF

sometimes in your business logic you want to throw
an exception regarding business requirements not Java syntax coding exception.
For example you want to raise an exception that birthday is not later than hire date.

To implement this cased in ADF I prefer the below steps.
1- Create new "ApplicationException" class and extend oracle.jbo.JboException


Create new custom class which extends oracle.jbo.JboException for adding your custom code to exception later.
import oracle.jbo.JboException;
import oracle.jbo.common.ResourceBundleDef;
public class ApplicationException extends JboException { 

 public ApplicationException(Class class1, String string, Object[] objects, Exception[] exceptions) { 

super(class1, string, objects, exceptions); 
 } 
 public ApplicationException(Class class1, String string, Object[] objects, JboException[] jboExceptions) 

 super(class1, string, objects, jboExceptions); 
 } 
 public ApplicationException(ResourceBundleDef resourceBundleDef, String string, Object[] objects) { 
 super(resourceBundleDef, string, objects); 
 } 
 public ApplicationException(Class class1, String string, Object[] objects)
 { 
 super(class1, string, objects); 
 } 
 public ApplicationException(Throwable throwable) 

 super(throwable); 
 }
 public ApplicationException(String string) { super(string); 
 }
 public ApplicationException(String string, String string1, Object[] objects) 

 super(string, string1, objects); 
 }
 }


2- Throw an exception in your code using the new class.
Anywhere in your code you can throw an exception using the following code


throw new ApplicationException("birthday should not later than hire date");

Tuesday 23 April 2013

Adding a javascript to a page in Oracle adf

In your ADF web application you may want to use javaScript functions to perform some actions in client side. You can either add inline JavaScript directly to a page or you can import JavaScript
libraries into a page. When you import libraries, you reduce the page content size, the libraries can be shared across pages, and they can be cached by the browser. You
should import JavaScript libraries whenever possible. Use inline JavaScript only for cases where a small, page-specific script is needed.

How to Use Inline JavaScript

1. Add the MyFaces Trinidad tag library to the root element of the page by adding the code


<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:af="http://xmlns.oracle.com/adf/faces/rich"
xmlns:trh="http://myfaces.apache.org/trinidad/html">


2.In the Component Palette, from the Layout panel, in the Core Structure group,drag and drop a Resource onto the page .

3. In the Insert Resource dialog, select javascript from the dropdown menu and click OK.

4. Create the JavaScript on the page within the tag.


<af:resource>
function sayHello()
{
alert("Hello, world!")
}
</af:resource>



5. In the Structure window, right-click the component that will invoke the JavaScript,and choose Insert inside component>ADF Faces>Client Listener.

6. In the Insert Client Listener dialog, in the Method field, enter the JavaScript function name. In the Type field, select the event type that should invoke the
function.

Note : You can add CSS as well in resource tag.

Thats it.now enjoy javascript in ADF.

Now why we write plain javascript , when we have such a well documented library like jquery or EXTJS. see how we can do that.

How to Import JavaScript Libraries

Use the af:resource tag to access a JavaScript library from a page. This tag should appear inside the document tag’s metaContainer facet.

1. Inside document tag, add the code below and replace the /path with the relative path to the directory that holds the JavaScript library. for example ,You can add Jquery and EXTJS .


<af:document>
<f:facet name="metaContainer">
<af:resource source="/path"/>
</facet>
<af:form></af:form>
</af:document>



2. Structure window, right-click the component that will invoke the JavaScript,and choose Insert inside component>ADF Faces>Client Listener.

3. In the Insert Client Listener dialog, in the Method field, enter the fully qualified name of the function. For example, if the showAlert
function was in the MyScripts library, you would enter MyScripts.showAlert . In the Type field, select the event type that should invoke the function.

Adding a portlet into webcenter


If you have portlets based on JSR 168 or JSR 286 and you want to add in webcenter 11g application.Oracle WebCenter Framework enables you to consume a portlet by registering its producer either with an application or with the Resource Palette from where you can add it to any application. After you register the producer, its portlets appear under the registered producer’s name under the Connections node in the Application Resources panel or in the Resource Palette.

For this you need to register WSRP portlet producer .If porlets JSR 168 is WSRP 2.0 enabled then it can be usable in webcenter 11g.

Register a WSRP portlet producer:

-> In the Application Resources panel of the Application Navigator, right-click Connections, choose New Connection and then choose WSRP Producer.
-> Use the Register WSRP Portlet Producer wizard , provide information and register .

Adding Portlets to a Page

Placing a portlet on a WebCenter Portal application page is a simple matter of dragging the portlet from the Application Resources panel or Resource Palette and dropping it on the page.
In the Application Navigator, open the application that contains the page (.jspx file) to which you want to add the portlet.
Under the Connections node in the Application Resources panel of the Application Navigator, or in the Resource Palette:
If the producer is a WSRP producer, expand the WSRP Producer node.
If the producer is a PDK-Java producer, expand the Oracle PDK-Java Producer node.

Expand the node for the portlet producer that contains the portlet to add to the page.Under the selected producer, all portlets contained by that producer are listed.
Drag the portlet from the producer node directly onto the page.You should drag the portlet onto a form on the page.

When you add a portlet to a page, a portlet tag (adfp:portlet or adfph:portlet) is added to the page source. This is the tag that represents the portlet component. This tag includes attributes that you can edit using the Property Inspector, or in the page source, to further control the behavior and appearance of the portlet.

The type of portlet tag used is determined by the following:

->If the project is configured for rich client components alone, the adfp:portlet tag is used.
->If the project is configured for Trinidad components alone, the adfph:portlet tag is used.


<adfp:portlet value="#{bindings.FooterPortlet1_3}"
portletType="/oracle/adf/portlet/SamplePortlets_1257247466260/ap/E2default_ba133935_0124_1000_8008_0a093208e9fc"
id="portlet18" binding="#{backing_home.portlet18}"
displayHeader="false" width="100%"
renderPortletInIFrame="false"
displayScrollBar="false"/>

Monday 22 April 2013

Oracle ADF Interview Questions and Answers/Tips- Part-2


Q : What is Action Listener ?

Ans : An action listener is a class that wants to be notified when a command component
fires an action event. An action listener contains an action listener method that
processes the action event object passed to it by the command component

Q:What are business Component In ADF.Describe them?

Ans: All of these features can be summarized by saying that using ADF Business
Components for your J2EE business service layer makes your life a lot easier. The key
ADF Business Components components that cooperate to provide the business service
implementation are:

 Entity Object
An entity object represents a row in a database table and simplifies modifying its
data by handling all DML operations for you. It can encapsulate business logic for
the row to ensure your business rules are consistently enforced. You associate an
entity object with others to reflect relationships in the underlying database schema
to create a layer of business domain objects to reuse in multiple applications.

 Application Module
An application module is the transactional component that UI clients use to work
with application data. It defines an up datable data model and top-level
procedures and functions (called service methods) related to a logical unit of work
related to an end-user task.

 View Object
A view object represents a SQL query and simplifies working with its results. You
use the full power of the familiar SQL language to join, project, filter, sort, and
aggregate data into exactly the “shape” required by the end-user task at hand. This
includes the ability to link a view object with others to create master/detail
hierarchies of any complexity. When end users modify data in the user interface,
your view objects collaborate with entity objects to consistently validate and save
the changes

Q: What is Top Link?

Ans:
Top Link is an Object-Relational Mapping layer that provides a map between the Java objects that
the model uses and the database that is the source of their data.
By default, a session is created named default. In the following steps, you create a new session

Q:What is Managed Bean?

Ans:JavaBean objects managed by a JSF implementation are called managed beans. A managed bean describes how a bean is created and managed. It has nothing to do with the bean’s functionality.

Managed bean is about how the bean is created and initialized. As you know, jsf uses the lazy initialization model. It means that the bean in the particular scope is created and initialized not at the moment when the scope is started, but on-demand, i.e. when the bean is first time required.

Q :What is Backing Bean?

Ans:Backing beans are JavaBeans components associated with UI components used in a page. Backing-bean management separates the definition of UI component objects from objects that perform application-specific processing and hold data.

Backing bean is about the role a particular managed bean plays. This is a role to be a server-side representation of the components located on the page. Usually, the backing beans have a request scope, but it is not a restriction.
The backing bean defines properties and handling-logics associated with the UI components used on the page. Each backing-bean property is bound to either a component instance or its value. A backing bean also defines a set of methods that perform functions for the component, such as validating the component’s data, handling events that the component fires and performing processing associated with navigation when the component activates.

What is view object?

Ans :A view object is a model object used specifically in the presentation tier. It contains the data that must display in the view layer and the logic to validate user input, handle events, and interact with the business-logic tier. The backing bean is the view object in a JSF-based application. Backing bean and view object are interchangeable terms

Q: Difference between Backing Bean and Managed Bean?

Backing Beans
Managed Beans
A backing bean is any bean that is referenced by a form.
A managed bean is a backing bean that has been registered with JSF (in faces-config.xml) and it automatically created (and optionally initialized) by JSF when it is needed.

The advantage of managed beans is that the JSF framework will automatically create these beans, optionally initialize them with parameters you specify in faces-config.xml,
Backing Beans should be defined only in the request scope
The managed beans that are created by JSF can be stored within the request, session, or application scopes
Q? What do you mean by Bean Scope?
Bean Scope typically holds beans and other objects that need to be available in the different components of a web application.


Q.  What are the different kinds of Bean Scopes in JSF?

JSF supports three Bean Scopes. viz.,

Request Scope: The request scope is short-lived. It starts when an HTTP request is submitted and ends when the response is sent back to the client.

Session Scope: The session scope persists from the time that a session is established until session termination.

Application Scope: The application scope persists for the entire duration of the web application. This scope is shared among all the requests and sessions.

What is the difference between JSP-EL and JSF-EL?

JSP-EL
JSF-EL
In JSP-EL the value expressions are delimited by ${…}.
In JSf-EL the value expressions are delimited by #{…}.
The ${…} delimiter denotes the immediate evaluation of the expressions, at the time that the application server processes the page.
The #{…} delimiter denotes deferred evaluation. With deferred evaluation ,the application server retains the expression and evaluates it whenever a value is needed.

Q:How to declare the page navigation (navigation rules) in faces-config.xml file in ADF 10g
?

Ans: Navigation rules tells JSF implementation which page to send back to the browser after a form has been submitted. We can declare the page navigation as follows:
<naviagation-rule>
<from-view-id>/index.jsp</from-view-id>
<navigation-case>
<from-outcome>login</from-outcome>
<to-view-id>/welcome.jsp</to-view-id>
</navigation-case>
</naviagation-rule>
This declaration states that the login action navigates to /welcome.jsp, if it occurred inside /index.jsp.
Q: Setting the range of table

Ans : <af:table rows=”#{bindings.LoggedInUserServiceRequests.rangeSize}”…/>

Q : Which component in ADF BC manages transaction ?

A : Application Module, manages transaction.

Q : Can an entity object be based on two Database Objects(tables/views) or two Webservices ?

A : No entity objects will always have one to one relationship with a database object or web service.

Q : Where is that we write business rules/validations in ADF and why?

A : We should ideally be writing validations at Entity Object level, because they provide highest degree of reuse.

Q:What are the JSF life-cycle phases?

Ans:The six phases of the JSF application lifecycle are as follows (note the event processing at each phase):

1. Restore view
2. Apply request values; process events
3. Process validations; process events
4. Update model values; process events
5. Invoke application; process events
6. Render response

Q. Explain briefly the life-cycle phases of JSF?

1. Restore View : A request comes through the FacesServlet controller. The controller examines the request and extracts the view ID, which is determined by the name of the JSP page.

2. Apply request valuesThe purpose of the apply request values phase is for each component to retrieve its current state. The components must first be retrieved or created from the FacesContext object, followed by their values.

3. Process validationsIn this phase, each component will have its values validated against the application’s validation rules.

4. Update model valuesIn this phase JSF updates the actual values of the server-side model ,by updating the properties of your backing beans.

5. Invoke applicationIn this phase the JSF controller invokes the application to handle Form submissions.

6. Render responseIn this phase JSF displays the view with all of its components in their current state.

Q: What is setActionListener?

Ans:SetActionListener – The setActionListener tag is a declarative way to allow an action source ( , , etc.) to set a value before navigation. It is perhaps most useful in conjunction with the “processScope” EL scope provided b ADF Faces, as it makes it possible to pass details from one page to another without writing any Java code. This tag can be used both with ADF Faces commands and JSF standard tags.
Exmaple of this can be as follows. Suppose we have a table “employee”.We want to fetch the salary of an employee of some particular row and want to send this salary in
Next page in process scope or request scope etc.So using this we can do this.
It have two attributes :
From – the source of the value; can be an EL expression or a constant value
To – the target for the value; must be an EL expression
1
<af:setActionListener from="#{row.salary}"
2
to="#{processScope.salary1}"/>
This setActionListener will pick value of salary of that row and store this value into salary1 variable.So anyone can use this salary
As processScope.salary1 . It is very simple to use. And very useful

Application Module Basics

Application Module:
The interface for Application Modules. An Application Module is a logical container for coordinated objects related to a particular task with optional programming logic.

Root Application Module and Nested Application Module:
An Application Module may be a root Application Module or a nested Application Module.
A root Application Module is not contained in another Application Module. It provides transaction context for all objects contained in it. It may optionally contain nested Application Modules. A root Application Module is created through JDNI calls. See below for details.

A nested Application Module is contained in another Application Module. The containing Application Module is referred to as the parent Application Module. If one traverses this containership ancestry, one will eventually find the root Application Module (which does not have a parent Application Module). A nested Application Module uses the transaction context provided by the root Application Module. Thus, data modifications performed in Application Modules parented by one root Application Module will commit or rollback together.

Transaction:
Associated with the root Application Module is the Transaction object, which provides this transaction context. From any (root or nested) Application Module, the user can retrieve the transaction object through a call to getTransaction(). In reality, getTransaction() first locates the root Application Module and then returns the transaction object from it.

The Transaction object manages connection to database and Entity caches. Thus, changes made through one View Object are visible to other View Objects as long as these View Objects all parented by the one root Application Module. In contrast, if two View Objects are parented by two separate root Application Modules, then changes made through the View Object will not be seen by the second View Object until the changes are committed to database through the first root Application Module and the second VO executes query (to retrieve the most up-to-date data from database).

Creating Application Module
A root Application Module is created by:

Finding the Application Module home through JNDI.
Calling create() on the Application Module home.
Here is a sample code to create a root Application Module:

java.util.Hashtable env = new java.util.Hashtable();

// Add environment entries into env...

javax.naming.Context ic = new InitialContext(env);

// 'defName' is the JNDI name for the Application Module
// definition from which the root Application Module is to
// be created
String defName = ...;

oracle.jbo.ApplicationModuleHome home = ic.lookup(defName);
oracle.jbo.ApplicationModule am = home.create();


One creates a nested Application Module by calling createApplicationModule on the parent Application Module.

Application Module definitions are managed by oracle.jbo.server.MetaObjectManager. One can find a specific definition object by issuing:

String defName = ...;
oracle.jbo.server.ApplicationModuleDefImpl def;

def = oracle.jbo.server.ApplicationModuleDefImpl.findDefObject(defName);

Wednesday 17 April 2013

Rendering HTML code on page

Below are the ways to render HTML code on JSF page:

Using <af:outputText><af:outputText value="#{pageFlowScope.testbean.value}" id="ot1" escape="false"/>

Using <af:richTextEditor><af:richTextEditor label="Label 1" id="rte1" readOnly="true" value="#{pageFlowScope.testbean.value}"/>
where bean code is using "org.apache.commons.lang.StringEscapeUtils.unescapeHtml" API to render html code properly.

import org.apache.commons.lang.StringEscapeUtils; 

public class testbean { 
 public testbean() { } 
 private String value = "&lt;
object width="100" height="100" data="http://www.google.co.in/images/srpr/logo3w.png"&gt;&lt;/object&gt;"; 
 public void setValue(String value) { 
 this.value = value; 
 } 
 public String getValue() { 
 value = StringEscapeUtils.unescapeHtml(value); return value; 
 } 
}

Tuesday 9 April 2013

Reusable ADF Region with Dialog Framework

This post is about reusable ADF region and its usage from ADF Dialog Framework. If we have ADF Task Flow with fragments and want to use Dialog Framework, we need to create intermediate ADF Task Flow with pages and include our reusable region there - this will allow to load ADF Dialog from the fragment (dialog is always running in ADF page). I will describe in this post how to pass data from/to ADF region included into ADF Dialog to the calling fragment.

There is main ADF Task Flow in the sample - empls-flow (download sample applicationReusableDialogRegionApp.zip):

This task flow is configured to call intermediate ADF Task Flow with wrapper page. We are passing and getting parameters to/from the dialog:
Dialog is opened from the button in the main employees fragment:
Button is configured to open dialog:
There is dialog listener defined for this button, it receives return value. Alternatively we can get return value from the dialog return parameter directly:
Intermediate ADF task flow (which actually implements ADF dialog), contains a page and return activity. This page is only a wrapper, it includes reusable ADF region:
Intermediate ADF task flow with wrapper page defines input and output parameters:
Wrapper page contains Close button, this button sets return value, it retrieves return value from the bindings. Because Data Control is shared between reusable ADF region and intermediate ADF task flow with wrapper page, we can access bindings from ADF region and return it from the wrapper page. You can see that this page includes our reusable ADF region:
Here is binding definition for the attribute in the page definition for wrapper page:
And the last bit - ADF reusable region, JSF fragment view:
Bindings for ADF reusable region, you can see where CountryId attribute value is set. We are getting the same value in dialog wrapper page through shared Data Control:
I should mention one important thing - intermediate ADF dialog task flow is configured to run in isolated scope. This is important and allows to reset reusable ADF region in the dialog always to its initial state on opening:
Countries region is loaded and DepartmentId value is passed into:
Selected value is returned back:
The same reusable region is opened from another fragment - region state is reset, user can select value and return it:

Thursday 4 April 2013

Oracle ADF useful training video, PPT, PDF links

Videos:
Following are the prerequisites for these trainings:-
Oracle JDeveloper 11G Studio
Oracle Database Express Edition 10G/11G  

Training-1: Introduction to ADF 
http://download.oracle.com/otn_hosted_doc/jdeveloper/11gdemos/Introduction_To_ADF/Introduction_To_ADF.html

Training-2: Introduction to ADF Business Components
http://download.oracle.com/otn_hosted_doc/jdeveloper/11gdemos/adfinsiderBC/adfinsiderBC.html

Training-3: Introduction to ADF Faces Components
http://download.oracle.com/otn_hosted_doc/jdeveloper/11gdemos/adfinsiderADFFaces/adfinsiderADFFaces.html

Training-4: ADF Page Template and Declarative Component
http://download.oracle.com/otn_hosted_doc/jdeveloper/11gdemos/adfjsfreuse/templates.html

Training-5: ADF Faces Skin
http://download.oracle.com/otn_hosted_doc/jdeveloper/11gdemos/adf-insider-skinning/adf-insider-skinning.html

Training-6: ADF Data Binding (Part-1)
http://download.oracle.com/otn_hosted_doc/jdeveloper/11gdemos/insiderBinding1/BindingsPart1.html

Training-7: ADF Data Binding (Part-2)
http://download.oracle.com/otn_hosted_doc/jdeveloper/11gdemos/adfinsider-binding-internals-2/adfinsider-binding-internals-2.html

Training-8: ADF Task Flow - Overview (Part-1)
http://download.oracle.com/otn_hosted_doc/jdeveloper/11gdemos/taskflow-overview-p1/taskflow-overview-p1.html

Training-9: ADF Task Flow - Overview (Part-1)
http://download.oracle.com/otn_hosted_doc/jdeveloper/11gdemos/taskflow-overview-p2/taskflow-overview-p2.html

Training-10: ADF Application Security
http://download.oracle.com/otn_hosted_doc/jdeveloper/11gdemos/adfinsidersecurity/adfinsidersecurity.html  

Other Useful Links:

Oracle ADF Insider  - Oracle ADF Architecture Fundamentals - Angles in ADF Architecture..
http://download.oracle.com/otn_hosted_doc/jdeveloper/11gdemos/AngelsInTheArchitecture/AngelsInTheArchitecture.html

Tuesday 2 April 2013

How to use subversion with jdeveloper for Oracle ADF development


It is a very rare sight that a project team with more than 2 developers doesn’t have any source control in place while working on an Oracle ADF development project.If you don’t have source control for Oracle ADF development, then your project needs a better project manager and architect :).

I had created a small project to demonstrate source control with Oracle ADF jdeveloper’s native support for subversion(SVN).We will use the code.adfapps.com for our subversion project hosting.

Below are the high level steps..

1) Create a manual connection to subversion repository from Jdeveloper

2) Click on the Application menu and say version application.

3) Select the repository connection and choose whether to version control to trunk,tags or branch(Put it in Trunk for the first time)

4) That’s it.. We are done with source control..No, there are lot of challenges still.We will cover them one by one in the 5 part series.

For now, let us look at the above steps in detail.


Step 1 : Create connection to svn repository
Step 2: Create a project with svn support in code.adfapps.com like below
Step 3: Provide the details as below for a demo svn project in code.adfapps.com
Step 4: Version the application now.

Step 5: Verify the subversion log in jdeveloper
Now we have successfully source controlled our Oracle ADF application.From now on we will use this code base to demonstrate the various features of subversion in ADF jdeveloper.