Pages

Tuesday, December 6, 2016

Implementation of inputColor component

In one of my project I had a use case of storing selected color value in DB and displaying the same stored color on UI.  For this use case I made use of inputColor component, where the picked color from inputColor component is converted into color code before storing in DB. In this blog, I will explain the steps to achieve this feature.

The inputColor component creates a text field for entering colors and a button for picking colors from a palette.InputColor

Steps:
1. Create Entity Object on top of the DB table where color codes are saved.
2. Create a transient attribute(say awtColor) of type, java.awt.Color in the entity object.
3. Create View Object on top of the Entity Object created in Step#1. Add the transient attribute in the View Object as well.
4. Generate VORowImpl class of the View Object created in Step#3.
5. Override Getter and Setter of awtColor transient attribute as mentioned below. 
Getter:
Convert the color code stored in DB to java.awt.Color using Color.decode method.
    public Color getAwtColour() {
        String colorCode = getColourCode();
        if(colorCode != null)
            return Color.decode(colorCode);
        else
            return null;
    }
Setter:
Whenever a new Color is picked from inputColor component, it has to be converted into corresponding color code as shown. 
    public void setAwtColour(Color col) {
        if (col != null) {
  String color= String.format("#%02X%02X%02X", col.getRed(), col.getGreen(), col.getBlue());
            setColourCode(color);
        } else {
            setColourCode(null);
        }
    }
6. Drag and drop VO collection from Data Control as af:table on jspx page.

7. Convert awtColor column attribute from inputText component to inputColor component. jspx code after this code change is:

<af:column sortable="true" headerText="Color" id="c3" width="200">
        <af:inputColor value="#{row.bindings.AwtColour.inputValue}"
                    autoSubmit="true" id="it3">
        </af:inputColor>

    </af:column>


8.  The UI is displayed as:

How to specify min/max date value for an inputDate component.

Very often in projects, you get a requirement to restrict an user from selecting a date value before today's date and sometimes restrict an user from selecting a date value beyond today's date. In this blog post, I will explain you with simple steps how to achieve this feature using min and max values of an inputDate component.

1. minValue attribute: the minimum value allowed for a date value.
You can use this attribute to disable past dates before today's date by following below steps.

Step1: Drag and drop an inputDate component on a page.

