Tuesday, February 2, 2016

Change Web Service WSDL at Runtime When Calling SOAP Web Service (Step-by-Step)

Sometime we need to change the Web Service WSDL URL dynamically at runtime when we call web service. The Web Service may deployed in different environments and you want depending on some conditions you will decide which version you should call.
In this example I will show you how to call SOAP Web Service progrmatically with dynamic wsdl url.

I used JDev 11.1.2.4.0 for developing this complete example.

1- Create a Simple Web Service:

I will create a simple web service has one function call "sayHello" this function will receive String and will return "Hello " + String.

- From JDeveloper create a custom application "e.g SimpleWebService" with one project "e.g SimpleWS" then create a class "e.g MyWebService.java" has one function sayHello as shown




- Right click on the MyWebService.java --> Create Web Service


- Go throw the opened wizard to create the web service. After finish creating the web service the application should be like:



- Right click on the MyWebService.java --> Test Web Service



Now the web service is running in my local machine with wsdl url

http://localhost:7101/SimpleWebService-SimpleWS-context-root/MyWebServicePort?wsdl

I will deploy it in another server and the web service wsdl url will be

http://weblogic2:8000/SimpleWebService-SimpleWS-context-root/MyWebServicePort?wsdl

- Now we finished creating Web Service and deployed it in 2 different environments with 2 different wsdl url.


2- Create a jar File for Calling The Web Service

To call this web service in other applications like ADF application or Java Application you should create jar file and use this jar file on this application.

- Create dummy application --> right click on the project --> New --> Web Service Client and Proxy


- Enter any of the Web Service wsdl url (I will enter the local running web service wsdl url) then press Finish


- The client class will open with code in case you want to test WS



- To create the jar file, right click on the project --> Deploy -->MyWebService-Client


- We will use the generated jar file on other application which will call this WS like ADF Application or any Java application

3- Call the The Web Service Programmatically With Dynamic WSDL URL

- Create new custom application "e.g. CallWebServiceDynamically" with java class "e.g. CallWS.java"



- Import jar file (which we created in the previous point) in the project


- Inside CallWS class write main method with this code



I will describe this code line by line:

     QName qname = new QName("http://simplews/", "MyWebService");

QName will receive 2 parameters you can get these 2 parameters by running the Web Service WSDL in any browser and take the value of targetNamespace and name



URL wsdl1 = new URL("http://localhost:7101/SimpleWebService-SimpleWS-context-root/MyWebServicePort?wsdl");

In this line you write the desired web service WSDL URL

 MyWebService_Service myWebService_Service = new MyWebService_Service(wsdl1, qname);
 MyWebService myWebService = myWebService_Service.getMyWebServicePort();

These 2 lines you can get it from the dummy application client class (which generated when we try to generate jar file in the previous step)

But the first line is bit different because it will accept the wsdl url and gname



System.out.println("Web Service Output= " + myWebService.sayHello("Sameh"));

This is line for testing the Web Service and print the output on the log.

- To run the test application Right click on the CallWS --> run
You will find the web service output on the log


- Try to change the wsdl to point to the second deployed web service and run again



You can download the sample examples from here



Friday, January 22, 2016

Open ADF Popup on The Top of The Screen

In ADF if you open a popup, by default this popup will open in the center of the screen. Some customers want to open the popup in the top of the screen, in this case you can choose one component in the top and use align id hints before opening the popup but I see this way is not good because you may not find a suitable component for alignment.

In this post I will show you how to use javascript function to put the popup in the top of the screen. In java function we will get the screen height and we will set the popup dialog margin by screen height divided by 2.

Just call this function before opening the popup (may be in the popup fetch listener)



Send the dialog id to this function and the dialog will be in the top of the screen.

If dialog id ="id1" and you use page template with id ="pt1" so you should send "pt1:d1" to the function.



Wednesday, December 30, 2015

Apply Dynamic JDBC in ADF Application (Step-by-Step)

In some situations the business require that ADF application can connect to different database users depending on the login user. For example if user1 login, the ADF application will connect to database user hr/hr. If user2 login, the ADF application will connect to database user hr2/hr2.
This is call Dynamic JDBC.

