Обработка документов на портале Liferay - PullRequest
4 голосов
/ 28 февраля 2011

За последние 2 года я часто пользуюсь Liferay, но мне никогда не требовалось обширного управления документами.

Теперь у меня есть портлет, куда пользователи загружают документы (документы MS Office OLE2, документы ODS, PDF и т. Д.), И я должен сохранять их со всеми доступными метаданными.

Я знаю, как бы это сделать без использования Liferay, я бы, вероятно, использовал Apache Solr с Apache Tika ( UpdateRichDocuments и ExtractingRequestHandler ) или Apache Jackrabbit, которые используют Apache Tika под капот (org.apache.jackrabbit.extractor. *).

Проблема в том, что, если я посмотрю на ствол Liferay, есть несколько ключевых классов:

Hooks (JCRHook, FileSystemHook, CMISHook, s3Hook), которые заняты изнутри DLLocalServiceImpl вроде напрямую

Другой альтернативой является использование DLAppLocalServiceImpl, в котором используется DLRepositoryLocalServiceImpl, и файлы сохраняются в хранилище также через хуки, но там делается много дополнительных вещей.

  1. В Liferay нет библиотеки jackrabbit-text-extractors, поэтому я полагаю, что если бы я хотел извлечь метаданные из документов PDF, DOCs, ODS, у меня были бы очень трудные времена ... потому что уровень обслуживания DL не принимает дополнительные свойства

    1. Я думаю, что мне придется избегать использования служб DL и перехвата JCR и получать прямой доступ к Jackrabbit ... Но я бы потерял совместимость и возможность перенести мой репозиторий и т. Д.

Может ли кто-нибудь поработать над этим, пожалуйста? Спасибо

Ответы [ 4 ]

2 голосов
/ 28 февраля 2011

SOLR для индексации, Jackrabbit для хранения документов. Управлять Liferay Document Library в коде довольно просто, достаточно взглянуть на классы DL * LocalServiceUtil, а именно DLFolderLocalServiceUtil и DLFileLocalServiceUtil. По умолчанию Liferay просто создает подходящую структуру папок / файлов на жестком диске (с измененными именами), поэтому вам нужно будет только написать код или использовать Jackrabbit, если вы хотите больше, чем это, поскольку Liferay позволяет загружать / скачивать и просматривать прямо из коробки через панель управления и различные портлеты.

Я не использовал JackRabbit с Liferay, но после настройки все должно управляться под прикрытием, и вам не нужно беспокоиться об этом на внешнем интерфейсе.

Когда вы говорите «со всеми доступными метаданными» Я не уверен, что сохраняется, но кроме переименования файла, чтобы его можно было отслеживать, никаких других изменений быть не должно. Тестирование должно быть быстрым и простым, загрузив файл каждого типа и проверив записи в каталоге и подкаталогах LIFERAY/data/document_library. Опять же, это было бы иначе, если бы использовался джекраббит.

1 голос
/ 21 марта 2011

эти две службы DLLocalServiceImpl и DLAppLocalServiceImpl обе являются и, я полагаю, важными. Первый, если для прямого доступа к хранилищу. Обратите внимание, что при добавлении файла через этот сервис вам необходимо сохранить соответствующий DlFileEntry в базе данных, а затем ссылаться на этот addFile (...., fileEntryId, ...).

Последний сервис делает для вас дополнительные вещи, в основном управление активами и рабочий процесс.

Что касается вашего варианта использования, я бы не стал использовать библиотеку документов, потому что никакие метаданные не могут попасть в репозиторий JCR. На самом деле только метаданные / пользовательские свойства, которые вы можете сохранить, будут custom properties AKA Expando функцией портала Liferay.

Наилучшим способом для вас, по-видимому, является реализация собственной ловушки на крольчатнике для хранения данных в репозитории, и позволить библиотеке документов Liferay использовать этот репозиторий.

0 голосов
/ 21 августа 2013

Вам необходимо всегда использовать DLAppServiceUtil (как конкретно указано Liferay). Вот мой рабочий код, который сохраняет файл в CMS:

public static void saveFileToCMS(ActionRequest aReq, long groupId, String fileName, File filenameWithPath) {
    try {
        ServiceContext serviceContext = ServiceContextFactory.getInstance(
                Group.class.getName(), aReq);

        // prevents duplicate entries based on unique title name
        Random rand = new Random();
        Integer suffix = new Integer(rand.nextInt(10000));

        DLAppServiceUtil.addFileEntry(groupId, 0, fileName, "application/vnd.ms-excel",
                fileName + suffix.toString(), "description goes here", "changelogname",
                filenameWithPath, serviceContext);

        //log.info("Successfully added the new file");

    } catch (PortalException pe) {
        log.error("Portal Exception occurred while saving file to CMS");
        pe.printStackTrace();
    } catch (SystemException e) {
        log.error("System Exception occurred while saving file to CMS");
        e.printStackTrace();
    }
}
0 голосов
/ 17 марта 2011

Думаю, Эдгар прав.Если вы проверите текущий транк через http://svn.liferay.com/repos/public/portal/trunk/portal-service/src/com/liferay/documentlibrary/service/DLLocalService.java (войдите как гость и не пароль), вы больше не найдете класс DLFolderLocalServiceUtil.Мы также используем существующий класс DLFolderLocalServiceUtil.Спасибо за внимание.Мы проведем рефакторинг нашего кода, поэтому, когда выйдет 6.1, мы все равно сможем использовать службы DocumentLibrary.

...