Search in sources :

Example 1 with CreateDocumentsAndLinks

use of io.lumeer.engine.api.event.CreateDocumentsAndLinks in project engine by Lumeer.

the class DocumentFacade method createDocumentsChain.

public DocumentsChain createDocumentsChain(List<Document> documents, List<LinkInstance> linkInstances) {
    var collectionsMap = documents.stream().filter(document -> document.getId() == null).map(document -> checkCreateDocuments(document.getCollectionId())).collect(Collectors.toMap(Resource::getId, Function.identity()));
    var linkTypesMap = linkInstances.stream().filter(linkInstance -> linkInstance.getId() == null).map(linkInstanceId -> checkCreateLinks(linkInstanceId.getLinkTypeId())).collect(Collectors.toMap(LinkType::getId, Function.identity()));
    permissionsChecker.checkDocumentLimits(documents);
    if (documents.isEmpty()) {
        return new DocumentsChain(Collections.emptyList(), Collections.emptyList());
    }
    List<Document> createdDocuments = new ArrayList<>();
    List<LinkInstance> createdLinks = new ArrayList<>();
    String previousDocumentId = linkInstances.size() == documents.size() ? Utils.firstNotNullElement(linkInstances.get(0).getDocumentIds()) : null;
    var linkInstanceIndex = 0;
    for (Document document : documents) {
        String currentDocumentId;
        if (document.getId() != null) {
            currentDocumentId = document.getId();
        } else {
            var collection = collectionsMap.get(document.getCollectionId());
            var tuple = createDocument(collection, document);
            createdDocuments.add(tuple.getSecond());
            currentDocumentId = tuple.getFirst().getId();
            collectionAdapter.updateCollectionMetadata(collection, tuple.getSecond().getData().keySet(), Collections.emptySet());
        }
        var linkInstance = linkInstances.size() > linkInstanceIndex ? linkInstances.get(linkInstanceIndex) : null;
        if (previousDocumentId != null && linkInstance != null) {
            linkInstance.setDocumentIds(Arrays.asList(previousDocumentId, currentDocumentId));
            if (linkInstance.getId() != null) {
                var updatedLinkInstance = linkInstanceDao.updateLinkInstance(linkInstance.getId(), linkInstance);
                updatedLinkInstance.setData(linkInstance.getData());
                createdLinks.add(updatedLinkInstance);
            } else {
                var linkType = linkTypesMap.get(linkInstance.getLinkTypeId());
                var linkData = linkInstanceFacade.createLinkInstance(linkType, linkInstance);
                createdLinks.add(linkData.getSecond());
            }
            linkInstanceIndex++;
        }
        previousDocumentId = currentDocumentId;
    }
    if (this.createChainEvent != null) {
        this.createChainEvent.fire(new CreateDocumentsAndLinks(createdDocuments, createdLinks));
    }
    return new DocumentsChain(createdDocuments, createdLinks);
}
Also used : Arrays(java.util.Arrays) ZonedDateTime(java.time.ZonedDateTime) DocumentsChain(io.lumeer.api.model.DocumentsChain) LinkTypeDao(io.lumeer.storage.api.dao.LinkTypeDao) HashMap(java.util.HashMap) DocumentAdapter(io.lumeer.core.adapter.DocumentAdapter) Function(java.util.function.Function) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) Inject(javax.inject.Inject) CollectionDao(io.lumeer.storage.api.dao.CollectionDao) DataDao(io.lumeer.storage.api.dao.DataDao) ResourceType(io.lumeer.api.model.ResourceType) Resource(io.lumeer.api.model.common.Resource) Map(java.util.Map) ResourceCommentDao(io.lumeer.storage.api.dao.ResourceCommentDao) CollectionAdapter(io.lumeer.core.adapter.CollectionAdapter) ImportCollectionContent(io.lumeer.engine.api.event.ImportCollectionContent) ConstraintManager(io.lumeer.core.constraint.ConstraintManager) Tuple(io.lumeer.core.util.Tuple) Event(javax.enterprise.event.Event) DocumentDao(io.lumeer.storage.api.dao.DocumentDao) DataDocument(io.lumeer.engine.api.data.DataDocument) ResourceNotFoundException(io.lumeer.storage.api.exception.ResourceNotFoundException) Document(io.lumeer.api.model.Document) CreateDocument(io.lumeer.engine.api.event.CreateDocument) Set(java.util.Set) UUID(java.util.UUID) Constraint(io.lumeer.api.model.Constraint) Collectors(java.util.stream.Collectors) LinkInstance(io.lumeer.api.model.LinkInstance) LinkType(io.lumeer.api.model.LinkType) DocumentUtils(io.lumeer.core.util.DocumentUtils) Objects(java.util.Objects) FileAttachment(io.lumeer.api.model.FileAttachment) Project(io.lumeer.api.model.Project) LinkInstanceDao(io.lumeer.storage.api.dao.LinkInstanceDao) DefaultConfigurationProducer(io.lumeer.core.facade.configuration.DefaultConfigurationProducer) List(java.util.List) ResourceUtils(io.lumeer.api.util.ResourceUtils) RequestScoped(javax.enterprise.context.RequestScoped) PostConstruct(javax.annotation.PostConstruct) FavoriteItemDao(io.lumeer.storage.api.dao.FavoriteItemDao) UpdateDocument(io.lumeer.engine.api.event.UpdateDocument) Utils(io.lumeer.core.util.Utils) Collections(java.util.Collections) Collection(io.lumeer.api.model.Collection) CreateDocumentsAndLinks(io.lumeer.engine.api.event.CreateDocumentsAndLinks) DocumentsChain(io.lumeer.api.model.DocumentsChain) ArrayList(java.util.ArrayList) CreateDocumentsAndLinks(io.lumeer.engine.api.event.CreateDocumentsAndLinks) LinkInstance(io.lumeer.api.model.LinkInstance) DataDocument(io.lumeer.engine.api.data.DataDocument) Document(io.lumeer.api.model.Document) CreateDocument(io.lumeer.engine.api.event.CreateDocument) UpdateDocument(io.lumeer.engine.api.event.UpdateDocument)

