2015-06-19 3 views
1

Когда я загружаю папки как zip, тип которых не является cm: папкой, я получаю пустой zip-архив. Для папок с типом контента cm: и для документов он работает правильно.Загрузите папку Zip с настраиваемой папкой типа

Подробнее:

В нашем проекте мы создали пользовательский тип папки, которые родителя типа cm:folder:

<type name="ef:folder"> 
    <title>Parent of all folders</title> 
    <parent>cm:folder</parent> 
    <mandatory-aspects> 
    <aspect>ef:typed</aspect> 
    </mandatory-aspects> 
</type> 

Проблема заключается в том, что, когда я нажимаю Скачать в Zip кнопки для выбранной папки (ы) я получаю пустой zip-файл. Оно происходит от startNode метода ZipDownloadExporter.java:

@Override 
public void startNode(NodeRef nodeRef) 
{ 
    this.currentName = (String)nodeService.getProperty(nodeRef, ContentModel.PROP_NAME); 
    path.push(new Pair<String, NodeRef>(currentName, nodeRef)); 
    if (ContentModel.TYPE_FOLDER.equals(nodeService.getType(nodeRef))) 
    { 
    String path = getPath() + PATH_SEPARATOR; 
    ZipArchiveEntry archiveEntry = new ZipArchiveEntry(path); 
    try 
    { 
     zipStream.putArchiveEntry(archiveEntry); 
     zipStream.closeArchiveEntry(); 
    } 
    catch (IOException e) 
    { 
     throw new ExporterException("Unexpected IOException adding folder entry", e); 
    } 
    } 
} 

Поскольку пользовательские папки имеет тип ef:folder эта проверка возвращает ложь:

if (ContentModel.TYPE_FOLDER.equals(nodeService.getType(nodeRef))) 

и папка не добавляется в почтовый индекс.

Является ли это ошибкой (возможно, правильным решением было бы проверить не только тип узла, но и родительский тип)?

Как это можно было бы устранить без создания пользовательского экспортера для пользовательских типов папок?

Из-за ограничения типа проекта папка не может быть изменена на папку cm:.

ответ

4

Я должен был решить ту же проблему. Чтобы исправить это, вам действительно понадобится проверка подтипа папки cm:, поэтому вам необходимо иметь словарьсервисы внутри этого класса. Делать это довольно утомительно, но вот мое решение:

Override боб с идентификатором «createDownloadArchiveAction», и глотают serviceregistry в нее =>

<bean id="createDownloadArchiveAction" class="org.alfresco.repo.download.CreateDownloadArchiveActionSR" parent="action-executer"> 
    <property name="checkOutCheckInSerivce" ref="checkOutCheckInService"/> 
    <property name="contentServiceHelper" ref="downloadContentServiceHelper" /> 
    <property name="downloadStorage" ref="downloadStorage" /> 
    <property name="exporterService" ref="exporterComponent" /> 
    <property name="maximumContentSize" value="${download.maxContentSize}" /> 
    <property name="nodeService" ref="nodeService" /> 
    <property name="publicAction" value="false"/> 
    <property name="transactionHelper" ref="retryingTransactionHelper"/> 
    <property name="updateService" ref="downloadStatusUpdateService"/> 
    <property name="serviceRegistry"> 
    <ref bean="ServiceRegistry" /> 
    </property> 

В этом новом классе, вам должны направить serviceregistry к ZipDownloadExporter =>

private void createDownload(final NodeRef actionedUponNodeRef, ExporterCrawlerParameters crawlerParameters, SizeEstimator estimator) 
    { 
     // perform the actual export 
     final File tempFile = TempFileProvider.createTempFile(TEMP_FILE_PREFIX, TEMP_FILE_SUFFIX); 
     final MyZipDownloadExporter handler = new MyZipDownloadExporter (tempFile, checkOutCheckInService, nodeService, transactionHelper, updateService, downloadStorage,serviceRegistry, actionedUponNodeRef, estimator.getSize(), estimator.getFileCount()); 

в этом классе MyZipDownloadExporter теперь вы можете сделать проверку подтипа:

public void startNode(NodeRef nodeRef) 
    { 
     this.currentName = (String)nodeService.getProperty(nodeRef, ContentModel.PROP_NAME); 
     path.push(new Pair<String, NodeRef>(currentName, nodeRef)); 
     if (this.sr.getDictionaryService().isSubClass((nodeService.getType(nodeRef), ContentModel.TYPE_FOLDER)) 
     { .... 
Смежные вопросы