Tuesday, December 17, 2013

AME in Custom Workflow

How to Automatically Refresh the View Object of the View Accessor

If you need to ensure that your view accessor always queries the latest data from the lookup table, you can set the Auto Refresh property on the destination view object. This property allows the view object instance to refresh itself after a change in the database. The typical use case is when you define a view accessor for the destination view object.

For example, assume that an LOV displays a list of zip codes that is managed in read-only fashion by a database administrator. After the administrator adds a new zip code as a row to the database, the shared application module detects a time when there are no outstanding requests and determines that a pending notification exists for the view instance that access the list of zip codes; at that point, the view object refreshes the data and all future requests will see the new zip code.

To enable auto-refresh for a view instance of a shared application module:
#In the Application Navigator, double-click the view object that you want to receive database change notifications.
#In the overview editor, click the General navigation tab.
#In the Property Inspector expand the Tuning section, and select True for the Auto Refresh property.

Source: http://docs.oracle.com/cd/E16162_01/web.1112/e16182/bclookups.htm#CIHCHGIA

Thursday, December 5, 2013

ADF Code Snippets

Code to get AppModule in Java Bean class
To implement resolvEDIC method
    public Object resolvElDC(String data) {
           FacesContext fc = FacesContext.getCurrentInstance();
           Application app = fc.getApplication();
           ExpressionFactory elFactory = app.getExpressionFactory();
           ELContext elContext = fc.getELContext();
           ValueExpression valueExp =
                   elFactory.createValueExpression(elContext, "#{data." + data + ".dataProvider}", Object.class);
           return valueExp.getValue(elContext);
      }

Use this in code to get  Application Module Impl class
       AppModuleAMImpl am =
       (AppModuleAMImpl)resolvElDC("AppModuleAMDataControl");

Code to show FacesMessege  in page
     FacesMessage message = new FacesMessage("Record Saved Successfully!");  
     message.setSeverity(FacesMessage.SEVERITY_INFO);  
     FacesContext fc = FacesContext.getCurrentInstance();  
     fc.addMessage(null, message);

Code to show error msg  in page
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,”msg”,null));

Code to get bindings to make custom buttons
BindingContainer bindings = BindingContext.getCurrent().getCurrentBindingsEntry();
OperationBinding operationBinding =bindings.getOperationBinding("Commit");
operationBinding.execute();
 
Code to use popup
1)showPopup method to call popup
    private void showPopup(RichPopup pop, boolean visible) {
    try {
      FacesContext context = FacesContext.getCurrentInstance();
      if (context != null && pop != null) {
        String popupId = pop.getClientId(context);
        if (popupId != null) {
          StringBuilder script = new StringBuilder();
          script.append("var popup = AdfPage.PAGE.findComponent('").append(popupId).append("'); ");
          if (visible) {
            script.append("if (!popup.isPopupVisible()) { ").append("popup.show();}");
          } else {
            script.append("if (popup.isPopupVisible()) { ").append("popup.hide();}");
          }
          ExtendedRenderKitService erks =
            Service.getService(context.getRenderKit(), ExtendedRenderKitService.class);
          erks.addScript(context, script.toString());
        }
      }
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }

2)And import these packages
import org.apache.myfaces.trinidad.event.SelectionEvent;
import org.apache.myfaces.trinidad.render.ExtendedRenderKitService;
import org.apache.myfaces.trinidad.util.Service;
import javax.faces.context.FacesContext;

3)To use in the page
Use binding property of Popup
private RichPopup pop;

Now use above showPopup method to show popup in any method or button action.
showPopup(pop, true);

Popup Dialog listener
Place dialog in popup and use Dialog Listner event of dialog to perform action of used button of dialog.
For ex:-  we use ok button of Dialog .So to perform action of Ok button we have to bind DialogListner property of Dialog and use following code.
    public void dailogok(DialogEvent dialogEvent) {
       if(dialogEvent.getOutcome().name().equals("ok")){
           BindingContainer bindings = getBindings();
           OperationBinding operationBinding =bindings.getOperationBinding("Commit");
           operationBinding.execute();
       }

Code for email validation
public void emailValidator(FacesContext facesContext, UIComponent uIComponent, Object object) {
       if(object!=null){
           String name=object.toString();
           String expression="^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
           CharSequence inputStr=name;
           Pattern pattern=Pattern.compile(expression);
           Matcher matcher=pattern.matcher(inputStr);
           String msg="Email is not in Proper Format";
           if(matcher.matches()){
             
           }
           else{
               throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,msg,null));
           }
       }
   }

