首页 > 代码库 > EMC-- DFC --Sessions and Session Managers
EMC-- DFC --Sessions and Session Managers
DFC - Documentum Foundation Classes
位于Content server和client 之间。 用来做服务端业务逻辑和客制。
BOF- Business Object Framework.
模组。 最重要的两个模组是
1. TBOs --type based objects
2. SBOs-- service based objects
3. Aspect -- similar to TBOs. enable you to attach properties and behavior on an instance-by-instace basic.
DFC的运行点
1. 运行content server的机器。 as call from a mthod.
2. 中间层系统。 as an application server
DFC除了DfClientC和 异常类及其子类(DfException),大部分类都是通过工厂方法 实例化。
如何得到一个session
1. 通过 IDfClient.newSessionMangager的方式创建一个IDfSessionManger
2. 从session manager中得到一个session. IDfSessionManger.newSession
3. session使用完成之后需要释放
4. IDfSessionManger.getSession 得到的是公用的session
clientx.getLocalClient() 这个方法会去找dfc的配置文件
IDfSessionManager.ALL_DOCBASES . 对于所有的docbases, 设置单一的身份
如果session manager有多重身份, 可以懒加载。 但是需要确认是否以及有此身份,如果有需先清空之前的身份信息,才能setIdentity否则会报错误。
package com.dev.guide.ch2; import com.documentum.com.DfClientX; import com.documentum.com.IDfClientX; import com.documentum.fc.client.DfServiceException; import com.documentum.fc.client.IDfClient; import com.documentum.fc.client.IDfSessionManager; import com.documentum.fc.common.DfException; import com.documentum.fc.common.IDfLoginInfo; public class TestSession { private IDfSessionManager sessionManager; IDfClientX clientx; public IDfSessionManager getSessionManager() { sessionManager = null; try { clientx = new DfClientX(); IDfClient client = clientx.getLocalClient(); sessionManager = client.newSessionManager(); } catch (DfException e) { e.printStackTrace(); } return sessionManager; } public IDfSessionManager getSessionManager(String userName, String password) { sessionManager = null; try { clientx = new DfClientX(); IDfClient client = clientx.getLocalClient(); sessionManager = client.newSessionManager(); IDfLoginInfo loginInfo = clientx.getLoginInfo(); loginInfo.setUser(userName); loginInfo.setPassword(password); sessionManager.setIdentity(IDfSessionManager.ALL_DOCBASES, loginInfo); } catch (DfException e) { e.printStackTrace(); } return sessionManager; } public void addIdentity(String repository, String userName, String password) { try { IDfLoginInfo loginInfo = clientx.getLoginInfo(); loginInfo.setUser(userName); loginInfo.setPassword(password); if (sessionManager.hasIdentity(repository)) { sessionManager.clearIdentity(repository); } sessionManager.setIdentity(repository, loginInfo); } catch (DfServiceException e) { e.printStackTrace(); } } public static void main(String[] args) { // TODO Auto-generated method stub TestSession testSession = new TestSession(); testSession.getSessionManager("dm_bof_registry", "dctmecmq"); testSession.addIdentity("ecmq", "dm_bof_registry", "dctmecmq"); } }
setIdentity不会验证登录信息的正确与否, 而是到getSession或是newSession的时候验证。但是你可以调用IDfSessionManger.authenticate的方法来验证。
getSession -- 得到共享session
newSession --得到私有的session
session需及时释放,尽量不要保存使用。 释放时放在 finally的程序段里。
一些遗留的程序直接从IDfClient获取sessions, 在这种状况下,使用IDfSession.disconnet的方式释放。
当引用一个存在的session , 像session作为type object的数据成员的时候, 不能够释放session.
比如通过这种方式获取的: IDfTypedObject.getSession
同一个session不能被释放两次 ,否则会抛出异常。
session释放之后也不能再使用了。
根据现有的session,得到另外一个repository有两种方式
1. 通过session得到sessionmanger, 使用sessionmanager传入repository, 获取session. 两个session都需要释放。
2. 使用relateSession的方式。session.getRelatedSession. 这种session不需要显示释放。
早期DFC使用 setDocbaseScope方式创建子连接的方式不再推荐使用。
original 和object sessions
一般来说, 两者是一样的
事务
分为 session manager level 和 session level
IDfSessionManagerConfig
IDfSessionManager.getConfig的方式获得。
可以设置本地话, 时区,动态组,和应用程式代码设置。
使用登录门票获取session
login ticket可以使用IDfSession里的方法获取
1. 第一个使用是已经有了认证session, 需要链接进入WDK-based的程序。 使用URL方式传入, 就不需要再登录了。
2. 第二个使用是授予其他人权限。一般用在流程方法等。
获得login tickets的方法
1. getLoginTicket -- 不需要获得ticket的session是super user
2. getLoginTicketEx -- 获得ticket的session是super user,
3. getLoginTicketForUser -- 获得ticket的session是属于superuser. 当前登录的人是superuser
principal authentication support
Maintaining state in a session manager
可以使session manager维持一个repository object的状态。 通过调用IDfTypedObject的 setSessionManager.
这个方法把对象的状态从session复制到session manager, 这样的话,session 断开也不会导致对象无效。
注意:谨慎使用setSessionManager,这是一个花销很大的方法。
但是,使用setSessionManager比使用 begin/end client control 的机制防止session从session manager断开要好。