在插件中访问XPage数据源

时间:2012-12-13 09:40:14

标签: xpages

对于插件(如扩展库),我尝试使用给定的“var”名称访问数据源。使用以下代码访问Datasource对象非常简单:

m_DataSourceName包含数据源的名称(var)。

public DataSource getDataSource() {
    if (StringUtil.isNotEmpty(m_DataSourceName)) {

        UIViewRoot vrCurrent = getFacesContext().getViewRoot();
        if (vrCurrent instanceof UIViewRootEx) {
            for (DataSource dsCurrent : ((UIViewRootEx) vrCurrent)
                    .getData()) {
                if (m_DataSourceName.equals(dsCurrent.getVar())) {
                    return dsCurrent;
                }
            }
        }
    }
    System.out.println("Datasource name:" + m_DataSourceName);
    return null;
}

我正在获取数据源,我可以投射此数据源:

private TabularDataModel getTDM(DataSource dsCurrent, FacesContext context) {
        try {
            if (dsCurrent instanceof ModelDataSource) {
                ModelDataSource mds = (ModelDataSource) dsCurrent;
                AbstractDataSource ads = (AbstractDataSource) mds;
                ads.load(context);
                System.out.println(ads.getBeanId());
                if (ads.getBeanId() == null) {

                }
                DataModel tdm = mds.getDataModel();
                if (tdm instanceof TabularDataModel) {
                    TabularDataModel tds = (TabularDataModel) tdm;
                    return tds;
                }
            }
            return null;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

现在我想访问TDM.getRowCount(),这一点我得到一个nullpointer异常。数据源包含注释视图。我错过了初始化数据源的任何内容吗?

1 个答案:

答案 0 :(得分:1)

以下是您的问题的解决方案:

这将为您提供视图的所有不是条目数* 。 F.E.如果您有一个分类视图,每个类别有5个类别和1个条目,这将导致10行。参赛人数为5。

首先,创建一个实现 FacesDataIterator

的虚拟类
public class DummyDataIterator implements com.ibm.xsp.component.FacesDataIterator{

    public DataModel getDataModel() {
        return null;
    }

    public int getFirst() {
        return 0;
    }

    public int getRowIndex() {
        return 0;
    }

    public int getRows() {
        return 0;
    }

    public void setFirst(int paramInt) {}

    public void setRows(int paramInt) {}
}

然后你必须做以下事情:

  1. 设置数据迭代器

    tdm.setDataControl( new DummyDataIterator() );
    
  2. 首次初始化行计数器

    tdm.getRowCount();   
    
  3. 使用导航器计算确切的行数

    (( com.ibm.xsp.model.domino.viewnavigator.NOIViewNavigatorEx) tdm.getDominoViewDataContainer().getNavigator()).calculateExactCount(tdm.getView());
    
  4. 现在您的行计数已初始化,您可以使用正常的 getRowCount 获得结果:

    System.out.println("Rows: " +  tdm.getRowCount() );
    

    希望这有帮助!

    *

    tdm.getView().getAllEntries().getCount()