Создание папки с DFC (Documentum)

Я столкнулся со странной проблемой. Все, что я хочу, это создать новую папку с DFC. Но когда я выполняю код (JUnit или внутри приложения), папка не создается, и, что удивительно, исключение не выдается. Так что думаю ошибка где-то в другом.

Это мой код:

public void createNewFolder(String sFolderName, String sParentId)
{
    IDfSession session = null;
    try 
    {
        session = getSession();     
        IDfFolder newFolder = (IDfFolder) session.newObject("dm_folder");
        newFolder.setObjectName(sFolderName);
        newFolder.link(sParentId);
        newFolder.save();
        String sDump = newFolder.dump();

        System.out.println("Folder ["+sFolderName+"] saved.");
        System.out.println("Folder has id ["+newFolder.getId("r_object_id")+"]");
    }
    catch (DfException e) 
    {
        e.printStackTrace();
    }
    finally
    {
        m_sessionManager.release(session);
    }

В ответ я получаю идентификатор системного объекта, но когда я пытаюсь получить его с помощью оператора dql, я не могу его найти.

В качестве альтернативы я попытался выполнить запрос на создание dql, который создает папку. Это не работает с JUnit или в работающем приложении, но когда я запускаю его вручную, оно просто работает.

Это мой метод getSession()

private IDfSession getSession()
{
    try 
    {
        if (m_sessionManager == null)
        {
                return establishConnection();
        }
        else
        {
            return m_sessionManager.getSession(m_sRepository);
        }
    } 
    catch (DfException e) 
    {
        e.printStackTrace();
    }
    return null;
}

Любые идеи по этому поводу?


person Benjamin Brandmeier    schedule 19.08.2011    source источник
comment
Убедились ли вы, что ваши dfc.properties указывают на тот же экземпляр, который вы ищете для подтверждения? Возвращает ли вам что-нибудь строка newFolder.dump() в вашем коде? Я не вижу, где вы это распечатываете. Если он возвращает вам идентификатор, значит, он создается.   -  person Brendan Hannemann    schedule 24.08.2011
comment
Да, на самом деле я получаю идентификатор обратно, когда я отлаживаю и ищу его. Но сразу после его выполнения я пытаюсь получить его с помощью DQL, но его почему-то нет...   -  person Benjamin Brandmeier    schedule 25.08.2011
comment
Используете ли вы какую-либо транзакцию DFC? Это потребует, чтобы вы совершили это в первую очередь. Я наблюдал странное поведение при смешивании транзакций DFC с DQL даже в рамках одной транзакции. Мое единственное другое предложение состоит в том, чтобы вы дважды проверили Acl, чтобы убедиться, что у вас действительно есть права на него.   -  person Brendan Hannemann    schedule 25.08.2011
comment
Ни одна транзакция DFC не используется. Я также дважды проверил свойства dfc и ACL. Я имею в виду, когда я использую webtop для создания папки в месте назначения с точно тем же пользователем, он просто работает ... или если я выполняю «создать запрос» в редакторе dql, он работает хорошо. но если я выполню это программно, это не будет ни запрос, ни код dfc...   -  person Benjamin Brandmeier    schedule 27.08.2011
comment
Прости, юникрон, позор мне. Вы были абсолютно правы. Я не публиковал свой метод installConnection(), и в этом я действительно использовал вызов transaction.begin(). Удаление этого устраняет все проблемы. Спасибо.   -  person Benjamin Brandmeier    schedule 30.08.2011


Ответы (2)


Под каким пользователем вы пытаетесь создать папку с помощью DFC? Это тот же самый, который вы используете позже для проверки DQL? Если нет, возможно, ACL этой папки не позволяет вам видеть вновь созданную папку с другим пользователем.

person Милош Грбић    schedule 24.08.2011

Благодаря комментариям юникрон. Это фактически позволило мне решить проблему. В моем методе installConnection(), который я не публиковал в вопросе, я фактически использовал beginTransaction(). Удаление решило проблему, и все заработало нормально.

public IDfSession establishConnection(String sUserName, String sPassword, String sRepository) throws DfException 
{
    System.out.println("Login");
    IDfClientX clientX = new DfClientX();

    IDfClient localClient = clientX.getLocalClient();
    IDfSessionManager sessionManager = localClient.newSessionManager();
    IDfLoginInfo loginInfo = new DfLoginInfo();
    loginInfo.setUser(sUserName);
    loginInfo.setPassword(sPassword);
    sessionManager.setIdentity(sRepository, loginInfo);

// THIS IS THE EVIL LINE !
    sessionManager.beginTransaction();

    System.out.println("sessionmanager ist geladen");
    IDfSession session = sessionManager.getSession(sRepository);
    m_sUserName = sUserName;
    m_sRepository = sRepository;
    m_sessionManager = sessionManager;

    return session;
}
person Benjamin Brandmeier    schedule 30.08.2011
comment
строковый код, выполняющий beginTransaction, не так уж и плох, но если вы откроете транзакцию, вам придется зафиксировать ее с помощью commitTransaction, тогда ваш objectId обязательно сохранится в базе данных. - person Donatello; 03.07.2015