2012-12-13 63 views
0

對於插件(如擴展庫),我嘗試使用給定的「var」名稱訪問數據源。使用以下代碼訪問數據源對象非常簡單:訪問插件中的XPages數據源

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(),這一點上,我得到一個空指針異常。數據源包含註釋視圖。我錯過了什麼來初始化數據源?

+0

如果您正在使用Notes查看,您將收到的* DominoViewDataModel *一個實例。這需要一個* com.ibm.xsp.component.FacesDataIterator *實例來訪問* getRows *方法。如果這設置,空指針異常消失... –

+0

謝謝Sven,我會試試這個。我應該使用com.ibm.xsp.component.FacesDataIterator的子類還是構建自己的實現 –

回答

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. 初始化r流量計數器首次

    tdm.getRowCount(); 
    
  3. 計算出準確的一行導航計數

    ((com.ibm.xsp.model.domino.viewnavigator.NOIViewNavigatorEx) tdm.getDominoViewDataContainer().getNavigator()).calculateExactCount(tdm.getView()); 
    

現在你的行計數被初始化,您可以用正常getRowCount得到的結果:

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

希望這會有所幫助!

*

tdm.getView().getAllEntries().getCount() 
+0

我試過了,它工作正常,直到我嘗試訪問rowdatas。所以我將tdm.setDataControl(new DummyDataIterator)更改爲tmd.setDataControl(new UIDataEX()),並且所有工作正常,沒有3.計算確切的行部分....感謝Sven的支持。您將在OpenNTF的新POI 4 XPages項目中找到完整的解決方案 –