In this url you can see how to apply this dynamic JDBC, but in my post I will simplify this url by creating a sample ADF application and go step by step for how to apply dynamic JDBC to this ADF application.

I use JDeveloper 11.1.2.4.0.

Note: From Step1 to Step5 it just steps for creating a simple ADF application. Applying the Dynamic JDBC to this simple application is starting from Step6.

Step1:
Create a simple ADF Application connect to "hr" database, this application will contains only 1 ViewObject (Employees) and will contains 2 jspx pages (login.jspx and emp.jspx)



Step2:
From faces-config.xml --> Navigation Rules define outcome to the two jspx pages.
login.jspx---> login
emp.jspx----> emp


Step3:
- In the login.jspx page add two inputTexts (Username and Password) and one command button for login.
- Bind Username inputText and Password inputText to the back bean.
- Create action for the login command button to read the username and password then navigate to emp.jspx page.



Step4:
In the emp.jspx drag EmployeesView1 to the page and add logout link to the page 



The back bean should be:


Step5:
Run login.jspx page.

Now we have created a simple ADF application and we will now apply dynamic jdbc to this application.

Step6:
Open AppModule and set "Connection Type" to JDBC URL for both AppModuleShared and AppModuleLocal



Step7:
In the login button action we will store username/password it in session.
The login button action will be:



Step8:
Create new Filter (DynamicJDBCBindingFilter.java) extends ADFBindingFilter.



Step9:
Create Class (DynamicJDBCEnvInfoProvider) as



Step10:
Create Class (DynamicJDBCHttpSessionCookieImpl) as



Step11: 
Create Class (DynamicJDBCSessionCookieFactory) as



Step12:
In web.xml update adfBindings and make it point to DynamicJDBCBindingFilter



then add filter mapping to adfBindings filter




Step13:
In AppModule update jbo.ampool.sessioncookiefactoryclass in AppModuleLocal and AppModuleShare to point to DynamicJDBCSessionCookieFactory




Step14:

Now run login.jspx and login with database username/password = hr/hr you will successfully login and  get the data



Logout then login again with wrong password as hr/hr1 you will get "Invalid username/password".





You can download the sample application from here




Tuesday, December 29, 2015

Get JDeveloper and ADF Icons and Styles

Some developers want to get some icons which used in ADF components or JDeveloper. Examples of these icons (edit icon, LOV icon, undo icon,...) or get some css files which used for styling.

You can find these icons and css files on the jar file adf-richclient-impl-11.jar

You can find this jar in the path like:

C:\Oracle\Middleware\oracle_common\modules\oracle.adf.view_11.1.1\adf-richclient-impl-11.jar




You can extract this jar file then open "adf" folder and you will find 2 folders:

1-  "images" this folder will store icons.
2- "styles" this folder will store css files.






Friday, December 11, 2015

ADF Table Filter Case Insensitive and Search by Contains Instead of Start With

In ADF table if you enable column filter this filter by default will search by "start with" and it will be case sensitive . For example in table employees if you have employee name = Hermann and you try to search by "man", the search will return no result


but if you search by "Herm" it will return result


If you try to search by "herm" it will return no result.



This is because the filter by default is case sensitive and will search by start with.

In many cases we need the all tables filters be case insensitive and search by contains not start with. You can search by case insensitive by setting filterFeatures="caseInsensitive" for  each af:column but you need to do this in all af:column in your application and it will not be a proper solution.

You can search with contains by typing your string between '%', but we need something to be more easy than typing %.

To make the the ADF table filter be case insensitive and search by contains follow these steps:

1- In model project create new class "CustomViewImpl" this class should extend oracle.jbo.server.ViewObjectImpl


2- In this class override getCriteriaItemClause(ViewCriteriaItem viewCriteriaItem) and write this code:





3- Go to Model --> Project Properties --> ADF Business Components --> Base Classes --> View Object --> change Object to point to your CustomViewImpl class


4- Open ViewObject --> Java --> Java Classes --> Generate View Object Class



5- If you open the generated ViewImpl class you will find it extend the CustomViewImpl class


6- Run the application and test.

You can download the sample application from here

(This sample developed in JDev 11.1.2.4.0)




Monday, November 23, 2015

Call Restful Web Service from JAVA programmatically

In my previous post I have shown how you can create a Restful web service, in this post I will show how you can call this web service programmatically.

