2013-03-08 69 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

相关问题