Аутентификация файловой сети через com.filenet.api.util.UserContext
У меня есть демо-пример CeConnection.java
класс, доступный на сайте IBM ( http://www-01.ibm.com/support/docview.wss?uid=swg24028788) список этого класса, который вы можете найти в верхней части сообщения.
Итак, мое веб-приложение взаимодействует с Content Engine, используя одного пользователя (да, да, один ce_user с passw123). И не могли бы вы объяснить, хорошая практика, хороший подход, чтобы использовать это CeConnection
класс для каждого сеанса пользователя в моем веб-приложении Vaadin (точка входа vaadin - класс AppMain.java может иметь CeConnection
поле).
Какой из следующих подходов подходит?
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)
}
}
Спасибо!
/**
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;
}
}
РЕДАКТИРОВАТЬ: ДОБАВЛЕНО
Мне интересно, что произойдет, если два клиента будут вызывать метод сервлета почти одновременно, а один клиент сначала вызовет PopSubject? Является ли класс com.filenet.api.util.UserContext потокобезопасным?
метод сервлета:
public String getDocumentNumber(String id) {
UserContext.get().pushSubject(mySubject);
try {
....
....
....
....
} finally {
UserContext.get().popSubject();
}
}
//com.filenet.api.util.UserContext class
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);
}
1 ответ
Я бы предложил подключиться к CE, когда это необходимо, а не во время загрузки приложения. Никакого вреда при подключении, пока приложение запускается, так как хранилище объектов CE - это просто POJO, но я бы предпочел, когда мне это нужно.
Также из вашего кода я мог видеть, что вы использовали ceConenction.logofMethod();
предостережение в том, что вам нужно вызывать этот метод, когда вы закончите со всеми вашими операциями CE, в противном случае вы получите ошибки. Давайте возьмем пример
- Пользователи входят в систему
- Пользователь хочет, скажем, добавить документ, чтобы вы установили соединение
- Ваш код добавляет документ
- тогда ваш блок finally выполняется и
ceConenction.logofMethod();
- Сразу после этого, если вы хотите, чтобы пользователь выполнял какие-либо операции CE, такие как удаление или обновление, вы получите исключение. Так что вам нужно снова получить ObjectStore.
Надеюсь это поможет.