@Override public Set<String> execute(final DomainLookupContext context) { final DomainLookupsCache cache = context.getCache(); final Set<String> labels = sourceNode.getLabels(); final Set<String> allowedTargetConnectors = context.getCache() .getConnectionRules() .stream() .filter(rule -> isSourceConnectionAllowed(rule, labels)) .map(CanConnect::getRole) .collect(Collectors.toSet()); final Set<String> result = new LinkedHashSet<>(); for (final String allowedConnector : allowedTargetConnectors) { final int outEdgeCount = countOutgoingEdges(context, sourceNode, allowedConnector); final RuleViolations outEdgeCardinalityResult = context.getRuleManager() .evaluate(cache.getRuleSet(), edgeCardinality(sourceNode.getLabels(), allowedConnector, outEdgeCount, EdgeCardinalityContext.Direction.OUTGOING, Optional.of(CardinalityContext.Operation.ADD))); if (isValid(outEdgeCardinalityResult)) { result.add(allowedConnector); } } return result; } }
@Override public Set<String> execute(final DomainLookupContext context) { final DomainLookupsCache cache = context.getCache(); final Set<String> result = new LinkedHashSet<>(); for (final String definitionId : definitionIds) { final Set<String> labels = context.getDefinitionsRegistry().getLabels(definitionId); final RuleViolations violations = context.getRuleManager() .evaluate(cache.getRuleSet(), RuleContextBuilder.DomainContexts.edgeCardinality(labels, edgeId, 0, EdgeCardinalityContext.Direction.INCOMING, Optional.of(CardinalityContext.Operation.ADD))); if (isValid(violations)) { result.add(definitionId); } } return result; } }
@Override public Set<String> execute(final DomainLookupContext context) { final DomainLookupsCache cache = context.getCache(); final int outEdgeCount = countOutgoingEdges(context, sourceNode, edgeId); final RuleViolations outEdgeCardinalityResult = context.getRuleManager() .evaluate(cache.getRuleSet(), edgeCardinality(sourceNode.getLabels(), edgeId, outEdgeCount, EdgeCardinalityContext.Direction.OUTGOING, Optional.of(CardinalityContext.Operation.ADD))); if (isValid(outEdgeCardinalityResult)) { final String defId = context.getDefinitionManager() .adapters() .forDefinition() .getId(sourceNode.getContent().getDefinition()) .value(); return new LookupConnectionTargetRoles(edgeId, defId) .execute(context); } return Collections.emptySet(); } }
@Override @SuppressWarnings("unchecked") public RuleViolations evaluate(final EdgeOccurrences rule, final ConnectorCardinalityContext context) { final DefaultRuleViolations result = new DefaultRuleViolations(); final Node<? extends View<?>, ? extends Edge> candidate = (Node<? extends View<?>, ? extends Edge>) context.getCandidate(); final Edge<? extends View<?>, Node> edge = context.getEdge(); final Optional<CardinalityContext.Operation> operation = context.getOperation(); final EdgeCardinalityContext.Direction direction = context.getDirection(); final List<? extends Edge> edges = isIncoming(direction) ? candidate.getInEdges() : candidate.getOutEdges(); final String edgeId = evalUtils.getElementDefinitionId(edge); final int count = evalUtils.countEdges(edgeId, edges); // Delegate to the domain model cardinality rule manager. result.addViolations( edgeCardinalityEvaluationHandler .evaluate(rule, RuleContextBuilder.DomainContexts.edgeCardinality(candidate.getLabels(), edgeId, count, rule.getDirection(), operation)) ); return GraphEvaluationHandlerUtils.addViolationsSourceUUID(edge.getUUID(), result); }
@Override public boolean accepts(final EdgeOccurrences rule, final ConnectorCardinalityContext context) { final Edge<? extends View<?>, Node> edge = context.getEdge(); final Element<? extends View<?>> candidate = context.getCandidate(); final String edgeId = evalUtils.getElementDefinitionId(edge); final Set<String> candidateRoles = evalUtils.getLabels(candidate); // Take into account that there is no need to provide the candidate count value, as not necessary // just to check if the handler accepts the runtime rule and candidates. return edgeCardinalityEvaluationHandler.accepts(rule, RuleContextBuilder.DomainContexts.edgeCardinality(candidateRoles, edgeId, -1, context.getDirection(), context.getOperation())); }