起点R3使用JAVA获取Domino数据(下篇)

    在上篇中介绍了从JAVA中获取Domino数据库中的文档信息,但有一个缺点,就是必须要有本地Notes,即限制了只能在Windows下使用,在有些情况下,可能需要在其他操作系统中通过JAVA获取Domino数据,本文即为介绍在JAVA中使用CORBA实现跨操作系统访问Domino。本文介绍的Domino版本应该要在R5以上,R5以下版本未经验证,无法确认是否可行。注意,本文中需要使用lotus.domino.corba包,网络上找到这个库源码非常不容易,作者也是花费了不少时间才从国外一个小网站上下载到,如果有需要,请联系作者。Corba访问Domino过程比较复杂,大致如下:

String ior = http://127.0.0.1/diiop_ior.txt;
Properties props = new Properties(); 
props.put("org.openorb.orb.core.ORB", "org.openorb.orb.core.ORB"); 
ORB orb = ORB.init(new String[]{}, props); 
// 通过 IOR 得到 IObjectServer 对象
org.omg.CORBA.Object obj = orb.string_to_object(ior); 
IObjectServer ios = IObjectServerHelper.narrow(obj); 
// 通过 IObjectServer 获得 ISession 
ProtocolVersion maxVersion = new ProtocolVersion(IBase.DOM_MAJOR_MINIMUM_VERSION, IBase.DOM_MINOR_MINIMUM_VERSION); 
ProtocolVersion minVersion = new ProtocolVersion(IBase.DOM_MAJOR_VERSION,IBase.DOM_MINOR_VERSION); 
SessionData sd = ios.createSession(maxVersion, minVersion, ((CrawlTask)job.getCrawltask()).getAccount() , ((CrawlTask)job.getCrawltask()).getPassword()); 
session = sd.sesObject; 

通过账号和密码访问登录Domino后获得session,然后通过session获得数据库信息,如下:

// 使用 ISession 
dbCache = session.getDatabase(sd.serverName, properties.getProperty("database"), false); 
dCdata = dbCache.db.getAllDocuments();//iDatabase.search("1=1", null, 10); 
IDatabaseHolder idatabaseholder = new IDatabaseHolder(); 
IntHolder intholder = new IntHolder(); 



IDocument document = dCdata.dcObject.getFirstDocMDB(idatabaseholder, intholder); 

一样是或得到document,类型为IDocument,dCdata.dcObject即是文档列表,对此对象遍历即可

document = dCdata.dcObject.getNextDocMDB(document ,idatabaseholder, intholder); 

对IDocument对象的遍历也和DIIOP也有一些差别:

ItemData[] id = fieldDoc.getData().items;
for (int i = 0; i < id.length; i++) {
	MetaType metaType = new MetaType(id[i].name,String.valueOf(id[i].type)) ;
	ItemValue item = id[i].values;
	if (id[i].type == 1280) { //表示是文本
		metaType.setValue(item.StringValue()) ;
	} else if (id[i].type == 1024) { //表示是时间
		DateTime dateTime = item.TimeObject() ;
		if(dateTime!=null){
			metaType.setValue(String.valueOf(dateTime.toString())) ;
		}
	} else if (id[i].type == 768) { //表示是整型
		metaType.setValue(String.valueOf(String.valueOf(item.DoubleValue()))) ;
	} else if (id[i].type == 1) { //表示是rtf域
		//获得RTF域的附件信息
	} else{
		metaType.setValue(item.StringValue()) ;
	}
}

类型代码和上篇中介绍的都是一样的,但RTF域的附件信息获取方式不太一样,需要对items[i].RTObject对象进行进一步处理,处理过程如下:

IRichTextItem rtf = items[i].RTObject ;
if(item.StringValue()!=null){
	outputText.getMetadata().add(items[i].name, item.StringValue()) ;
}else if(rtf.getValueAsString()!=null){
	outputText.getMetadata().add(items[i].name, rtf.getValueAsString()) ;
}
{
	NameAndObject[] ed = rtf.getEmbeddedObjects() ;
	if(ed.length>0){
		for(NameAndObject nameObject : ed){
			EmbeddedData eo = document.getAttachment(nameObject.name) ;
			if(eo!=null && eo.embedObject!=null && eo.embedObject.getFileSize()>0){
				BooleanHolder holder = new BooleanHolder(true); 
				IntHolder inholder = new IntHolder();
				byte[] data  = null ;
				java.io.ByteArrayOutputStream output = new java.io.ByteArrayOutputStream() ;
				try{
					while((data = eo.embedObject.getFile(inholder, holder))!=null && data.length>0){
						output.write(data) ;
					}
				}catch(Exception ex){
					ex.printStackTrace();
				}
				java.io.ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray()) ;
				//获得输入流,自定义后续处理过程
				input.close() ;
			}
		}
	}
}

最后是关闭session,调用 session.recycle()。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于LotusScript,除了Rich-Text域外的元素,如文本、单选框、列表框、复选框等,你可以用几乎相同的代码取得它们的值。例如:如果有一个“Location”域,不论它是何种类型,你都可以用下面的LotusScript代码取得它的值:   fieldVals = doc.Location   或者这样:   fieldVals = doc.GetItemValue("Location")   在LotusScript中,域的类型对于你要取值(值数组)的代码并不重要。但是在JavaScript中,不同类型的域除了显示选项(比如单选框、复选框或者文本)外,并不像在Notes里那样,它们是不同的类型的对象,每一个都要用不同的方式去引用。其实,那也不是绝对的,有些对象是相似的,但是引用过程并不像在LotusScript里那么流畅。   在JavaScript中,没有所谓的Rich-Text域,在HTML中更没有。Notes里提供了一个可以放在浏览器里的富文本Java(不是JavaScript)小程序,从而可以得到富文本的一些功能,但是你并不能用JavaScript来对它编程,而且它也不是一个真正的HTML对象类型。   更让Notes开发人员惊讶的是,在Web上还没有数字型或时间型的域。HTML的域都是文本型的。尽管你能用它们来收集数字信息,如数量或单价,而保存的数据依然是文本。为了像数字一样使用它,你必须把它转换成数字类型。另一个区别是在Web上没有计算域,但并不意味着你不能在你的表单里加入计算域。你可以加入计算域,计算值将会在Web页中显示,除非域是隐藏的。关键是即使域就在那里显示,而HTML通常的处理是没有定义域。如果你把test域改成计算域而不是可编辑的,在测试时你会发现其值是取不到的,我们可以对比下计算域和可编辑域生成的html代码:   计算域的时候生成的代码(js是取不到值的):      action="/weboa/ggxx/Dinner.nsf/test?OpenForm&Seq=1" name="_test">
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值