在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();
}
}