Search in sources :

Example 11 with NodePointer

use of org.openforis.idm.model.NodePointer in project collect by openforis.

the class RecordUpdater method updateMaxCount.

@SuppressWarnings("deprecation")
private Collection<NodePointer> updateMaxCount(Collection<NodePointer> nodePointers) {
    List<NodePointer> updatedPointers = new ArrayList<NodePointer>();
    for (NodePointer nodePointer : nodePointers) {
        Entity entity = nodePointer.getEntity();
        NodeDefinition childDef = nodePointer.getChildDefinition();
        Integer oldCount = entity.getMaxCount(childDef);
        int newCount = calculateMaxCount(nodePointer);
        entity.setMaxCount(childDef, newCount);
        if (!ObjectUtils.equals(oldCount, newCount)) {
            updatedPointers.add(nodePointer);
        }
    }
    return updatedPointers;
}
Also used : Entity(org.openforis.idm.model.Entity) ArrayList(java.util.ArrayList) NodeDefinition(org.openforis.idm.metamodel.NodeDefinition) NodePointer(org.openforis.idm.model.NodePointer)

Example 12 with NodePointer

use of org.openforis.idm.model.NodePointer in project collect by openforis.

the class RecordUpdater method deleteNode.

/**
 * Deletes a node from the record.
 *
 * @param node
 * @return
 */
public NodeChangeSet deleteNode(Node<?> node) {
    Record record = node.getRecord();
    NodeChangeMap changeMap = new NodeChangeMap();
    Set<Node<?>> nodesToBeDeleted = node.getDescendantsAndSelf();
    Set<NodePointer> pointersToBeDeleted = nodesToPointers(nodesToBeDeleted);
    NodePointer nodePointer = new NodePointer(node);
    List<NodePointer> ancestorPointers = getAncestorPointers(node);
    Entity parentEntity = node.getParent();
    // calculated attributes
    List<Attribute<?, ?>> dependentCalculatedAttributes = record.determineCalculatedAttributes(nodesToBeDeleted);
    dependentCalculatedAttributes.removeAll(nodesToBeDeleted);
    if (validateAfterUpdate) {
        // relevance
        List<NodePointer> relevanceDependenciesToDeleted = record.determineRelevanceDependentNodes(nodesToBeDeleted);
        // min/max
        Collection<NodePointer> preDeletionMinMaxDependenciesToCheck = new HashSet<NodePointer>(pointersToBeDeleted);
        preDeletionMinMaxDependenciesToCheck.addAll(getAncestorsAndSelfPointers(node));
        Collection<NodePointer> minCountDependenciesToDelete = record.determineMinCountDependentNodes(preDeletionMinMaxDependenciesToCheck);
        Collection<NodePointer> maxCountDependenciesToDelete = record.determineMaxCountDependentNodes(preDeletionMinMaxDependenciesToCheck);
        // validation
        Set<Attribute<?, ?>> validationDependenciesToDeleted = record.determineValidationDependentNodes(nodesToBeDeleted);
        validationDependenciesToDeleted.removeAll(nodesToBeDeleted);
        List<Integer> ancestorIds = node.getAncestorIds();
        performNodeDeletion(node);
        changeMap.addNodeDeleteChange(record.getId(), ((CollectRecord) record).getStep(), ancestorIds, node);
        // calculated attributes
        List<Attribute<?, ?>> updatedCalculatedAttributes = recalculateValues(dependentCalculatedAttributes);
        changeMap.addValueChanges(updatedCalculatedAttributes);
        // relevance
        Set<NodePointer> pointersToRecalculateRelevanceFor = new HashSet<NodePointer>();
        pointersToRecalculateRelevanceFor.addAll(record.determineRelevanceDependentNodes(updatedCalculatedAttributes));
        pointersToRecalculateRelevanceFor.addAll(relevanceDependenciesToDeleted);
        if (parentEntity != null) {
            pointersToRecalculateRelevanceFor.addAll(record.determineRelevanceDependentNodePointers(Arrays.asList(new NodePointer(parentEntity, node.getDefinition()))));
        }
        List<NodePointer> relevanceToUpdate = record.determineRelevanceDependentNodePointers(pointersToRecalculateRelevanceFor);
        // check relevance update with detached entity in node pointer
        RelevanceUpdater relevanceUpdater = new RelevanceUpdater(relevanceToUpdate);
        Set<NodePointer> updatedRelevancePointers = relevanceUpdater.update();
        changeMap.addRelevanceChanges(updatedRelevancePointers);
        // min count
        Collection<NodePointer> pointersToCheckMinCountFor = new HashSet<NodePointer>(updatedRelevancePointers);
        pointersToCheckMinCountFor.addAll(minCountDependenciesToDelete);
        pointersToCheckMinCountFor.addAll(nodesToPointers(updatedCalculatedAttributes));
        Collection<NodePointer> minCountPointersToUpdate = record.determineMinCountDependentNodes(pointersToCheckMinCountFor);
        Collection<NodePointer> updatedMinCountPointers = updateMinCount(minCountPointersToUpdate);
        changeMap.addMinCountChanges(updatedMinCountPointers);
        // max count
        Collection<NodePointer> pointersToCheckMaxCountFor = new HashSet<NodePointer>(updatedRelevancePointers);
        pointersToCheckMaxCountFor.addAll(maxCountDependenciesToDelete);
        pointersToCheckMaxCountFor.addAll(nodesToPointers(updatedCalculatedAttributes));
        Collection<NodePointer> maxCountPointersToUpdate = record.determineMaxCountDependentNodes(pointersToCheckMaxCountFor);
        Collection<NodePointer> updatedMaxCountPointers = updateMaxCount(maxCountPointersToUpdate);
        changeMap.addMinCountChanges(updatedMaxCountPointers);
        Set<NodePointer> updatedCardinalityPointers = new HashSet<NodePointer>(updatedMinCountPointers);
        updatedCardinalityPointers.addAll(updatedMaxCountPointers);
        // validate cardinality
        Set<NodePointer> pointersToValidateCardinalityFor = new HashSet<NodePointer>(updatedMinCountPointers.size() + updatedMaxCountPointers.size());
        pointersToValidateCardinalityFor.addAll(updatedMinCountPointers);
        pointersToValidateCardinalityFor.addAll(updatedMaxCountPointers);
        // validate cardinality on ancestor node pointers because we are considering empty nodes as missing nodes
        pointersToValidateCardinalityFor.add(nodePointer);
        pointersToValidateCardinalityFor.addAll(ancestorPointers);
        validateCardinality(record, pointersToValidateCardinalityFor, changeMap);
        // validate attributes
        Set<Node<?>> nodesToCheckValidationFor = new HashSet<Node<?>>(validationDependenciesToDeleted);
        nodesToCheckValidationFor.addAll(updatedCalculatedAttributes);
        nodesToCheckValidationFor.addAll(pointersToNodes(updatedRelevancePointers));
        nodesToCheckValidationFor.addAll(pointersToNodes(updatedCardinalityPointers));
        Set<Attribute<?, ?>> attributesToRevalidate = record.determineValidationDependentNodes(nodesToCheckValidationFor);
        validateAttributes(record, attributesToRevalidate, changeMap);
    } else {
        performNodeDeletion(node);
        // calculated attributes
        List<Attribute<?, ?>> updatedCalculatedAttributes = recalculateValues(dependentCalculatedAttributes);
        changeMap.addValueChanges(updatedCalculatedAttributes);
    }
    return changeMap;
}
Also used : Entity(org.openforis.idm.model.Entity) CodeAttribute(org.openforis.idm.model.CodeAttribute) Attribute(org.openforis.idm.model.Attribute) BooleanAttribute(org.openforis.idm.model.BooleanAttribute) Node(org.openforis.idm.model.Node) NodePointer(org.openforis.idm.model.NodePointer) Record(org.openforis.idm.model.Record) HashSet(java.util.HashSet) LinkedHashSet(java.util.LinkedHashSet)

