Показаны сообщения с ярлыком ADF. Показать все сообщения
Показаны сообщения с ярлыком ADF. Показать все сообщения

вторник, 18 марта 2014 г.

Валидация поля номера счета


    public void onEdateToValidation(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,})$";
              String expression = "[0-9]{1,20}";
              CharSequence inputStr = name;
              Pattern pattern = Pattern.compile(expression);
              Matcher matcher = pattern.matcher(inputStr);
              String msg = "Кореспондентский счет может содержать только цифры. Длинна поля - в точности 20 символов.";
              if ((matcher.matches() && inputStr.length() == 20) || name.isEmpty())
              {

              }
              else
              {
                throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, null));
              }
            }
    }

воскресенье, 2 февраля 2014 г.

Создание коннекции к БД

1. В WLS создаем коннекцию с именем jndi/rkoDS


2. Настраиваем коннекцию для модуля


3. В свойствах приложения убираем галочку синхронизации



4. Свойства коннекции передаются в файле <имя коннекции>_jdbc.xml


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

Безопасность в 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 г.

Как отменить изменения только в одном 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'} 

четверг, 7 ноября 2013 г.

CheckBox в таблице связанный с INTEGER полем базы

В БД есть поле do_flg типа INTEGER со значениями 0(ложь), 1(истина), которое нужно отображать в таблице интерфейса в виде чекбокса.


  • Создаем в xxxEO транзиентный(!) атрибут flg типа Boolean всегда изменяемый.
  • Добавляем flg в xxxVO где ставим его ControlType CheckBox
  • В классе xxxEOImpl.java переопределяем методы доступа к flg так, чтобы они были привязаны к полю do_flg
    public Boolean getFlg() {
        Number n = (Number)getAttributeInternal(DOFLG);
        if( n != null && n.longValue()== 1) {
            return new Boolean(true);
        }
        return new Boolean(false);
    }

    public void setFlg(Boolean value) {
        if(value == null || !value.booleanValue())
            setAttributeInternal(DOFLG, new BigDecimal(0));
        else 
            setAttributeInternal(DOFLG, new BigDecimal(1));
        setAttributeInternal(FLG, value);
    }


Всё. Теперь все изменения flg будут приводить к изменению do_flg/


среда, 30 октября 2013 г.

вторник, 29 октября 2013 г.

Как получить текст запроса для поисковой формы


Хотим получить запрос выполняющийся в поисковой форме (Query) элементе
для этого переопределяем метод executeQueryForCollection объекта ViewObjectImpl

    protected void executeQueryForCollection(Object qc, Object[] params,
        int numUserParams) {
            System.out.println("--- numUserParams "+numUserParams);
            System.out.println("--- getQuery "+getQuery());
            for(int i=0;i<numUserParams;i++) {
                Object[] o = (Object[])params[i];
            System.err.println(o[0] + " " + o[1]);
        }
        super.executeQueryForCollection(qc, params, numUserParams);
    }

Получаем что-то такое:


SELECT * FROM
(SELECT /*+ FIRST_ROWS */ IQ.*, ROWNUM AS Z_R_N FROM
(SELECT TrInOperationsEO.ID,         TrInOperationsEO.INOUT_DATA_LOG_ID,
...
TrInOperationsEO.CLIENT_CODE
FROM TR_IN_OPERATIONS TrInOperationsEO
WHERE (ROWNUM <= :bndMaxRows)
AND ( ( ( (TrInOperationsEO.ID = :vc_temp_1 )
AND (TrInOperationsEO.INOUT_DATA_LOG_ID = :vc_temp_2 ) ) ) ) ORDER BY id DESC
) IQ  WHERE ROWNUM < :Bind_RangePage_High
) WHERE Z_R_N > :Bind_RangePage_Low

Надо заметить, что параметры Bind_RangePage_High, Bind_RangePage_Low возникают из постраничного вывода VO, остальные имеют имена vc_temp_1, vc_temp_2, и т.д. в соответствии с тем, какие параметры отмечены в форме.

Список параметров выглядит примерно так:


bndMaxRows 100
vc_temp_1 15613
vc_temp_2 23
vc_temp_3 R

Первая переменная bndMaxRows добавлена в запрос VO вручную, остальные формируются по полям автоматически. 




  

четверг, 24 октября 2013 г.

Таблицы с постраничный выводом


Настраиваем VO для работы с многостраничными запросами



В свойствах итератора выставляем то же  количество записей:





Для таблицы с постраничным выводом количество записей получается через функцию
getEstimatedRowCount()  объекта ViewObjectImpl

Пройти по всем записям можно через два цикла, первый - цикл по страницам, второй по записям на каждой странице, примерно так:


    public void onLoop(ActionEvent actionEvent) {
        long row_count = getVoImpl().getEstimatedRowCount();
        long rows_per_page = getVoImpl().getRangeSize();
        long page_count = row_count / rows_per_page + 1;
        System.out.println("total rows:" + row_count + "  rows at page:" +    rows_per_page + "  numb of pages:" + page_count);
        int m = 1;
        for(int i=1;i<=page_count;i++) {
            System.out.println("--- Page: " + i);
            getVoImpl().scrollToRangePage(i);
                for(int j=0; j<rows_per_page && m<=row_count; m++, j++) {
                    Row row = getVoImpl().getRowAtRangeIndex(j);
                    System.out.println(m +"  "+ row.getAttribute(0)+ "  " + row.getAttribute(2) );
                }
        }
    }



Тестовое приложение TestHr1.rar






вторник, 22 октября 2013 г.

Стандартные иконки


Иконки находится в jar файле oicons.jar

У меня они в двух местах:

C:\Oracle\Middleware123\jdeveloper\ide\lib\
C:\Oracle\Middleware123\oracle_common\modules\oracle.adf.model_11.1.1\oicons.jar

воскресенье, 13 октября 2013 г.

Работа с критериями поиска ViewCriteria


Полезные ссылки:


ViewObject (VO) - Выводимый Объект (ВО)
ViewCriteria(VC) - Критерий Поиска (КП)

Похоже, Критерии Поиска довольно мощный и гибкий механизм. Суть в том, что на один VO можно навесить несколько разных критериев, а затем, использовать один и тот же VO в нужном контексте. 

Примерная последовательность действий:
  • Добавляем несколько КритериевПоиска в интересующий ViewObject
  • Создаем таблицу "t1" в форме на основе VO
  • Добавляем в форму popup элемент в который вставляем query(Запрос с Параметрами) на основе NamedCriteria   для нашего VO.  Можно создать Запрос с Параметрами на основе конкретного Критерия Поиска, но потом всё-равно можно перемещаться выбирая другие КП.
  • Для каждого КП можно декларативно определить выводимые параметры на основе атрибутов VO
----------------------------------------------------------------------------------------------------------

Программное изменение использования атрибута в запросе критерия

В классе ViewObjectImpl определяем метод:


public void setQuerable(String attributeName, Boolean isQuerable) {  
   
     int indx = this.getAttributeIndexOf(attributeName);  
   
     ViewAttributeDefImpl attr = (ViewAttributeDefImpl)this.getAttributeDef(indx);  
   
     attr.setQueriable(isQuerable);  
   
   }