class PolicyEngine {

    public Collection<PolicyViolation> evaluate(final Collection<ThirdPartyArtifact> thirdPartyArtifacts) {
        LOGGER.debug("Artifacts are " + thirdPartyArtifacts.stream()
                .map(ThirdPartyArtifact::getCoordinates)
                .flatMap(Collection::stream)
                .map(Coordinate::canonicalize)
                .collect(Collectors.joining(",", "[", "]")));

        Collection<PolicyViolation> violations =  executors.parallelStream()
                .map(executor -> executor.executeRules(thirdPartyArtifacts))
                .flatMap(Collection::stream)
                .collect(Collectors.toList());

        if (violations.size() > 0) {
            LOGGER.warn("Number of violations found: " + violations.size());
        } else {
            LOGGER.info("No violations found");
        }

        return violations;
    }

    public  PolicyEngine(final Collection<RuleExecutor> executors);

}