在XT上可以预设条目模板(EntryTemplate)来达到模板化控制上传文档安全性和属性等信息的作用。而EntryTemplate本身可以与Folder相关联(一个Folder可以关联多个EntryTemplate),这样我们在XT上的某个Folder下上传即可按照我们所要设置的值进行设置文档安全性和属性信息了,而省去了手动操作,这对zhy天津分公司的业务很有必要,原因是客户在这里总体上有三个基本组,是对所有Folder下的document具备相同权限,而另外另个特殊的组,可能根据不同Folder的不同即不同。
这些工作在XT上可以轻松通过配置来完成,但作为定制化开发的应用程序,在最初实现时客户并无此要求,最初有这种特殊需求满可以定制特殊的权限管理来完成,但这仅能指标,原因是这样也会是客户做两套动作,一个是在XT上进行,另一个则是在定制的应用上进行。最好的办法是后进行的应用能够直接读取XT的相关EntryTemplate权限在对应folde下传documet时,进行相关设置。
不过,由于FileNet本身并没有提供直接的根据Folder获取EntryTemplate的API。而如果要通过遍历整个EntryTemplate来解决获取folder对应的EntryTemplate,一者需要应用维持一种关系(从一定意义上讲,还是得客户进行两套动作,而不是时时一致的状态),二者遍历的工作量也相当大。
经过分析zhy天津分公司EntryTemplate和Folder的特点,可以发现在Folder的Annotations中包含着EntryTemplate对应文档的序列号,可以根据它来获取相关EntryTemplate的内容,从而解析出相关权限,进行设置。本案例的特殊性在于Folder的Annotations中仅存在EntryTemplate的序列号(以文件形式存储,需要解析出特定notes的值)。具体操作过程示意代码如下所示:
//获取folder关联entry template 的序列的id
public void testWhatIsFolderAnnotationsTextId(){
Connection connection = CEHelper.getConnection();
CEHelper.pushSubject(connection);
ObjectStore os = CEHelper.getObjectStore(connection);
try{
Folder folder = Factory.Folder.fetchInstance(os, new Id("{F78C8CE7-94FE-47CA-94E4-19A78EEBBF9E}"), null);
AnnotationSet get_Annotations = folder.get_Annotations();
Iterator iterator = get_Annotations.iterator();
while(iterator.hasNext()){
Annotation annotation = (Annotation)iterator.next();
logger.info("annotation.get_Name() = " + annotation.get_Name());
DocumentBuilderFactory docBuilderFactory = javax.xml.parsers.DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = null;
docBuilder = docBuilderFactory.newDocumentBuilder();
org.w3c.dom.Document doc = docBuilder.parse(annotation.accessContentStream(0));
NodeList parameters = doc.getElementsByTagName("object");
Node rootNode = null;
if (parameters != null) {
rootNode = parameters.item(0);
}
Element ele = (Element)rootNode;
NodeList elementsByTagName = ele.getElementsByTagName("setting");
Node item = elementsByTagName.item(1);
logger.info("item.getNodeName() = " + item.getNodeName());
logger.info("item.getNodeValue() = " + item.getNodeValue());
logger.info("item.getTextContent() = " + item.getTextContent());
}
}catch(Exception e){
e.printStackTrace();
}finally{
CEHelper.popSubject();
}
}
//根据序列ID获取相应entry template的安全性等内容
public void testGetVersionSeries(){
Connection connection = CEHelper.getConnection();
CEHelper.pushSubject(connection);
ObjectStore os = CEHelper.getObjectStore(connection);
try{
String docId = "{60CFDD81-C2DA-46F3-A98E-B49A125930F9}";
VersionSeries fetchInstance = Factory.VersionSeries.fetchInstance(os, new Id(docId), null);
logger.info(fetchInstance.get_Id().toString());
Document doc = (Document)fetchInstance.get_CurrentVersion();
org.w3c.dom.Document w3cDoc = WcmXMLUtil.getDocumentFromInputStream(doc.accessContentStream(0));
EntryTemplateParser parser = new EntryTemplateParser(w3cDoc);
String className = parser.getClassName();
String classId = parser.getId();
List permissionList = parser.getPermissionList();
List propertyList = parser.getPropertyList();
Iterator iterator = permissionList.iterator();
while(iterator.hasNext()){
String item = (String)iterator.next();
logger.info(item.toString());
}
}catch(Exception e){
e.printStackTrace();
}finally{
CEHelper.popSubject();
}
}
//设置文档安全性
public void testPermission(){
Connection connection = CEHelper.getConnection();
CEHelper.pushSubject(connection);
ObjectStore os = CEHelper.getObjectStore(connection);
try{
Document doc = Factory.Document.createInstance(os, "GeneralClass");
AccessPermissionList createList = Factory.AccessPermission.createList();
AccessPermission createInstance2 = Factory.AccessPermission.createInstance();
createInstance2.set_AccessMask(131073);
createInstance2.set_AccessType(AccessType.ALLOW);
createInstance2.set_GranteeName("#AUTHENTICATED-USERS");
createInstance2.set_InheritableDepth(-1);
AccessPermission createInstance3 = Factory.AccessPermission.createInstance();
createInstance3.set_AccessMask(998871);
createInstance3.set_AccessType(AccessType.ALLOW);
createInstance3.set_GranteeName("fnadmins");
createInstance3.set_InheritableDepth(-1);
createList.add(createInstance2);
createList.add(createInstance3);
doc.getProperties().putValue("DocumentTitle", "log4j_3.log");
String minType = "application/octet-stream";
doc.set_MimeType(minType);
doc.checkin(AutoClassify.DO_NOT_AUTO_CLASSIFY, CheckinType.MAJOR_VERSION);
doc.save(RefreshMode.REFRESH);
Folder folder = Factory.Folder.fetchInstance(os, new Id("{0BCA05B3-6A0A-407C-B17A-503FA4070193}"), null);
ReferentialContainmentRelationship rcr = folder.file(doc, AutoUniqueName.NOT_AUTO_UNIQUE, null, DefineSecurityParentage.DO_NOT_DEFINE_SECURITY_PARENTAGE);
rcr.save(RefreshMode.REFRESH);
doc.set_Permissions(createList);
doc.save(RefreshMode.NO_REFRESH);
}catch(Exception e){
e.printStackTrace();
}finally{
CEHelper.popSubject();
}
}