`
jaddy0302
  • 浏览: 4648 次
文章分类
社区版块
存档分类
最新评论

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

阅读更多

      Lotus Domino 作为一种全球领先的协作、消息传递和 Web 支持软件,正在迅速地在中国企事业推广。Domino 已经成为帮助每个人更灵活和更高效地工作的强大支持。如何从 DOMINO 数据库中获取数据,使这些数据为其他系统可用,已经成为许多企业迫切需要解决的问题。然而 domino 不同于普通的关系型数据库,由 ibm/lotus 自主研发,有自己的标准和特殊性,是一种另类的数据库类型。开发具有访问 DOMINO 服务器的应用程序的方法有许多种,但是普遍存在的问题是功能有很大的局限性,都要在依赖于 lotous notes 这一庞大而昂贵的客户端软件。随着 java 语言和 CORBA 中间件技术的日趋成熟,新版本的 Domino 也提供了 corba 服务,使这一问题得到彻底的解决。java/corba 访问 domino 的优点在于采用此技术开发的应用程序在不用安装 lotus notes 的情况下获取远程 domino 服务器上的数据,真正做到了瘦客户端,为企业节省了不必要的开支,同时也极大的降低了应用程序部署的难度。由于这一技术刚刚发展两三年,国内基本上没有相应的中文资料,corba 技术也属于比较高级的开发技术,绝大多数开发工程师都没有接触过,因此许多做数据集成的开发人员对 domino 的开发望而生畏。本文旨在为开发人员提供一个全面的 java/corba 访问 domino 的技术解决方案,并通过例程指导开发人员掌握这一新技术。其中也有笔者在开发过程中的一些经验与教训,相信对广大开发人员一定会有相当大的帮助。

      起点R3能够通过以下三种方式来获取Domino数据,第一种方式是Notes本地获取;第二种是DIIOP方式远程获取;第三种是Corba访问Domino,第一第二种方式只能在Windows平台下,第三种方式能够实现跨平台访问Domino。本文分为上下两篇,本文为上篇,先介绍第一第二两种方式获取数据,下篇再介绍第三种方式。

      在起点R3的Domino采集器中,有如下代码:     

if(properties.getProperty("local")==null){
    session = NotesFactory.createSession(((CrawlTask)job.getCrawltask()).getResourceuri() ,((CrawlTask)job.getCrawltask()).getAccount() , ((CrawlTask)job.getCrawltask()).getPassword());
}else{
    session = NotesFactory.createSession();
}

 即如果传入的插件参数中有local=true,则使用本地Notes访问数据,否则,通过DIIOP访问Domino数据,需要注意的是,起点R3在采集Domion数据的时候需要将Domino或者Notes的安装目录加入到PATH中,获取到session之后,通过以下代码获取数据库信息:   

db = session.getDatabase(session.getServerName(), properties.getProperty("database"));
documentList = db.getAllDocuments() ;
然后可以遍历documentList获得数据库中的所有文档。

对Domino数据库的遍历有两种方式,第一种是通过 documentList.getFirstDocument()和documentList.getNextDocument() 顺序获取文档,第二种方式是documentList.getLastDocument()和documentList.getPrevDocument() 逆序获取文档,最终获取到的是Document对象,然后通过以下代码来对Document的域进行遍历:

Vector id = fieldDoc.getItems();
for (int i = 0; i < id.size(); i++) {
	try{
		Item item = (Item)id.get(i) ;
		MetaType metaType = new MetaType(item.getName(),String.valueOf(item.getType())) ;
		if (item != null && item.getType() == 1280) { //表示是文本
			Vector values = item.getValues() ;
			if(values!=null && values.size()>0){
		StringBuffer strb = new StringBuffer() ;
		for(Object value : values){
			if(strb.length()>0){
				strb.append(" ") ;
			}
			if(value!=null){
				strb.append(value.toString()) ;
			}
		}
		metaType.setValue(strb.toString()) ;
		outputText.getMetadata().add(item.getName(), metaType.getValue()) ;
	}else{
		metaType.setValue(item.getValueString()) ;
		outputText.getMetadata().add(item.getName(), metaType.getValue()) ;
	}
//							metaType.setValue(item.getValueString()) ;
//							outputText.getMetadata().add(item.getName(), metaType.getValue()) ;
    } else if (item != null && item.getType() == 1024) { //表示是时间
	DateTime dateTime = item.getDateTimeValue() ;
	if(dateTime!=null){
		metaType.setValue(String.valueOf(item.getDateTimeValue())) ;
		outputText.getMetadata().add(item.getName(), metaType.getValue()) ;
	}
    } else if (item != null && item.getType() == 768) { //表示是整型
	metaType.setValue(String.valueOf(item.getValueInteger())) ;
	outputText.getMetadata().add(item.getName(), metaType.getValue()) ;
    } else if (item != null && item.getType() == 1) { //表示是rtf域
	metaType.setValue(item.getValueString()) ;
	outputText.getMetadata().add(item.getName(), metaType.getValue()) ;
    } else{
	Vector values = item.getValues() ;
	if(values!=null && values.size()>0){
		StringBuffer strb = new StringBuffer() ;
		for(Object value : values){
			if(strb.length()>0){
				strb.append(" ") ;
			}
			if(value!=null){
				strb.append(value.toString()) ;
			}
		}
		metaType.setValue(strb.toString()) ;
		outputText.getMetadata().add(item.getName(), metaType.getValue()) ;
	}else{
		metaType.setValue(item.getValueString()) ;
		outputText.getMetadata().add(item.getName(), metaType.getValue()) ;
	}
		}
		dataList.add(metaType);
	}catch(Exception ex){}
}

重点是集中特殊域的获取,其中,域类型1280是文本,1024是时间,768是数字,1表示RTF域,还有文本列表域等。

RTF域的获取需要使用以下代码:

if (item != null && item.getType() == 1) { //表示是rtf域
/**
 * 处理RTF域中的文本内容
 */
if(properties!=null && "false".equals(properties.getProperty("rtftext"))){}else{
	outputText.getMetadata().add(item.getName(), item.getValueString()) ;
}
java.util.Vector vector = document.getItems();
for(int i=0; i<vector.size() ; i++){
	Item itmWjbt = (Item)vector.get(i) ;
	if(itmWjbt != null && itmWjbt.getName().equals("$FILE") && zipData.getFileMap().get(itmWjbt.getValueString())==null){
		EmbeddedObject eo = document.getAttachment(itmWjbt.getValueString());
		InputStream input = eo.getInputStream();
                          //从input中获取数据保存到文件或其他输出流
		input.close() ;
	}
}

文本列表域的获取需要使用 Vector values = item.getValues() ,然后

for(Object value : values){
	if(strb.length()>0){
		strb.append(" ") ;
	}
	if(value!=null){
		strb.append(value.toString()) ;
	}
}

 

    在上篇中介绍了从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和db, db.recycle();

分享到:
评论

相关推荐

    Java访问Domino的编程指南.doc

    Java 访问 Domino 对象需要首先连接到 Domino 服务器,然后获取目录对象,以便访问到对应的 Domino 对象。 Domino 消息处理概述 Domino 消息处理是指 Domino 中的消息处理机制。Domino 服务器可以处理各种类型的...

    lotus domino java代理_获取传递值json

    Lotus Domino 是一种基于Notes技术的服务器端应用程序, Lotus Domino Java 代理是指在 Domino 服务器上运行的 Java 代理程序,可以用来处理用户请求、提供数据服务等。今天,我们将讨论如何在 Lotus Domino Java ...

    如何用java远程访问Domino邮箱数据

    Java远程访问Domino邮箱数据是通过使用Lotus Domino Java API(Lotus Domino JNA或Lotus Domino Access for Java)来实现的。这个过程涉及到多个步骤和技术,包括理解Lotus Domino的架构、设置Java环境以及使用特定...

    java访问domino,通过http访问Domino,java快速访问Domino,java集成lotus domino

    java访问domino,通过http访问Domino,java快速访问Domino,java集成lotus domino 完全提供源码 界面请查阅 https://blog.csdn.net/weijia3624/article/details/113108704

    java连接Lotes邮件服务器(Domino) 读取邮件内容附件完整实例

    总结起来,Java连接Lotus Domino邮件服务器并读取邮件内容和附件涉及的主要知识点包括:JNDI或LotusJCA连接、Domino API的使用、数据库操作、邮件和附件的读取、日期转换以及数据模型的设计。通过理解和运用这些知识...

    java调试domino邮件常见问题

    ### Java调试Domino邮件常见问题 #### 背景与目的 在企业级应用开发过程中,经常需要通过Java来调用Domino服务器发送邮件。为了确保邮件能够顺利发送,需要进行一系列配置及调试工作,包括开启Domino服务器的DIIOP...

    java访问domino数据库.rar

    在IT领域,Java是一种广泛使用的编程语言,而Lotus Domino是一种流行的企业级应用平台,尤其在协同工作和信息管理方面。本压缩包“java访问domino数据库.rar”提供了关于如何利用Java来访问和操作Domino数据库的重要...

    java连接domino帮助文档

    这篇文档将详细介绍如何使用Java与Lotus Domino进行交互,并基于提供的压缩包文件内容展开讨论。 首先,Java连接到Domino通常涉及以下知识点: 1. **JDBC驱动**:尽管Lotus Domino本身并不直接支持JDBC(Java ...

    lotus domnio java代理获取domino安装路径

    lotus domnio java代理获取domino安装路径

    用Java 操作Domino 数据库例子

    以下是一个使用Java读取Domino数据库并将数据写入XML文件的示例代码: ```java package test; import lotus.domino.*; import java.util.*; import java.io.*; public class ReadThread1 implements Runnable { ...

    java操作domino

    - Java API为开发者提供了通过Java应用程序操作Domino数据库的能力,使得可以在Java应用中实现对Domino数据的增删查改等功能。 3. **基本概念**: - **NotesThread**: 用于初始化和清理线程环境。 - **Sessions*...

    java webservice flash在domino中的使用

    在提供的压缩包文件中,"flash在domino中的使用"可能包含有关如何在Domino环境中使用Flash的详细指南,"java在domino中的使用"可能会讲解如何创建和部署Java Web服务,而"Webservice在domino中的使用"则可能涵盖了...

    用java访问domino对象

    本地调用是指在 Notes 客户端或 Domino 服务器所在的计算机上运行 Java 程序,使用 JNI 对 Notes/Domino 的代码进行访问。远程调用是指通过 CORBA 访问 Domino 所提供的服务,客户端通过 HTTP 协议获得服务器的初始...

    java连接domino lotus.domino

    Notes.jar lotus.domino.* java连接domino 没有分数的可以到 http://www.ibm.com/developerworks/apps/download/index.jsp?contentid=50943&filename=DominoJSPArticle.zip&method=http&locale=worldwide

    用Java查询Domino服务器在线人数信息

    ### 使用Java查询Domino服务器在线人数信息...综上所述,这段代码不仅展示了如何使用Java与Domino服务器进行通信,还深入介绍了XML处理和文件操作的技术细节,对于理解和应用基于Domino的Java开发具有重要的参考价值。

    java连接domino

    这是一个java通过domino的diiop连接domino的类。希望对大家有用

    Java 对 Domino 的访问

    Java对Domino的访问是IBM Lotus Domino开发中的一个重要主题,它允许开发者利用Java语言与Domino服务器进行交互,实现各种功能,如数据存取、邮件处理、应用逻辑控制等。在IBM官网上,这一主题被详细解读并分为上下...

    Domino的Java编程指南

    当我们谈论“Domino的Java编程”时,是指使用Java语言来操作和扩展Domino的功能。Java为开发人员提供了丰富的API,可以方便地访问和操作Domino的各个组件。以下是一些主要的Java编程概念和步骤: **1. Domino对象**...

    在domino中用JAVA的文档

    3. **访问Notes API**:使用Lotus Domino Java API,可以与Notes数据进行交互,如打开、读取、更新和删除文档。 四、Java在Domino中的应用场景 1. **数据处理**:Java可以高效地处理大量数据,例如批量更新数据库...

    使用Java mail API访问Lotus Domino邮箱

    在本场景中,我们将深入探讨如何使用Java Mail API来访问Lotus Domino邮箱系统。Lotus Domino是由IBM开发的企业级协作平台,其中包含了电子邮件、日历、任务等功能。 首先,为了与Lotus Domino服务器进行交互,你...

Global site tag (gtag.js) - Google Analytics