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

问题描述

LotusDomino作为一种全球领先的协作、消息传递和Web支持软件,正在迅速地在中国企事业推广。Domino已经成为帮助每个人更灵活和更高效地工作的强大支持。如何从DOMINO数据库中获取数据,使这些数据为其他系统可用,已经成为许多企业迫切需要解决的问题。然而domino不同于普通的关系型数据库,由ibm/lotus自主研发,有自己的标准和特殊性,是一种另类的数据库类型。开发具有访问DOMINO服务器的应用程序的方法有许多种,但是普遍存在的问题是功能有很大的局限性,都要在依赖于lotousnotes这一庞大而昂贵的客户端软件。随着java语言和CORBA中间件技术的日趋成熟,新版本的Domino也提供了corba服务,使这一问题得到彻底的解决。java/corba访问domino的优点在于采用此技术开发的应用程序在不用安装lotusnotes的情况下获取远程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的域进行遍历:Vectorid=fieldDoc.getItems();for(inti=0;i<id.size();i++){try{Itemitem=(Item)id.get(i);MetaTypemetaType=newMetaType(item.getName(),String.valueOf(item.getType()));if(item!=null&&item.getType()==1280){//表示是文本Vectorvalues=item.getValues();if(values!=null&&values.size()>0){StringBufferstrb=newStringBuffer();for(Objectvalue: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());}elseif(item!=null&&item.getType()==1024){//表示是时间DateTimedateTime=item.getDateTimeValue();if(dateTime!=null){metaType.setValue(String.valueOf(item.getDateTimeValue()));outputText.getMetadata().add(item.getName(),metaType.getValue());}}elseif(item!=null&&item.getType()==768){//表示是整型metaType.setValue(String.valueOf(item.getValueInteger()));outputText.getMetadata().add(item.getName(),metaType.getValue());}elseif(item!=null&&item.getType()==1){//表示是rtf域metaType.setValue(item.getValueString());outputText.getMetadata().add(item.getName(),metaType.getValue());}else{Vectorvalues=item.getValues();if(values!=null&&values.size()>0){StringBufferstrb=newStringBuffer();for(Objectvalue: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(Exceptionex){}}重点是集中特殊域的获取,其中,域类型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.Vectorvector=document.getItems();for(inti=0;i<vector.size();i++){ItemitmWjbt=(Item)vector.get(i);if(itmWjbt!=null&&itmWjbt.getName().equals("$FILE")&&zipData.getFileMap().get(itmWjbt.getValueString())==null){EmbeddedObjecteo=document.getAttachment(itmWjbt.getValueString());InputStreaminput=eo.getInputStream();//从input中获取数据保存到文件或其他输出流input.close();}}文本列表域的获取需要使用Vectorvalues=item.getValues(),然后for(Objectvalue: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过程比较复杂,大致如下:Stringior=http://127.0.0.1/diiop_ior.txt;Propertiesprops=newProperties();props.put("org.openorb.orb.core.ORB","org.openorb.orb.core.ORB");ORBorb=ORB.init(newString[]{},props);//通过IOR得到IObjectServer对象org.omg.CORBA.Objectobj=orb.string_to_object(ior);IObjectServerios=IObjectServerHelper.narrow(obj);//通过IObjectServer获得ISessionProtocolVersionmaxVersion=newProtocolVersion(IBase.DOM_MAJOR_MINIMUM_VERSION,IBase.DOM_MINOR_MINIMUM_VERSION);ProtocolVersionminVersion=newProtocolVersion(IBase.DOM_MAJOR_VERSION,IBase.DOM_MINOR_VERSION);SessionDatasd=ios.createSession(maxVersion,minVersion,((CrawlTask)job.getCrawltask()).getAccount(),((CrawlTask)job.getCrawltask()).getPassword());session=sd.sesObject;通过账号和密码访问登录Domino后获得session,然后通过session获得数据库信息,如下://使用ISessiondbCache=session.getDatabase(sd.serverName,properties.getProperty("database"),false);dCdata=dbCache.db.getAllDocuments();//iDatabase.search("1=1",null,10);IDatabaseHolderidatabaseholder=newIDatabaseHolder();IntHolderintholder=newIntHolder();IDocumentdocument=dCdata.dcObject.getFirstDocMDB(idatabaseholder,intholder);一样是或得到document,类型为IDocument,dCdata.dcObject即是文档列表,对此对象遍历即可document=dCdata.dcObject.getNextDocMDB(document,idatabaseholder,intholder);对IDocument对象的遍历也和DIIOP也有一些差别:ItemData[]id=fieldDoc.getData().items;for(inti=0;i<id.length;i++){MetaTypemetaType=newMetaType(id[i].name,String.valueOf(id[i].type));ItemValueitem=id[i].values;if(id[i].type==1280){//表示是文本metaType.setValue(item.StringValue());}elseif(id[i].type==1024){//表示是时间DateTimedateTime=item.TimeObject();if(dateTime!=null){metaType.setValue(String.valueOf(dateTime.toString()));}}elseif(id[i].type==768){//表示是整型metaType.setValue(String.valueOf(String.valueOf(item.DoubleValue())));}elseif(id[i].type==1){//表示是rtf域//获得RTF域的附件信息}else{metaType.setValue(item.StringValue());}}类型代码和上篇中介绍的都是一样的,但RTF域的附件信息获取方式不太一样,需要对items[i].RTObject对象进行进一步处理,处理过程如下:IRichTextItemrtf=items[i].RTObject;if(item.StringValue()!=null){outputText.getMetadata().add(items[i].name,item.StringValue());}elseif(rtf.getValueAsString()!=null){outputText.getMetadata().add(items[i].name,rtf.getValueAsString());}{NameAndObject[]ed=rtf.getEmbeddedObjects();if(ed.length>0){for(NameAndObjectnameObject:ed){EmbeddedDataeo=document.getAttachment(nameObject.name);if(eo!=null&&eo.embedObject!=null&&eo.embedObject.getFileSize()>0){BooleanHolderholder=newBooleanHolder(true);IntHolderinholder=newIntHolder();byte[]data=null;java.io.ByteArrayOutputStreamoutput=newjava.io.ByteArrayOutputStream();try{while((data=eo.embedObject.getFile(inholder,holder))!=null&&data.length>0){output.write(data);}}catch(Exceptionex){ex.printStackTrace();}java.io.ByteArrayInputStreaminput=newByteArrayInputStream(output.toByteArray());//获得输入流,自定义后续处理过程input.close();}}}}最后是关闭session和db,db.recycle();

时间: 2024-12-05 01:01:14

起点R3使用JAVA获取Domino数据(上篇)的相关文章

java 获取网站数据,知道登录人的账户密码

问题描述 java 获取网站数据,知道登录人的账户密码 现在一个网站登录需要用户名和密码,然后查看里面的数据.我现在知道用户名和密码,但是想自己开发些延伸功能,例如对里面数据进行汇总.我怎么在自己程序里获取对方网站的数据.求思路,求指点 解决方案 用webclient/httpwebrequest登录,提交你的用户名密码,之后在cookie中附着传回给你的cookies. 解决方案二: 直接调用他的接口返回数据的同时自己备份一份

java获取网页数据,url所指向的页面不是最终要获取的页面

问题描述 通过http://www.pingan.com/ebusiness/auto/newness/index.do?cityCode=350200&provinceCode=350000访问到页面填写信息后点击确定,跳转到页面,在填写信息后跳转到最终的结果页面而这个页面才是我要抓取的数据页面,求高手帮忙 解决方案 解决方案二:没人么?自己先顶上解决方案三:为什么要抓取别人网站的内容,楼主给我扫扫盲,感觉很好玩的样子解决方案四:人家可以能是A->B用的是get,B->C用的是POS

基于jquery+ztree+java获取json数据构建树实例

zTree 是利用 JQuery 的核心代码,实现一套能完成大部分常用功能的 Tree 插件 兼容 IE.FireFox.Chrome 等浏览器 在一个页面内可同时生成多个 Tree 实例 支持 JSON 数据 支持一次性静态生成 和 Ajax 异步加载 两种方式 支持多种事件响应及反馈 支持 Tree 的节点移动.编辑.删除 支持任意更换皮肤 / 个性化图标(依靠css) 支持极其灵活的 checkbox 或 radio 选择功能 简单的参数配置实现 灵活多变的功能 因为ztree的格式支持J

java获取两个数组中不同数据的方法_java

本文实例讲述了java获取两个数组中不同数据的方法.分享给大家供大家参考.具体实现方法如下: public static <T> List<T> compare(T[] t1, T[] t2) { List<T> list1 = Arrays.asList(t1); List<T> list2 = new ArrayList<T>(); for (T t : t2) { if (!list1.contains(t)) { list2.add(t)

java获取数据时重复

问题描述 有一个对象User(对应数据库中t_user表),User有一个字段code.现在有一个方法edit(),edit方法每次通过User的code值来生成新的code值,就是说,如果现在数据库中code的最大值为10,那么edit方法新增一个User对象,这个User对象的code值为11,然后将新的User对象保存.现在的问题是如果多个用户同时执行到edit方法,会导致User记录的code 值重复,应该怎么解决??(获取code的最新值有一个特定方法:getNextCode) 解决方

android如何获取网站数据

问题描述 android如何获取网站数据 android应用是怎么获取网站数据的,比如在某个应用里,有起点小说排行榜,那这里边数据是怎么获取的? 在不提供SDK下. 解决方案 直接用http去访问网站抓网页再用正则表达式提取数据处理. 解决方案二: 同意楼上,没试过,但是用java可以实现,我用过,android应该也可以 解决方案三: 我之前用过一个开源的jar包 jsoup 也是从一个网站上抓取需要的数据做了一款app,这里是源码 https://github.com/cayden/joke

[Domino]Java访问Domino必需配置的服务器设置

[Domino]Java访问Domino必需配置的服务器设置 编写者 日期 关键词 郑昀@ultrapower 2005-6-30 Java Domino Configuration 应用场景 我们需要通过Java远程访问IBM Lotus Domino R6和R5服务器,从中获取用户邮箱的邮件信息等关键数据.我们不需要提供每一个用户密码以及ID文件. 我们的具体做法是,通过Domino ORB,来使得Domino Server与Java远程交互,双方使用IIOP来交互和交换对象数据. 访问的D

Java获取随机数的3种方法_java

主要介绍了Java获取随机数的3种方法,主要利用random()函数来实现 方法1 (数据类型)(最小值+Math.random()*(最大值-最小值+1))例: (int)(1+Math.random()*(10-1+1)) 从1到10的int型随数 方法2 获得随机数 for (int i=0;i<30;i++) {System.out.println((int)(1+Math.random()*10));} (int)(1+Math.random()*10) 通过java.Math包的ra

ajax-怎样才能用Java获取到电商网页上产品的促销价格呢?

问题描述 怎样才能用Java获取到电商网页上产品的促销价格呢? 目的:获得商品的促销价格(实时价格)最近在做本科毕业设计啦~~~我的思路:以下面这个链接为例:http://item.taobao.com/item.htm?spm=a230r.1.14.72.OJMBD3&id=42302206603&ns=1&abbucket=11#detail我想要获取那个促销的价格,但是他好像是经过ajax之后的网页得到的,肿么才能把它提取出来呢?请各位大神支支招~~ 解决方案 如果是 js