如何从Xpages中的Java代理调用java共享脚本库?

时间:2014-01-29 08:54:26

标签: java xpages lotus-notes lotus-domino

我有一个代理人,每天早上8点开始运行 我想编写一个java代码(在共享库中)并使用参数从代理中调用该库。

例如:

代理商代码:

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

java库代码:

public class Check{       
    public void checkAndSendMail(String email_param){
        // ...
        mail.send(email_param);
        // ...
    }    
}
  • 我可以从Xpages中的Java代理调用java共享脚本库吗?
  • 如果是,那该怎么称呼?

3 个答案:

答案 0 :(得分:6)

XPage中的JVM和Domino Java Agents是分开的,因此您无法在它们之间共享Java代码。 如果转到设计器

中的脚本库部分,则可以创建Java代码

Scriptlib java

不是适用于XPage的Java / Jar部分。并创建一个可以包含在Java代理中的新Java库。

Import scriptlib

答案 1 :(得分:4)

你可以这样做,但这只能带来很多“开销”。假设您要在代理中加载Java类,则可以执行以下操作:

  1. 获取包含您的类的设计说明(例如,带有特殊设计视图或Java NAPI)
  2. 使用DXL导出笔记
  3. 提取内容所有“$ ClassData”字段
  4. Base64解码内容
  5. 跳过前42个字节,并使用您自己的类加载器加载生成的字节数组(覆盖执行 defineClass 调用的 findClass 方法)
  6. 现在,您可以在代理中实例化该类,并通过反射
  7. 访问它

    正如您所看到的那样,这是可能的,但需要更多的努力,而不仅仅是“加倍”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);
            }
        }
    }
    

答案 2 :(得分:2)

迈克,弗雷德里克是对的 - 没有分享。除非... 将共享代码打包到Jar中并将其部署到服务器和/或客户端的jvm / lib / ext目录中。您的管理员可能不会那样喜欢。在OpenNTF上有一个修补版本的updatesite.ntf允许将插件部署到服务器操作系统中。您可以破解脚本以将jar部署到ext目录中。但请征得管理员的同意。

:-) stw