Example 2 with CreateDocumentsAndLinks

use of io.lumeer.engine.api.event.CreateDocumentsAndLinks in project engine by Lumeer.

the class DocumentFacade method duplicateDocuments.

public List<Document> duplicateDocuments(final String collectionId, final List<String> documentIds) {
    final Collection collection = checkCreateDocuments(collectionId);
    permissionsChecker.checkDocumentLimits(documentIds.size());
    var dataMap = dataDao.getData(collectionId, new HashSet<>(documentIds)).stream().collect(Collectors.toMap(DataDocument::getId, d -> d));
    final List<Document> originalDocuments = documentDao.getDocumentsByIds(new HashSet<>(documentIds)).stream().peek(document -> document.setData(dataMap.getOrDefault(document.getId(), new DataDocument()))).filter(document -> permissionsChecker.canEditDocument(collection, document)).collect(Collectors.toList());
    if (originalDocuments.isEmpty()) {
        return originalDocuments;
    }
    final List<Document> documents = documentDao.duplicateDocuments(originalDocuments);
    final Map<String, Document> documentsDirectory = new HashMap<>();
    final Map<String, String> keyMap = new HashMap<>();
    documents.forEach(d -> {
        documentsDirectory.put(d.getId(), d);
        keyMap.put(d.getMetaData().getString(Document.META_ORIGINAL_DOCUMENT_ID), d.getId());
    });
    final Map<String, Integer> usages = new HashMap<>();
    final List<DataDocument> dataList = dataDao.duplicateData(collectionId, dataMap.values(), keyMap);
    dataList.forEach(encodedData -> {
        final DataDocument data = constraintManager.decodeDataTypes(collection, encodedData);
        if (documentsDirectory.containsKey(data.getId())) {
            documentsDirectory.get(data.getId()).setData(data);
        }
        data.keySet().forEach(key -> usages.put(key, usages.computeIfAbsent(key, k -> 0) + 1));
    });
    fileAttachmentFacade.duplicateFileAttachments(collection.getId(), keyMap, FileAttachment.AttachmentType.DOCUMENT);
    if (this.createChainEvent != null) {
        this.createChainEvent.fire(new CreateDocumentsAndLinks(documents, Collections.emptyList()));
    }
    collectionAdapter.updateCollectionMetadata(collection, usages);
    return documents;
}
Also used : Arrays(java.util.Arrays) ZonedDateTime(java.time.ZonedDateTime) DocumentsChain(io.lumeer.api.model.DocumentsChain) LinkTypeDao(io.lumeer.storage.api.dao.LinkTypeDao) HashMap(java.util.HashMap) DocumentAdapter(io.lumeer.core.adapter.DocumentAdapter) Function(java.util.function.Function) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) Inject(javax.inject.Inject) CollectionDao(io.lumeer.storage.api.dao.CollectionDao) DataDao(io.lumeer.storage.api.dao.DataDao) ResourceType(io.lumeer.api.model.ResourceType) Resource(io.lumeer.api.model.common.Resource) Map(java.util.Map) ResourceCommentDao(io.lumeer.storage.api.dao.ResourceCommentDao) CollectionAdapter(io.lumeer.core.adapter.CollectionAdapter) ImportCollectionContent(io.lumeer.engine.api.event.ImportCollectionContent) ConstraintManager(io.lumeer.core.constraint.ConstraintManager) Tuple(io.lumeer.core.util.Tuple) Event(javax.enterprise.event.Event) DocumentDao(io.lumeer.storage.api.dao.DocumentDao) DataDocument(io.lumeer.engine.api.data.DataDocument) ResourceNotFoundException(io.lumeer.storage.api.exception.ResourceNotFoundException) Document(io.lumeer.api.model.Document) CreateDocument(io.lumeer.engine.api.event.CreateDocument) Set(java.util.Set) UUID(java.util.UUID) Constraint(io.lumeer.api.model.Constraint) Collectors(java.util.stream.Collectors) LinkInstance(io.lumeer.api.model.LinkInstance) LinkType(io.lumeer.api.model.LinkType) DocumentUtils(io.lumeer.core.util.DocumentUtils) Objects(java.util.Objects) FileAttachment(io.lumeer.api.model.FileAttachment) Project(io.lumeer.api.model.Project) LinkInstanceDao(io.lumeer.storage.api.dao.LinkInstanceDao) DefaultConfigurationProducer(io.lumeer.core.facade.configuration.DefaultConfigurationProducer) List(java.util.List) ResourceUtils(io.lumeer.api.util.ResourceUtils) RequestScoped(javax.enterprise.context.RequestScoped) PostConstruct(javax.annotation.PostConstruct) FavoriteItemDao(io.lumeer.storage.api.dao.FavoriteItemDao) UpdateDocument(io.lumeer.engine.api.event.UpdateDocument) Utils(io.lumeer.core.util.Utils) Collections(java.util.Collections) Collection(io.lumeer.api.model.Collection) CreateDocumentsAndLinks(io.lumeer.engine.api.event.CreateDocumentsAndLinks) DataDocument(io.lumeer.engine.api.data.DataDocument) HashMap(java.util.HashMap) CreateDocumentsAndLinks(io.lumeer.engine.api.event.CreateDocumentsAndLinks) DataDocument(io.lumeer.engine.api.data.DataDocument) Document(io.lumeer.api.model.Document) CreateDocument(io.lumeer.engine.api.event.CreateDocument) UpdateDocument(io.lumeer.engine.api.event.UpdateDocument) Collection(io.lumeer.api.model.Collection)

