воскресенье, 7 июля 2013 г.

13й - практикум. Oracle ADF. Программное наполнение данными. Часть 2

Во второй части покажу как показать данные от программного ViewObject (Programmatic ViewObject), т.е. это VO, но данные он получает не из БД, а например из коллекции.


Прежде надо создать VO типа programmatic





Затем определить его атрибутный состав




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


public class PgmrVOObjImpl
  extends ViewObjectImpl
{
  /**
   * This is the default constructor (do not remove).
   */
  public PgmrVOObjImpl()
  {
  }

  private List<Map<String, Object>> resultRS = new ArrayList<Map<String, Object>>();

  /**
   * executeQueryForCollection - overridden for custom java data source support.
   */
  protected void executeQueryForCollection(Object qc, Object[] params, int noUserParams)
  {    
    super.executeQueryForCollection(qc, params, noUserParams);
  }

  /**
   * hasNextForCollection - overridden for custom java data source support.
   */
  protected boolean hasNextForCollection(Object qc)
  {
  }

  /**
   * createRowFromResultSet - overridden for custom java data source support.
   * Мапирование данных из коллекции на атрибуты VO
   */
  protected ViewRowImpl createRowFromResultSet(Object qc, ResultSet resultSet)
  {
  }

  /**
   * getQueryHitCount - overridden for custom java data source support.
   */
  public long getQueryHitCount(ViewRowSetImpl viewRowSet)
  {
  }


Переопределение методов может быть различным, в зависимости от решаемой задачи. В примере ниже будет простая, но вполне реальная реализация.

Основные методы где реализуется логика


  /**
   * executeQueryForCollection - overridden for custom java data source support.
   * Подготовить коллецию данных. Вызывается на executeQuery
   */
  protected void executeQueryForCollection(Object qc, Object[] params, int noUserParams)
  {
    setUserDataForCollection(qc, new UserCollectionData(getUserRows(params, noUserParams)));
    super.executeQueryForCollection(qc, params, noUserParams);

  }

  /**
   * createRowFromResultSet - overridden for custom java data source support.
   * Мапирование данных из user коллекции на атрибуты VO
   */
  protected ViewRowImpl createRowFromResultSet(Object qc, ResultSet resultSet)
  {
    UserCollectionData uc = (UserCollectionData)getUserDataForCollection(qc);
    Iterator<Map<String, Object>> iter = uc.getIterator();
    ViewRowImpl vr = null;
    if (iter.hasNext()) {
        Map<String, Object> row = iter.next();
        vr = createNewRowForCollection(qc);
        // поля user коллекции
        for (Object k : row.keySet()) {
            // атрибут из описания VO
            AttributeDef attrDef = vr.findAttributeDef((String)k);
            populateAttributeForRow(vr, attrDef.getIndex(), row.get(k));
        }
    } else {
        setFetchCompleteForCollection(qc, true);
    }
    return vr;
  }


 Контейнер пользовательских данных


public class UserCollectionData
{
  Iterator<Map<String, Object>> iter = null;

  public UserCollectionData(List<Map<String, Object>> data) {
      iter = data.iterator();
  }

  public Iterator<Map<String, Object>> getIterator() {
      return iter;
  }
}


 Наполнение данными происходит в getUserRows()


  /**
   * Получить данные для RS 
   * @param params - параметры для условия Where
   * @param noUserParams - 
   * @return
   */
  protected List<Map<String, Object>> getUserRows(Object[] params, int noUserParams) {    
    Map<String, Object> map;    
    // первая запись
    map = new HashMap<String, Object>();    
    map.put("IdPgmr", Integer.valueOf(1));
    map.put("FirstName", "Alexander");
    map.put("LastName", "Rylkov");
    resultRS.add(map);    
    // вторая 
. . . . . . 
    
    return resultRS;
  }

 
Результат


К этому типу VO можно так же применять и поиск (Query) и др. популярные возможности.

Исходный код

Источник
Using Programmatic View Objects for Alternative Data Sources
http://docs.oracle.com/cd/E24382_01/web.1112/e16182/bcadvvo.htm#sm0341




Комментариев нет:

Отправить комментарий