在你开始前
关于本教程
ECM解决方案越来越需要捕获和管理所有形式的非结构化内容,例如图像,表格,传真,办公文档,电子邮件,视频和音频。 为了最有效,此内容需要跨各种业务流程和应用程序集成,以便可以按需将其交付给用户。 这种集成通常涉及使用ECM解决方案的API,以便在运行中搜索相关内容。 例如,您可能要搜索与用户正在使用的客户编号相关的所有文档。
本教程旨在涵盖这一集成级别。 这是IBM ECM编程的简介。 本教程介绍了IBM Content Manager产品的Java API以及IBM FileNet P8 Content Manager产品。 此外,还介绍了IBM Information Integrator Content Edition的联合Java API,它能够访问一个或两个存储库。
当然,还有Java以外的其他API,例如Web Services,它们不在本教程的范围之内。
先决条件
本教程假定您是经验丰富的IBM Content Manager用户或IBM FileNet P8 Content Manager用户,并且具有使用Rational Application Developer进行Java应用程序开发的经验。
所需的开发平台
本教程基于三种软件环境:
- IBM Content Manager API
- IBM Content Manager
- IBM Rational应用程序开发人员
- IBM FileNet P8 Content Manager API
- IBM FileNet P8内容管理器
- IBM Rational应用程序开发人员
- IBM Information Integrator内容版API
- IBM Content Manager
- IBM Information Integrator内容版
- IBM Rational应用程序开发人员
使用的软件版本如下:
- IBM Content Manager
- Microsoft®Windows®2000 Server SP4
- IBMWebSphere®Application Server 5.1.1.2
- IBM Content Manager 8.3
- IBM FileNet P8内容管理器
- Microsoft Windows 2003企业服务器SP1
- IBM WebSphere应用服务器6.2.0.13
- IBM FileNet P8 4.0内容引擎
- IBM FileNet P8 4.0应用程序引擎
- IBM Information Integrator内容版
- Microsoft Windows 2000 Server SP4
- IBM WebSphere应用服务器5.1.1.2
- IBM Content Manager 8.3
- IBM Information Integrator内容版本8.3
- IBM Rational应用程序开发人员
- IBM Rational Application Developer 7.0.0
开发场景
需要访问ECM存储库中文档的用户的典型业务环境是显示与他们当前使用的实体相关的所有文档的列表,例如:客户,供应商,产品或项目。 然后从匹配的文档列表中选择一个或多个并选择查看它们。
您将编写的应用程序依次使用每个API来执行以下操作,从而满足这些基本要求:
- 登录到存储库
- 执行参数搜索
- 检索结果集
- 查看文档元数据
- 查看文件
重要说明:本练习中的示例代码假定您将检索“简单”文档,即没有注释的单部分文档对象ECM产品的确允许使用更复杂的内容模型,这超出了本教程的范围。 。
IBM Content Manager API
搭建开发环境
设置IBM Rational Application Developer环境
Java构建路径
对于IBM Rational Application Developer中新创建的项目,除了Java运行时环境(JRE)之外,还需要以下Java Archive(JAR)文件(请参见下面的图1):
- [IBMCMROOT] \ lib \ cmb81.jar
- [IBMCMROOT] \ lib \ cmbsdk81.jar
- [IBMCMROOT] \ lib \ cmbview81.jar
- [IBMCMROOT] \ lib \ log4j-1.2.8.jar
- [DB2ROOT] \ java \ db2java.zip
在此测试环境中,[IBMCMROOT]目录为:C:\ IBM \ db2cm8
在此测试环境中,[DB2ROOT]目录为:C:\ IBM \ SQLLIB
注:在IBM Content Manager 8.4(最近可用)中,所需的JAR文件略有不同:
不需要 db2java.zip。
而是,必须包含以下JAR文件:
- [IBMCMROOT] \ lib \ db2jcc.jar
- [IBMCMROOT] \ lib \ db2jcc_license_cu.jar
- [IBMCMROOT] \ lib \ db2jcc_license_cisuj.jar
图1. Java构建路径
这些JAR文件必须位于类路径中(请参见下面的图2)。
另外,将包含cmbicmenv.properties的目录添加到类路径—在此测试环境中,文件安装在以下位置:C:\ IBM \ db2cm8 \ cmgmt
图2.类路径
IBM Content Manager应用程序环境
在此示例代码中使用的库服务器是“ icmnlsdb”,如IBM Content Manager Administration Client中所示(请参见下面的图3)。
包含文档的Item Type为“客户”,而用于搜索的文档属性为“客户编号”,如IBM Content Manager Administration Client中所示(请参见下面的图3)。
两个文档(JPEG和GIF)已添加到该项目类型,客户编号为“ 12345”。
图3. IBM Content Manager管理客户端
如果IBM Content Manager应用程序环境设置正确,则使用eClient客户端,您应该能够以管理员身份登录并搜索客户编号=“ 12345”,如图4所示。
图4. IBM Content Manager eClient
清单1. IBM Content Manager示例代码
package developerWorks;
import java.io.*;
import java.io.File;
import com.ibm.mm.beans.*;
public class CMSampleCode {
public static void main(String[] args)
{
try{
CMSampleCode cm8 = new CMSampleCode();
// Log on to the CM Library Server
CMBConnection connection = cm8.getCMConnection();
// Search for documents
CMBSearchResults documents = cm8.searchDocuments(connection);
// Iterate through results set (documents) to retrieve each document
for (int i = 0; i < documents.getCount(); i++)
{
// Get the document item
CMBItem item = documents.getItem(i);
// Get document metadata attributes
cm8.getDocumentMetaData(item);
// Retrieve the document
String fileName = cm8.retrieveDocument(connection, item);
// View the document using Explorer
cm8.viewDocument(fileName);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public CMBConnection getCMConnection() throws Exception
{
// Create connection bean
CMBConnection connection = new CMBConnection();
// Set properties on connection bean
// Set the DataStore type to indicate Content Manager
connection.setDsType("ICM");
// Set the Library Server name
connection.setServerName("icmnlsdb");
// Set the user id and password for authentication
connection.setUserid("cmuser");
connection.setPassword("password");
// Get the connection
connection.connect();
System.out.println("Connected to CM server");
return connection;
}
public CMBSearchResults searchDocuments(CMBConnection connection)
throws CMBInvalidQueryException, CMBConnectFailedException, CMBException
{
// Search across all CM Item Types
String entity = "/*";
// Search where customer number is equal to 12345
String condition = "[@CustomerNumber = \"12345\"]";
// Create a query string to hold our search criteria
String queryString = entity + condition;
// Get an instance of query service bean
CMBQueryService queryService = connection.getQueryService();
// Set properties on the query service bean
short queryType = CMBBaseConstant.CMB_QS_TYPE_XPATH;
queryService.setQueryString(queryString, queryType);
queryService.setAsynchSearch(false);
// Perform search and create results set
queryService.runQuery();
// Get an instance of search results bean
CMBSearchResults documents = new CMBSearchResults();
documents.setConnection(connection);
documents.newResults(queryService.getResults());
// Return results set object
return documents;
}
public void getDocumentMetaData(CMBItem item)
throws CMBException, Exception
{
// Get document metadata attributes
String[] names = item.getAttrNames();
String[] values = item.getAttrValues();
// For each attribute, show the attribute name and value
for (int i = 0; i < names.length; i++) {
System.out.println(names[i] + ": " + values[i] + " ");
}
}
public String retrieveDocument(CMBConnection connection, CMBItem item)
throws CMBException, IOException, Exception
{
// Get an instance of data management bean
CMBDataManagement dataManagement = connection.getDataManagement();
// Set the current data item
dataManagement.setDataObject(item);
// Retrieve the original file name
CMBObject object = dataManagement.getContent(0);
String inputFileName = object.getOriginalFileName();
// Parse the file name from the full path
int pos=inputFileName.lastIndexOf("\\");
inputFileName = inputFileName.substring(pos+1);
// Write the document content to a new file
String fileName = System.getProperty("user.dir")
+ File.separator + inputFileName;
System.out.println("Output file name " + fileName);
FileOutputStream fileoutstream = new FileOutputStream(fileName);
fileoutstream.write(dataManagement.getContent(0).getData());
fileoutstream.close();
// Return file name
return fileName;
}
public void viewDocument(String fileName) throws Exception
{
// Use Explorer.exe to view the documents
String VIEWER = "Explorer.exe ";
Runtime rt = Runtime.getRuntime();
// Launch the document with explorer
String cmd = VIEWER + fileName;
rt.exec(cmd);
}
} // end main
运行示例代码的结果
在IBM Rational Application Developer环境中运行示例代码将启动在IBM Content Manager中找到的两个文档,如图5所示。
图5.运行时结果
IBM FileNet P8 Content Manager API
搭建开发环境
在IBM WebSphere Application Server中编辑属性文件
本教程中的样本代码使用Java远程方法调用技术运行在Internet星际协议(RMI-IIOP)上,以连接到WebSphere Application Server。 这要求配置公共对象请求代理体系结构(CORBA)安全支持。
注意 :如果您使用的是Web服务互操作性(WSI)传输,则此步骤也将有所不同。
编辑sas.client.props文件-默认情况下可以在以下位置找到该文件:C:\ Program Files \ IBM \ WebSphere \ AppServer \ profiles \ default \ properties。
确保设置了以下属性(请参见下面的图6):
- com.ibm.CORBA.sercurityServerHost = hqdemo1
- com.ibm.CORBA.sercurityServerPort = 2809
- com.ibm.CORBA.loginSource =无
图6. sas.client.props文件属性
设置IBM Rational Application Developer环境
Java构建路径
对于IBM Rational Application Developer中新创建的项目,除了JRE,还需要以下JAR文件(请参见下面的图7):
- 杰斯·贾尔
- log4j-1.2.13.jar
- J2EE.jar
在此测试环境中,Jace.jar和log4j-1.2.13.jar安装在C:\ Program Files \ FileNet \ ContentEngine \ lib中。
在此测试环境中,J2EE.jar安装在C:\ Program Files \ IBM \ WebSphere \ AppServer \ lib中。
图7. Java构建路径
这些JAR文件必须在类路径中,而且log4j.xml文件也必须在类路径中,以便日志记录成功初始化(请参见图8):
图8.类路径
VM参数
对于上述项目的新创建的类,请在IBM Rational Application Developer运行时参数中设置VM参数。
将清单2中的文本复制到图9所示的VM arguments框中。
清单2. VM参数
-Djava.security.auth.login.config=
"C:\Program Files\FileNet\ContentEngine\config\jaas.conf.WebSphere"
-Dcom.ibm.CORBA.ConfigURL="file:${WAS_HOME}\profiles\default\properties\sas.client.props"
-Djava.ext.dirs="${WAS_JAVA_HOME}\lib\ext;${WAS_JAVA_HOME}\lib;
${WAS_HOME}\classes;${WAS_HOME}\lib;${WAS_HOME}\lib\ext"
-Djava.naming.provider.url=iiop://localhost:2809
-Xbootclasspath/p:"${WAS_JAVA_HOME}\lib\ibmorb.jar;
${WAS_HOME}\profiles\default\properties"
图9. VM参数
变数
对于同一类,将清单3中的变量添加到IBM Rational Application Developer运行时参数中,如下面的图10所示。
清单3. VM变量
WAS_HOME C:\Program Files\IBM\WebSphere\AppServer
WAS_JAVA_HOME C:\Program Files\IBM\WebSphere\AppServer\java\jre
图10.程序参数变量
IBM FileNet P8 Content Manager应用程序环境
如IBM FileNet P8 Enterprise Manager中所示,此示例代码中使用的域是“ p8demodom”。
如IBM FileNet P8 Enterprise Manager中所示,此样本代码中使用的对象存储为“ EVTFS”(图11)。
包含文档的文档类为“客户”,用于搜索的文档属性为“客户号”,如IBM FileNet P8 Enterprise Manager中所示(图11)。
两个文档(JPEG和GIF)已添加到此文档类中,客户编号为“ 12345”。
图11. FileNet企业管理器
如果FileNet P8 Content Manager应用程序环境设置正确,则使用Workplace客户端,您应该能够以管理员身份登录并搜索客户编号=“ 12345”,如图12所示。
图12. FileNet Workplace客户端
清单4. IBM FileNet P8 Content Manager示例代码
package developerWorks;
import java.io.*;
import java.util.Iterator;
import javax.security.auth.Subject;
import com.filenet.api.core.*;
import com.filenet.api.util.UserContext;
import com.filenet.api.collection.*;
import com.filenet.api.query.*;
public class P8SampleCode {
public static void main(String[] args)
{
try{
P8SampleCode p8 = new P8SampleCode();
// Log on to the P8 Content Engine
ObjectStore store = p8.getP8Connection();
// Search for documents
DocumentSet documents = p8.searchDocuments(store);
// Iterate through results set (documents) to retrieve each document
Iterator it = documents.iterator();
while (it.hasNext())
{
// Get the document item
Document document = (Document)it.next();
// Get document metadata attributes
p8.getDocumentMetaData(document);
// Retrieve the document
String fileName = p8.getDocumentContent(document);
// View the document using Explorer
p8.viewDocument(fileName);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public ObjectStore getP8Connection()
{
// The connection URI includes the transport protocol (connection type),
// host name, and port number that are used for server communication
// Note these are the default P8 configuration parameters
String uri = "iiop://hqdemo1:2809/FileNet/Engine";
// Set the user id and password for authentication
String username = "p8user";
String password = "password";
// Get the connection
Connection conn = Factory.Connection.getConnection(uri);
// The next 3 lines authenticate with the application server using the JAAS API
Subject subject = UserContext.createSubject( conn, username, password, null);
UserContext uc = UserContext.get();
uc.pushSubject(subject);
// Retrieve the specific Domain Object P8demodom
Domain domain = Factory.Domain.fetchInstance(conn, "P8demodom", null);
System.out.println("Domain Name is: "+ domain.get_Name());
// Get the specific object store EVTFS
ObjectStore store =
Factory.ObjectStore.fetchInstance(domain, "EVTFS", null);
System.out.println("Objectstore is: "+ store.get_Name());
// Return the Object Store
return store;
}
public DocumentSet searchDocuments(ObjectStore os)
{
// Instantiate a search scope to search our object store
SearchScope search = new SearchScope(os);
// Instantiate an SQL object to hold our search criteria
SearchSQL sql = new SearchSQL();
// When searching, retrieve certain document
sql.setSelectList("DocumentType, DocumentTitle, Description,
ContentElements");
// Search for all documents
sql.setFromClauseInitialValue("Document", "d", true);
// Search where customer number is equal to 12345
sql.setWhereClause("CustomerNumber='12345'");
// Perform search and create results set
DocumentSet documents = (DocumentSet)search.fetchObjects(sql, new
Integer(50),null, Boolean.valueOf(true));
// Return results set object
return documents;
}
public void getDocumentMetaData(Document document)
{
// Get document metadata attributes
System.out.println("Document type = " +
document.getProperties().getStringValue("DocumentType"));
System.out.println("Document title = " +
document.getProperties().getStringValue("DocumentTitle"));
System.out.println("Document description = " +
document.getProperties().getStringValue("Description"))
}
public String getDocumentContent(Document document) throws Exception
{
// Initialize the output file name with the path where to store the document
String fileName = System.getProperty("user.dir") + File.separator;
// Get the content elements
ContentElementList contents = document.get_ContentElements();
ContentElement content;
Iterator itContent = contents.iterator();
// iterate on the elements to retrieve the document
while (itContent.hasNext())
{
content = (ContentElement)itContent.next();
// Get the document file name
fileName = fileName+((ContentTransfer)content).get_RetrievalName()
System.out.println("fileName = " + fileName);
// Get an input stream for reading document data
InputStream inputStream =
((ContentTransfer)content).accessContentStream();
// Get an output stream for writing document data
OutputStream outputStream = new FileOutputStream(fileName);
// Retrieve document content to the new file
byte[] nextBytes = new byte[64000];
int nBytesRead;
while ((nBytesRead = inputStream.read(nextBytes)) != -1)
{
outputStream.write(nextBytes, 0, nBytesRead);
outputStream.flush();
}
}
// Return the newly created document file
return fileName;
}
public void viewDocument(String fileName) throws Exception
{
// Use Explorer.exe to view the documents
String VIEWER = "Explorer.exe ";
Runtime rt = Runtime.getRuntime();
// Launch the document with explorer
String cmd = VIEWER + fileName;
rt.exec(cmd);
}
} // end main
运行示例代码的结果
在IBM Rational Application Developer环境中运行示例代码将启动在IBM FileNet P8 Content Manager中找到的两个文档,如图13所示:
图13.运行时结果
IBM Information Integrator内容版API
在本部分中,您将使用IBM Information Integrator Content Edition API从IBM Content Manager检索文档。
搭建开发环境
设置IBM Rational Application Developer环境
Java构建路径
对于IBM Rational Application Developer中新创建的项目,除了JRE之外,还需要以下JAR文件(请参见下面的图14):
- [IICE_HOME] \ lib vbr.jar
- [IICE_HOME] \ opt \ datastore.jar
- [IICE_HOME] \ opt \ log4j.jar
- [IICE_HOME] \ opt \ vbr_subscription.jar
- [IICE_HOME] \ opt \ vbr_vrepo.jar
- [IICE_HOME] \ opt \ vbr_wc.jar
- [WAS_HOME] \ lib \ bootstrap.jar
- [WAS_HOME] \ lib \ disthub.jar
- [WAS_HOME] \ lib \ ecutils.jar
- [WAS_HOME] \ lib \ ejbportable.jar
- [WAS_HOME] \ lib \ ffdc.jar
- [WAS_HOME] \ lib \ idl.jar
- [WAS_HOME] \ lib \ iwsorb.jar
- [WAS_HOME] \ lib \ messagingClient.jar
- [WAS_HOME] \ lib \ naming.jar
- [WAS_HOME] \ lib \ namingclient.jar
- [WAS_HOME] \ lib \ ras.jar
- [WAS_HOME] \ lib \ tcljava.jar
- [WAS_HOME] \ lib \ tx.jar
- [WAS_HOME] \ lib \ txClientPrivate.jar
- [WAS_HOME] \ lib \ utils.jar
- [WAS_HOME] \ lib \ utils.jar
- [WAS_HOME] \ lib \ wsexception.jar
- [WAS_HOME] \ installedApps \ <节点> \ VeniceBridge.ear \ vbr_access_services.jar
- [WAS_HOME] \ installedApps \ <节点> \ VeniceBridge.ear \ vbr_view_services.jar
在此测试环境中,[IICE_HOME]目录为C:\ IBM \ IICE。
在此测试环境中,[WAS_HOME]目录为C:\ IBM \ WebSphere \ AppServer。
在此测试环境中,<node>目录为cmdemo。
图14. Java构建路径
这些JAR文件和路径必须在类路径中(请参见图15):
图15.类路径
VM参数
对于上述项目的新创建的类,请在IBM Rational Application Developer运行时参数中设置VM参数。
将清单5中的文本复制到VM arguments框中,如图16所示。
清单5. VM参数
-Djava.naming.factory.initial=com.ibm.websphere.naming.WsnInitialContextFactory
-Djava.naming.provider.url=iiop://localhost:2810
图16. VM参数
IBM Content Manager应用程序环境
如IBM Content Manager Administration Client中所示,此示例代码中使用的库服务器为“ icmnlsdb”(请参见下面的图17)。
包含文档的项目类型为“客户”,用于搜索的文档属性为“客户编号”,如IBM Content Manager Administration Client中所示(请参见下面的图17)。
向该物料类型添加了两个文档(JPEG和GIF),客户编号为“ 12345”。
图17. IBM Content Manager管理客户端
如果IBM Content Manager应用程序环境设置正确,则使用eClient客户端,您应该能够以管理员身份登录并搜索客户编号=“ 12345”,如图18所示。
图18. IBM Content Manager eClient
IBM Information Integrator内容版应用程序环境
本节中的示例代码假定您已经为IBM Content Manager和IBM Information Integrator Content Edition配置了有效的连接(请参见图19)。
图19. IBM Content Manager连接器
如果正确设置了与IBM Content Manager的IBM Information Integrator Content Edition连接,那么使用IBM Information Integrator Content Edition Web Client,您应该能够以管理员身份登录并搜索客户编号=“ 12345”,如图20所示。 。
图20. IBM Information Integrator内容版Web客户端
清单6. IBM Information Integrator内容版示例代码
package developerWorks;
import java.io.*;
import com.venetica.vbr.client.*;
public class IICESampleCode {
public static void main(String[] args)
{
try{
IICESampleCode iice = new IICESampleCode();
// Log on to the CM Library Server
Repository repository = iice.getIICEConnection();
// Search for documents
IResultSet documents = iice.searchDocuments(repository);
// Iterate through results set (documents) to retrieve each document
for (int i = 0; i < documents.getRowCount(); i++)
{
// Get the document item
ResultRow item = documents.getRowAt(i);
Content content = repository.getContent(item.getID(),
Content.LATEST_VERSION);
// Get document metadata attributes
iice.getDocumentMetaData(documents, item);
// Retrieve the document
String fileName = iice.retrieveDocument(content);
// View the document using Explorer
iice.viewDocument(fileName);
}
} catch (Exception ex) {
ex.printStackTrace(System.err);
}
}
public Repository getIICEConnection() throws Exception
{
// Get the repository id for our Content Manager IICE connection
User user = new User();
user.initialize();
Repository repository =
user.getRepositoryByID("ContentManagerConnector");
// Set the user id and password for authentication
String userid = "cmuser"
String password = "password";
// Get the connection
repository.logon(userid, password, "");
System.out.println("Connected to CM server");
return repository;
}
public IResultSet searchDocuments(Repository repository) throws Exception
{
// Create a query string to hold our search criteria
Query queryString = repository.createQuery();
// Return only specific document attributes
queryString.addSelectionProperties("CustomerNumber");
queryString.addSelectionProperties("DocumentType");
queryString.addSelectionProperties("Description");
// Search where customer number is equal to 12345
queryString.setSelectionCriteria("CustomerNumber = '12345'");
// Perform search and create results set
IResultSet documents = queryString.executeContentQuery();
// Return results set object
return documents;
}
public void getDocumentMetaData(IResultSet documents, ResultRow item)
throws Exception
{
// Get document metadata attributes
String[] names = documents.getColumnNames();
// For each attribute retrieved
for (int i = 0; i < documents.getColumnCount(); i++) {
// Show the attribute name and value
System.out.println(names[i] + ": " + item.getColumnValue(i) + " ");
}
}
public String retrieveDocument(Content content)throws Exception
{
// Retrieve the original file name
String inputFileName = content.getDefaultFileName();
// Parse the file name from the full path
int pos=inputFileName.lastIndexOf("\\");
inputFileName = inputFileName.substring(pos+1);
// Write the document content to a new file
String fileName =
System.getProperty("user.dir") + File.separator + inputFileName;
System.out.println("Output file name " + fileName);
content.getNativeContentAsFile(fileName);
// Return file name
return fileName;
}
public void viewDocument(String fileName) throws Exception
{
// Use Explorer.exe to view the documents
String VIEWER = "Explorer.exe ";
Runtime rt = Runtime.getRuntime();
// Launch the document with explorer
String cmd = VIEWER + fileName;
rt.exec(cmd);
}
}// end main
运行示例代码的结果
在IBM Rational Application Developer环境中运行示例代码将启动在IBM Content Manager中找到的两个文档,如图21所示。
图21.运行时结果
结论
IBM Content Manager,IBM FileNet P8 Content Manager和IBM Information Integrator Content Edition的Java API提供了在企业应用程序中集成企业内容管理功能的关键元素。 IBM Rational Application Developer是用于开发简单或复杂J2EE应用程序的出色工具。 本教程向您展示了如何配置准备使用这些Java API进行开发的Rational Application Developer环境。 它还显示了如何满足最常见的ECM集成要求,即能够登录,搜索,检索和查看符合特定选择标准的文档。
翻译自: https://www.ibm.com/developerworks/data/tutorials/dm0804hulme/dm0804hulme.html