DSpace 5.4 XMLUI - 更改文件名

时间:2016-04-22 11:28:21

标签: java dspace

我们在DSpace XMLUI工作流程中实施了一个新步骤。此步骤更改上载文件的文件名。 我们已经尝试了两种不同的方法:

  • 第一个:我们遵循了提示 here。 问题是我们的编辑(他们有自己的用户组)是 显然没有授权进行文件名更改。即使我们给了 它们在所有可选择的集合中具有比特流写入权限 授权错误仍然存​​在。


我们的方法如下:

private void updateFileName(DBConnection dspaceDbConnection, Context c, Item item, String fName)
            throws Exception {

        Bundle[] bundles = item.getBundles("ORIGINAL");
        for (int i = 0; i < bundles.length; i++) {
            Bitstream[] bitstreams = bundles[i].getBitstreams();
            for (int j = 0; j < bitstreams.length; j++) {
                bitstreams[j].setName(fileName);
                bitstreams[j].update();
                log.info("file name change:" + fileName);
            }
        }
        c.commit();
  • 由于没有成功,我们决定直接在数据库上通过java方法更改文件名(SQL,类似于UPDATE metadatavalue SET text_value = ...)。 除了索引不更新我们的数据库更改之外,它工作得很好。

    因此我们得到以下问题:
  • 在DSpace中更改文件名的首选或最佳方法是什么?
  • 是否有可行的方法告诉索引对数据库进行特定更改? 或
  • 有没有办法为DSpace组授予更改比特流元数据的权限?


提前感谢您的建议!

2 个答案:

答案 0 :(得分:1)

您可以使用方法context.turnOffAuthorisationSystem()来临时阻止授权异常的发生。确保在使用方法context.restoreAuthSystemState()调用context.commit()后恢复授权!

例如:

private void updateFileName(DBConnection dspaceDbConnection, Context c, Item item, String fName)
            throws Exception {   
try{
        c.turnOffAuthorisationSystem()
        Bundle[] bundles = item.getBundles("ORIGINAL");
        for (int i = 0; i < bundles.length; i++) {
            Bitstream[] bitstreams = bundles[i].getBitstreams();
            for (int j = 0; j < bitstreams.length; j++) {
                bitstreams[j].setName(fileName);
                bitstreams[j].update();
                log.info("file name change:" + fileName);
            }
        }
        c.commit();
}
finally {
       c.restoreAuthSystemState()
}

答案 1 :(得分:1)

查看DSpace 5x代码,我在创建项目时会在Item.create()中调用以下内容。

    // Call update to give the item a last modified date. OK this isn't
    // amazingly efficient but creates don't happen that often.
    context.turnOffAuthorisationSystem();
    i.update();
    context.restoreAuthSystemState();

    context.addEvent(new Event(Event.CREATE, Constants.ITEM, i.getID(), 
            null, i.getIdentifiers(context)));

请参阅https://github.com/DSpace/DSpace/blob/dspace-5_x/dspace-api/src/main/java/org/dspace/content/Item.java#L179-L186

对于比特流,存在以下方法Bitstream.updateLastModified()。

public void updateLastModified()
{
    //Also fire a modified event since the bitstream HAS been modified
    ourContext.addEvent(new Event(Event.MODIFY, Constants.BITSTREAM, getID(), null, getIdentifiers(ourContext)));
}

请参阅https://github.com/DSpace/DSpace/blob/dspace-5_x/dspace-api/src/main/java/org/dspace/content/Bitstream.java#L728-L734

您是否尝试获取索引以发现已分配给比特流的文件名?我不相信文件名是全文(SOLR)索引。