Liferay门户网站中的文档处理

时间:2011-02-27 22:41:32

标签: java content-management-system liferay jackrabbit document-management

过去两年我一直在使用Liferay,但我从未需要任何广泛的文档管理。

现在我有一个用户上传文档的portlet(MS office OLE2文档,ODS文档,PDF等),我必须使用所有可用的元数据来保存它们。

我知道如何在不使用Liferay的情况下这样做,我可能会使用Apache解决方案与Apache Tika(UpdateRichDocumentsExtractingRequestHandler)或Apache Jackrabbit一起使用Apache Tika(org) .apache.jackrabbit.extractor。*)。

问题是,如果我查看Liferay的主干,有一些关键类:

直接在Hooks (JCRHook, FileSystemHook, CMISHook, s3Hook)范围内使用的

DLLocalServiceImpl

另一个替代方法是使用DLAppLocalServiceImpl使用DLRepositoryLocalServiceImpl并且文件也通过Hooks保存到存储库中,但是在那里完成了很多其他的工作。

  1. Liferay中没有jackrabbit-text-extractors库,所以我想如果我想从PDF,DOC,ODS文档中提取元数据,我会很难...因为DL服务层不接受其他属性

    1. 我想我必须避免使用DL服务和JCR挂钩并直接访问Jackrabbit ...但是我会失去兼容性并且可能会迁移我的存储库等。
  2. 可以请任何人合作这个吗?谢谢

4 个答案:

答案 0 :(得分:2)

SOLR用于索引,Jackrabbit用于文档存储。在代码中管理Liferay文档库非常简单,只需查看DL * LocalServiceUtil类,即DLFolderLocalServiceUtilDLFileLocalServiceUtil。默认情况下,Liferay只是在硬盘驱动器上创建一个匹配的文件夹/文件结构(名称已更改),因此您只需要编写代码或使用Jackrabbit,因为Liferay允许启动/下载和查看开箱即用通过控制面板和各种portlet。

我没有将JackRabbit与Liferay一起使用,但一旦配置完毕,一切都应该在封面下进行管理,你不必担心它在前端。

当你说“所有元数据都可用时”我不确定保留什么,但除了重命名文件以便跟踪它之外,不应该有任何其他更改。通过上传每种类型的文件并检查LIFERAY/data/document_library目录和子目录中的条目,可以快速轻松地进行测试。如果使用Jackrabbit,这将是不同的。

答案 1 :(得分:1)

我认为这两项服务DLLocalServiceImplDLAppLocalServiceImpl都很重要。前一个如果直接访问存储库。请注意,通过此服务添加文件时,您需要将相应的DlFileEntry保存到数据库中,然后引用addFile(....,fileEntryId,...)。

后一项服务正在为您做更多的事情,主要是资产管理和工作流程。

关于您的用例,我会避免使用文档库,因为没有元数据可以进入JCR存储库。实际上,只有您可以存储的元数据/自定义属性才是Liferay门户网站的custom properties AKA Expando功能。

最好的办法似乎是实现自己的jackrabbit钩子将数据存储到存储库中,让Liferay文档库使用该存储库。

答案 2 :(得分:0)

认为埃德加是对的。如果您通过http://svn.liferay.com/repos/public/portal/trunk/portal-service/src/com/liferay/documentlibrary/service/DLLocalService.java(以访客身份登录而无密码)检查当前中继,您将不再找到DLFolderLocalServiceUtil类。我们也在使用现有的DLFolderLocalServiceUtil类。谢谢你的提醒。我们将重构我们的代码,所以当6.1出现时我们仍然可以使用DocumentLibrary服务。

答案 3 :(得分:0)

您需要始终使用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();
    }
}