Code to validate duplicate record
    public void deptNameValidator(FacesContext facesContext, UIComponent uIComponent, Object object) {
     
       DuplicateRecordValidationAMImpl am =  (DuplicateRecordValidationAMImpl)resolvElDC("DuplicateRecordValidationAMDataControl");
       DepartmentViewImpl departmentView1 = am.getDepartmentView1();
       Row[] filteredRowsInRange = departmentView1.getFilteredRows("DepartmentName", object.toString());
//        departmentView1.getAllRowsInRange();
       int i=filteredRowsInRange.length;
       String msg="Department with the same name found.Please enter any other name.";
       if(i>1){
           throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,msg,null));
       }
    }

Phone Number validation
public void phoneNoValidator(FacesContext facesContext, UIComponent uIComponent, Object object) {
String msg2 = "";
if (object != null) {
    String phnNo = object.toString();
    int openB = 0;
    int closeB = 0;
    boolean closeFg = false;
    char[] xx = phnNo.toCharArray();
          for (char c : xx) {
               if (c == '(') {
                   openB = openB + 1;
               } else if (c == ')') {
                   closeB = closeB + 1;
               }
               if (closeB > openB) {
                   closeFg = true; //closed brackets will not be more than open brackets at any given                    time.
               }
           }
           //if openB=0 then no. of closing and opening brackets equal || opening bracket must always come before closing brackets
           //closing brackets must not come before first occurrence of openning bracket
           if (openB != closeB || closeFg == true || (phnNo.lastIndexOf("(") > phnNo.lastIndexOf(")")) ||
               (phnNo.indexOf(")") < phnNo.indexOf("("))) {
               msg2 = "Brackets not closed properly.";
               FacesMessage message2 = new FacesMessage(msg2);
               message2.setSeverity(FacesMessage.SEVERITY_ERROR);
               throw new ValidatorException(message2);
           }
           if (phnNo.contains("()")) {
               msg2 = "Empty Brackets are not allowed.";
               FacesMessage message2 = new FacesMessage(msg2);
               message2.setSeverity(FacesMessage.SEVERITY_ERROR);
               throw new ValidatorException(message2);
           }
           if (phnNo.contains("(.") || phnNo.contains("(-") || phnNo.contains("-)")) {
               msg2 = "Invalid Phone Number.Check content inside brackets.";
               FacesMessage message2 = new FacesMessage(msg2);
               message2.setSeverity(FacesMessage.SEVERITY_ERROR);
               throw new ValidatorException(message2);
           }
           openB = 0;
           closeB = 0;
           closeFg = false;
           //check for valid language name.Allowed- brackets,dots,hyphen
           String expression = "([0-9\\-\\+\\(\\)]+)";
           CharSequence inputStr = phnNo;
           Pattern pattern = Pattern.compile(expression);
           Matcher matcher = pattern.matcher(inputStr);
           String error = "Invalid Phone Number";
         
           if (matcher.matches()) {
               if (phnNo.contains("++") || phnNo.contains("--")) {
                   throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, error,"Can not contain two hyphen(--) or plus(++)"));
               } else if (phnNo.lastIndexOf("+") > 1) {
                   throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, error,"Plus sign should be in proper place"));
               } else if (phnNo.lastIndexOf("+") == 1 && phnNo.charAt(0) != '(') {
                   throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, error,"Plus sign should be in proper place"));
               }
               else if(phnNo.startsWith(" ") || phnNo.endsWith(" ")){
                   throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, error,"Space Not allowed at start and end"));
               }
             
           } else {
               throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, error,"Only numeric character,+,() and - allowed"));
           }
       }
   }

Using groovy expression (sample format)
Groovy expressions can be placed in a number of different places in ADF Business
Components. For the main part, you will probably be applying them in entity and view object
attribute values and for entity object validations.

Mostly we can use groovy expression for Transient object

1)When used to calculate many fields of an VO and show the sum in the same VO.
object.getRowSet().sum("Salary")
2)Sample format to use Groovy expression for transient object
CommissionPct==null? Salary:Salary+Salary*CommissionPct
   (Condition)    ?  (When true) : (When false)

Refresh page through java code
protected void refreshPage() {
      FacesContext fc = FacesContext.getCurrentInstance();
      String refreshpage = fc.getViewRoot().getViewId();
 ViewHandler ViewH =
 fc.getApplication().getViewHandler();
      UIViewRoot UIV = ViewH.createView(fc,refreshpage);
      UIV.setViewId(refreshpage);
      fc.setViewRoot(UIV);
}

Partially refresh on any UI Component
 Here we use binding property of UI Component
AdfFacesContext.getCurrentInstance().addPartialTarget(UIComponent);
Related Posts Plugin for WordPress, Blogger...