Как загрузить новую версию файла с помощью WebScript?

У меня есть простое приложение Spring (интерфейсное приложение), которое загружает файлы в репозиторий Alfresco. Если файл уже существует, его новая версия не создается.

Веб-скрипт репозитория представлен ниже:

public class CustomFileUploader extends DeclarativeWebScript {

    private static final String FIRM_DOC = 
        "{http://www.firm.com/model/content/1.0}someDoc";
    private static final String FIRM_DOC_FOLDER = 
        "workspace://SpacesStore/8caf07c3-6aa9-4a41-bd63-404cb3e3ef0f";

    private FirmFile firmFile;

    private FileFolderService fileFolderService;
    private ContentService contentService;

    protected Map<String, Object> executeImpl(WebScriptRequest req, 
            Status status) {
        retrievePostRequestParams(req);
        writeContent();

        return null;
    }

    private void retrievePostRequestParams(WebScriptRequest req) {
        FormData formData = (FormData) req.parseContent();
        FormData.FormField[] fields = formData.getFields();

        for(FormData.FormField field : fields) {
            String fieldName = field.getName();
            String fieldValue = field.getValue();

            if (fieldName.equalsIgnoreCase("firm_file") 
                    && field.getIsFile()) {
                String fileName = field.getFilename();
                Content fileContent = field.getContent();
                String fileMimetype = field.getMimetype();

                firmFile = new FirmFile(fileName, fileContent, 
                    fileMimetype, FIRM_DOC);
            }
        }
    }

    private void writeContent() {
        try {
            NodeRef parentNodeRef = new NodeRef(FIRM_DOC_FOLDER);
            NodeRef fileNodeRef = createFileNode(parentNodeRef, 
                firmFile.getFileName());

            ContentWriter contentWriter = contentService.getWriter(fileNodeRef, 
                ContentModel.PROP_CONTENT, true);
            contentWriter.setMimetype(firmFile.getFileMimetype());
            contentWriter.putContent(firmFile.getFileContent().getInputStream());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private NodeRef createFileNode(NodeRef parentNode, String fileName) {
        try {
            QName contentQName = QName.createQName(FIRM_DOC);
            FileInfo fileInfo = fileFolderService.create(parentNode, 
                fileName, contentQName);

            return fileInfo.getNodeRef();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public FileFolderService getFileFolderService() {
        return fileFolderService;
    }

    public void setFileFolderService(FileFolderService fileFolderService) {
        this.fileFolderService = fileFolderService;
    }

    public ContentService getContentService() {
        return contentService;
    }

    public void setContentService(ContentService contentService) {
        this.contentService = contentService;
    }
}

Как создать новую версию файла с тем же именем, используя WebScript на базе Java?

Правильно ли это решение?

Проверьте, существует ли файл с помощью поиска Lucene: TYPE:"firm:doc" AND @cm\:name:contract.png; (например) Если существует, увеличьте свойство cm:versionLabel и создайте новую версию Node со всеми свойствами (на самом деле, необходимо перебрать все ResultSet и найти NodeRef с максимальным значением cm:versionLabel затем увеличьте его и создайте новый Node). Есть ли более изящное решение?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
179
1

Ответы 1

Решение можно представить следующим образом:

public class CustomFileUploader extends DeclarativeWebScript {
    private static final String FIRM_DOC = "{http://www.firm.com/model/content/1.0}doc";
    private static final String FIRM_DOC_FOLDER = "workspace://SpacesStore/8caf07c3-6aa9-4a41-bd63-404cb3e3ef0f";

    private FileFolderService fileFolderService;
    private ContentService contentService;
    private NodeService nodeService;
    private SearchService searchService;

    protected Map<String, Object> executeImpl(WebScriptRequest req, Status status) {
        processUpload(req);
        return null;
    }

    private void writeContent(NodeRef node, FirmFile firmFile) {
        try {
            ContentWriter contentWriter = contentService.getWriter(node, ContentModel.PROP_CONTENT, true);
            contentWriter.setMimetype(firmFile.getFileMimetype());
            contentWriter.putContent(firmFile.getFileContent().getInputStream());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private NodeRef checkIfNodeExists(String fileName) {
        StoreRef storeRef = new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore");
        ResultSet resultSet = searchService.query(storeRef, SearchService.LANGUAGE_LUCENE/*LANGUAGE_FTS_ALFRESCO*/, 
                "TYPE:\"firm:doc\" AND @cm\\:name:" + fileName.replaceAll(" ", "\\ ")+ "");

        int len = resultSet.length();
        if (len == 0) { 
            return null;
        }

        NodeRef node = resultSet.getNodeRef(0);
        return node;
    }

    private NodeRef createNewNode(FirmFile firmFile) {
        NodeRef parent = new NodeRef(FIRM_DOC_FOLDER);
        NodeRef node = createFileNode(parent, firmFile.getFileName());

        return node;
    }

    private void processUpload(WebScriptRequest req) {
        FormData formData = (FormData) req.parseContent();
        FormData.FormField[] fields = formData.getFields();

        for(FormData.FormField field : fields) {
            String fieldName = field.getName();
            if (fieldName.equalsIgnoreCase("firm_file") && field.getIsFile()) {
                String fileName = field.getFilename();
                Content fileContent = field.getContent();
                String fileMimetype = field.getMimetype();

                NodeRef node = checkIfNodeExists(fileName);

                // POJO
                FirmFile firm = new FirmFile(fileName, fileContent, fileMimetype, FIRM_DOC);
                if (node == null) {
                    node = createNewNode(firmFile);
                } 

                writeContent(node, firmFile);
            }
        }
    }

    private NodeRef createFileNode(NodeRef parentNode, String fileName) {
        try {
            QName contentQName = QName.createQName(FIRM_DOC);
            FileInfo fileInfo = fileFolderService.create(parentNode, fileName, contentQName);
            return fileInfo.getNodeRef();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public FileFolderService getFileFolderService() {
        return fileFolderService;
    }

    public void setFileFolderService(FileFolderService fileFolderService) {
        this.fileFolderService = fileFolderService;
    }

    public ContentService getContentService() {
        return contentService;
    }

    public void setContentService(ContentService contentService) {
        this.contentService = contentService;
    }

    public NodeService getNodeService() {
        return nodeService;
    }

    public void setNodeService(NodeService nodeService) {
        this.nodeService = nodeService;
    }

    public SearchService getSearchService() {
        return searchService;
    }

    public void setSearchService(SearchService searchService) {
        this.searchService = searchService;
    }
}

Модель контента должна иметь обязательный аспект cm:versionable:

<mandatory-aspects>
    <aspect>cm:versionable</aspect>
</mandatory-aspects>

Другие вопросы по теме