четверг, 10 апреля 2014 г.

Multy check box for big table

1. Открываем EO VO на основе таблицы с большим количеством записей

2. В EO добавляем атрибут Attr (Transient, boolean, NUMBER, editable allways)

3. Добавляем Attr в VO

4. Создаем session bean StateHolderBean.java


public class StateHolderBean {
    private MyCheckBoxHolder valholder = new MyCheckBoxHolder();

    public void setValholder(StateHolderBean.MyCheckBoxHolder valholder) {
        this.valholder = valholder;
    }

    public StateHolderBean.MyCheckBoxHolder getValholder() {
        return valholder;
    }

    public StateHolderBean() {
        super();
    }


    private class MyCheckBoxHolder extends HashMap<Object, Boolean> {
        @Override
        public Boolean get(Object key) {

            //System.out.println("getting key "+key+" val "+super.get(key));
            if (!this.containsKey(key) && this.containsKey("allselect")) {
                return super.get("allselect");
            }
            if (super.get(key) == null) {
                return false;
            }
            return super.get(key);
        }

        @Override
        public Boolean put(Object key, Boolean b) {
            System.out.println("Putting key: " + key + " val " + b);
            if (b != null && key != null) {

                return super.put(key, b);
            } else {
                return super.put(key, false);
            }
        }
    }
}


5. Создаем форму untitlead1.jspx с таблицей

6. Создаем view bean untitlead1B.java

7. Байндим таблицу t1 на t1 в untitlead1B
#{viewScope.untitlead1B.t1}

8. В форме у checkbox Attr ставим в Value
value="#{StateHolderBean.valholder[row.bindings.EmployeeId.inputValue]}"

и выставляем autoSubmit="true"

9. process


    public  String process() {
        HashMap checkval = (HashMap) getValueObject("#{InOperationsB.valholder}");
        Iterator it = checkval.entrySet().iterator();
        while (it.hasNext())  {
            Map.Entry pairs = (Map.Entry)it.next();
            System.out.println(pairs.getKey()+" : "+pairs.getValue());
        }
       return  null;
    }








  

вторник, 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));
              }
            }
    }

вторник, 25 февраля 2014 г.

ADF_FACES-60097- Oracle ADF

ADF_FACES-60097- Oracle ADF





Possible Causes- 
  • Mainly occurs in editable af:table
  • Problem with Primary Key
  • af:column's component's property is being used in any EL, inside or outside of table
        Exp- #{row.bindings.xyz.inputValue==0} 
  • Updateable primary key, and autosubmit true
Possible Solution -
  • Never use primary key as updateable column in af:table, if you have to use then remove primary key from Entity Object
  • Try to validate in RowImpl instead of Expression of Table
  • Surrogate Primary Key
  • Avoid LOV (List of Values) on primary key
  • Change Event Policy of af:table and iterator to none
    these solutions are not rules or conventions, you can only try , and may one of it will work for you

среда, 19 февраля 2014 г.

Invoking af:exportCollectionActionListener from Java

ADF_FACES-60003:Компонент с идентификатором r9:0:r1:0:pc1:t1 не зарегистрирован для активных данных

В общем, хуйня. Выгрузку в Эксель нужно писать на java  ручками.

----

Напоролся на ошибку ADF_FACES-60003:Компонент с идентификатором r9:0:r1:0:pc1:t1 не зарегистрирован для активных данных

Она возникла при попытке перейти на другую страницу, после того как на первой был выполнен вывод данных в Excel файл.

ссыль с инфой о вркароунд:
http://tompeez.wordpress.com/2011/11/16/jdev-11-1-2-1-0-dealing-with-adf_faces-60003-error-component-with-id-r11cb1-not-registered-for-active-data/


Из той же оперы:
Automatic PPR stops working in jdev 11.1.2.x when using an af:exportCollectionActionListener

ссылка ADFEMG-65

WORKAROUND: навесить partial triggers на кнопку вызова экспорта в Excel на таблицы где возникает ошибка.



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

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

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


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


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



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


четверг, 30 января 2014 г.

Ограничение кол-ва выводимых строк





        oracle.jbo.domain.Number n = new oracle.jbo.domain.Number(maxrows);
        TrInOperationsEOViewImpl v = (TrInOperationsEOViewImpl)this.getVoImpl();
        v.setbndMaxRows(n);



В классе TrInOperationsEOViewImpl должна быть определена 

    /**
     * Sets <code>value</code> for bind variable bndMaxRows.
     * @param value value to bind as bndMaxRows
     */
    public void setbndMaxRows(Number value) {
        setNamedWhereClauseParam("bndMaxRows", value);
    }

понедельник, 20 января 2014 г.

Переход на 12с

1. Типы атрибутов boolean в отображениях поставить в default

2. Убрать фильтрацию в формах по транзиентным полям

  

среда, 15 января 2014 г.

Integrated WLS стартует с опцией -jrockit

Выдает ошибку "unrecognize option -jrockit"

чтобы устранить нужно вставить

set JAVA_VM=-server

в  setDomainEnv.com
c:\Users\roman_eremeev\AppData\Roaming\JDeveloper\system12.1.2.0.40.66.68\DefaultDomain\bin\setDomainEnv.com

понедельник, 13 января 2014 г.

ADFLogger

Чтобы заюзать нужно

1. в кодах создать логеры

    private static final ADFLogger LOGGER =
        ADFLogger.createADFLogger(SessionB.class);
    
        LOGGER.info("---I--- SessionB() was constructed");
        LOGGER.warning("---W--- SessionB() was constructed");
        LOGGER.log(ADFLogger.NOTIFICATION.INFO, "---I--- SessionB() was constructed");


2. в logging.xml настроить логеры
%JDEV_USER_DIR%\system11.1.2.1.38.60.81\
DefaultDomain\config\fmwconfig\servers\DefaultServer


3. в опциях java (свойства проекта) включить логирование
-Djbo.debugoutput=adflogger -Djbo.adflogger.level=FINEST

Можно в project Properties dialog and selecting the Run/Debug/Profile если запускается из JDev





----------------------------------------------

***** Adventures in ADF Logging - Part 1



Доступ к базе через JNDI

Делаем через JNDI

1. Настраиваем сервер WLS


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

четверг, 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.

ссыль