Tuesday, December 29, 2009

Programmatically Navigating to another page in adf / jsf

Here is the sample code which can be used to programmatically navigating to another page in jsf or adf

FacesContext fctx = FacesContext.getCurrentInstance();
Application application = fctx.getApplication();
NavigationHandler navHandler = application.getNavigationHandler();
navHandler.handleNavigation(fctx,null, "name of navigation case");

Doing some work before showing Popup in ADF

Here is the way to do any processing before calling popup. First of all create a method in backing bean and assign this to action of "commandButton" or "commandLink". Sample signature for you method is as follows:

public void myMethod()
{
/**
* Place your processing logic here and then call showPoup method
**/
showPopup(popupId);
}

Signature of showPopup is:

public static void showPopup(String popupId)
{
FacesContext context = FacesContext.getCurrentInstance();

ExtendedRenderKitService extRenderKitSrvc =
Service.getRenderKitService(context, ExtendedRenderKitService.class);
extRenderKitSrvc.addScript(context,
"AdfPage.PAGE.findComponent('" + popupId + "').show();");
}

Friday, December 25, 2009

JSF Life cycle Tip # 1

Usually people think that by setting the attribute "immediate" true, bypasses the validation life cycle but this is not true in every case. If you talk about CommandButton and CommandLink, then its true and after "Apply Request Values" phase, request processing cycle shifts to "Render Response" phase thus skipping "Process Validation","Update Model Values", and "Invoke Application". ActionListener and action method associcated with CommandButton / CommandLink is executed in "Apply Request Values".
When we talk about editableValueHolder like InputText, and other controls, setting immediate "true" does not bypass the validation or other phases. Infact it just prioritize the control for validation e.g. if you want to validate one input control first than others, then you can set "immediate" for that control to "true".

Wednesday, October 28, 2009

Pros and Cons of JDeveloper 11g and ADF from begginers Point of View

I have started to use JDeveloper 11g and ADF for one of my enterprise level project. I didn't use any part of ADF before. Its now one month and i want to share with world what i found in ADF with JDeveloper 11g.

Pros:
- It is based on MVC pattern and cleanly separates your business logic from presentation layer.
- It has built in support for AJAX
- Very rapid development because most of the development one can do declaratively by just drag and drop components on pages and like that
- Most important and exciting feature from me was very good support of LOV. LOV is required in almost every business application and with ADF i don't have to do any code for LOV just a query and some very small configurations and that's it.
- Rich Tables supporting LOV, combo box and others.
- It provides good hooks to develop own framework or utility classes to suit development e.g. I want to extend all entities from my own class and i can do it very easily.
- One of the unique feature of ADF 11g is ADF Task flow which faciliates developer to define reusable navigation and avoid cluttering of all navigation rules in one file which happens in JSF

Cons
Now we discuss cons of ADF and JDeveloper 11g
- JDeveloper is buggy and crashes many times espeically when one does refactoring or deleting some resources
- You will have to spend good time to learn ADF if you didn't have prior experience with Oracle technologies
- Query component in ADF Faces which is used to build criteria does not have option to change the layout of fields like grouping etc.
- LOV which are generated are also buggy. I am still facing one problem and no one still gave me solution for that.
- You will have to do lot of hit and trials to understand the behaviour of layout components

Thursday, October 8, 2009

ADF Error timezone region not found

When i deploy/run adf applications, i receive error:
timezone region  not found

In order to solve this, right click on Model project and select Project properties. In "Run/Debug/Profile" select "Edit" in "Run Configurations" and add "-Duser.timezone=UTC" in JavaOptions. Repeat same steps for ViewController Project.

Tuesday, October 6, 2009

JDeveloper11g Startup error

I installed JDeveloper11g Studio Edition with no JDK bundle but when i tried to start JDeveloper, it gave me error

Unable to start Java Virtual Machine located at ....

In order to fix this type of error, go to installation_directoy\Middleware\JDeveloper\jdev\bin folder
and edit file jdev.conf.
Locate line "AddVMOption -XX:MaxPermSize=256M".
Now add another line just below this line:

AddVMOption -Xmx256M

Saturday, October 3, 2009

Persistence Unit for Toplink Essentials

Minimum configurations required for persistence unit in case of Toplink essentials is given below:

<?xml version="1.0" encoding="windows-1252" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="Model" transaction-type="RESOURCE_LOCAL">
<provider>
oracle.toplink.essentials.PersistenceProvider
</provider>
<class>org.engineers.adf.hrdemo.model.Departments</class>
<class>org.engineers.adf.hrdemo.model.Employees</class>
<properties>
<property name="toplink.logging.level" value="INFO"/>
<property name="toplink.jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="toplink.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
<property name="toplink.jdbc.password" value="password"/>
<property name="toplink.jdbc.user" value="user"/>
</properties>

</persistence-unit>

</persistence>

JPA with Toplink Essentials Error Code: 17002

From this post, I am going to start to post solution for different problems or errors in java technologies which i face during development so that others also could get help from my research and don't waste time on that now.

Error is given below:

Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.1 (Build b52-fcs (09/24/2008))):
oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Io exception:
Invalid number format for port number
Error Code: 17002

Cause Was: I just copied url from a web site and then pasted to persistence. Probably it appended some hidden characters due to which provider game an error about port format. I just rewrite the port number again and error resolved.

Second Error which i faced was:

Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.1 (Build b52-fcs (09/24/2008))):
oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException:
Io exception: The Network Adapter could not establish the connection
Error Code: 17002

Cause Was: wrong port number, ip address or network disconnection

Sunday, May 10, 2009

How to Send Message to Status Bar in Android

Status bar is very important part of android interface. It alerts the user about new sms, emails and many other stuff. Applications can also send messages or notifications to status bar for user. In this post, I will guide the user how to send messages to status bar using a simple application.
Application has a simple interface which has a edit box and a button. User will type any text in edit box and will click on button. which will send the message to status bar. Given below is the code for interface:

package org.engineers.android;

import android.app.Activity;


import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;

/**
*
* @author amer sohail
*/
public class NotificationActivity extends Activity {

private EditText editor;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
// ToDo add your GUI initialization code here
setContentView(getEditor());
}

private LinearLayout getEditor(){
LinearLayout parent = new LinearLayout(this);
parent.setOrientation(LinearLayout.VERTICAL);
editor = new EditText(this);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams (LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, 0.5f);
parent.addView(editor ,lp);

LinearLayout actionBar = new LinearLayout(this);
actionBar.setOrientation(LinearLayout.HORIZONTAL);
Button sendButton = new Button(this);
sendButton.setText("Send");
sendButton.setOnClickListener(listener);
actionBar.addView(sendButton);
parent.addView(actionBar,lp);
return parent;
}

private OnClickListener listener = new OnClickListener() {

public void onClick(View arg0) {

//write code here
}
};

}

Above code is very simple. There is an activity named as "NotificationActivity" extended from Activity class. This will be the view of application. Inside "onCreate" method, content view is set which is developed in separate method "getEditor". Although good approach to write interface is in xml but i wrote it here using code because this was a very simple application. I used Linear Layout with vertical orientation as main layout. It contains EditBox and Button vertically. A OnClickListener was also set to button's OnClickListener. OnClickListener contains a method onClick where i will write main code to sent message to status bar. Code for that is given below:


NotificationManager manager= (NotificationManager)NotificationActivity.this.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(R.drawable.alert_dialog_icon,null, System.currentTimeMillis());
PendingIntent contentIntent = PendingIntent.getActivity(NotificationActivity.this, 0,
new Intent(NotificationActivity.this, NotificationActivity.class), 0);
notification.setLatestEventInfo(NotificationActivity.this, "Alert", editor.getText(), contentIntent);
manager.notify(1, notification);

NotificationManager is main class which is used to send messages in the form of Notification to the status bar. NotificationManager is gotten from Content.getSystemService method. Since Acitivity is extended from Context class, so i used "NotificationActivity" to get NotificationManager. Next step is to create a Notification. It has many constructors but constructor which i have used contains three parameters. First one is "icon" to be displayed in the notification. second one is message which i will set later and third one is time in milliseconds of generating the message. Notification object also requires a PendingIntent to display acitivity when user will click on message in status bar. PendingIntent.getActivity is used to create PendingIntent for activity. In the last, i call notify of NotificationManager which takes two parameter, first one is unique identifier for notification and second one is Notification itself. That's it. You can send notification to status bar in four simple lines. Create a project and try it. I will post another blog to explain PendingIntent in details.