Example 13 with NodePointer

use of org.openforis.idm.model.NodePointer in project collect by openforis.

the class RecordUpdater method approveMissingValue.

public NodeChangeSet approveMissingValue(Entity parentEntity, String nodeName) {
    setMissingValueApproved(parentEntity, nodeName, true);
    List<NodePointer> cardinalityPointers = getAncestorPointers(parentEntity);
    cardinalityPointers.add(new NodePointer(parentEntity, nodeName));
    NodeChangeMap changeMap = new NodeChangeMap();
    validateCardinality(parentEntity.getRecord(), cardinalityPointers, changeMap);
    return changeMap;
}
Also used : NodePointer(org.openforis.idm.model.NodePointer)

Example 14 with NodePointer

use of org.openforis.idm.model.NodePointer in project collect by openforis.

the class RecordUpdater method getAncestorPointers.

private List<NodePointer> getAncestorPointers(Node<?> node) {
    List<NodePointer> pointers = new ArrayList<NodePointer>();
    Entity parent = node.getParent();
    if (parent != null && parent.getParent() != null) {
        pointers.add(new NodePointer(parent));
        pointers.addAll(getAncestorPointers(parent));
    }
    return pointers;
}
Also used : Entity(org.openforis.idm.model.Entity) ArrayList(java.util.ArrayList) NodePointer(org.openforis.idm.model.NodePointer)

Aggregations

NodePointer (org.openforis.idm.model.NodePointer)14 ArrayList (java.util.ArrayList)7 Entity (org.openforis.idm.model.Entity)6 NodeDefinition (org.openforis.idm.metamodel.NodeDefinition)5 HashSet (java.util.HashSet)4 LinkedHashSet (java.util.LinkedHashSet)4 Attribute (org.openforis.idm.model.Attribute)3 BooleanAttribute (org.openforis.idm.model.BooleanAttribute)3 CodeAttribute (org.openforis.idm.model.CodeAttribute)3 Node (org.openforis.idm.model.Node)3 Record (org.openforis.idm.model.Record)3 EntityDefinition (org.openforis.idm.metamodel.EntityDefinition)2 ModelVersion (org.openforis.idm.metamodel.ModelVersion)2 ValidationResultFlag (org.openforis.idm.metamodel.validation.ValidationResultFlag)1 Validator (org.openforis.idm.metamodel.validation.Validator)1 BooleanValue (org.openforis.idm.model.BooleanValue)1 Value (org.openforis.idm.model.Value)1