2013-03-08 82 views
0

我想測試java代理,通過觸發xpage上的按鈕單擊事件來清除視圖中的所有文檔。我在Java代理中沒有錯誤,但它不起作用。你能幫助我渡過這個階段嗎?如何從xpage按鈕點擊事件觸發java代理?

按鈕單擊事件:

var serverName=session.getCurrentDatabase().getServer(); 
//@WarningMessage("current one"); 
//@WarningMessage("server=" + serverName); 
//var db:NotesDatabase = session.getDatabase(session.getCurrentDatabase().getServer(), "\ProTexII.nsf"); 
var db:NotesDatabase=session.getCurrentDatabase(); 
@WarningMessage("db=" + db); 

var agent:NotesAgent = db.getAgent("SnapShotUpdate"); 
@WarningMessage("agent" + agent); 

if (agent!=null){ 

agent.run(); 
@WarningMessage("view is fired!"); 

} 

Java代理:

package javaPkg; 
import java.io.PrintWriter; 

import lotus.domino.*; 

public class SnapShotUpdate extends AgentBase{ 

public void NotesMain() { 
     try { 

     //String p = session.getPlatform(); 
      //PrintWriter out=getAgentOutput(); 

      System.out.println("Hello i never give it up!!"); 


      Session session = getSession(); 
      AgentContext agentContext =session.getAgentContext(); 
      Database db=session.getCurrentDatabase(); 


      //**clear view "vActualSalesFromSD" before copying documents into it 

      DocumentCollection dc= db.createDocumentCollection(); 
      View view= db.getView("vActualSalesFromSD"); 
      Document docToBeCleared= view.getFirstDocument(); 

      while (docToBeCleared != null) { 

      { 
       dc.addDocument(docToBeCleared); 
      } 

       docToBeCleared = view.getNextDocument(docToBeCleared); 
      } 

      dc.removeAll(true); 
     } catch(Exception e) { 
     e.printStackTrace(); 
     } 
    } 


} 
+0

任何warningmessage被觸發?由於對象數據庫始終存在,因此您也可以直接使用database.getAgent()。會議同樣如此。 – 2013-03-08 06:04:39

+0

您是否有計劃在以後使這個代理更復雜?在目前的形式下,這是一個相當簡單的操作......你可能直接在按鈕事件中直接運行這些代碼。如果您調用代理的唯一原因是在簽名者的權限下發生文檔刪除,請使用sessionAsSigner在當前數據庫上獲取單獨的句柄;您通過該句柄在數據庫中執行的任何操作都將作爲簽名者完成,而不是用戶完成。 – 2013-03-08 07:23:50

+0

P.S.如果目標是專門刪除給定視圖中的所有文檔,請不要打擾循環:db.getView(「vActualSalesFromSD」)。getAllEntries()。removeAll(true)將獲得相同的結果。 – 2013-03-08 07:25:23

回答

5

你有3個可能觸發您的代碼:

  1. 你已經採取
  2. 的方法
  3. 進行AJAX調用/yourdatabase.nsf/SnapshotUpdate?OpenAgent
  4. 不要使用代理(高度)推薦 - >這就是Java已經使用的一類,並呼籲它在你的SSJS

可能出現的錯誤:

  1. 劑具有比「無」
  2. 你不是已經在該數據庫中刪除權限
  3. 你沒有其他的目標權運行的代理(不太可能,因爲你可以運行的XPage)

我會寫循環是這樣的:

public function clearView(Database db, String vName) { 
    try { 
     View view= db.getView("vActualSalesFromSD"); 
     Document docToBeCleared= view.getFirstDocument(); 
     Document nextDoc = null; 

     while (docToBeCleared != null) { 
      nextDoc = view.getNextDocument(docToBeCleared); 
      try { 
       docToBeCleared.remove(true); 
       } catch (Exception didntWork) { 
       // Do some logging here 
       } 
      // Recycle your objects 
      doc.recycle(); 
      docToBeCleared = nextDoc;    
     } 

     // cleanup, we recycle what we opened, but not the parameters 
     // nextDoc and docToBeCleared are null already; 
     v.recycle(); 

    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

讓我們知道你的進步。

+0

現在我的代理正在運行。事情是當我創建新的代理,一個Java代理自動創建在Src /(默認包)下,但我創建了新的java類作爲代理在單獨的包下,而不是嘗試從我的xpage調用它。感謝它解決了:) – 2013-03-09 06:36:49

+0

你仍然不應該在這裏使用代理 - 除非你可以分享一個很好的理由 – stwissel 2013-03-09 11:59:50

相關問題