Tuesday, November 30, 2010

ADF Popup buttons rendred outside the dialog - IE

If you have custom buttons in your popup that are right aligned and they are toolbarbuttons they may render outside the dialog in Internet Explorer.

Just remove the af:toolbar tag and make the buttons af:commandButton instead of af:commandToolbarButton and they should behave.

Also remeber that commandToolbarButton partial submit is set to true by default.

JBO-25013: TooManyObjectsException

oracle.jbo.TooManyObjectsException: JBO-25013: Too many objects match the primary key oracle.jbo.Key[Key null ].

Ok so for you it may be trying to insert a duplicate record this should explain your problem (also check trigger they could be the cause.)

NOTE: You can also try to create a new duplicate EO if you have a page with two VO's using the same EO. This could sort your problems.

For me I needed to add a launch listener on my LOV and clear the cache of my vo.

LOV
<af:inputListOfValues id="NameId"
  popupTitle="#{bindings.Name.hints.label}"
  value="#{bindings.RolName1.inputValue}"
  label="#{bindings.RolName1.hints.label}"
  model="#{bindings.RolName1.listOfValuesModel}"
  required="#{bindings.RolName1.hints.mandatory}"
  columns="#{bindings.RolName1.hints.displayWidth}"
  shortDesc="#{bindings.RolName1.hints.tooltip}"
  launchPopupListener="#{backingBeanScope.backingBean.launchPopup}">

CODE

public void launchLOVPopup(LaunchPopupEvent launchPopupEvent){
clearVOCache("YourAMDataControl", "ViewNameVO");
}

public void clearVOCache(String amName, String voName){
ApplicationModule appModule = getApplicationModule(amName);
ViewObject vo = appModule.findViewObject(voName);
vo.clearCache();
}

Thursday, November 18, 2010

***** adf secret password

Ok so my secret password text inputs always changed to ****** after submit (not the number of characters I typed in) on error on the client. Though this was a bit weird so I checked it out and found that this is ADF default behaviour.

The only way to change this is to create your own renderer so I left it as it was. Also changing this in any way will make your app less secure.

Monday, November 15, 2010

ADF programmatic disabled

I am creating dynamic links and here is something useful I used for programmatic creatin of the links.

uiCompnent.setValueExpression(
  "disabled",
  JSFUtils.getValueExpression(
    "#{bindings.MyVOIterator.estimatedRowCount == 0}",
      Boolean.class));

public static ValueExpression getValueExpression(
  String expression, Class clazz){
  FacesContext ctx = FacesContext.getCurrentInstance();
  ELContext elCtx = ctx.getELContext();
  Application app = ctx.getApplication();
  return app.getExpressionFactory().createValueExpression(
    elCtx, expression, clazz);
}

Friday, November 5, 2010

Util code

public static MethodExpression getMethodExpression(
  String expr, Class returnType, Class[] argTypes){
  FacesContext fc = FacesContext.getCurrentInstance();
  ELContext elctx = fc.getELContext();
  ExpressionFactory elFactory = fc.getApplication().getExpressionFactory();
  return elFactory.createMethodExpression(
  elctx, expr, returnType, argTypes);
}
public static javax.faces.el.MethodBinding getMethodBinding(
  String expr, Class[] argTypes){
  FacesContext fc = FacesContext.getCurrentInstance();
  ELContext elctx = fc.getELContext();
  return fc.getApplication().createMethodBinding(expr, argTypes);
}

  SetPropertyListener listener = new SetPropertyListener(
    ActionEvent.class.getName());
  listener.setFrom(link.getRoute());
  listener.setValueExpression("to",
   JSFUtils.getValueExpression("#{pageFlowScope.route}", String.class));
  action.addActionListener(listener);
  AdfFacesContext.getCurrentInstance().getPageFlowScope()
    .put("route", link.getRoute());

Thursday, November 4, 2010

ADF weblogic remote deployment problem -

Use the t3 protocol (ProtocolException Tunneling problem) not http for remote deployments and dont forget the -upload flag (Unable to access application source information in)!

Example:
<java classname="weblogic.Deployer"
fork="true" failonerror="true"
classpath="/oracle/jdeveloper/weblogiclibrary/weblogic.jar">
<arg value="-library"/>
<arg value="-upload"/>
<arg value="-adminurl"/><arg value="t3://$wlHost:7001"/>
  <arg value="-username"/><arg value="weblogic"/>
  <arg value="-password"/><arg value="weblogic1"/>
  <arg value="-source"/><arg value="/deploy/application.ear"/>
  <arg value="-targets"/><arg value="DefaultServer"/>
<arg value="-deploy"/>
</java>

Monday, November 1, 2010

ADF Date convert secondary pattern

This will try the second pattern if there is an error with the first. This should
sort out most situations you need else you will need to write a custom tag.

<af:convertDateTime pattern="yyyyMMdd" secondaryPattern="yyyy-MM-dd" />

NOTE: interesting javascript override
Java [custom converter]

public class YourDateConverter
extends DateTimeConverter implements ClientConverter {

public Object getAsObject(
FacesContext facesContext,
UIComponent uiComponent, String string){//do convert here}

public String getAsString(
FacesContext facesContext, UIComponent uiComponent, Object object)
{//do convert here}

public java.lang.String getClientConversion(
javax.faces.context.FacesContext fc,
javax.faces.component.UIComponent c){
String conv = super.getClientConversion(fc, c);
return "new YourDateTimeConverter('dd/MM/yyyy',null,'01/11/2010','DATE')";
}


Javascript:
function YourDateTimeConverter(
  pattern, locale, exampleString, type, messages) {
    this._exampleString = exampleString;
    this._pattern = pattern;
    this.trconverter =
     new TrDateTimeConverter(
       pattern, locale, exampleString, type, messages);
}

YourDateTimeConverter.prototype = new TrConverter();

YourDateTimeConverter.prototype.getAsString = function (formatTime) {
  //do your convert here date to string
}

YourDateTimeConverter.prototype.getAsObject = function (parseString, label) {
  //do your convert here string 2 date
}