четверг, 26 декабря 2013 г.

Интеграция ADF приложений (Библиотеки)


1. Создаем проект с BC и VC в котором будут находиться библиотечные компоненты. Важно правильно выставить зависимость проектов SharedVC от SharedBC


2. Для проекта SharedVC создаем профиль загрузки как ADF Lib Jar. Нужно проследить чтобы зависимость от SharedBC перенеслась правильно


Выбираем путь для хранения библиотеки

Проверяем, что нужные библиотеки и jar-ы в наличии.

4. Создаем проект в котором будем использовать библиотеки и подключам их как пользовательские

6. Убеждаемся, что в окошке приложения для нашего проекта библиотека видна и в ней нужные нам компоненты.


7. Теперь можно использовать библиотечные компоненты как родные


8. В свойствах либы нужно выставить указание, что передавать конеекцию только как имя(предполагается, что в майине используется такая же коннекция с таким же именем)
иначе обругает, "weblogic.common.ResourceException: Data Source rko already exists."


9. Если используется безопасность то:

В проекте либы лучше отключать секюрити. А в проекте майна не забыть поставить галочку "Показывать компоненты из библиотеки", чтобы выставить правильно безопасность на страницы, таскфлоу и прочую фуйню.




Integration in Oracle ADF Through ADF Libraries and ADF Task Flows
ADF Calling Bounded Task Flow Using URL

How-to integrate remote task flows in your ADF applications


четверг, 19 декабря 2013 г.

getCurrentDateTime()

/**
      * Get Current Date
      * @return
      */
public Date getCurrentDateTime()
    {
    return new Date(new java.sql.Timestamp(System.currentTimeMillis()));
    }

Безопасность в ADF





  • Включаем безопасность на приложении
Включаем безопасность на приложении
   Application->Security->Configure ADF Security
   AdfAutentification and Authorization
   Создаем login форму
   No Automatic Grants
   Выбираем страницу перехода по-умолчанию
 
Заводим пользователей и роли редактируя файл jazn-data.xml

из  oracle\middleware\modules

com.bea.core.weblogic.securiti.auth.....jar
com.bea.core.weblogic.securiti.identity......jar

из
c:\Oracle\Middleware123\wlserver_10.3\server\lib\wls-api.jar




Securing Fusion Web Applications
ADF Training - Oracle ADF 11g Security - Custom ADF Login (три библиотеки)
4 Adding Security to Your Application Fusion Middleware Tutorial
14 Developing Secure Applications Документация(!)

вторник, 17 декабря 2013 г.

Как добраться до свойства определенного в бине


Можно через функцию  JSFUtils.resolveExpression() например так:


RichCommandLink link = (RichCommandLink)JSFUtils.resolveExpression(
            "#{viewScope.ContractsTableBean.warningLink}");




Сама функция(метод JSFUtils) определена так:

/**
      * Method for taking a reference to a JSF binding expression and returning
      * the matching object (or creating it).
      * @param expression EL expression
      * @return Managed object
      */
     public static Object resolveExpression(String expression)
     {
       FacesContext facesContext = getFacesContext();
       Application app = facesContext.getApplication();
       ExpressionFactory elFactory = app.getExpressionFactory();
       ELContext elContext = facesContext.getELContext();
       ValueExpression valueExp = elFactory.createValueExpression(elContext, expression, Object.class);
       return valueExp.getValue(elContext);
     }

четверг, 12 декабря 2013 г.

воскресенье, 8 декабря 2013 г.

Форма для редактирования с кнопкой Edit

1) Добавляем во VO rowstatus





2) Добавляем во VO edit

3) В xxxVOImpl.java вешаем метод для отмены изменений, примерно такой


    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();
        byte status = entityItem.getEntityState();
          String s = ((status == EntityImpl.STATUS_MODIFIED) ? " STATUS_MODIFIED" : "")
          + ((status == EntityImpl.STATUS_NEW) ? " STATUS_NEW" : "")
          + ((status == EntityImpl.STATUS_DELETED) ? " STATUS_DELETED" : "")
          + ((status == EntityImpl.STATUS_DEAD) ? " STATUS_DEAD" : "")
          + ((status == EntityImpl.STATUS_INITIALIZED) ? " STATUS_INITIALIZED" : "")
          + ((status == EntityImpl.STATUS_UNMODIFIED) ? " STATUS_UNMODIFIED" : "");
          System.err.println(" --- "+ s);
       
        if(status == EntityImpl.STATUS_NEW
          || status == EntityImpl.STATUS_DELETED) {
            entityItem.refresh(EntityImpl.REFRESH_REMOVE_NEW_ROWS
                | EntityImpl.REFRESH_UNDO_CHANGES);
        }
        if(status == EntityImpl.STATUS_MODIFIED) {
            entityItem.refresh(EntityImpl.REFRESH_WITH_DB_FORGET_CHANGES);
        }
        getViewObject().clearCache();

    }
 
4) В форму добавляем поле с кнопкой для редактирования