Before start you should download the sample web service from here and run the web service.

Follow These Steps to call the web service:

1- From JDeveloper create new custom application



For example, Application Name: CallRestfullWSProgrammatically

2- In this application create new class




For example, Class Name : CallRestfulWS.java

3- In the project properties add 2 libraries

- jersey-client-1.18.jar
- jersey-core-1.18.jar

You can get these jar files from the uploaded sample application



4- Write this code for the main method





5- Run the main method (Right Click ---> Run)




Download the sample application (done using JDev 11.1.2.4.0) from here


Thursday, July 30, 2015

Control ADF application Passivation Mode

In your ADF application you can set the session timeout of the application according to customer requirement.
If one of the customer want the application to be active for 3 hours what you will do?
The first thing you will think about is the session parameter (and you are right), you will open web.xml and set session timeout to 180


After setting the session timeout parameter you will deploy the application and the customer will test the application. Customer will login and will leave the application idle for 2 hours and will return back to the application he will find the session still active and it is ok. After the user try to use the application he will find the application will be in unexpected behavior and he will get some errors and he will find a lot of issues in the application.. why this issues happened?
because the application entered to the passivation mode.
Now you will ask me some questions like:
1- What is the passivation mode?
2- When the application will entered in the passivation mode?
3- What I have to do when the application become in passivation mode?
4- How can I test my application in passivation mode to test the application behavior in that mode?
5- How can I control the time that make the application to be in the passivation mode?
6- How can I configure my application to avoid the passivation mode?

I will answer all these questions:

1- What is the passivation mode?
In short description passivation mode will manage system resources. If you leave the application idle for along time the resources (database pool - memories - .. ) may gone to another active application and in this case your application will be in the passivation mode.
You can check this for more information about passivation

2- When the application will entered in the passivation mode?
By default after you leave the application 1 hour the application will enter to passivation mode.

3- What I have to do when the application become in passivation mode?
logout from the application and login again.

4- How can I test my application in passivation mode to test the application behavior in that mode?
Open AppModule and uncheck "Enable Application Module Pooling" for both local and shares then run the application.



5- How can I control the time that make the application to be in the passivation mode?
In the AppModule there is 2 parameters you have to set
jbo.ampool.maxinactiveage and jbo.ampool.timetolive

e.g:
jbo.ampool.maxinactiveage=18000000
jbo.ampool.timetolive=-1

time in maxinactiveage will be in ms so 18000000 is 5 hours.
These previous configurations means the application will enter the passivation mode after 5 hours.



6- How can I configure my application to avoid the passivation mode?
To avoid passivation mode you have to set the session timeout with value less than the passivation value.
e.g 

If the customer want the application to be active for 3 hours you can set session timeout to 180 (3 hours) and set passivation parameters to be 4 hours

jbo.ampool.maxinactiveage=14400000
jbo.ampool.timetolive=-1

Thursday, June 4, 2015

Call Secure SOAP Web Service In ADF Application Using DataControl

In this post I will explain how in ADF application you can call secured Web Service where this web service is secured by username token.

Assume you have the WSDL URL of SOAP Web Service like this:

http://serverIp:port/myws/MyWSPort?WSDL

In My Example the wsdl is:

http://192.168.1.39:8000/corews/CAPISalesOrderWebSPort?WSDL

You can run this url in the browser to be sure that web service is running and secured by username token as:



- In the server which the web service was deployed in, open the console -->Security Realms --> myrealm --> users

create user. for example username= wsuser and password=ws123456



This user will be used when we call Web Service

- Now make ADF application and from ViewController project right click --> New --> Web Service Data Control




- Enter Data Control name and web service wsdl url


- Select the function which you want to use from web service



- In Endpoint Authentication step select web service port and enter username and password (in our example username=wsuser - password = ws123456)



- Press Finish.

- After finishing the new data control will created select it and go to structure window --> right click on the data control -->  Define Web Service Security


- From the security list check on " orcale/wss_username_token_client_policy" then press "OK"



- In adf application create new .jspx page and from Data Control drag web service function and drop it in the page



- Drag web service output and drop it in the page as ADF Output Text


- Run ADF page.
- Enter web service parameter then press the button you will get the web service output.