Step2:  Define a managed bean variable minDate and override the getter of this variable as mentioned below. Here we are setting the minDate date variable to current date.

    public Date getMinDate() {
        try {
            Calendar cal = Calendar.getInstance();
            java.util.Date date = cal.getTime();
            DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
            String currentDate = formatter.format(date);
            maxDate = formatter.parse(currentDate);
            return formatter.parse(currentDate);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
Step3: Go to inputDate component and set the minValue attribute to the managed bean variable created in step 2.

                <af:inputDate label="Min Value" id="id1"
                            value=""
                            minValue="#{pageFlowScope.TestBean.minDate}"
                            autoSubmit="true">
                </af:inputDate>

Run the page and see that all the past dates before today's date(6th Dec, 2016) are disabled.  

2. maxValue attribute: the maximum value allowed for a date value.
You can use this attribute to disable future dates after today's date by following below steps.

Step1: Drag and drop an inputDate component on a page.

Step2:  Define a managed bean variable maxDate and override the getter of this variable as mentioned below. Here we are setting the maxDate date variable to current date.

    public Date getMaxDate() {
        try {
            Calendar cal = Calendar.getInstance();
            java.util.Date date = cal.getTime();
            DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
            String currentDate = formatter.format(date);
            maxDate = formatter.parse(currentDate);
            return formatter.parse(currentDate);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
Step3: Go to inputDate component and set the maxValue attribute to the managed bean variable created in step 2.

                <af:inputDate label="Min Value" id="id1"
                            value=""
                            maxValue="#{pageFlowScope.TestBean.maxDate}"
                            autoSubmit="true">
                </af:inputDate>

Run the page and see that all the future dates after today's date(6th Dec, 2016) are disabled.  

Wednesday, September 7, 2016

Issue with LOV performance in ADF 12.1.3

I have an LOV defined on an attribute of a view object. The view accessor that fetches data for this LOV is not filtered and queries data from a large table. With LOV created in ADF 12.1.3, I was seeing performance issue while selecting any value in the LOV. 

Also I was seeing the below logs in the Jdeveloper console.

[142211] Evaluating Script with name:null, Type : Groovy. Expression:
[142212]  ( (FormatDesc = :vc_temp_1 ) )
[142213] Evaluation result:false

After debugging for some time, I have found a resolution for this. I need to modify the ListRangeSize parameter to a positive value eg: 10 whose value is by default set to -1 in ADF 12.1.3.

 <ListBinding
    Name="LOV_DrugName"
    ListVOName="DrugDescSearchVA"
    ListRangeSize="10"
    ComboRowCountHint="10"
    NullValueFlag="none"
    MRUCount="0">
    <AttrArray Name="AttrNames">
      <Item Value="DrugName"/>
    </AttrArray>
    <AttrArray Name="AttrExpressions"/>
    <AttrArray Name="DerivedAttrNames">
      <Item Value="ChemicalName"/>
      <Item Value="DrugSerial"/>
    </AttrArray>
    <AttrArray Name="ListAttrNames">
      <Item Value="Drug"/>
      <Item Value="Chem"/>
      <Item Value="DrugSerial"/>
    </AttrArray>
    <AttrArray Name="ListDisplayAttrNames">
      <Item Value="Drug"/>
    </AttrArray>
    <DisplayCriteria
      Name="findByDrugDesc"/>
  </ListBinding> 

How to execute code after a popup is launched

In one of my project, I had a requirement to execute some code after a popup is launched. After struggling for some time, I found a way to implement it. In this post, I will describe you one of the popup client events which can be used to execute a code after a popup is made visible.

Out of many client events that a popup supports, there is an event called popupOpened which is fired once a  popup becomes visible. You can use this event for handling custom code that should be executed once the popup is launched.

Use the below code to implement such behavior.

<af:popup id="p1">
    <af:dialog type="none" closeIconVisible="true"
               resize="off" id="d3">
        <af:panelGroupLayout id="pgl12" layout="vertical">
            ......
            ......
        </af:panelGroupLayout>
    </af:dialog>
    <af:clientListener method="<custom method>" type="popupOpened"/>
</af:popup>

Here <custom method> is the custom method name that needs to be executed.

Wednesday, July 27, 2016

Add/Remove af:messages on a component using javascript

In one of my project, I had a requirement to add & remove af:messages from input components. In this post, I will show the javascript code used to achieve it.
 

For adding af:message to an input component using java script, use the following code.

function customJSMethod(evt){
       var source = evt.getSource();
       var inputComponent = source.findComponent('inputcompId’);
       var message = “Valiation Failing…”;...//Custom message to be added on component.
       AdfPage.PAGE.addMessage(inputComponent.getClientId(), new AdfFacesMessage(AdfFacesMessage.TYPE_ERROR, null, message));
       AdfPage.PAGE.showMessages(inputComponent.getClientId());
}

For removing af:message from an input component using java script, use the following code.

function customJSMethod(evt){
    var source = evt.getSource();
    var inputComponent = source.findComponent('inputcompId’);....
    AdfPage.PAGE. clearMessages (inputComponent.getClientId());
    AdfPage.PAGE.showMessages(null);
}

Thursday, May 19, 2016

Issue with groovy expresssion in ADF 12.1.3

I was trying to define a groovy expression for creating a sequence for one of my entity object attribute.
(new oracle.jbo.server.SequenceImpl("SEQ_NAME", adf.object.getDBTransaction())).getSequenceNumber()

But while trying to create a new record using BC Tester I am getting the following exception.

General error during semantic analysis: JBO-25152: Calling the constructor for class oracle.jbo.server.SequenceImpl is not permitted.

oracle.jbo.ExprSecurityException: JBO-25152: Calling the constructor for class oracle.jbo.server.SequenceImpl is not permitted.



After debugging for some time, I have found a resolution for this. While defining a groovy expression for an entity object attribute, the source code is generated as below.

<TransientExpression trustMode="untrusted"><![CDATA[(new oracle.jbo.server.SequenceImpl("SEQ_NAME", adf.object.getDBTransaction())).getSequenceNumber()]]></TransientExpression>


In order to resolve the above issue we need to make the trustMode attribute to trusted or remove the attribute trustMode as the default value for this attribute is trusted. 

<TransientExpression><![CDATA[(new oracle.jbo.server.SequenceImpl("SEQ_NAME", adf.object.getDBTransaction())).getSequenceNumber()]]></TransientExpression>
  

Thursday, March 24, 2016

Clearing cookies on browser close

In one of my project I had a requirement to clear all the session cookies set in my application on browser close. After exploring for a while I found out a simple configuration in WebLogic Server-specific deployment descriptor, weblogic.xml which will clear all the cookies on browser close. 

In session-descriptor section of weblogic.xml, there is a parameter, cookie-max-age-secs which sets the life span of the session cookie in seconds, after which it expires on the client. Setting this value to -1 expires the cookie on browser close.  Set this value as mentioned below.