2014-01-29 63 views
1

我有一個代理設置爲每天在8:00運行
我想寫一個java代碼(在共享庫中)並使用參數從代理調用該庫。如何從Xpages中的Java代理調用Java共享腳本庫?

例如:

代理代碼:

// .... 
    checkAndSendMail(email_1); 
    checkAndSendMail(email_2); 
    // .... 

Java庫代碼:

public class Check{  
    public void checkAndSendMail(String email_param){ 
     // ... 
     mail.send(email_param); 
     // ... 
    }  
} 
  • 我可以打電話從XPages中的Java代理Java共享腳本庫?
  • 如果是,那麼如何打電話?
+0

類似的問題:http://www-10.lotus.com/ldd/xpagesforum.nsf/xpTopicThread.xsp?action=openDocument&documentId=E89573775690EC9C85257840001DC328 – Naveen

回答

4

你可以做到這一點,但是這是唯一可能與大量的「開銷」的。假設你想在一個代理加載Java類,你可以做到以下幾點:

  1. 獲取包含類(FE經特殊設計視圖或Java NAPI)
  2. 導出注意到DXL的設計注意事項
  3. 提取內容的所有「$ ClassData」字段
  4. Base64編碼解碼內容
  5. 跳過第一42個字節,並用自己的類加載器加載得到的字節陣列(覆蓋的findClass方法,該方法做了的defineClass調用)
  6. 現在,你可以通過反射

在您的代理和訪問它實例化類正如你看到的,這是可能的,但不是僅僅「翻一番」,在庫中較高的努力DDE。

編輯:

下面是一個例子類加載器的試劑。 Base64編碼的DXL已經添加。 代理實例化類ch.hasselba.demo.LoadedClass並調用方法printTime()

package ch.hasselba.demo; 

public class LoadedClass { 

    public void printTime(){ 
     System.out.println("Time: " + System.currentTimeMillis()); 
    } 
} 

代理的代碼(使用lwpd.commons.jar

import lotus.domino.AgentBase; 
import com.ibm.commons.util.io.base64.Base64; 
import java.lang.reflect.Method; 

public class JavaAgent extends AgentBase { 

    public void NotesMain() { 

     try { 
      // trucated DXL string 
      String dataDXL = "YQAYAAAAAACqAgAAAQAAAAAAAAAAAAAAYAC8AgAAqgKqAgAAAAAAAAAAyv66vgAAADEALwcAAgEAFWNoL2hhc3NlbGJhL3hwYWdlcy9aWgcA"; 

      // base64 decode the string 
      String b64 = Base64.decode(dataDXL); 
      byte[] b64Bytes = b64.getBytes(); 
      byte[] classBytes = new byte[b64Bytes.length - 42]; 

      // skip the first 42 bytes 
      System.arraycopy(b64Bytes, 42, classBytes, 0, b64Bytes.length - 42); 

      try { 
       // load the class 
       ByteClassLoader obj = new ByteClassLoader(); 
       Class theClass = obj.findClass("ch.hasselba.demo.LoadedClass", classBytes); 
       // instantiate it 
       Object theInstance = theClass.newInstance(); 

       // get the method printTime via Reflection & call it 
       Method theMethod = theInstance.getClass().getMethod("printTime", null); 
       theMethod.invoke(theInstance, null); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

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

     } 
    } 

    // the class loader 
    public static class ByteClassLoader extends ClassLoader { 

     public Class findClass(String name, byte[] data) { 
      return defineClass(name, data, 0, data.length); 
     } 
    } 
} 
6

XPage和Domino Java代理中的JVM是獨立的,因此您不能在它們之間共享Java代碼。 如果你去到腳本您可以創建Java代碼在設計

Scriptlib java

不是Java /罐節是的XPages庫部分。並創建一個可包含在Java代理中的新Java庫。

Import scriptlib

2

邁克,弗雷德裏克是正確的 - 不共享。除非... 您將共享代碼打包到Jar中並將其部署到服務器和/或客戶端的jvm/lib/ext目錄中。您的管理員不會喜歡那樣。 OpenNTF上的updatesite.ntf的補丁版本允許將插件部署到服務器操作系統中。你可以破解該腳本,將jar部署到ext目錄中。但是隻有經過管理員的同意,

:-) STW