5) На кнопку вешаем PropertyListner   To: #{row.bindings.edit.inputValue}




) Свойство таблицы EditMode выставляем - onClickEdit

6) Добавляем на форму кнопку New с таким обработчиком событий:
#{bindings.CreateInsert.execute}. При этом нужно не забыть добавить action CreateInsert в binding!


7) Добавляем кнопку Save с обработчиком вызывающем такой метод:


    public void onSave(ActionEvent actionEvent) {
        // Add event code here...
        //System.out.println("--- onSave");
        ViewObject viewObject = getCurrentVO();
        RowSetIterator iterator = viewObject.createRowSetIterator(null);
        iterator.reset();
        while (iterator.hasNext()) {
        Row row = iterator.next();
        // process the row here
            row.setAttribute("edit",false);
        }
        iterator.closeRowSetIterator();
     
        super.onCommit(actionEvent);
    }


8) Добавляем кнопку Undo Changes обработчиком вызывающем такой метод:

    public void onRollback(ActionEvent actionEvent) {
        ((xxxVOImpl)getCurrentVO()).clearAllCache();
        getCurrentVO().executeQuery();
        
        if(getUpdComponent()!= null)
          AdfFacesContext.getCurrentInstance().addPartialTarget(getUpdComponent());
    }


9) Добавляем в xxxVORowImpl.java два метода, которые будут учитывать свойство edit записи:


    @Override
    public boolean isAttributeUpdateable(int i) {
        Boolean ed = this.getedit();
        if(ed == null) {
            return false;  
        }
        if(ed.equals(true)) {
            return super.isAttributeUpdateable(i);  
        } else {
            return false;
        }
    }

    @Override
    protected void create(AttributeList attributeList) {
        attributeList.setAttribute("edit", true);
        super.create(attributeList);
    }






------------------------------------------------------------------------------------------------------
Выделяем цветом редактируемые записи

inlineStyle="#{backingBeanScope.backing_ServiceTypesPriceV.cellColor}">
------------------------------------------------------------------------------------------------------


    /*
    * Управляем доступностью кнопок Edit, Delete
    */
    public void tableSelectionListener(SelectionEvent selectionEvent) {
        ADFUtil.invokeEL("#{bindings.PV_ViewObj2.collectionModel.makeCurrent}", new Class[] {SelectionEvent.class},
                             new Object[] { selectionEvent });
            // get the selected row , by this you can get any attribute of that row
            //Row selectedRow =
            //    (Row)ADFUtil.evaluateEL("#{bindings."+ iterator_name +".currentRow}"); // get the current selected row
            Row selectedRow = this.getCurrentRow();
            BigDecimal no = (BigDecimal) selectedRow.getAttribute("StatusId");
            if(no.intValue() == 1) {
                this.cb5.setDisabled(false);
                this.cb2.setDisabled(false);
                //System.out.println("--- cb5.setDisabled(false) " );
            } else {
                //this.cb5.setDisabled(true);
                //this.cb2.setDisabled(true);
                //System.out.println("--- cb5.setDisabled(true) " );
            }
    }

Как отменить изменения только в одном VO

Rollback не годится, т.к. сбрасывает изменения во всём модуле для всех VO. Поэтому чтобы  справиться с задачей модифицируем класс xxxVOImpl добавив в него метод


    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();
        byte status = entityItem.getEntityState();
          String s = ((status == EntityImpl.STATUS_MODIFIED) ? " STATUS_MODIFIED" : "")
          + ((status == EntityImpl.STATUS_NEW) ? " STATUS_NEW" : "")
          + ((status == EntityImpl.STATUS_DELETED) ? " STATUS_DELETED" : "")
          + ((status == EntityImpl.STATUS_DEAD) ? " STATUS_DEAD" : "")
          + ((status == EntityImpl.STATUS_INITIALIZED) ? " STATUS_INITIALIZED" : "")
          + ((status == EntityImpl.STATUS_UNMODIFIED) ? " STATUS_UNMODIFIED" : "");
          System.err.println(" --- "+ s);
       
        if(status == EntityImpl.STATUS_NEW
          || status == EntityImpl.STATUS_DELETED) {
            entityItem.refresh(EntityImpl.REFRESH_REMOVE_NEW_ROWS
                | EntityImpl.REFRESH_UNDO_CHANGES);
        }
        if(status == EntityImpl.STATUS_MODIFIED) {
            entityItem.refresh(EntityImpl.REFRESH_WITH_DB_FORGET_CHANGES);
        }
       
      }
      getViewObject().clearCache();
    }


 Идея заключается в том, что проходим по всем записям VO и в зависимости от их состояния делаем refresh.

ссыль

четверг, 5 декабря 2013 г.

Как сделать кнопку активной/пассивной в зависимости от записи в таблице

Можно задать свойство disabled для этой кнопки


Кнопка будет доступна когда значение статуса равно 'N'
#{bindings.Status.inputValue eq 'N' ? 'false' : 'true'}