首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于com.filenet.api.util.UserContext的Filenet认证

基于com.filenet.api.util.UserContext的Filenet认证
EN

Stack Overflow用户
提问于 2017-10-02 07:57:17
回答 1查看 1.6K关注 0票数 1

我有一个示例CeConnection.java类,可以从IBM (http://www-01.ibm.com/support/docview.wss?uid=swg24028788)获得,您可以在消息顶部找到这个类的清单。

因此,我的webapp使用单个用户与内容引擎进行通信(是的,是的,单一的'ce_user‘和'passw123')。请您解释一下,在我的Vaadin中,为每个用户的会话使用这个CeConnection类的良好实践,好方法(vaadin的入口点-- AppMain.java类可以有CeConnection字段)。

下列哪一种方法可以?

代码语言:javascript
复制
1. When the webapp starts I establish connection: 
  void init() {  // this is vaadins entry point

  ceConnection  = new CeConnection();

  ceConnection.establishConnection(...);

  }



OR

2. Create new CeConnection for every request to Content Engine. like:

    Document getDoc(String id) {
         CeConnection ceConnection = new CeConnection(...) 
         try {
         ceConnection.establish(); // (contains UserContext.pushSubject)

         ...get data from CE....
         } finally {
         ceConenction.logofMethod();  (contains UserContext.popSubject)
         }
        }

谢谢!

代码语言:javascript
复制
/**
    IBM grants you a nonexclusive copyright license to use all programming code 
    examples from which you can generate similar function tailored to your own 
    specific needs.

    All sample code is provided by IBM for illustrative purposes only.
    These examples have not been thoroughly tested under all conditions.  IBM, 
    therefore cannot guarantee or imply reliability, serviceability, or function of 
    these programs.

    All Programs or code component contained herein are provided to you �AS IS � 
    without any warranties of any kind.
    The implied warranties of non-infringement, merchantability and fitness for a 
    particular purpose are expressly disclaimed.

    � Copyright IBM Corporation 2007, ALL RIGHTS RESERVED.
 */

package cesample;

import java.util.Iterator;
import java.util.Vector;
import javax.security.auth.Subject;
import com.filenet.api.collection.ObjectStoreSet;
import com.filenet.api.core.Connection;
import com.filenet.api.core.Domain;
import com.filenet.api.core.Factory;
import com.filenet.api.core.ObjectStore;
import com.filenet.api.util.UserContext;

/**
 * This object represents the connection with
 * the Content Engine. Once connection is established
 * it intializes Domain and ObjectStoreSet with
 * available Domain and ObjectStoreSet.
 * 
 */
public class CEConnection 
{
    private Connection con;
    private Domain dom;
    private String domainName;
    private ObjectStoreSet ost;
    private Vector osnames;
    private boolean isConnected;
    private UserContext uc;

    /*
     * constructor
     */
    public CEConnection()
    {
        con = null;
        uc = UserContext.get();
        dom = null;
        domainName = null;
        ost = null;
        osnames = new Vector();
        isConnected = false;
    }

    /*
     * Establishes connection with Content Engine using
     * supplied username, password, JAAS stanza and CE Uri.
     */
    public void establishConnection(String userName, String password, String stanza, String uri)
    {
        con = Factory.Connection.getConnection(uri);
        Subject sub = UserContext.createSubject(con,userName,password,stanza);
        uc.pushSubject(sub);
        dom = fetchDomain();
        domainName = dom.get_Name();
        ost = getOSSet();
        isConnected = true;
    }

    /*
     * Returns Domain object.
     */
    public Domain fetchDomain()
    {
        dom = Factory.Domain.fetchInstance(con, null, null);
        return dom;
    }

    /*
     * Returns ObjectStoreSet from Domain
     */
    public ObjectStoreSet getOSSet()
    {
        ost = dom.get_ObjectStores();
        return ost;
    }

    /*
     * Returns vector containing ObjectStore
     * names from object stores available in
     * ObjectStoreSet.
     */
    public Vector getOSNames()
    {
        if(osnames.isEmpty())
        {
            Iterator it = ost.iterator();
            while(it.hasNext())
            {
                ObjectStore os = (ObjectStore) it.next();
                osnames.add(os.get_DisplayName());
            }
        }
        return osnames;
    }

    /*
     * Checks whether connection has established
     * with the Content Engine or not.
     */
    public boolean isConnected() 
    {
        return isConnected;
    }

    /*
     * Returns ObjectStore object for supplied
     * object store name.
     */
    public ObjectStore fetchOS(String name)
    {
        ObjectStore os = Factory.ObjectStore.fetchInstance(dom, name, null);
        return os;
    }

    /*
     * Returns the domain name.
     */
    public String getDomainName()
    {
        return domainName;
    }
}

编辑:添加

我想知道,如果两个客户机几乎同时调用servlet方法,而一个客户机首先调用PopSubject,会发生什么?com.filenet.api.util.UserContext类线程安全吗?

servlet方法:

代码语言:javascript
复制
public String getDocumentNumber(String id) {

 UserContext.get().pushSubject(mySubject);
 try {
   ....
   ....
   ....
   ....
 } finally {
   UserContext.get().popSubject();
 }

}

//com.filenet.api.util.UserContext类

代码语言:javascript
复制
public static UserContext get() {
        UserContext cntx = (UserContext)tl.get();
        if(cntx == null) {
            cntx = new UserContext();
            tl.set(cntx);
        }

        return cntx;
    }


public synchronized void pushSubject(Subject sub) {

        if(sub == null) {
            throw new EngineRuntimeException(ExceptionCode.E_NULL_OR_INVALID_PARAM_VALUE, "Subject");
        } else {
            this.subjects.add(sub);
        }
}


public synchronized Subject popSubject() {

        return this.subjects.isEmpty()?null:(Subject)this.subjects.remove(this.subjects.size() - 1);
}
EN

回答 1

Stack Overflow用户

发布于 2017-10-03 14:56:22

我建议在需要时连接到CE,而不是在应用程序加载期间。在应用程序启动时进行连接没有什么害处,因为CE对象存储只是一个POJO,但是我更喜欢在需要的时候。

此外,从您的代码中,我可以看到您使用了ceConenction.logofMethod();,一个警告是,在完成所有CE操作时,您需要调用此方法,否则会出现错误。让我们举个例子

  1. 用户登录
  2. 用户想要添加一个文档,以便建立连接
  3. 您的代码添加了文档
  4. 然后执行最后一个块,然后执行ceConenction.logofMethod();
  5. 在此之后,如果您希望用户执行任何CE操作,如删除或更新,您将得到一个异常。所以你得再买一次对象商店。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46521548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档