Aggregations

Collection (io.lumeer.api.model.Collection)2 Constraint (io.lumeer.api.model.Constraint)2 Document (io.lumeer.api.model.Document)2 DocumentsChain (io.lumeer.api.model.DocumentsChain)2 FileAttachment (io.lumeer.api.model.FileAttachment)2 LinkInstance (io.lumeer.api.model.LinkInstance)2 LinkType (io.lumeer.api.model.LinkType)2 Project (io.lumeer.api.model.Project)2 ResourceType (io.lumeer.api.model.ResourceType)2 Resource (io.lumeer.api.model.common.Resource)2 ResourceUtils (io.lumeer.api.util.ResourceUtils)2 CollectionAdapter (io.lumeer.core.adapter.CollectionAdapter)2 DocumentAdapter (io.lumeer.core.adapter.DocumentAdapter)2 ConstraintManager (io.lumeer.core.constraint.ConstraintManager)2 DefaultConfigurationProducer (io.lumeer.core.facade.configuration.DefaultConfigurationProducer)2 DocumentUtils (io.lumeer.core.util.DocumentUtils)2 Tuple (io.lumeer.core.util.Tuple)2 Utils (io.lumeer.core.util.Utils)2 DataDocument (io.lumeer.engine.api.data.DataDocument)2 CreateDocument (io.lumeer.engine.api.event.CreateDocument)2