Wednesday, November 9, 2011

ADF: Revert only changes to one View Object (mini rollback)

JDeveloper 11.1.2.1

I really struggled to get this working so hopefully this helps someone out:
I needed to just rollback the changes on a single vo backed popup and not the parent object so this is what I did. (not the pk for this view was rowid based and normal methods to do this just refused to work)
Also I failed to mention it is a multi line editable table.

NOTE: Performance was not an issue here.

Phase 1) Parent VO Impl
  We have a parent object for all our View Objects so I implemented this method there.

 public void clearAllCache() {
  //dont ask
  ViewRowSetImpl drsi = super.getDefaultRowSetInternal();
  while(drsi.hasNext()) {
    Row item = drsi.next();
  }

  Iterator iter = super.getEntityDef(0).getAllEntityInstancesIterator(this.getDBTransaction());
  while(iter.hasNext()) {
    EntityImpl entityItem = (EntityImpl) iter.next();
    if(entityItem.getEntityState() == EntityImpl.STATUS_NEW ||
      entityItem.getEntityState() == EntityImpl.STATUS_DELETED) {
      entityItem.refresh(EntityImpl.REFRESH_REMOVE_NEW_ROWS | 
  EntityImpl.REFRESH_UNDO_CHANGES);
    }
  }
  getViewObject().clearCache();
}

Phase 2) AM (implement this method and map it as a client interface)
 public void rollbackVO(String iteratorName) {
    DCIteratorBinding iterator = ((DCBindingContainer)   
      BindingContext.getCurrent().getCurrentBindingsEntry()).
      findIteratorBinding(iteratorName);

  ViewObject vo = iterator.getViewObject();
  if(vo instanceof WesbankVOImpl) {
    ((WesbankVOImpl) vo).clearAllCache();
  }
 }

Phase 3) Backing bean method (mapped to close popup button - all our popups work the same way and the backing bean holds the current popup iterator name)
public String resetPopup() {
  Map params = new HashMap();
  params.put("iteratorName", getCurrentPopupIteratorName());
  ADFUtils.executeOperationBindingWithoutException("rollbackVO", params);
  AdfFacesContext.getCurrentInstance().returnFromDialog(null, null);
  return null;

Phase 4) Page
Bind a method action to your page for the rollbackVO method

This still needs to be cleaned up (ie the getEntityDef(0) wont work everywhere).

No comments:

Post a Comment