Friday 22 August 2014

Custom Login in ADF Application

We have used ADF security many more time with form based Authentication and Authorization using default login.html and error.html.
Suppose if we want to design our own login.jspx page and have complete control on ADF authentication then follow these steps.

1. Create Login.jspx and update the web.xml with login.jspx.

2. In login.jspx  add two input text with name (User name and password) and one button create managed bean  and  bind the input text with managed bean use the below code on button action event.

3. Add the following 3 jars in view controller project library

/MIDDLEWARE_HOME/modulescom.bea.core.weblogic.security.auth_xxxx.jar, /MIDDLEWARE_HOME/modulescom.bea.core.weblogic.security.identity_xxxxx.jar, /WLSERVER/serverlibwls-api.zip


import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import javax.security.auth.Subject;
import javax.security.auth.login.FailedLoginException;
import javax.security.auth.login.LoginException;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import oracle.adf.view.rich.component.rich.input.RichInputText;

import weblogic.security.URLCallbackHandler;
import weblogic.security.services.Authentication;
import weblogic.servlet.security.ServletAuthentication;


    public void executeLogin(ActionEvent actionEvent) {
        FacesContext ctx = FacesContext.getCurrentInstance();
        HttpServletRequest request =
            (HttpServletRequest)ctx.getExternalContext().getRequest();
        Subject mySubject;
        try {
            mySubject = Authentication.login(new URLCallbackHandler(uid.getValue().toString(), pwd.getValue().toString()));
            ServletAuthentication.runAs(mySubject, request);
            ServletAuthentication.generateNewSessionID(request);
            String loginUrl =
                "/adfAuthentication?success_url=/faces/main.jspx";
            HttpServletResponse response =
                (HttpServletResponse)ctx.getExternalContext().getResponse();
            RequestDispatcher dispatcher =
                request.getRequestDispatcher(loginUrl);
            dispatcher.forward(request, response);
        } catch (FailedLoginException e) {
            FacesMessage msg =
                new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid username or password",
                                 "Invalid username or password");
            ctx.addMessage(null, msg);
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }
       
    }

Happy Learning :)

Thursday 21 August 2014

MAF: Data Control method returns Custom Type as array

In my previous post i have discussed about the Call Data control method from managed bean which return the Integer/String or and primitive data type.

But if your Data control method returns the Array of Custom data type Like Employees,Department etc. Use below code.

findEmployeesInDept is data control method which returns array of employees.

        pnames = new ArrayList();
        params = new ArrayList();
        ptypes = new ArrayList();
        
        pnames.add("findCriteria");
        params.add("10");
        ptypes.add(String.class);
       
        //end - WS empty params

        List l = new ArrayList();
        try 
        {    
            GenericType result = (GenericType)AdfmfJavaUtilities.invokeDataControlMethod("HRDC", null, "findEmployeesInDept",pnames, params, ptypes);
            if(result!=null)
            {
                for (int i = 0; i < result.getAttributeCount(); i++) 
                {
                    GenericType r = (GenericType)result.getAttribute(i);
                    Employees wd = (Employees)GenericTypeBeanSerializationHelper.fromGenericType(Employees.class, r);
                    l.add(wd);
                }
            }
        } 
        catch (AdfInvocationException e) 
        {
            e.getMessage();
        }

Thanks
Happy Learning.

Sunday 17 August 2014

invokeContainerJavaScript method call TimeOut after 15 seconds

In Oracle MAF When you call the javascript function which have alter statement, If you don't close the alert box with in 15 sec on runtime then you will get below Java script time out error.

To resolve this issue, handle the exception as given below. Because the java script method which have the alert statement will throw the AdfException if the alert box is not closed with in 15 secs.


        try {
            AdfmfContainerUtilities.invokeContainerJavaScriptFunction("com.psihcm.ihcmMain", "mandatory",
                                                                      new Object[] { msg });

        } catch (AdfException e) {


        }


Call Data Control method from managed bean in MAF

If you have requirement to call the Data Control method from managed bean, Use AdfmfJavaUtilities.invokeDataControlMethod(). Below is complete code




Data Control method name is calculateDays with three argument of String type. In below method "iHCMWSClient" (name of the data control).

        List pnames1 = new ArrayList();
        List params1 = new ArrayList();
        List ptypes1 = new ArrayList();

        pnames1.add("arg0"); //start date
        ptypes1.add(String.class);
        params1.add(TimeShift.convertStringToDate(startDate));

        pnames1.add("arg1"); //endDate
        ptypes1.add(String.class);
        params1.add(TimeShift.convertStringToDate(endDate));

        pnames1.add("arg2"); //personID
        ptypes1.add(String.class);
        params1.add(new AbsenceRequest().getpID());

        System.out.println("%%%%% result" + noOfDays);
        try {
            noOfDays =
                    (String)AdfmfJavaUtilities.invokeDataControlMethod("iHCMWSClient", null, "calculateDays", pnames1, params1, ptypes1);

    System.out.println("%%%%% result" + noOfDays);
     
        } catch (AdfInvocationException e) {
            throw new AdfException("error ", AdfException.ERROR);
        }



Calling Java Script function from java bean class in MAF

Hi

Sometimes you may get requirement to call javascript function from bean class, Use below invokeContainerJavaScriptFunction() to call the Javascript function.

doAlert() is JS function with one argument.

                AdfmfContainerUtilities.invokeContainerJavaScriptFunction("com.ihcmMobile.Absence", "doAlert",
                                                                          new Object[] { " Absence Record Already Exist " });



JS Function:

doAlert = function () {
        var args = arguments;
        var str = ""+ args[0];
        alert(str);  //Absence Record Already Exist  gets printed

    };



Error while deploying MAF app to android - Cannot run program "\sdk\tools\zipalign"

Hi

If you are getting the below error while deploying the application to android. Here is the solution

[11:11:31 AM] Cannot run program "\sdk\tools\zipalign"": CreateProcess error=2, The system cannot find the file specified
[11:11:31 AM] CreateProcess error=2, The system cannot find the file specified

During the deployment jdeveloper creates .apk file using zipalign.exe file. But zipaling.exe is not exist in this location C:\Program Files\Android\sdk\tools\zipalign.

Solution is copy the zipaling.exe from   \build-tools\19.1.0  to \sdk\tools folder.




Getting Started With Oracle MAF

Oracle MAF:


Oracle MAF (Mobile Application Framework) is a hybrid-mobile framework that enables developers to rapidly develop single-source applications and deploy to both the Apple iOS and Google Android platforms. Oracle MAF provides a complete MVC development framework - that leverage Java, HTML5 and JavaScript - with declarative user interface definition, device services integration and built-in security. Oracle MAF maximizes code reuse and results in faster development of compelling mobile applications.




Features and Benefits


  • Develop once, deploy to multiple mobile devices and platforms including iOS and Android
  • Choose your preferred development language Java or JavaScript
  • Leverage Over 80 components for simpler development of richer user interfaces
  • Accelerate development through visual & declarative application development
  • Choose your preferred IDE - Oracle JDeveloper or Eclipse
  • Access native device services, such as phone, SMS, camera, GPS and more
  • Integrate both on-device and browser-based mobile interfaces into the same applications

For More information on Oracle MAF go through the link Oracle MAF